Advertisement
Guest User

huigovnozapupa

a guest
Jun 22nd, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.37 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "open_gl_functions.h"
  3. //У каждого окна есть уникальный идентификатор HWND, дерево окон
  4. HWND hWnd = NULL;
  5. //device context
  6. HDC hDC = NULL;
  7. HGLRC hRC = NULL;
  8.  
  9. GLfloat x, y, z;
  10.  
  11. struct RGBQuad{
  12. GLubyte R;
  13. GLubyte G;
  14. GLubyte B;
  15. GLubyte A;
  16. };
  17. //Unsigned binary integer
  18. GLuint texRoof;
  19. GLuint texLand;
  20. GLuint texDoor;
  21. GLuint texLight;
  22. GLuint texDarkMramor;
  23. GLuint texBrightMramor;
  24. //функция подгрузки текстуры
  25. void LoadTexImage(System::String^ file)
  26. {
  27. try
  28. {
  29. System::Drawing::Bitmap^ data;
  30. data = gcnew System::Drawing::Bitmap(file);
  31. RGBQuad *image = new RGBQuad[data->Width*data->Height];
  32. for (int x = 0; x < data->Height; x++)
  33. {
  34. for (int y = 0; y < data->Width; y++)
  35. {
  36. System::Drawing::Color pixelColor = data->GetPixel(y, data->Height - 1 - x);
  37. image[data->Width*x + y].R = pixelColor.R;
  38. image[data->Width*x + y].G = pixelColor.G;
  39. image[data->Width*x + y].B = pixelColor.B;
  40. image[data->Width*x + y].A = pixelColor.A;
  41. }
  42. }
  43. //создание текстуры
  44. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->Width, data->Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &image[0]);
  45. delete [] image;
  46. delete data;
  47. }
  48. catch (System::ArgumentException^)
  49. {
  50. System::Windows::Forms::MessageBox::Show( "There was an error."
  51. "Check the path to the image file." );
  52. }
  53. }
  54.  
  55.  
  56. void CreateOpenGLWindow(HWND hwnd)
  57. {
  58. /* pointer to the main window */
  59. hWnd = hwnd;
  60. if(!hWnd)
  61. System::Windows::Forms::MessageBox::Show(L"Error: hWnd not created");
  62. /* get the device context (DC) */
  63. hDC = GetDC(hWnd);
  64. if(!hDC)
  65. System::Windows::Forms::MessageBox::Show(L"Error: hDC not created");
  66.  
  67. /* set the pixel format for the DC */
  68. PIXELFORMATDESCRIPTOR pfd, *ppfd;
  69. int pixelformat;
  70.  
  71. ppfd = &pfd;
  72. memset(ppfd, sizeof(PIXELFORMATDESCRIPTOR), 0);
  73.  
  74. ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
  75. ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  76. ppfd->cColorBits = 32;
  77. ppfd->cAlphaBits = 32;
  78. ppfd->cDepthBits = 32;
  79. ppfd->cAccumBits = 32;
  80. ppfd->cStencilBits = 32;
  81.  
  82. pixelformat = ChoosePixelFormat(hDC, ppfd);
  83.  
  84. if(!pixelformat)
  85. System::Windows::Forms::MessageBox::Show(L"Error: pixel format not created");
  86.  
  87. if(!SetPixelFormat(hDC, pixelformat, ppfd))
  88. System::Windows::Forms::MessageBox::Show(L"Error: pixelformat not set");
  89.  
  90. /* create and enable the render context (RC) */
  91. hRC = wglCreateContext(hDC);
  92. SetPixelFormat(hDC, pixelformat, ppfd);
  93. hRC = wglCreateContext(hDC);
  94.  
  95. if(!hRC)
  96. System::Windows::Forms::MessageBox::Show(L"Error: hRC not created");
  97. wglMakeCurrent(hDC, hRC);
  98. }
  99.  
  100. void InitializeOpenGL()
  101. {
  102. //specify clear values for the color buffers
  103. glClearColor(0.9, 0.999, 1, 1);
  104. //проверка глубины(если она будет выключена объекты не будут закрывать друг друга)
  105. glEnable(GL_DEPTH_TEST);
  106. //освещение
  107. glEnable(GL_LIGHTING);
  108.  
  109. //двухсторонний расчет освещения
  110. //set the lighting model parameters
  111. //glLightModel sets the lighting model parameter.
  112. //"pname" names a parameter and "params" gives the new value.
  113. glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
  114. //Вычисляется угол отражения
  115. glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
  116.  
  117. // Свойства распаковки [Режим выравнивания может принимать значения 1, 2, 4, 8, а по умолчанию имеет значение 4.]
  118. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  119.  
  120. glGenTextures(1, &texRoof);
  121. glGenTextures(1, &texLand);
  122. glGenTextures(1, &texDoor);
  123. glGenTextures(1, &texLight);
  124. glGenTextures(1, &texDarkMramor);
  125. glGenTextures(1, &texBrightMramor);
  126.  
  127. //GL_TEXTURE_2D - таргет
  128. glBindTexture(GL_TEXTURE_2D, texRoof);
  129. //S-координата текстуры - это горизонтальная координата, T-координата - вертикальная
  130. //GL_REPEAT - Повторение текстуры
  131. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  132. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  133. //Не использовать интерполяцию при выборе точки на текстуре(если больше)
  134. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  135. //если полигон, на который наносим текстуру, меньше текстуры
  136. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  137. LoadTexImage(L"roof.jpg");
  138. //определяет, как текстура будет взаимодействовать с материалом, из которого сделан объект
  139. //конечный цвет находится как произведение цвета точки на поверхности и цвета соответствующей ей точки на текстуре
  140. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  141.  
  142. glBindTexture(GL_TEXTURE_2D, texBrightMramor);
  143. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  144. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  145. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  146. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  147. LoadTexImage(L"bright.jpg");
  148. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  149.  
  150. glBindTexture(GL_TEXTURE_2D, texLand);
  151. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  152. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  153. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  154. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  155. LoadTexImage(L"land.jpg");
  156. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  157.  
  158. glBindTexture(GL_TEXTURE_2D, texDoor);
  159. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  160. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  161. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  162. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  163. LoadTexImage(L"door.jpg");
  164. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  165.  
  166. glBindTexture(GL_TEXTURE_2D, texLight);
  167. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  168. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  169. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  170. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  171. LoadTexImage(L"light.jpg");
  172. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  173.  
  174. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  175. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  176. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  177. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  178. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  179. LoadTexImage(L"dark.jpg");
  180. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  181. }
  182.  
  183. void InitializeScene()
  184. {
  185. x = y = z = 0.0;
  186. }
  187.  
  188. void ResizeGraphics(float w, float h)
  189. {
  190. //Get new window size
  191. RECT rect;
  192. int width, height;
  193. GLfloat aspect;
  194.  
  195. //получение размера окна
  196. GetClientRect(hWnd, &rect);
  197. //GetWindowRect(hWnd, &rect);
  198. width = rect.right;
  199. height = rect.bottom;
  200. aspect = (GLfloat)width / height; //перспектива
  201.  
  202. // Adjust graphics to window size
  203. //Окно вывода
  204. glViewport(0, 0, w, h);
  205. glMatrixMode(GL_PROJECTION);
  206. //загружаем единичную матрицу
  207. glLoadIdentity();
  208.  
  209. //Задание перспективной проекции
  210. gluPerspective(60.0, aspect, 0.1, 200.0);
  211. //Далее будет проводиться только преобразование объектов сцены
  212. glMatrixMode(GL_MODELVIEW);
  213. glLoadIdentity();
  214. InvalidateRect(hWnd, NULL, FALSE);
  215. }
  216.  
  217. //функция для параллелепипедов
  218. void prlpd(GLfloat a, GLfloat b, GLfloat c, GLfloat h, GLfloat x, GLfloat y, GLfloat z){
  219.  
  220. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  221. glBegin(GL_QUADS);
  222.  
  223. //правая
  224. glNormal3f(0.0f, 0.0f, 1.0f);
  225. glTexCoord2f(0.0f, 0.0f);
  226. glVertex3f( a + h + x, b + y, c + z);
  227. glTexCoord2f(0.0f, 1.0f);
  228. glVertex3f(-a + h + x, b + y, c + z);
  229. glTexCoord2f(1.0f, 1.0f);
  230. glVertex3f(-a + h + x,-b + y, c + z);
  231. glTexCoord2f(1.0f, 0.0f);
  232. glVertex3f( a + h + x,-b + y, c + z);
  233.  
  234. //левая
  235. glNormal3f(0.0f, 0.0f, -1.0f);
  236. glTexCoord2f(0.0f, 0.0f);
  237. glVertex3f( a + h + x, b + y,-c + z);
  238. glTexCoord2f(0.0f, 1.0f);
  239. glVertex3f( a + h + x,-b + y,-c + z);
  240. glTexCoord2f(1.0f, 1.0f);
  241. glVertex3f(-a + h + x,-b + y,-c + z);
  242. glTexCoord2f(1.0f, 0.0f);
  243. glVertex3f(-a + h + x, b + y,-c + z);
  244.  
  245. //низ
  246. glNormal3f(-1.0f, 0.0f, 0.0f);
  247. glTexCoord2f(0.0f, 0.0f);
  248. glVertex3f(-a + h + x, b + y, c + z);
  249. glTexCoord2f(0.0f, 1.0f);
  250. glVertex3f(-a + h + x, b + y,-c + z);
  251. glTexCoord2f(1.0f, 1.0f);
  252. glVertex3f(-a + h + x,-b + y,-c + z);
  253. glTexCoord2f(1.0f, 0.0f);
  254. glVertex3f(-a + h + x,-b + y, c + z);
  255.  
  256. //перед
  257. glNormal3f(0.0f, 1.0f, 0.0f);
  258. glTexCoord2f(0.0f, 0.0f);
  259. glVertex3f( a + h + x, b + y, c + z);
  260. glTexCoord2f(0.0f, 1.0f);
  261. glVertex3f( a + h + x, b + y,-c + z);
  262. glTexCoord2f(1.0f, 1.0f);
  263. glVertex3f(-a + h + x, b + y,-c + z);
  264. glTexCoord2f(1.0f, 0.0f);
  265. glVertex3f(-a + h + x, b + y, c + z);
  266.  
  267. //верх
  268. glNormal3f(1.0f, 0.0f, 0.0f);
  269. glTexCoord2f(0.0f, 0.0f);
  270. glVertex3f( a + h + x, b + y, c + z);
  271. glTexCoord2f(0.0f, 1.0f);
  272. glVertex3f( a + h + x,-b + y, c + z);
  273. glTexCoord2f(1.0f, 1.0f);
  274. glVertex3f( a + h + x,-b + y,-c + z);
  275. glTexCoord2f(1.0f, 0.0f);
  276. glVertex3f( a + h + x, b + y,-c + z);
  277.  
  278. //зад
  279. glNormal3f(0.0f, -1.0f, 0.0f);
  280. glTexCoord2f(0.0f, 0.0f);
  281. glVertex3f( a + h + x,-b + y, c + z);
  282. glTexCoord2f(0.0f, 1.0f);
  283. glVertex3f(-a + h + x,-b + y, c + z);
  284. glTexCoord2f(1.0f, 1.0f);
  285. glVertex3f(-a + h + x,-b + y,-c + z);
  286. glTexCoord2f(1.0f, 0.0f);
  287. glVertex3f(a + h + x,-b + y,-c + z);
  288.  
  289. glEnd();
  290. }
  291.  
  292. //функция отрисовки колонн
  293. void Colonna(GLfloat x, GLfloat y, GLfloat z){
  294.  
  295. const GLfloat R = 2;
  296. const GLfloat h = 20;
  297. const GLint N = 500;
  298.  
  299. prlpd(1.5, 2.75, 2.75, 0, x, y, z);
  300. prlpd(1.5, 2.25, 2.25, 1, x, y, z);
  301. prlpd(1.5, 2.25, 2.25, h, x, y, z);
  302. prlpd(1.5, 2.75, 2.75, h + 1, x, y, z);
  303.  
  304. glBindTexture(GL_TEXTURE_2D, texBrightMramor);
  305. //колонна
  306. glBegin(GL_QUADS);
  307. for(int i = 0; i < N; i++){
  308. float q = (float)i/N * 2 * M_PI;
  309. float w = (float)(i+1)/N * 2 * M_PI;
  310. glTexCoord2f(0.0f, 0.0f);
  311. glNormal3f(0, sin(q), cos(q));
  312. glVertex3f(x, R*sin(q) + y, R*cos(q) + z);
  313.  
  314. glTexCoord2f(0.0f, 1.0f);
  315. glNormal3f(0, sin(w), cos(w));
  316. glVertex3f(x, R*sin(w) + y, R*cos(w) + z);
  317.  
  318. glTexCoord2f(1.0f, 1.0f);
  319. glNormal3f(0, sin(w), cos(w));
  320. glVertex3f(x + h, R*sin(w) + y, R*cos(w) + z);
  321.  
  322. glTexCoord2f(1.0f, 0.0f);
  323. glNormal3f(0, sin(q), cos(q));
  324. glVertex3f(x + h, R*sin(q) + y, R*cos(q) + z);
  325.  
  326. }
  327.  
  328. glEnd();
  329.  
  330. }
  331.  
  332. //мейн крыша (кольца)
  333. void Cylinder(GLfloat x, GLfloat R2, GLint helper){
  334.  
  335. const GLfloat y2 = -13-R2;
  336. const GLfloat h2 = 40;
  337. const GLint N2 = 500;
  338.  
  339. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  340. //колонна
  341. glBegin(GL_QUADS);
  342. for(int i = 0; i < N2; i++){
  343. float q = (float)i/N2 * 2 * M_PI;
  344. float w = (float)(i+1)/N2 * 2 * M_PI;
  345. glTexCoord2f(0.0f, 0.0f);
  346. glNormal3f(0, sin(q), cos(q));
  347. glVertex3f(x + h2, R2*sin(q) + y2 - helper, R2*cos(q) + 16.3);
  348.  
  349. glTexCoord2f(0.0f, 1.0f);
  350. glNormal3f(0, sin(w), cos(w));
  351. glVertex3f(x + h2, R2*sin(w) + y2 - helper, R2*cos(w) + 16.3);
  352.  
  353. glTexCoord2f(1.0f, 1.0f);
  354. glNormal3f(0, sin(w), cos(w));
  355. glVertex3f(x + h2 + 2, R2*sin(w) + y2 - helper, R2*cos(w) + 16.3);
  356.  
  357. glTexCoord2f(1.0f, 0.0f);
  358. glNormal3f(0, sin(q), cos(q));
  359. glVertex3f(x + h2 + 2, R2*sin(q) + y2 - helper, R2*cos(q) + 16.3);
  360.  
  361. }
  362. glEnd();
  363.  
  364. //крышка
  365. glBindTexture(GL_TEXTURE_2D, texBrightMramor);
  366. glBegin(GL_TRIANGLE_FAN);
  367. glNormal3f(1, 0, 0);
  368. glVertex3f(x + h2 + 2, y2 - helper, 16.3);
  369. for(int i = 0; i <= N2; i++){
  370. float q = (float)i/N2 * 2 * M_PI;
  371. float w = (float)(i+1)/N2 * 2 * M_PI;
  372.  
  373. glTexCoord2f(0.0f, 0.0f);
  374. glVertex3f(x + h2 + 2, R2*sin(q) + y2 - helper, R2*cos(q) + 16.3);
  375.  
  376. glTexCoord2f(0.0f, 1.0f);
  377. glVertex3f(x + h2 + 2, R2*sin(w) + y2 - helper, R2*cos(w) + 16.3);
  378.  
  379. glTexCoord2f(1.0f, 1.0f);
  380. glVertex3f(x + h2 + 2, R2*sin(q) + y2 - helper, R2*cos(q) + 16.3);
  381. }
  382.  
  383. glEnd();
  384. }
  385.  
  386. //обода здания
  387. void Cylinder2(GLfloat x, GLfloat R2, GLfloat h2){
  388.  
  389.  
  390. const GLfloat y2 = -13-R2;
  391. const GLint N2 = 500;
  392.  
  393.  
  394. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  395. //колонна
  396. glBegin(GL_QUADS);
  397. for(int i = 0; i < N2; i++){
  398. float q = (float)i/N2 * 2 * M_PI;
  399. float w = (float)(i+1)/N2 * 2 * M_PI;
  400.  
  401. glTexCoord2f(0.0f, 0.0f);
  402. glNormal3f(0, sin(q), cos(q));
  403. glVertex3f(x, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
  404.  
  405. glTexCoord2f(0.0f, 1.0f);
  406. glNormal3f(0, sin(w), cos(w));
  407. glVertex3f(x, R2*sin(w) + y2 + 0.5, R2*cos(w) + 16.3);
  408.  
  409. glTexCoord2f(1.0f, 1.0f);
  410. glNormal3f(0, sin(w), cos(w));
  411. glVertex3f(x + h2, R2*sin(w) + y2 + 0.5, R2*cos(w) + 16.3);
  412.  
  413. glTexCoord2f(1.0f, 0.0f);
  414. glNormal3f(0, sin(q), cos(q));
  415. glVertex3f(x + h2, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
  416.  
  417. }
  418. glEnd();
  419.  
  420. //крышка(верх)
  421. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  422. glBegin(GL_TRIANGLE_FAN);
  423. glNormal3f(1, 0, 0);
  424. glVertex3f(x + h2, y2 + 0.5, 16.3);
  425. for(int i = 0; i <= N2; i++){
  426. float q = (float)i/N2 * 2 * M_PI;
  427. float w = (float)(i+1)/N2 * 2 * M_PI;
  428.  
  429. glTexCoord2f(0.0f, 0.0f);
  430. glVertex3f(x + h2, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
  431.  
  432. glTexCoord2f(0.0f, 1.0f);
  433. glVertex3f(x + h2, R2*sin(w) + y2 + 0.5, R2*cos(w) + 16.3);
  434.  
  435. glTexCoord2f(1.0f, 1.0f);
  436. glVertex3f(x + h2, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
  437. }
  438. glEnd();
  439.  
  440. //крышка(низ)
  441. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  442. glBegin(GL_TRIANGLE_FAN);
  443. glNormal3f(-1, 0, 0);
  444. glVertex3f(x, y2 + 0.5, 16.3);
  445. for(int i = 0; i <= N2; i++){
  446. float q = (float)i/N2 * 2 * M_PI;
  447. float w = (float)(i+1)/N2 * 2 * M_PI;
  448.  
  449. glTexCoord2f(0.0f, 0.0f);
  450. glVertex3f(x, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
  451.  
  452. glTexCoord2f(0.0f, 1.0f);
  453. glVertex3f(x, R2*sin(w) + y2 + 0.5, R2*cos(w) + 16.3);
  454.  
  455. glTexCoord2f(1.0f, 1.0f);
  456. glVertex3f(x, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
  457. }
  458. glEnd();
  459. }
  460.  
  461. /**
  462. * Находит нормаль к поверхности, заданной тремя точками (вектора должны быть неколинеарны)
  463. * x1, y1, z1 - первая точка
  464. * x2, y2, z2 - вторая точка
  465. * x3, y3, z3 - третья точка
  466. * возвращаемое значение - вектор с координатами нормали
  467. */
  468. std::vector<float> GetNormal(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3)
  469. {
  470. // v1, v2 - координаты перемножаемых веторов, vm - векторное произведение, vn - нормаль
  471. std::vector<float> v1(3), v2(3), vm(3), vn(3);
  472.  
  473. // вычисляем координаты вектором по точкам
  474. v1[0] = x1 - x2;
  475. v1[1] = y1 - y2;
  476. v1[2] = z1 - z2;
  477. v2[0] = x1 - x3;
  478. v2[1] = y1 - y3;
  479. v2[2] = z1 - z3;
  480.  
  481. // находим векторное произведение
  482. vm[0] = v1[1] * v2[2] - v1[2] * v2[1];
  483. vm[1] = -(v1[0] * v2[2] - v1[2] * v2[0]);
  484. vm[2] = v1[0] * v2[1] - v1[1] * v2[0];
  485.  
  486. // находим l - длину полученного вектора
  487. float l = sqrt(vm[0] * vm[0] + vm[1] * vm[1] + vm[2] * vm[2]);
  488.  
  489. if (l == 0)
  490. {
  491. std::vector<float> error(3, 0);
  492. return error;
  493. }
  494.  
  495. // находим нормаль
  496. vn[0] = vm[0] / l;
  497. vn[1] = vm[1] / l;
  498. vn[2] = vm[2] / l;
  499.  
  500. return vn;
  501. }
  502.  
  503. //фонарики
  504. void Lamp(GLfloat x, GLfloat y, GLfloat z){
  505.  
  506. const GLfloat R = 0.4;
  507. const GLfloat h = 18;
  508. const GLint N = 100;
  509.  
  510. prlpd(0.45, 1.05, 1.05, 0, x, y, z);
  511. prlpd(1.6, 0.6, 0.6, 1, x, y, z);
  512.  
  513.  
  514. glBindTexture(GL_TEXTURE_2D, texBrightMramor);
  515. //столб
  516. glBegin(GL_QUADS);
  517. for(int i = 0; i < N; i++){
  518. float q = (float)i/N * 2 * M_PI;
  519. float w = (float)(i+1)/N * 2 * M_PI;
  520.  
  521. glTexCoord2f(0.0f, 0.0f);
  522. glNormal3f(0, sin(q), cos(q));
  523. glVertex3f(x, R*sin(q) + y, R*cos(q) + z);
  524.  
  525. glTexCoord2f(0.0f, 1.0f);
  526. glNormal3f(0, sin(w), cos(w));
  527. glVertex3f(x, R*sin(w) + y, R*cos(w) + z);
  528.  
  529. glTexCoord2f(1.0f, 1.0f);
  530. glNormal3f(0, sin(w), cos(w));
  531. glVertex3f(x + h, R*sin(w) + y, R*cos(w) + z);
  532.  
  533. glTexCoord2f(1.0f, 0.0f);
  534. glNormal3f(0, sin(q), cos(q));
  535. glVertex3f(x + h, R*sin(q) + y, R*cos(q) + z);
  536.  
  537. }
  538.  
  539. glEnd();
  540.  
  541. //фонарь
  542. glBindTexture(GL_TEXTURE_2D, texLight);
  543. glBegin(GL_QUADS);
  544. int m = 15; float r = 1.5; int n = 15; const GLfloat y3 = -12- r;
  545. for( int i = 0; i < m; i++ )
  546. {
  547. float fi = (float)i/(m)*2*M_PI;
  548. float psi = (float)(i + 1)/(m)*2*M_PI;
  549. for( int j = 0; j < n; j++ )
  550. {
  551. float u = -M_PI/2 + (float)j/n*M_PI;
  552. float v = -M_PI/2 + (float)(j+1)/n*M_PI;
  553.  
  554. glTexCoord2f(0.0f, 0.0f);
  555. glNormal3f( cos(u)*sin(fi), sin(u), cos(u)*cos(fi));
  556. glVertex3f( r*cos(u)*sin(fi) + x + h, r*sin(u) + y, r*cos(u)*cos(fi) + z);
  557.  
  558. glTexCoord2f(0.0f, 1.0f);
  559. glNormal3f( cos(u)*sin(psi), sin(u), cos(u)*cos(psi));
  560. glVertex3f( r*cos(u)*sin(psi) + x + h, r*sin(u) + y, r*cos(u)*cos(psi) + z);
  561.  
  562. glTexCoord2f(1.0f, 1.0f);
  563. glNormal3f( cos(v)*sin(psi), sin(v), cos(v)*cos(psi));
  564. glVertex3f( r*cos(v)*sin(psi) + x + h, r*sin(v) + y, r*cos(v)*cos(psi) + z);
  565.  
  566. glTexCoord2f(1.0f, 0.0f);
  567. glNormal3f( cos(v)*sin(fi), sin(v), cos(v)*cos(fi));
  568. glVertex3f( r*cos(v)*sin(fi) + x + h, r*sin(v) + y, r*cos(v)*cos(fi) + z);
  569. }
  570. }
  571. glEnd();
  572.  
  573. }
  574.  
  575. void DrawGraphics() {
  576.  
  577. //Проводится только преобразование объектов сцены
  578. glMatrixMode(GL_MODELVIEW);
  579. //загружаем единичную матрицу
  580. glLoadIdentity();
  581. //Инициализация (очистка) текущего буфера кадра и глубины
  582. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  583.  
  584. glEnable(GL_COLOR_MATERIAL);
  585. glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
  586.  
  587. glEnable(GL_LIGHT0);
  588. //Определяем точку наблюдения
  589. gluLookAt(50 + (float)x, 50 + (float)y,-50 + (float)z, 10, -40, 30, 1, 0, 0);
  590.  
  591. //Определение свойств освещения
  592. GLfloat light1_position1[] = {50, 15, 16, 1};
  593. float white [] = {1, 1, 1, 1};
  594.  
  595. glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
  596. glLightfv(GL_LIGHT0, GL_POSITION, light1_position1);
  597.  
  598. glEnable(GL_TEXTURE_2D);
  599.  
  600. // Зeмля
  601. glBindTexture(GL_TEXTURE_2D, texLand);
  602. glBegin(GL_QUADS);
  603.  
  604. glTexCoord2f(0.0f, 0.0f);
  605. glNormal3f(1, 0, 0);
  606. glVertex3f(-2.5, 45, -42);
  607.  
  608. glTexCoord2f(0.0f, 1.0f);
  609. glNormal3f(1, 0, 0);
  610. glVertex3f(-2.5, -100, -42);
  611.  
  612. glTexCoord2f(1.0f, 1.0f);
  613. glNormal3f(1, 0, 0);
  614. glVertex3f(-2.5, -100, 80);
  615.  
  616. glTexCoord2f(1.0f, 0.0f);
  617. glNormal3f(1, 0, 0);
  618. glVertex3f(-2.5, 45, 80);
  619.  
  620. glEnd();
  621.  
  622. // Kолонны
  623. for(int i = 0, z = 0; i < 2; i++){
  624.  
  625. Colonna(0,0,z);
  626. z+=33;
  627. }
  628.  
  629. //Портик
  630. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  631. glBegin(GL_QUADS);
  632.  
  633. //правая стена
  634. glNormal3f(0.0f, 0.0f, 1.0f);
  635. glTexCoord2f(0.0f, 0.0f);
  636. glVertex3f( 21.5, -11, 36);
  637. glTexCoord2f(0.0f, 1.0f);
  638. glVertex3f(-0.5, -11, 36);
  639. glTexCoord2f(1.0f, 1.0f);
  640. glVertex3f(-0.5, -75, 36);
  641. glTexCoord2f(1.0f, 0.0f);
  642. glVertex3f(21.5, -75, 36);
  643.  
  644. //левая стена
  645. glNormal3f(0.0f, 0.0f, -1.0f);
  646. glTexCoord2f(0.0f, 0.0f);
  647. glVertex3f( 21.5, -11, -3);
  648. glTexCoord2f(0.0f, 1.0f);
  649. glVertex3f(-0.5, -11, -3);
  650. glTexCoord2f(1.0f, 1.0f);
  651. glVertex3f(-0.5, -75, -3);
  652. glTexCoord2f(1.0f, 0.0f);
  653. glVertex3f(21.5, -75, -3);
  654.  
  655. //низ стен
  656. glNormal3f(-1.0f, 0.0f, 0.0f);
  657. glTexCoord2f(0.0f, 0.0f);
  658. glVertex3f(-0.5, -11, -3);
  659. glTexCoord2f(0.0f, 1.0f);
  660. glVertex3f(-0.5, -11, 36);
  661. glTexCoord2f(1.0f, 1.0f);
  662. glVertex3f(-0.5, -75, 36);
  663. glTexCoord2f(1.0f, 0.0f);
  664. glVertex3f(-0.5, -75, -3);
  665.  
  666. //передняя стена
  667. glNormal3f(0.0f, 1.0f, 0.0f);
  668.  
  669. glTexCoord2f(0.0f, 0.0f);
  670. glVertex3f(-0.5, -11, -3);
  671.  
  672. glTexCoord2f(0.0f, 1.0f);
  673. glVertex3f(21.5, -11, -3);
  674.  
  675. glTexCoord2f(1.0f, 1.0f);
  676. glVertex3f(21.5, -11, 36);
  677.  
  678. glTexCoord2f(1.0f, 0.0f);
  679. glVertex3f(-0.5, -11, 36);
  680.  
  681. //верхняя стена
  682. glNormal3f(1.0f, 0.0f, 0.0f);
  683. glTexCoord2f(0.0f, 0.0f);
  684. glVertex3f(21.5, -11, -3);
  685. glTexCoord2f(0.0f, 1.0f);
  686. glVertex3f(21.5, -11, 36);
  687. glTexCoord2f(1.0f, 1.0f);
  688. glVertex3f(21.5, -75, 36);
  689. glTexCoord2f(1.0f, 0.0f);
  690. glVertex3f(21.5, -75, -3);
  691.  
  692. //зад
  693. glNormal3f(0.0f, -1.0f, 0.0f);
  694. glTexCoord2f(0.0f, 0.0f);
  695. glVertex3f( -0.5, -75, -3);
  696. glTexCoord2f(0.0f, 1.0f);
  697. glVertex3f(21.5, -75, -3);
  698. glTexCoord2f(1.0f, 1.0f);
  699. glVertex3f(21.5, -75, 36);
  700. glTexCoord2f(1.0f, 0.0f);
  701. glVertex3f(-0.5, -75, 36);
  702.  
  703.  
  704. glEnd();
  705.  
  706. glBindTexture(GL_TEXTURE_2D, texDoor);
  707. //Дверь
  708. glBegin(GL_QUADS);
  709.  
  710. glTexCoord2f(0.0f, 0.0f);
  711. glVertex3f(-0.5, -10.5, 12.3);
  712.  
  713. glTexCoord2f(0.0f, 1.0f);
  714. glVertex3f(12, -10.5, 12.3);
  715.  
  716. glTexCoord2f(1.0f, 1.0f);
  717. glVertex3f(12, -10.5, 20.3);
  718.  
  719. glTexCoord2f(1.0f, 0.0f);
  720. glVertex3f(-0.5, -10.5, 20.3);
  721.  
  722. glEnd();
  723.  
  724. //Пирамидка
  725. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  726. glBegin(GL_QUADS);
  727.  
  728. std::vector<float> normal;
  729.  
  730. //правая
  731. normal = GetNormal(-0.5, 3, 36, -2.5, -75, 38, -0.5, -75, 36);
  732. glNormal3f(normal[0], normal[1], normal[2]);
  733.  
  734. glTexCoord2f(0.0f, 0.0f);
  735. glVertex3f(-0.5, 3, 36);
  736.  
  737. glTexCoord2f(0.0f, 1.0f);
  738. glVertex3f(-0.5, -75, 36);
  739.  
  740. glTexCoord2f(1.0f, 1.0f);
  741. glVertex3f(-2.5, -75, 38);
  742.  
  743. glTexCoord2f(1.0f, 0.0f);
  744. glVertex3f(-2.5, 5, 38);
  745.  
  746. //левая
  747. normal = GetNormal(-0.5, -75, -3, -2.5, -75, -5, -2.5, 5, -5);
  748. glNormal3f(normal[0], normal[1], normal[2]);
  749.  
  750. glTexCoord2f(0.0f, 0.0f);
  751. glVertex3f( -0.5, -75, -3);
  752.  
  753. glTexCoord2f(0.0f, 1.0f);
  754. glVertex3f(-2.5, -75, -5);
  755.  
  756. glTexCoord2f(1.0f, 1.0f);
  757. glVertex3f(-2.5, 5, -5);
  758.  
  759. glTexCoord2f(1.0f, 0.0f);
  760. glVertex3f(-0.5, 3, -3);
  761.  
  762. //низ
  763. glNormal3f(1, 0, 0);
  764. glTexCoord2f(0.0f, 0.0f);
  765. glVertex3f(-2.5, 5, -5);
  766.  
  767. glTexCoord2f(0.0f, 1.0f);
  768. glVertex3f(-2.5, -75, -5);
  769.  
  770. glTexCoord2f(1.0f, 1.0f);
  771. glVertex3f(-2.5, -75, 38);
  772.  
  773. glTexCoord2f(1.0f, 0.0f);
  774. glVertex3f(-2.5, 5, 38);
  775.  
  776. //перед
  777. normal = GetNormal(-0.5, 3, -3, -2.5, 5, -5, -2.5, 5, 38);
  778. glNormal3f(normal[0], normal[1], normal[2]);
  779.  
  780. glTexCoord2f(0.0f, 0.0f);
  781. glVertex3f(-0.5, 3, -3);
  782.  
  783. glTexCoord2f(0.0f, 1.0f);
  784. glVertex3f(-2.5, 5, -5);
  785.  
  786. glTexCoord2f(1.0f, 1.0f);
  787. glVertex3f(-2.5, 5, 38);
  788.  
  789. glTexCoord2f(1.0f, 0.0f);
  790. glVertex3f(-0.5, 3, 36);
  791.  
  792. //верх
  793. glNormal3f(1, 0, 0);
  794. glTexCoord2f(0.0f, 0.0f);
  795. glVertex3f(-0.5, 3, -3);
  796.  
  797. glTexCoord2f(0.0f, 1.0f);
  798. glVertex3f(-0.5, -75, -3);
  799.  
  800. glTexCoord2f(1.0f, 1.0f);
  801. glVertex3f(-0.5, -75, 36);
  802.  
  803. glTexCoord2f(1.0f, 0.0f);
  804. glVertex3f(-0.5, 3, 36);
  805.  
  806. glEnd();
  807.  
  808.  
  809. //Параллелепипед(под крышей)
  810. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  811. glBegin(GL_QUADS);
  812.  
  813. //правая
  814. glNormal3f(0.0f, 0.0f, 1.0f);
  815.  
  816. glTexCoord2f(0.0f, 0.0f);
  817. glVertex3f(21.5, 3, 36);
  818.  
  819. glTexCoord2f(0.0f, 1.0f);
  820. glVertex3f(23.5, 3, 36);
  821.  
  822. glTexCoord2f(1.0f, 1.0f);
  823. glVertex3f(23.5, -75, 36);
  824.  
  825. glTexCoord2f(1.0f, 0.0f);
  826. glVertex3f(21.5, -75, 36);
  827.  
  828. //левая
  829. glNormal3f(0.0f, 0.0f, -1.0f);
  830.  
  831. glTexCoord2f(0.0f, 0.0f);
  832. glVertex3f( 21.5, 3, -3);
  833.  
  834. glTexCoord2f(0.0f, 1.0f);
  835. glVertex3f(23.5, 3, -3);
  836.  
  837. glTexCoord2f(1.0f, 1.0f);
  838. glVertex3f(23.5, -75, -3);
  839.  
  840. glTexCoord2f(1.0f, 0.0f);
  841. glVertex3f(21.5, -75, -3);
  842.  
  843. //низ
  844. glNormal3f(-1.0f, 0.0f, 0.0f);
  845.  
  846. glTexCoord2f(0.0f, 0.0f);
  847. glVertex3f(21.5, 3, -3);
  848.  
  849. glTexCoord2f(0.0f, 1.0f);
  850. glVertex3f(21.5, 3, 36);
  851.  
  852. glTexCoord2f(1.0f, 1.0f);
  853. glVertex3f(21.5, -75, 36);
  854.  
  855. glTexCoord2f(1.0f, 0.0f);
  856. glVertex3f(21.5, -75, -3);
  857.  
  858. //перед
  859. glNormal3f(0.0f, 1.0f, 0.0f);
  860.  
  861. glTexCoord2f(0.0f, 0.0f);
  862. glVertex3f(21.5, 3, -3);
  863.  
  864. glTexCoord2f(0.0f, 1.0f);
  865. glVertex3f(21.5, 3, 36);
  866.  
  867. glTexCoord2f(1.0f, 1.0f);
  868. glVertex3f(23.5, 3, 36);
  869.  
  870. glTexCoord2f(1.0f, 0.0f);
  871. glVertex3f(23.5, 3, -3);
  872.  
  873. //верх
  874. glNormal3f(1.0f, 0.0f, 0.0f);
  875.  
  876. glTexCoord2f(0.0f, 0.0f);
  877. glVertex3f(23.5, 3, -3);
  878.  
  879. glTexCoord2f(0.0f, 1.0f);
  880. glVertex3f(23.5, 3, 36);
  881.  
  882. glTexCoord2f(1.0f, 1.0f);
  883. glVertex3f(23.5, -75, 36);
  884.  
  885. glTexCoord2f(1.0f, 0.0f);
  886. glVertex3f(23.5, -75, -3);
  887.  
  888. //зад
  889. glNormal3f(0.0f, -1.0f, 0.0f);
  890.  
  891. glTexCoord2f(0.0f, 0.0f);
  892. glVertex3f(21.5, -75, -3);
  893.  
  894. glTexCoord2f(0.0f, 1.0f);
  895. glVertex3f(21.5, -75, 36);
  896.  
  897. glTexCoord2f(1.0f, 1.0f);
  898. glVertex3f(23.5, -75, 36);
  899.  
  900. glTexCoord2f(1.0f, 0.0f);
  901. glVertex3f(23.5, -75, -3);
  902.  
  903.  
  904. glEnd();
  905.  
  906. glBindTexture(GL_TEXTURE_2D, texBrightMramor);
  907. //перед (мелкий треугольник)
  908. glBegin(GL_TRIANGLES);
  909.  
  910. glNormal3f(0.0f, 1.0f, 0.0f);
  911.  
  912. glTexCoord2f(0.0f, 0.0f);
  913. glVertex3f(23.5, 3.05, -1);
  914.  
  915. glTexCoord2f(0.0f, 1.0f);
  916. glVertex3f(29.5, 3.05, 16.3);
  917.  
  918. glTexCoord2f(1.0f, 1.0f);
  919. glVertex3f(23.5, 3.05, 34);
  920.  
  921. glEnd();
  922.  
  923.  
  924.  
  925. //Крыша(портика)
  926. glBindTexture(GL_TEXTURE_2D, texDarkMramor);
  927. //перед
  928. glBegin(GL_TRIANGLES);
  929.  
  930. glNormal3f(0.0f, 1.0f, 0.0f);
  931.  
  932. glTexCoord2f(0.0f, 0.0f);
  933. glVertex3f(23.5, 3, -3);
  934.  
  935. glTexCoord2f(0.0f, 1.0f);
  936. glVertex3f(30.5, 3, 16.3);
  937.  
  938. glTexCoord2f(1.0f, 1.0f);
  939. glVertex3f(23.5, 3, 36);
  940.  
  941. //зад
  942. glNormal3f(0.0f, -1.0f, 0.0f);
  943.  
  944. glTexCoord2f(0.0f, 0.0f);
  945. glVertex3f(23.5, -75, -3);
  946.  
  947. glTexCoord2f(0.0f, 1.0f);
  948. glVertex3f(30.5, -75, 16.3);
  949.  
  950. glTexCoord2f(1.0f, 1.0f);
  951. glVertex3f(23.5, -75, 36);
  952.  
  953. glEnd();
  954.  
  955. //крыша лево-право
  956. glBindTexture(GL_TEXTURE_2D, texRoof);
  957. glBegin(GL_QUADS);
  958.  
  959. std::vector<float> normal2;
  960.  
  961. //правая
  962. normal2 = GetNormal(23.5, 3, 36, 30.5, -75, 16.3, 30.5, 3, 16.3);
  963. glNormal3f(normal2[0], normal2[1], normal2[2]);
  964.  
  965. glTexCoord2f(0.0f, 0.0f);
  966. glVertex3f(23.5, 3, 36);
  967.  
  968. glTexCoord2f(0.0f, 1.0f);
  969. glVertex3f(30.5, 3, 16.3);
  970.  
  971. glTexCoord2f(1.0f, 1.0f);
  972. glVertex3f(30.5, -75, 16.3);
  973.  
  974. glTexCoord2f(1.0f, 0.0f);
  975. glVertex3f(23.5, -75, 36);
  976.  
  977. //левая
  978. normal2 = GetNormal(23.5, 3, -3, 30.5, 3, 16.3, 30.5, -75, 16.3);
  979. glNormal3f(normal2[0], normal2[1], normal2[2]);
  980.  
  981. glTexCoord2f(0.0f, 0.0f);
  982. glVertex3f(23.5, 3, -3);
  983.  
  984. glTexCoord2f(0.0f, 1.0f);
  985. glVertex3f(30.5, 3, 16.3);
  986.  
  987. glTexCoord2f(1.0f, 1.0f);
  988. glVertex3f(30.5, -75, 16.3);
  989.  
  990. glTexCoord2f(1.0f, 0.0f);
  991. glVertex3f(23.5, -75, -3);
  992.  
  993. glEnd();
  994.  
  995.  
  996. //Перестановка буферов кадра
  997. SwapBuffers(hDC);
  998. }
  999.  
  1000. void press(wchar_t key)
  1001. {
  1002. switch(key)
  1003. {
  1004. case 'a':
  1005. z += 5.0f;
  1006. break;
  1007. case 'd':
  1008. z -= 5.0f;
  1009. break;
  1010. case 'w':
  1011. x += 5.0f;
  1012. break;
  1013. case 's':
  1014. x -= 5.0f;
  1015. break;
  1016. case 'e':
  1017. y += 5.0f;
  1018. break;
  1019. case 'q':
  1020. y -= 5.0f;
  1021. break;
  1022. case '0':
  1023. x = 0;
  1024. y = 0;
  1025. z = 0;
  1026. break;
  1027. default:;
  1028. }
  1029. InvalidateRect(hWnd, NULL, FALSE);
  1030. }
  1031.  
  1032. void close()
  1033. {
  1034. wglMakeCurrent(NULL, NULL);
  1035. wglDeleteContext(hRC);
  1036. ReleaseDC(hWnd, hDC);
  1037. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement