Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.02 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <GL/gl.h>
  5. #include <GL/glu.h>
  6.  
  7. // position of observer
  8. struct observer {
  9. double x = 5.0;
  10. double y = 5.0;
  11. double z = 5.0;
  12. } obv;
  13.  
  14. // size of cuboid
  15. const struct cuboid {
  16. const double x = 3.0;
  17. const double y = 1.0;
  18. const double z = 4.0;
  19. } qb;
  20.  
  21. double length = 2.0;
  22.  
  23. bool task1 = false;
  24. bool task2 = false;
  25. bool task3 = false;
  26.  
  27. void DrawScene(GLfloat xRot, GLfloat yRot)
  28. {
  29. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  30. glLoadIdentity();
  31.  
  32. glRotatef(xRot, 1.0f, 0.0f, 0.0f);
  33. glRotatef(yRot, 0.0f, 1.0f, 0.0f);
  34.  
  35. glBegin(GL_POINTS);
  36. glPointSize(20);
  37. glVertex3f(obv.x, obv.y, obv.z);
  38. glColor3f(1, 0, 0);
  39. glRotatef(5, 1.0f, 0.0f, 0.0f);
  40. glRotatef(5, 0.0f, 1.0f, 0.0f);
  41. glRotatef(5, 0.0f, 0.0f, 1.0f);
  42. glEnd();
  43.  
  44. // lines from centres of walls to observer
  45. glBegin(GL_LINES);
  46. glColor3f(0, 1, 0);
  47.  
  48. glVertex3f(0, 0, qb.z);
  49. glVertex3f(obv.x, obv.y, obv.z);
  50. glVertex3f(0, 0, -qb.z);
  51. glVertex3f(obv.x, obv.y, obv.z);
  52.  
  53. glVertex3f(0, qb.y, 0);
  54. glVertex3f(obv.x, obv.y, obv.z);
  55. glVertex3f(0, -qb.y, 0);
  56. glVertex3f(obv.x, obv.y, obv.z);
  57.  
  58. glVertex3f(qb.x, 0, 0);
  59. glVertex3f(obv.x, obv.y, obv.z);
  60. glVertex3f(-qb.x, 0, 0);
  61. glVertex3f(obv.x, obv.y, obv.z);
  62.  
  63. // centres of walls (normals)
  64. glColor3f(1, 0, 0); // red
  65.  
  66. glVertex3f(qb.x, 0, 0);
  67. glVertex3f(qb.x + length, 0, 0);
  68.  
  69. glVertex3f(0, qb.y, 0);
  70. glVertex3f(0, qb.y + length, 0);
  71.  
  72. glVertex3f(0, 0, qb.z);
  73. glVertex3f(0, 0, qb.z + length);
  74.  
  75. glVertex3f(-qb.x, 0, 0);
  76. glVertex3f(-qb.x - length, 0, 0);
  77.  
  78. glVertex3f(0, -qb.y, 0);
  79. glVertex3f(0, -qb.y - length, 0);
  80.  
  81. glVertex3f(0, 0, -qb.z);
  82. glVertex3f(0, 0, -qb.z - length);
  83.  
  84. glEnd();
  85.  
  86. glBegin(GL_QUADS);
  87. if (obv.z > qb.z)
  88. {
  89. // wall 1
  90. glColor3f(0, 0, 1); // blue
  91. glVertex3f(-qb.x, -qb.y, qb.z);
  92. glVertex3f(-qb.x, qb.y, qb.z);
  93. glVertex3f(qb.x, qb.y, qb.z);
  94. glVertex3f(qb.x, -qb.y, qb.z);
  95. }
  96. if (obv.z < -qb.z)
  97. {
  98. // wall 2
  99. glColor3f(0, 1, 0); // green
  100. glVertex3f(-qb.x, -qb.y, -qb.z);
  101. glVertex3f(-qb.x, qb.y, -qb.z);
  102. glVertex3f(qb.x, qb.y, -qb.z);
  103. glVertex3f(qb.x, -qb.y, -qb.z);
  104. }
  105. if (obv.y > qb.y)
  106. {
  107. // wall 3
  108. glColor3f(0, 1, 1); // cyan
  109. glVertex3f(-qb.x, qb.y, -qb.z);
  110. glVertex3f(-qb.x, qb.y, qb.z);
  111. glVertex3f(qb.x, qb.y, qb.z);
  112. glVertex3f(qb.x, qb.y, -qb.z);
  113. }
  114. if (obv.y < -qb.y)
  115. {
  116. // wall 4
  117. glColor3f(1, 0, 0); // red
  118. glVertex3f(-qb.x, -qb.y, -qb.z);
  119. glVertex3f(-qb.x, -qb.y, qb.z);
  120. glVertex3f(qb.x, -qb.y, qb.z);
  121. glVertex3f(qb.x, -qb.y, -qb.z);
  122. }
  123. if (obv.x > qb.x)
  124. {
  125. // wall 6
  126. glColor3f(1, 1, 0); // yellow
  127. glVertex3f(qb.x, -qb.y, -qb.z);
  128. glVertex3f(qb.x, -qb.y, qb.z);
  129. glVertex3f(qb.x, qb.y, qb.z);
  130. glVertex3f(qb.x, qb.y, -qb.z);
  131. }
  132. if (obv.x < -qb.x)
  133. {
  134. // wall 5
  135. glColor3f(1, 0, 1); // magenta
  136. glVertex3f(-qb.x, -qb.y, -qb.z);
  137. glVertex3f(-qb.x, -qb.y, qb.z);
  138. glVertex3f(-qb.x, qb.y, qb.z);
  139. glVertex3f(-qb.x, qb.y, -qb.z);
  140. }
  141. glEnd();
  142.  
  143. glFinish();
  144. }
  145.  
  146. void SetMyPixelFormat(HDC hdc)
  147. {
  148. PIXELFORMATDESCRIPTOR pfd;
  149. ZeroMemory(&pfd, sizeof(pfd));
  150. pfd.nSize = sizeof(pfd);
  151. pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  152. pfd.iPixelType = PFD_TYPE_RGBA;
  153. pfd.iPixelType = PFD_TYPE_RGBA;
  154. pfd.cColorBits = 32;
  155. pfd.cDepthBits = 16;
  156. pfd.iLayerType = PFD_MAIN_PLANE;
  157.  
  158. int nPixelFormat = ChoosePixelFormat(hdc, &pfd);
  159. SetPixelFormat(hdc, nPixelFormat, &pfd);
  160. }
  161.  
  162. void ResizeWindow(int width, int height)
  163. {
  164. if (height * width == 0) return;
  165. glViewport(0, 0, width, height);
  166. glMatrixMode(GL_PROJECTION);
  167. glLoadIdentity();
  168. glOrtho(-10, 10, -10, 10, -10, 10);
  169. glMatrixMode(GL_MODELVIEW);
  170. glLoadIdentity();
  171. glEnable(GL_DEPTH_TEST);
  172.  
  173. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);// set the blend mode
  174. glEnable(GL_BLEND); //obligatory for blending and transparencies
  175. glEnable(GL_LINE_SMOOTH);
  176.  
  177. //glEnable(GL_CULL_FACE);
  178.  
  179. glShadeModel(GL_FLAT);
  180. glShadeModel(GL_SMOOTH);
  181. }
  182.  
  183. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  184. {
  185. PAINTSTRUCT ps;
  186. HDC hdc;
  187. static HGLRC hrc;
  188. static GLfloat xRot = 0.0f;
  189. static GLfloat yRot = 0.0f;
  190.  
  191. switch (message)
  192. {
  193. case WM_SIZE:
  194. ResizeWindow(LOWORD(lParam), HIWORD(lParam));
  195. break;
  196. case WM_CREATE:
  197. hdc = GetDC(hWnd);
  198. SetMyPixelFormat(hdc);
  199. hrc = wglCreateContext(hdc);
  200. wglMakeCurrent(hdc, hrc);
  201. ReleaseDC(hWnd, hdc);
  202. break;
  203. case WM_KEYDOWN:
  204. // moving whole scene
  205. if (wParam == VK_UP) xRot -= 5.0f;
  206. if (wParam == VK_DOWN) xRot += 5.0f;
  207. if (wParam == VK_LEFT) yRot -= 5.0f;
  208. if (wParam == VK_RIGHT) yRot += 5.0f;
  209.  
  210. // moving observer
  211. if (wParam == 'A') obv.x -= 0.5;
  212. if (wParam == 'D') obv.x += 0.5;
  213. if (wParam == 'W') obv.y += 0.5;
  214. if (wParam == 'S') obv.y -= 0.5;
  215. if (wParam == 'E') obv.z -= 0.5;
  216. if (wParam == 'Q') obv.z += 0.5;
  217.  
  218. // setting observer to see single wall
  219. if (wParam == '1') { obv.x = 0; obv.y = 0; obv.z = qb.z + length; }
  220. if (wParam == '2') { obv.x = 0; obv.y = 0; obv.z = -qb.z - length; }
  221. if (wParam == '3') { obv.x = 0; obv.y = qb.y + length; obv.z = 0; }
  222. if (wParam == '4') { obv.x = 0; obv.y = -qb.y - length; obv.z = 0; }
  223. if (wParam == '5') { obv.x = qb.x + length; obv.y = 0; obv.z = 0; }
  224. if (wParam == '6') { obv.x = -qb.x - length; obv.y = 0; obv.z = 0; }
  225.  
  226. // resetting observer to starting point
  227. if (wParam == 'X') { obv.x = 5; obv.y = 5; obv.z = 5; }
  228.  
  229. // additional steering
  230.  
  231.  
  232. if (xRot > 356.0f) xRot = 0.0f;
  233. if (xRot < -1.0f) xRot = 355.0f;
  234. if (yRot > 356.0f) yRot = 0.0f;
  235. if (yRot < -1.0f) yRot = 355.0f;
  236.  
  237. InvalidateRect(hWnd, NULL, FALSE);
  238. break;
  239. case WM_PAINT:
  240. hdc = BeginPaint(hWnd, &ps);
  241. DrawScene(xRot, yRot);
  242. SwapBuffers(hdc);
  243. EndPaint(hWnd, &ps);
  244. break;
  245. case WM_ERASEBKGND:
  246. return 1;
  247. break;
  248. case WM_DESTROY:
  249. wglMakeCurrent(NULL, NULL);
  250. wglDeleteContext(hrc);
  251. PostQuitMessage(0);
  252. break;
  253. default:
  254. return DefWindowProc(hWnd, message, wParam, lParam);
  255. }
  256. return 0;
  257. }
  258.  
  259. ATOM MyRegisterClass(HINSTANCE hInstance)
  260. {
  261. WNDCLASSEX wcex;
  262. wcex.cbSize = sizeof(WNDCLASSEX);
  263. wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  264. wcex.lpfnWndProc = (WNDPROC)WndProc;
  265. wcex.cbClsExtra = 0;
  266. wcex.cbWndExtra = 0;
  267. wcex.hInstance = hInstance;
  268. wcex.hIcon = NULL;
  269. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  270. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  271. wcex.lpszMenuName = NULL;
  272. wcex.lpszClassName = "Primitives";
  273. wcex.hIconSm = NULL;
  274. return RegisterClassEx(&wcex);
  275. }
  276.  
  277. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  278. {
  279. HWND hWnd;
  280. hWnd = CreateWindow("Primitives", "OGL color lab", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  281. if (!hWnd) return FALSE;
  282. ShowWindow(hWnd, nCmdShow);
  283. UpdateWindow(hWnd);
  284. return TRUE;
  285. }
  286.  
  287. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
  288. {
  289. MSG msg;
  290. MyRegisterClass(hInstance);
  291. if (!InitInstance(hInstance, nCmdShow)) return FALSE;
  292. while (GetMessage(&msg, NULL, 0, 0)) {
  293. TranslateMessage(&msg);
  294. DispatchMessage(&msg);
  295. }
  296. return (int)msg.wParam;
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement