Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.46 KB | None | 0 0
  1.  
  2. //#define GLM_FORCE_RADIANS
  3.  
  4. #include "Game.h"
  5. #include "3rd\glm\gtc\matrix_transform.hpp"
  6. #include "3rd\glm\glm.hpp"
  7. #include "Content.h"
  8. #include "Keyboard.h"
  9.  
  10. //moje zmiene statyczne - do obracania kamery mysza
  11. int Game::lewy = 0;
  12. int Game::prawy = 0;
  13. Game::Game(void)
  14. {
  15.  
  16. }
  17.  
  18. Game::~Game(void)
  19. {
  20. }
  21.  
  22. // inicjalizacja parametrow renderingu
  23. void Game::Init()
  24. {
  25.  
  26. // parametry polozenia i ruchu gracza
  27. sceneWidth = 10;
  28. sceneHeight = 8;
  29. rotate = -90;
  30. speed = 0.05f; // predkosc ruchu czajnika
  31. posX = 0.0f;
  32. posY = 0.0f;
  33. pocisk = posY;
  34.  
  35. theta = 1.0f;
  36. Effect::ShadersDirectory = "";
  37. glClearColor(0.6f, 0.5f, 1.0f, 1.0f );
  38.  
  39. //stworzenie figury (quada) do wyświetlania render targetów
  40. quad = new Quad();
  41.  
  42. // wczytanie tekstury
  43. tex = Content::LoadTexture("../resources/test.png");
  44.  
  45. // wczytanie modelu
  46. testModel = Content::LoadModel( "../resources/teaPot.ASE" );
  47.  
  48. //ustawienie materiału
  49. glm::mat4x4 mm;
  50. for(int i = 0; i < testModel->Elements(); i++)
  51. {
  52. //ustawienie koloru materiału dla pobranego modelu
  53. testModel->GetMesh(i)->GetMaterial().Color = glm::vec3(1,1,0);
  54. //podmiana tekstury w modelu
  55. testModel->GetMesh(i)->GetMaterial().texture = tex;
  56.  
  57. mm = testModel->GetMesh(i)->getLocalWorld();
  58. }
  59.  
  60. // drugi model (sciany na scenie)
  61. sceneModelBox = Content::LoadModel("../resources/cube.ASE");
  62. for(int i = 0; i < sceneModelBox->Elements(); i++) {
  63. sceneModelBox->GetMesh(i)->GetMaterial().Color = glm::vec3( 0.5f, 0.5f, 0.5f );
  64. }
  65.  
  66.  
  67. //////////////////////////////////////// RENDER TARGETS
  68. rtTMO = new RenderTarget2D( 800, 600, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT, GL_DEPTH24_STENCIL8 );
  69. rt = new RenderTarget2D( 800, 600, GL_RGBA32F, GL_RGBA, GL_FLOAT, GL_DEPTH24_STENCIL8 );
  70.  
  71.  
  72. /////////////////////////////////////// SHADERS
  73. // wczytanie i inicjalizacja shadera obliczajacego kolor powierzchni obiektu
  74. // wczytuje shadery (wspiera jedynie fragment (.ps) i vertex shadery (.vs), wystarczy podać nazwę pliku bez rozszerzenia)
  75. shaderColor= new Effect( "shaders/color" );
  76. // kompilacja shadera, alteratywnie można wykorzystać CreateShaderInfo, ktory wypisze w konsoli dane nt. shadera oraz ewnetualne błędy.
  77. shaderColor->CreateShader();
  78.  
  79. // wczytanie i inicjalizacja shadera obliczajacego mapowanie tonow
  80. shaderTMO = new Effect( "shaders/tmo" );
  81. shaderTMO->CreateShader();
  82.  
  83. // wczytanie i inicjalizacja shadera renderujacego obraz do framebuffera
  84. shaderTextureDrawer = new Effect( "shaders/texture" );
  85. shaderTextureDrawer->CreateShader();
  86.  
  87.  
  88. /////////////////////////////////////// KAMERA
  89. // ustawienie parametrów kamery (konstruktor przyjmuje rozdzielczość viewportu),
  90. // domyślny field of view to 45*, można zmienić metodą SetFOV(float)
  91. camera = Camera( 800, 600 );
  92. camera.setPosition(glm::vec3( 0, 0, 15 ));
  93. camera.setTarget(glm::vec3( 0, 0, 0 ));
  94. //camera.setFOV( 60.0f );
  95.  
  96. // polozenie zrodla swiatla
  97. LightPosition = glm::vec3(10,10,10);
  98. }
  99.  
  100. // obsluga klawiatury, zmiana parametrow renderingu
  101. void Game::Update()
  102. {
  103. theta += 0.02f;
  104. if(Keyboard::isPressed('W'))
  105. {
  106. LightPosition.z += 0.1f;
  107. }
  108. if(Keyboard::isPressed('S'))
  109. {
  110. LightPosition.z -= 0.1f;
  111. }
  112. if(Keyboard::isPressed('A'))
  113. {
  114. LightPosition.x -= 0.1f;
  115. }
  116. if(Keyboard::isPressed('D'))
  117. {
  118. LightPosition.x += 0.1f;
  119. }
  120.  
  121.  
  122. if(Keyboard::isPressed(GLFW_KEY_UP)) {
  123. posX = posX + speed * (float)cos( rotate * 3.14/180.0f );
  124. posY = posY - speed * (float)sin( rotate * 3.14/180.0f );
  125. }
  126. if(Keyboard::isPressed(GLFW_KEY_DOWN)) {
  127. posX = posX - speed * (float)cos( rotate * 3.14/180.0f );
  128. posY = posY + speed * (float)sin( rotate * 3.14/180.0f );
  129. }
  130.  
  131. if(Keyboard::isPressed(GLFW_KEY_RIGHT)) {
  132. rotate += 0.4f;
  133. }
  134. if(Keyboard::isPressed(GLFW_KEY_LEFT)) {
  135. rotate -= 0.4f;
  136. }
  137.  
  138. //mysz - obrot kamery dookola
  139.  
  140. if (prawy) {
  141. rotate += 0.4f;
  142. }
  143. if (lewy) {
  144. rotate -= 0.4f;
  145. }
  146.  
  147. if(Keyboard::isPressed(GLFW_KEY_ESCAPE))
  148. {
  149. glfwSetWindowShouldClose(glfwGetCurrentContext(), GL_TRUE);
  150. }
  151.  
  152. // zmiana parametrow kamery w czasie ruchu
  153. camera.setPosition(glm::vec3( posX, posY, 0.6 ));
  154.  
  155. glm::mat4 camRot = glm::rotate(glm::mat4(1.0f), (rotate+90), glm::vec3( 0.0f, 0.0f, 1.0f));
  156. glm::vec4 up = camRot * glm::vec4(0,1,0,1);
  157.  
  158. float upX = (float)cos((rotate) * 3.14 / 180);
  159. float upY = (float)sin((rotate) * 3.14 / 180);
  160. camera.setUp( glm::vec3( upX, -upY,0) );
  161.  
  162. float camTZ = 0;
  163. float camTY = posY - 3*upY;
  164. float camTX = posX + 3*upX;
  165. camera.setTarget(glm::vec3(camTX, camTY, camTZ));
  166.  
  167. // zmiana parametrow kamery w czasie ruchu 3 osoba
  168. /*camera.setPosition(glm::vec3(posX, posY, 0.6));
  169.  
  170. glm::mat4 camRot = glm::rotate(glm::mat4(1.0f), (rotate + 90), glm::vec3(0.0f, 0.0f, 1.0f));
  171. glm::vec4 up = camRot * glm::vec4(0, 1, 0, 1);
  172.  
  173. float upX = 2*((float)cos((rotate) * 3.14 / 180));
  174. float upY = 2*((float)sin((rotate) * 3.14 / 180));
  175. camera.setUp(glm::vec3(upX, -upY, 0));
  176.  
  177. float camTZ = 0;
  178. float camTY = (posY-2.0f) - 3 * upY;
  179. float camTX = posX + 3 * upX;
  180. camera.setTarget(glm::vec3(camTX, camTY, camTZ));*/
  181.  
  182. }
  183.  
  184.  
  185. // rysowanie planszy gry skladajacej sie z obiektow sceneModelBox
  186. void Game::drawScene( void ) {
  187.  
  188. int i = 0;
  189.  
  190. shaderColor->GetParameter("matColor")->SetValue(sceneModelBox->GetMesh(i)->GetMaterial().Color);
  191. shaderColor->GetParameter("mode")->SetValue(-1.0f);
  192.  
  193. //podloga
  194. this->shaderColor->GetParameter("World")->SetValue(
  195. sceneModelBox->GetMesh(i)->getLocalWorld() *
  196. glm::translate(glm::mat4(1.0f), glm::vec3( 0.0f, 5.0f, -0.5f )) *
  197. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3( 0.0f, 1.0f, 0.0f)) *
  198. glm::scale(glm::mat4(1.0f), glm::vec3( 0.001f, 0.3f , 0.3f ))
  199. );
  200.  
  201. // rysowanie modelu
  202. sceneModelBox->GetMesh(i)->Draw();
  203.  
  204. //sciana lewa
  205. this->shaderColor->GetParameter("World")->SetValue(
  206. sceneModelBox->GetMesh(i)->getLocalWorld() *
  207. glm::translate(glm::mat4(1.0f), glm::vec3(-4.67f, 5.0f, 0.9f)) *
  208. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  209. glm::scale(glm::mat4(1.0f), glm::vec3(0.1f, 0.3f, 0.01f))
  210. );
  211.  
  212. // rysowanie modelu
  213. sceneModelBox->GetMesh(i)->Draw();
  214.  
  215. //sciana prawa
  216. this->shaderColor->GetParameter("World")->SetValue(
  217. sceneModelBox->GetMesh(i)->getLocalWorld() *
  218. glm::translate(glm::mat4(1.0f), glm::vec3(4.67f, 5.0f, 0.9f)) *
  219. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  220. glm::scale(glm::mat4(1.0f), glm::vec3(0.1f, 0.3f, 0.01f))
  221. );
  222.  
  223. // rysowanie modelu
  224. sceneModelBox->GetMesh(i)->Draw();
  225.  
  226. //sciana tylna
  227. this->shaderColor->GetParameter("World")->SetValue(
  228. sceneModelBox->GetMesh(i)->getLocalWorld() *
  229. glm::translate(glm::mat4(1.0f), glm::vec3(0.1f, 14.0f, 0.9f)) *
  230. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  231. glm::scale(glm::mat4(1.0f), glm::vec3(0.10f, 0.01f, 0.32f))
  232. );
  233.  
  234. // rysowanie modelu
  235. sceneModelBox->GetMesh(i)->Draw();
  236.  
  237. //noga stolu1
  238. this->shaderColor->GetParameter("World")->SetValue(
  239. sceneModelBox->GetMesh(i)->getLocalWorld() *
  240. glm::translate(glm::mat4(1.0f), glm::vec3(-2.0f, 8.0f, 0.0f)) *
  241. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  242. glm::scale(glm::mat4(1.0f), glm::vec3(0.02f, 0.01f, 0.01f))
  243. );
  244.  
  245. // rysowanie modelu
  246. sceneModelBox->GetMesh(i)->Draw();
  247.  
  248. //noga stolu2
  249. this->shaderColor->GetParameter("World")->SetValue(
  250. sceneModelBox->GetMesh(i)->getLocalWorld() *
  251. glm::translate(glm::mat4(1.0f), glm::vec3(-2.0f, 9.0f, 0.0f)) *
  252. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  253. glm::scale(glm::mat4(1.0f), glm::vec3(0.02f, 0.01f, 0.01f))
  254. );
  255.  
  256. // rysowanie modelu
  257. sceneModelBox->GetMesh(i)->Draw();
  258.  
  259. //noga stolu3
  260. this->shaderColor->GetParameter("World")->SetValue(
  261. sceneModelBox->GetMesh(i)->getLocalWorld() *
  262. glm::translate(glm::mat4(1.0f), glm::vec3(-1.0f, 8.0f, 0.0f)) *
  263. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  264. glm::scale(glm::mat4(1.0f), glm::vec3(0.02f, 0.01f, 0.01f))
  265. );
  266.  
  267. // rysowanie modelu
  268. sceneModelBox->GetMesh(i)->Draw();
  269.  
  270. //noga stolu4
  271. this->shaderColor->GetParameter("World")->SetValue(
  272. sceneModelBox->GetMesh(i)->getLocalWorld() *
  273. glm::translate(glm::mat4(1.0f), glm::vec3(-1.0f, 9.0f, 0.0f)) *
  274. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  275. glm::scale(glm::mat4(1.0f), glm::vec3(0.02f, 0.01f, 0.01f))
  276. );
  277.  
  278. // rysowanie modelu
  279. sceneModelBox->GetMesh(i)->Draw();
  280.  
  281.  
  282. //blat
  283. this->shaderColor->GetParameter("World")->SetValue(
  284. sceneModelBox->GetMesh(i)->getLocalWorld() *
  285. glm::translate(glm::mat4(1.0f), glm::vec3(-1.5f, 7.9f, 0.3f)) *
  286. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  287. glm::scale(glm::mat4(1.0f), glm::vec3(0.0019f, 0.05f, 0.05f))
  288. );
  289.  
  290. // rysowanie modelu
  291. sceneModelBox->GetMesh(i)->Draw();
  292.  
  293. //wazon
  294. this->shaderColor->GetParameter("World")->SetValue(
  295. sceneModelBox->GetMesh(i)->getLocalWorld() *
  296. glm::translate(glm::mat4(1.0f), glm::vec3(-1.5f, 8.3f, 0.5f)) *
  297. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  298. glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.005f, 0.005f))
  299. );
  300.  
  301. // rysowanie modelu
  302. sceneModelBox->GetMesh(i)->Draw();
  303.  
  304. //lampa trzon
  305. this->shaderColor->GetParameter("World")->SetValue(
  306. sceneModelBox->GetMesh(i)->getLocalWorld() *
  307. glm::translate(glm::mat4(1.0f), glm::vec3(3.0f, 10.0f, 0.2f)) *
  308. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  309. glm::scale(glm::mat4(1.0f), glm::vec3(0.06f, 0.01f, 0.01f))
  310. );
  311.  
  312. // rysowanie modelu
  313. sceneModelBox->GetMesh(i)->Draw();
  314.  
  315. //lampa abazur
  316. this->shaderColor->GetParameter("World")->SetValue(
  317. sceneModelBox->GetMesh(i)->getLocalWorld() *
  318. glm::translate(glm::mat4(1.0f), glm::vec3(3.0f, 9.9f, 1.4f)) *
  319. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(0.0f, 1.0f, 0.0f)) *
  320. glm::scale(glm::mat4(1.0f), glm::vec3(0.02f, 0.02f, 0.02f))
  321. );
  322.  
  323. // rysowanie modelu
  324. sceneModelBox->GetMesh(i)->Draw();
  325.  
  326. if (Keyboard::isPressed('P'))
  327. {
  328. this->shaderColor->GetParameter("World")->SetValue(
  329. sceneModelBox->GetMesh(i)->getLocalWorld() *
  330. glm::translate(glm::mat4(1.0f), glm::vec3(posX, posY+pocisk, posY)) *
  331. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(1.0f, 0.0f, 0.0f)) *
  332. glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.01f, 0.01f))
  333. );
  334.  
  335. // rysowanie modelu
  336. sceneModelBox->GetMesh(i)->Draw();
  337. pocisk += 0.1f;
  338. }
  339. else
  340. pocisk = posY;
  341.  
  342. }
  343.  
  344.  
  345. // rysowanie sceny (glowna petla)
  346. void Game::Redraw()
  347. {
  348. //ustawienie textury do ktorej chcemy renderować
  349. rt->SetRenderTarget();
  350. glClearColor(0.6f, 0.5f, 1.0f, 1.0f);
  351. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  352.  
  353. //ustawienie shadera e jako aktywnego
  354. shaderColor->Apply();
  355. //ustawienie macierzy widoku i projekcji
  356. shaderColor->GetParameter("View")->SetValue(camera.getView());
  357. shaderColor->GetParameter("Projection")->SetValue(camera.getProjection());
  358. //ustawienie pozycji światła i camery
  359. shaderColor->GetParameter("LightPosition")->SetValue(LightPosition);
  360. shaderColor->GetParameter("EyePosition")->SetValue(camera.getPosition());
  361.  
  362. int i = 0;
  363.  
  364. //ustawienie koloru materiału
  365. shaderColor->GetParameter("matColor")->SetValue(testModel->GetMesh(i)->GetMaterial().Color);
  366.  
  367. if(testModel->GetMesh(i)->GetMaterial().texture != NULL)
  368. {
  369. //jeśli mamy teksturę to ją bindujemy i ustawiamy tryb teskturowania w shaderze
  370. shaderColor->GetParameter("mode")->SetValue(1.0f);
  371. shaderColor->GetParameter("tex")->SetValue(*testModel->GetMesh(i)->GetMaterial().texture);
  372. }
  373. else
  374. {
  375. //włączenie trybu bez tekstury
  376. shaderColor->GetParameter("mode")->SetValue(-1.0f);
  377. }
  378.  
  379. // ustawienie transformacji obiektu
  380. // model może się składać z kilku części (meshy) które znajdują się w przestrzeni lokalnej modelu,
  381. // musimy skorygować ich pozycję i przekształcić do przestrzeni naszego świata,
  382. // w tym celu wyciągamy macierz transformacji mesha testModel->GetMesh(i)->getLocalWorld(),
  383. // a następnie przekształcamy w podobny sposób jak w starszych wersjach OpenGL
  384.  
  385. for(int i = 0; i < testModel->Elements(); i++) {
  386.  
  387. shaderColor->GetParameter("World")->SetValue(
  388.  
  389. testModel->GetMesh(i)->getLocalWorld() *
  390. glm::translate(glm::mat4(1.0f), glm::vec3( posX, posY, 0 )) *
  391. glm::rotate(glm::mat4(1.0f), -rotate, glm::vec3( 0.0f, 0.0f, 1.0f )) *
  392. glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3( 1.0f, 0.0f, 0.0f )) *
  393.  
  394. glm::scale(glm::mat4(1.0f), glm::vec3( 0.1, 0.1, 0.1 ))
  395. );
  396.  
  397. // rysowanie modelu
  398. testModel->GetMesh(i)->Draw();
  399. }
  400.  
  401. // rysowanie sceny
  402. drawScene();
  403.  
  404.  
  405. // mapowanie tonow za pomoca drugiego shadera, wynik renderowany jest do drugiego render targetu (rtTMO)
  406. rtTMO->SetRenderTarget();
  407. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  408. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  409. shaderTMO->Apply();
  410. shaderTMO->GetParameter("tex")->SetValue(*rt);
  411. shaderTMO->GetParameter("gamma")->SetValue(1.6f);
  412. quad->Draw(0, 0, 800, 600, shaderTMO->GetParameter("World"));
  413.  
  414. //rendering na ekran (do framebuffera)
  415. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  416. glViewport(0, 0, 800, 600);
  417. glClearColor(0.0, 0.0, 0.0, 0.0); //zmiana glClearColor by sprawdzić czy faktycznie wyrenderowaliśmy coś do tekstury
  418. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  419. shaderTextureDrawer->Apply();
  420. quad->Draw(0, 0, 800, 600, shaderTextureDrawer->GetParameter("World"));
  421.  
  422. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement