Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.96 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "GLRenderer.h"
  3. #include "GL\gl.h"
  4. #include "GL\glu.h"
  5. #include "GL\glaux.h"
  6. #include "GL\glut.h"
  7. #include "glext.h"
  8. #include "wglext.h"
  9.  
  10. #pragma comment(lib, "GL\\glut32.lib")
  11. #pragma comment(lib, "OpenGL32.lib")
  12.  
  13. PFNGLGENBUFFERSPROC glGenBuffers = NULL;
  14.  
  15. PFNGLBINDBUFFERPROC glBindBuffer = NULL;
  16.  
  17. PFNGLBUFFERDATAPROC glBufferData = NULL;
  18.  
  19. PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL;
  20.  
  21.  
  22.  
  23. CGLRenderer::CGLRenderer(void)
  24. {
  25. m_alpha = -30.0;
  26. m_beta = 35.0;
  27.  
  28. m_posX = 7.5;
  29. m_posY = 0.0;
  30. m_posZ = -70.0;
  31.  
  32. m_lampAngleX = 0.0;
  33. m_lampAngleY = 50.0;
  34. m_lampHeadAngleZ = -90.0;
  35. }
  36.  
  37. CGLRenderer::~CGLRenderer(void)
  38. {
  39.  
  40. }
  41.  
  42. bool CGLRenderer::CreateGLContext(CDC* pDC)
  43. {
  44. PIXELFORMATDESCRIPTOR pfd ;
  45. memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
  46. pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
  47. pfd.nVersion = 1;
  48. pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
  49. pfd.iPixelType = PFD_TYPE_RGBA;
  50. pfd.cColorBits = 32;
  51. pfd.cDepthBits = 32;
  52. pfd.iLayerType = PFD_MAIN_PLANE;
  53.  
  54. int nPixelFormat = ChoosePixelFormat(pDC->m_hDC, &pfd);
  55.  
  56. if (nPixelFormat == 0) return false;
  57.  
  58. BOOL bResult = SetPixelFormat (pDC->m_hDC, nPixelFormat, &pfd);
  59.  
  60. if (!bResult) return false;
  61.  
  62. m_hrc = wglCreateContext(pDC->m_hDC);
  63.  
  64. if (!m_hrc) return false;
  65.  
  66. return true;
  67. }
  68.  
  69. void CGLRenderer::PrepareScene(CDC *pDC)
  70. {
  71. wglMakeCurrent(pDC->m_hDC, m_hrc);
  72. //---------------------------------
  73.  
  74. glClearColor(1.0, 1.0, 1.0, 1.0);
  75.  
  76. // Ukljucivanje Z-bafera
  77. glEnable(GL_DEPTH_TEST);
  78. glCullFace(GL_BACK);
  79. glEnable(GL_CULL_FACE);
  80.  
  81. //Antialiasing kao
  82. //glEnable(GL_POLYGON_SMOOTH);
  83. //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  84.  
  85. //Osvetljenje
  86. SetLightModel();
  87. SetRedMetal();
  88. SetWallMaterial();
  89. SetFloorMaterial();
  90. SetWoodMaterial();
  91. SetBulbMaterial();
  92.  
  93. //Teksture
  94. PrepareTextures();
  95.  
  96. //---------------------------------
  97. wglMakeCurrent(NULL, NULL);
  98. }
  99.  
  100. void CGLRenderer::DrawScene(CDC *pDC)
  101. {
  102. wglMakeCurrent(pDC->m_hDC, m_hrc);
  103. //---------------------------------
  104. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  105. glLoadIdentity();
  106.  
  107.  
  108. glPushMatrix();
  109.  
  110. //gluLookAt(-m_posX, -m_posY, -m_posZ, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  111. glTranslated(m_posX, m_posY, m_posZ);
  112. glRotated(m_beta, 1.0, 0.0, 0.0);
  113. glRotated(m_alpha, 0.0, 1.0, 0.0);
  114.  
  115. DrawLamp(10.5, 10.5, 10.0);
  116.  
  117. glEnable(GL_TEXTURE_2D);
  118. DrawWalls(100, 3);
  119. DrawTable(15.0, 0.0, 10.0, 15);
  120. DrawEllipse(10.0, 5.0, 15.0, 10.51, 10.0);
  121. DrawCola(10, 15, 20, 3, 9, 360);
  122. glDisable(GL_TEXTURE_2D);
  123.  
  124. glPopMatrix();
  125.  
  126.  
  127. glFlush();
  128. SwapBuffers(pDC->m_hDC);
  129. //---------------------------------
  130. wglMakeCurrent(NULL, NULL);
  131. }
  132.  
  133. void CGLRenderer::Reshape(CDC *pDC, int w, int h)
  134. {
  135. wglMakeCurrent(pDC->m_hDC, m_hrc);
  136. //---------------------------------
  137.  
  138. glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  139. glMatrixMode(GL_PROJECTION);
  140. glLoadIdentity();
  141. gluPerspective(40, (double)w / (double)h, 0.1, 2000);
  142. glMatrixMode(GL_MODELVIEW);
  143.  
  144. //---------------------------------
  145. wglMakeCurrent(NULL, NULL);
  146. }
  147.  
  148. void CGLRenderer::DestroyScene(CDC *pDC)
  149. {
  150. wglMakeCurrent(pDC->m_hDC, m_hrc);
  151. // ...
  152. m_woodTex.Release();
  153. m_floorTex.Release();
  154. m_wallTex.Release();
  155. m_colaTex.Release();
  156. wglMakeCurrent(NULL,NULL);
  157. if(m_hrc)
  158. {
  159. wglDeleteContext(m_hrc);
  160. m_hrc = NULL;
  161. }
  162. }
  163.  
  164. void CGLRenderer::DrawBox(double a, double b, double c, int rx, int rz)
  165. {
  166. SetBoxBuf(a, b, c, rx, rz);
  167. DrawVBOBox();
  168. }
  169.  
  170. void CGLRenderer::DrawTable(double x, double y, double z, int n)
  171. {
  172. glPushMatrix();
  173.  
  174.  
  175. // Translacija celog stola
  176. glTranslatef(x, y, z);
  177.  
  178. m_woodMat.Select();
  179.  
  180.  
  181. // Crtanje gornje ploce
  182. m_woodTex.Select();
  183. glPushMatrix();
  184.  
  185. glTranslated(0.0, 10.25, 0.0);
  186. /*
  187. const double partX = 20.0 / n, partZ = 10.0 / n, startX = -10.0 + partX/2, startZ = -5.0 + partZ/2;
  188.  
  189. for(int i = 0; i < n; i++)
  190. {
  191. for(int j = 0; j < n; j++)
  192. {
  193. glPushMatrix();
  194. glTranslatef(startX + i * partX, 0, startZ + j * partZ);
  195. DrawBox(partX, 0.5, partZ);
  196. glPopMatrix();
  197. }
  198. }*/
  199. DrawBox(20.0, 0.5, 10.0, 1, 1);
  200.  
  201. glPopMatrix();
  202.  
  203. // Crtanje donje ploce
  204. glPushMatrix();
  205.  
  206. glTranslated(0.0, 9, 0.0);
  207. DrawBox(18.0, 2, 8.0, 1, 1);
  208.  
  209. glPopMatrix();
  210.  
  211. // Crtanje prve noge
  212. glPushMatrix();
  213.  
  214. glTranslated(-9.0, 5.0, -4.0);
  215. DrawBox(0.5, 10.0, 0.5, 1, 1);
  216.  
  217. glPopMatrix();
  218.  
  219. // Crtanje druge noge
  220. glPushMatrix();
  221.  
  222. glTranslated(9.0, 5.0, -4.0);
  223. DrawBox(0.5, 10.0, 0.5, 1, 1);
  224.  
  225. glPopMatrix();
  226.  
  227. // Crtanje trece noge
  228. glPushMatrix();
  229.  
  230. glTranslated(-9.0, 5.0, 4.0);
  231. DrawBox(0.5, 10.0, 0.5, 1, 1);
  232.  
  233. glPopMatrix();
  234.  
  235. // Crtanje cetvrte noge
  236. glPushMatrix();
  237.  
  238. glTranslated(9.0, 5.0, 4.0);
  239. DrawBox(0.5, 10.0, 0.5, 1, 1);
  240.  
  241. glPopMatrix();
  242.  
  243. glPopMatrix();
  244. }
  245.  
  246. void CGLRenderer::DrawWall(double a, int n)
  247. {
  248. const double partX = a / n, partZ = a / n, startX = -a + partX / 2, startZ = -a + partZ / 2;
  249.  
  250. for (int i = 0; i < n; i++)
  251. {
  252. for (int j = 0; j < n; j++)
  253. {
  254. glPushMatrix();
  255. glTranslatef(startX + i * partX, 0, startZ + j * partZ);
  256. DrawBox(partX, a, partZ, 2, 2);
  257. glPopMatrix();
  258. }
  259. }
  260. }
  261.  
  262. void CGLRenderer::DrawWalls(double size, int n)
  263. {
  264. m_wallMat.Select();
  265. m_wallTex.Select();
  266. glPushMatrix();
  267.  
  268. double half = size / 2;
  269.  
  270. glTranslated(half, 0, half);
  271.  
  272. // Levi zid
  273. glPushMatrix();
  274.  
  275. glTranslated(-half, half, half);
  276. DrawWall(size, n);
  277.  
  278. glPopMatrix();
  279.  
  280. // Desni zid
  281. glPushMatrix();
  282.  
  283. glTranslated(half, half, -half);
  284. DrawWall(size, n);
  285.  
  286. glPopMatrix();
  287.  
  288. // Pod
  289. m_floorMat.Select();
  290. m_floorTex.Select();
  291. glPushMatrix();
  292.  
  293. glTranslated(half, -half, half);
  294. DrawWall(size, n*2);
  295.  
  296. glPopMatrix();
  297.  
  298. glPopMatrix();
  299.  
  300. }
  301.  
  302. void CGLRenderer::DrawLamp(double x, double y, double z)
  303. {
  304. m_metalMat.Select();
  305. glPushMatrix();
  306.  
  307. glTranslated(x, y, z);
  308. glRotated(m_lampAngleX, 0.0, 1.0, 0.0);
  309.  
  310. // Postolje
  311. glutSolidSphere(1.0, 20, 20);
  312.  
  313. glPushMatrix();
  314.  
  315. // Rotacija cele lampe
  316. glRotated(m_lampAngleY, 0.0, 0.0, 1.0);
  317.  
  318. glPushMatrix();
  319.  
  320. // Translacija i rotacija drugog dela, zgloba i glave
  321. glTranslated(0.0, 7.0, 0.0);
  322. glRotated(-2 * m_lampAngleY, 0.0, 0.0, 1.0);
  323.  
  324. // Zglob
  325. glutSolidSphere(0.5, 10, 10);
  326.  
  327. glTranslated(0.0, 3.5, 0.0);
  328.  
  329. // Drugi deo
  330. SetBoxBuf(0.40, 7.0, 0.40, 1, 1);
  331. DrawVBOBox();
  332.  
  333. glTranslated(0.0, 3.5, 0.0);
  334.  
  335. DrawLampTop();
  336.  
  337. glPopMatrix();
  338.  
  339. glTranslated(0.0, 3.5, 0.0);
  340.  
  341. // Prvi deo
  342. SetBoxBuf(0.40, 7.0, 0.4, 1, 1);
  343. DrawVBOBox();
  344.  
  345. glPopMatrix();
  346.  
  347. glPopMatrix();
  348. }
  349.  
  350. void CGLRenderer::DrawLampTop()
  351. {
  352. glPushMatrix();
  353.  
  354. glRotated(m_lampHeadAngleZ, 0.0, 1.0, 0.0);
  355.  
  356. glPushMatrix();
  357.  
  358. glTranslated(0.0, 0.0, -2.0);
  359.  
  360. glDisable(GL_CULL_FACE);
  361.  
  362. GLdouble eqn[4] = { 0.0, 0.0, 1.0, 0.0 };
  363.  
  364. glClipPlane(GL_CLIP_PLANE0, eqn);
  365.  
  366. glEnable(GL_CLIP_PLANE0);
  367.  
  368. glutSolidSphere(1.5, 30, 30);
  369. glDisable(GL_CLIP_PLANE0);
  370.  
  371.  
  372. glEnable(GL_CULL_FACE);
  373.  
  374. // Sijalica
  375. m_bulbMat.Select();
  376. SetDirectedLight();
  377. glTranslated(0.0, 0.0, 0.5);
  378. glutSolidSphere(0.75, 30, 30);
  379.  
  380. glPopMatrix();
  381.  
  382. m_metalMat.Select();
  383. DrawBox(1.0, 1.0, 1.5, 1, 1);
  384.  
  385. glPopMatrix();
  386.  
  387. }
  388.  
  389. void CGLRenderer::DrawEllipse(double a, double b, double x, double y, double z)
  390. {
  391. std::vector<GLfloat> vec;
  392.  
  393. m_floorMat.Select();
  394. m_floorTex.Select();
  395.  
  396. glPushMatrix();
  397.  
  398. glTranslated(x, y, z);
  399.  
  400. for(int i = 360; i > 0; i--)
  401. {
  402. // Koordinate
  403. vec.push_back(a * cos(i * m_pi / 180));
  404. vec.push_back(0.0);
  405. vec.push_back(b * sin(i * m_pi / 180));
  406.  
  407. // Normale
  408. vec.push_back(0.0);
  409. vec.push_back(1.0);
  410. vec.push_back(0.0);
  411.  
  412. // Tex
  413. vec.push_back(a * cos(i * m_pi / 180));
  414. vec.push_back(b * sin(i * m_pi / 180));
  415. }
  416.  
  417. glVertexPointer(3, GL_FLOAT, 8 * sizeof(GLfloat), &vec[0]);
  418. glNormalPointer(GL_FLOAT, 8 * sizeof(GLfloat), &vec[3]);
  419. glTexCoordPointer(2, GL_FLOAT, 8 * sizeof(GLfloat), &vec[6]);
  420.  
  421. glEnableClientState(GL_VERTEX_ARRAY);
  422. glEnableClientState(GL_NORMAL_ARRAY);
  423. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  424.  
  425. glDrawArrays(GL_POLYGON, 0, vec.size() / 8);
  426.  
  427. glDisableClientState(GL_VERTEX_ARRAY);
  428. glDisableClientState(GL_NORMAL_ARRAY);
  429. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  430.  
  431. glPopMatrix();
  432. }
  433.  
  434. void CGLRenderer::DrawCola(double x, double y, double z, double r, double h, int size)
  435. {
  436. std::vector<GLfloat> vecBase1, vecBase2, vecMid;
  437.  
  438. m_colaTex.Select();
  439. m_defaultMat.Select();
  440.  
  441. const int decrement = 360 / size;
  442. const double offsetY = 1.0 / size;
  443. double currentOffset = 1.0;
  444.  
  445. for (int i = 360; i > 0; i-= decrement)
  446. {
  447.  
  448. const double sinVal = sin(i * m_pi/180), cosVal = cos(i * m_pi/180);
  449. const double sinVal2 = sin((i - decrement) * m_pi/180), cosVal2 = cos((i - decrement) * m_pi/180);
  450.  
  451. // Donja osnova
  452. // Koordinate
  453. vecBase1.push_back(r * cosVal);
  454. vecBase1.push_back(0.0);
  455. vecBase1.push_back(r * sinVal);
  456.  
  457. // Normale
  458. vecBase1.push_back(0.0);
  459. vecBase1.push_back(-1.0);
  460. vecBase1.push_back(0.0);
  461.  
  462. // Tex
  463. vecBase1.push_back(0.75 + (0.25 * cosVal));
  464. vecBase1.push_back(0.75 + (0.25 * sinVal));
  465.  
  466.  
  467. // Gornja osnova
  468.  
  469. // Koordinate
  470. vecBase2.push_back(r * cosVal);
  471. vecBase2.push_back(h);
  472. vecBase2.push_back(r * sinVal);
  473.  
  474. // Normale
  475. vecBase2.push_back(0.0);
  476. vecBase2.push_back(1.0);
  477. vecBase2.push_back(0.0);
  478.  
  479. // Tex
  480. vecBase2.push_back(0.75 + (0.25 * cosVal));
  481. vecBase2.push_back(0.25 + (0.25 * sinVal));
  482.  
  483. // Omotac
  484.  
  485. // Vertex 0
  486. vecMid.push_back(r * cosVal);
  487. vecMid.push_back(0.0);
  488. vecMid.push_back(r * sinVal);
  489.  
  490. vecMid.push_back(cosVal2);
  491. vecMid.push_back(0.0);
  492. vecMid.push_back(sinVal2);
  493.  
  494. vecMid.push_back(0.5);
  495. vecMid.push_back(currentOffset);
  496.  
  497. // Vertex 1
  498. vecMid.push_back(r * cosVal2);
  499. vecMid.push_back(0.0);
  500. vecMid.push_back(r * sinVal2);
  501.  
  502. vecMid.push_back(cosVal);
  503. vecMid.push_back(0.0);
  504. vecMid.push_back(sinVal);
  505.  
  506. vecMid.push_back(0.5);
  507. vecMid.push_back(currentOffset - offsetY);
  508.  
  509. // Vertex 2
  510. vecMid.push_back(r * cosVal2);
  511. vecMid.push_back(h);
  512. vecMid.push_back(r * sinVal2);
  513.  
  514. vecMid.push_back(cosVal);
  515. vecMid.push_back(0.0);
  516. vecMid.push_back(sinVal);
  517.  
  518. vecMid.push_back(0.0);
  519. vecMid.push_back(currentOffset - offsetY);
  520.  
  521. // Vertex 3
  522. vecMid.push_back(r * cosVal);
  523. vecMid.push_back(h);
  524. vecMid.push_back(r * sinVal);
  525. vecMid.push_back(cosVal2);
  526. vecMid.push_back(0.0);
  527. vecMid.push_back(sinVal2);
  528. vecMid.push_back(0);
  529. vecMid.push_back(currentOffset);
  530.  
  531. currentOffset -= offsetY;
  532. }
  533.  
  534. glPushMatrix();
  535.  
  536. glTranslated(x, y, z);
  537.  
  538.  
  539. glEnableClientState(GL_VERTEX_ARRAY);
  540. glEnableClientState(GL_NORMAL_ARRAY);
  541. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  542.  
  543. glVertexPointer(3, GL_FLOAT, 8 * sizeof(GLfloat), &vecBase1[0]);
  544. glNormalPointer(GL_FLOAT, 8 * sizeof(GLfloat), &vecBase1[3]);
  545. glTexCoordPointer(2, GL_FLOAT, 8 * sizeof(GLfloat), &vecBase1[6]);
  546.  
  547. glPushMatrix();
  548. glRotated(180, 1.0, 0.0, 0.0);
  549. glDrawArrays(GL_POLYGON, 0, vecBase1.size()/8);
  550. glPopMatrix();
  551.  
  552. glVertexPointer(3, GL_FLOAT, 8 * sizeof(GLfloat), &vecBase2[0]);
  553. glNormalPointer(GL_FLOAT, 8 * sizeof(GLfloat), &vecBase2[3]);
  554. glTexCoordPointer(2, GL_FLOAT, 8 * sizeof(GLfloat), &vecBase2[6]);
  555.  
  556. glDrawArrays(GL_POLYGON, 0, vecBase2.size()/8);
  557.  
  558. glVertexPointer(3, GL_FLOAT, 8 * sizeof(GLfloat), &vecMid[0]);
  559. glNormalPointer(GL_FLOAT, 8 * sizeof(GLfloat), &vecMid[3]);
  560. glTexCoordPointer(2, GL_FLOAT, 8 * sizeof(GLfloat), &vecMid[6]);
  561.  
  562. glDrawArrays(GL_QUADS, 0, vecMid.size() / 8);
  563.  
  564. glDisableClientState(GL_VERTEX_ARRAY);
  565. glDisableClientState(GL_NORMAL_ARRAY);
  566. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  567.  
  568. glPopMatrix();
  569. }
  570.  
  571. void CGLRenderer::SetLightModel()
  572. {
  573.  
  574. // Postavljanje globalnog ambijentnog svetla
  575. float lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
  576. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  577.  
  578. // Izbor udaljenog posmatraca
  579. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
  580.  
  581. // Ukljucivanje dvostranog osvetljenja
  582. glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  583.  
  584. // Ukljucivanje osvetljenja
  585. glEnable(GL_LIGHTING);
  586.  
  587. // Postavljanje svetla bele boje
  588. float light_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
  589. float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
  590. float light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  591. float light_position[] = { 20.0, 20.0, 20.0 };
  592.  
  593. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  594. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  595. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  596. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  597.  
  598. glEnable(GL_LIGHT0);
  599.  
  600.  
  601. }
  602.  
  603. void CGLRenderer::SetDirectedLight()
  604. {
  605. GLfloat light1_ambient[] = { 1.0, 1.0, 0.2, 1.0 };
  606. GLfloat light1_diffuse[] = { 1.0, 1.0, 0.2, 1.0 };
  607. GLfloat light1_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  608. GLfloat light1_position[] = { 0.0, 0.0, -1.0, 1.0 };
  609. GLfloat spot_direction[] = { 0.0, 0.0, -1.0 };
  610.  
  611. glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
  612. glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
  613. glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
  614. glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
  615.  
  616. glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0);
  617. glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5);
  618. glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2);
  619.  
  620. glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0);
  621. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction);
  622. glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
  623. glEnable(GL_LIGHT1);
  624. }
  625.  
  626. void CGLRenderer::SetWoodMaterial()
  627. {
  628. m_woodMat.SetAmbient(0.4, 0.2, 0.05, 1.0);
  629. m_woodMat.SetDiffuse(0.8, 0.4, 0.1, 1.0);
  630. m_woodMat.SetSpecular(1.0, 1.0, 1.0, 1.0);
  631. m_woodMat.SetShininess(32.0);
  632. }
  633.  
  634. void CGLRenderer::SetWallMaterial()
  635. {
  636. m_wallMat.SetAmbient(0.6, 0.5, 0.4, 1.0);
  637. m_wallMat.SetDiffuse(0.9, 0.8, 0.7, 1.0);
  638. m_wallMat.SetSpecular(1.0, 1.0, 1.0, 1.0);
  639. m_wallMat.SetShininess(128.0);
  640. }
  641.  
  642. void CGLRenderer::SetFloorMaterial()
  643. {
  644. m_floorMat.SetAmbient(0.4, 0.3, 0.2, 1.0);
  645. m_floorMat.SetDiffuse(0.5, 0.4, 0.3, 1.0);
  646. m_floorMat.SetSpecular(1.0, 1.0, 1.0, 1.0);
  647. m_floorMat.SetShininess(128.0);
  648. }
  649.  
  650. void CGLRenderer::SetRedMetal()
  651. {
  652. m_metalMat.SetAmbient(0.4, 0.0, 0.0, 1.0);
  653. m_metalMat.SetDiffuse(0.8, 0.0, 0.0, 1.0);
  654. m_metalMat.SetSpecular(1.0, 1.0, 1.0, 1.0);
  655. m_metalMat.SetShininess(8.0);
  656. }
  657.  
  658. void CGLRenderer::SetBulbMaterial()
  659. {
  660. m_bulbMat.SetEmmission(1.0, 1.0, 0.8, 1.0);
  661. m_bulbMat.SetShininess(8.0);
  662. }
  663.  
  664. void CGLRenderer::PrepareTextures()
  665. {
  666. GLTexture::PrepareTexturing(true);
  667.  
  668. m_woodTex.LoadFromFile(L"ASHSEN512.bmp");
  669. m_floorTex.LoadFromFile(L"PAT39.bmp");
  670. m_wallTex.LoadFromFile(L"Wall512.bmp");
  671. m_colaTex.LoadFromFile(L"KOKAKOLA.bmp");
  672.  
  673. }
  674.  
  675. void CGLRenderer::DrawVBOBox()
  676. {
  677. PrepareVBOBox();
  678.  
  679. glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
  680.  
  681. glVertexPointer(3, GL_FLOAT, 8 * sizeof(float), (void*)0);
  682. glNormalPointer(GL_FLOAT, 8 * sizeof(float), (void*)(3 * sizeof(float)));
  683. glTexCoordPointer (2, GL_FLOAT, 8 * sizeof(float), (void*)(6 * sizeof(float)));
  684.  
  685.  
  686. glEnableClientState(GL_VERTEX_ARRAY);
  687. glEnableClientState(GL_NORMAL_ARRAY);
  688. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  689.  
  690. glDrawArrays(GL_QUADS, 0, 24);
  691.  
  692. glDisableClientState(GL_VERTEX_ARRAY);
  693. glDisableClientState(GL_NORMAL_ARRAY);
  694. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  695.  
  696. DestroyVBO();
  697. }
  698.  
  699. void CGLRenderer::SetBoxBuf(double a, double b, double c, int rx, int rz)
  700. {
  701.  
  702. double halfA = a / 2, halfB = b / 2, halfC = c / 2;
  703. int ind = 0;
  704.  
  705. // Strana 0 1 2 3
  706. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = halfC; //0
  707. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 1.0;
  708. m_box_buf[ind++] = 0; m_box_buf[ind++] = 0;
  709. m_box_buf[ind++] = halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = halfC; //1
  710. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 1.0;
  711. m_box_buf[ind++] = rx; m_box_buf[ind++] = 0;
  712. m_box_buf[ind++] = halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = halfC; //2
  713. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 1.0;
  714. m_box_buf[ind++] = rx; m_box_buf[ind++] = rz;
  715. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = halfC; //3
  716. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 1.0;
  717. m_box_buf[ind++] = 0; m_box_buf[ind++] = rz;
  718.  
  719. // Strana 1 5 6 2
  720. m_box_buf[ind++] = halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = halfC; //1
  721. m_box_buf[ind++] = 1.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0;
  722. m_box_buf[ind++] = 0; m_box_buf[ind++] = 0;
  723. m_box_buf[ind++] = halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = -halfC; //5
  724. m_box_buf[ind++] = 1.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0;
  725. m_box_buf[ind++] = rx; m_box_buf[ind++] = 0.0;
  726. m_box_buf[ind++] = halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = -halfC; //6
  727. m_box_buf[ind++] = 1.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0;
  728. m_box_buf[ind++] = rx; m_box_buf[ind++] = rz;
  729. m_box_buf[ind++] = halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = halfC; //2
  730. m_box_buf[ind++] = 1.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0;
  731. m_box_buf[ind++] = 0; m_box_buf[ind++] = rz;
  732.  
  733. // Strana 7 6 5 4
  734. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = -halfC; //7
  735. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = -1.0;
  736. m_box_buf[ind++] = 0; m_box_buf[ind++] = 0;
  737. m_box_buf[ind++] = halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = -halfC; //6
  738. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = -1.0;
  739. m_box_buf[ind++] = rx; m_box_buf[ind++] = 0;
  740. m_box_buf[ind++] = halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = -halfC; //5
  741. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = -1.0;
  742. m_box_buf[ind++] = rx; m_box_buf[ind++] = rz;
  743. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = -halfC; //4
  744. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = -1.0;
  745. m_box_buf[ind++] = 0; m_box_buf[ind++] = rz;
  746.  
  747. // Strana 0 3 7 4
  748. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = halfC; //0
  749. m_box_buf[ind++] = -1.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0;
  750. m_box_buf[ind++] = 0; m_box_buf[ind++] = 0;
  751. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = halfC; //3
  752. m_box_buf[ind++] = -1.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0;
  753. m_box_buf[ind++] = rx; m_box_buf[ind++] = 0;
  754. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = -halfC; //7
  755. m_box_buf[ind++] = -1.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0;
  756. m_box_buf[ind++] = rx; m_box_buf[ind++] = rz;
  757. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = -halfC; //4
  758. m_box_buf[ind++] = -1.0; m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 0.0;
  759. m_box_buf[ind++] = 0; m_box_buf[ind++] = rz;
  760.  
  761. // Strana 0 4 5 1
  762. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = halfC; //0
  763. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = -1.0; m_box_buf[ind++] = 0.0;
  764. m_box_buf[ind++] = 0; m_box_buf[ind++] = 0;
  765. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = -halfC; //4
  766. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = -1.0; m_box_buf[ind++] = 0.0;
  767. m_box_buf[ind++] = rx; m_box_buf[ind++] = 0;
  768. m_box_buf[ind++] = halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = -halfC; //5
  769. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = -1.0; m_box_buf[ind++] = 0.0;
  770. m_box_buf[ind++] = rx; m_box_buf[ind++] = rz;
  771. m_box_buf[ind++] = halfA; m_box_buf[ind++] = -halfB; m_box_buf[ind++] = halfC; //1
  772. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = -1.0; m_box_buf[ind++] = 0.0;
  773. m_box_buf[ind++] = 0; m_box_buf[ind++] = rz;
  774.  
  775. // Strana 7 3 2 6
  776. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = -halfC; //7
  777. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 1.0; m_box_buf[ind++] = 0.0;
  778. m_box_buf[ind++] = 0; m_box_buf[ind++] = 0;
  779. m_box_buf[ind++] = -halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = halfC; //3
  780. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 1.0; m_box_buf[ind++] = 0.0;
  781. m_box_buf[ind++] = rx; m_box_buf[ind++] = 0;
  782. m_box_buf[ind++] = halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = halfC; //2
  783. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 1.0; m_box_buf[ind++] = 0.0;
  784. m_box_buf[ind++] = rx; m_box_buf[ind++] = rz;
  785. m_box_buf[ind++] = halfA; m_box_buf[ind++] = halfB; m_box_buf[ind++] = -halfC; //6
  786. m_box_buf[ind++] = 0.0; m_box_buf[ind++] = 1.0; m_box_buf[ind++] = 0.0;
  787. m_box_buf[ind++] = 0; m_box_buf[ind++] = rz;
  788.  
  789.  
  790. }
  791.  
  792. void CGLRenderer::PrepareVBOBox()
  793. {
  794. glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
  795. glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
  796. glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
  797. glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glDeleteBuffers");
  798.  
  799. glGenBuffers(1, m_vbo);
  800.  
  801. glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
  802. glBufferData(GL_ARRAY_BUFFER, sizeof(m_box_buf), m_box_buf, GL_STATIC_DRAW);
  803.  
  804. glBindBuffer(GL_ARRAY_BUFFER, 0);
  805. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  806. }
  807.  
  808. void CGLRenderer::DestroyVBO()
  809. {
  810. glDeleteBuffers(1, m_vbo);
  811. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement