Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.92 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. Game::Game(void)
  11. {
  12.    
  13. }
  14.  
  15. Game::~Game(void)
  16. {
  17. }
  18.  
  19. // inicjalizacja parametrow renderingu
  20. void Game::Init()
  21. {
  22.    
  23.     // parametry polozenia i ruchu gracza
  24.     sceneWidth = 10;
  25.     sceneHeight = 8;
  26.     rotate = -90;
  27.     speed = 0.05f; // predkosc ruchu czajnika
  28.     posX = 0.0f;
  29.     posY = 0.0f;
  30.  
  31.     ruch = 0.01f;   // ruch kostki
  32.     zmianaruchu = 0.05;
  33.  
  34.     polozeniekostki = 0.01f;
  35.     wielkosckostki = 0.01f;
  36.  
  37.     theta = 1.0f;
  38.     Effect::ShadersDirectory = "";
  39.     glClearColor(0.6f, 0.5f, 1.0f, 1.0f );
  40.  
  41.     //stworzenie figury (quada) do wyświetlania render targetów
  42.     quad = new Quad();
  43.  
  44.     // wczytanie tekstury
  45.     tex = Content::LoadTexture("../resources/test.png");
  46.  
  47.     // wczytanie modelu
  48.     testModel = Content::LoadModel( "../resources/teaPot.ASE" );
  49.  
  50.     //ustawienie materiału
  51.     glm::mat4x4 mm;
  52.     for(int i = 0; i < testModel->Elements(); i++)
  53.     {
  54.         //ustawienie koloru materiału dla pobranego modelu
  55.         testModel->GetMesh(i)->GetMaterial().Color = glm::vec3(1,1,0);
  56.         //podmiana tekstury w modelu
  57.         testModel->GetMesh(i)->GetMaterial().texture = tex;
  58.  
  59.         mm = testModel->GetMesh(i)->getLocalWorld();
  60.     }
  61.  
  62.     // drugi model (sciany na scenie)
  63.     sceneModelBox = Content::LoadModel("../resources/cube.ASE");
  64.     for(int i = 0; i < sceneModelBox->Elements(); i++) {
  65.         sceneModelBox->GetMesh(i)->GetMaterial().Color = glm::vec3( 0.5f, 0.5f, 0.5f );
  66.     }
  67.  
  68.  
  69.     //////////////////////////////////////// RENDER TARGETS
  70.     rtTMO = new RenderTarget2D( 800, 600, GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT, GL_DEPTH24_STENCIL8 );
  71.     rt = new RenderTarget2D( 800, 600, GL_RGBA32F, GL_RGBA, GL_FLOAT, GL_DEPTH24_STENCIL8 );
  72.  
  73.  
  74.     /////////////////////////////////////// SHADERS
  75.     // wczytanie i inicjalizacja shadera obliczajacego kolor powierzchni obiektu
  76.     // wczytuje shadery (wspiera jedynie fragment (.ps) i vertex shadery (.vs), wystarczy podać nazwę pliku bez rozszerzenia)
  77.     shaderColor= new Effect( "shaders/color" );
  78.     // kompilacja shadera, alteratywnie można wykorzystać CreateShaderInfo, ktory wypisze w konsoli dane nt. shadera oraz ewnetualne błędy.
  79.     shaderColor->CreateShader();
  80.  
  81.     // wczytanie i inicjalizacja shadera obliczajacego mapowanie tonow
  82.     shaderTMO = new Effect( "shaders/tmo" );
  83.     shaderTMO->CreateShader();
  84.  
  85.     // wczytanie i inicjalizacja shadera renderujacego obraz do framebuffera
  86.     shaderTextureDrawer = new Effect( "shaders/texture" );
  87.     shaderTextureDrawer->CreateShader();
  88.  
  89.  
  90.     /////////////////////////////////////// KAMERA
  91.     // ustawienie parametrów kamery (konstruktor przyjmuje rozdzielczość viewportu),
  92.     // domyślny field of view to 45*, można zmienić metodą SetFOV(float)
  93.     camera = Camera( 800, 600 );
  94.     camera.setPosition(glm::vec3( 0, 0, 15 ));
  95.     camera.setTarget(glm::vec3( 0, 0, 0 ));
  96.     //camera.setFOV( 60.0f );
  97.  
  98.     // polozenie zrodla swiatla
  99.     LightPosition = glm::vec3(10,10,10);
  100. }
  101.  
  102. // obsluga klawiatury, zmiana parametrow renderingu
  103. void Game::Update()
  104. {
  105.     theta += 0.02f;
  106.     if(Keyboard::isPressed('W'))
  107.     {
  108.         LightPosition.z += 0.1f;
  109.     }
  110.     if(Keyboard::isPressed('S'))
  111.     {
  112.         LightPosition.z -= 0.1f;
  113.     }
  114.     if(Keyboard::isPressed('A'))
  115.     {
  116.         LightPosition.x -= 0.1f;
  117.     }
  118.     if(Keyboard::isPressed('D'))
  119.     {
  120.         LightPosition.x += 0.1f;
  121.     }
  122.     if(Keyboard::isPressed('H'))
  123.     {
  124.         polozeniekostki += 0.02f;
  125.     }
  126.     if(Keyboard::isPressed('N'))
  127.     {
  128.         polozeniekostki = polozeniekostki - 0.02f;
  129.     }
  130.     if(Keyboard::isPressed('J'))
  131.     {
  132.         wielkosckostki += 0.001f;
  133.     }
  134.     if(Keyboard::isPressed('M'))
  135.     {
  136.         wielkosckostki -= 0.001f;
  137.     }
  138.    
  139.  
  140.  
  141.     if(Keyboard::isPressed(GLFW_KEY_UP)) {
  142.         posX = posX + speed * (float)cos( rotate * 3.14/180.0f );
  143.         posY = posY - speed * (float)sin( rotate * 3.14/180.0f );
  144.     }
  145.     if(Keyboard::isPressed(GLFW_KEY_DOWN)) {
  146.         posX = posX - speed * (float)cos( rotate * 3.14/180.0f );
  147.         posY = posY + speed * (float)sin( rotate * 3.14/180.0f );
  148.     }
  149.  
  150.     if(Keyboard::isPressed(GLFW_KEY_RIGHT)) {
  151.         rotate += 0.4f;
  152.     }
  153.     if(Keyboard::isPressed(GLFW_KEY_LEFT)) {
  154.         rotate -= 0.4f;
  155.     }
  156.  
  157.     if(Keyboard::isPressed(GLFW_KEY_ESCAPE))
  158.     {
  159.         glfwSetWindowShouldClose(glfwGetCurrentContext(), GL_TRUE);
  160.     }
  161.  
  162.     // zmiana parametrow kamery w czasie ruchu
  163.     camera.setPosition(glm::vec3( posX, posY, 0.6 ));
  164.    
  165.     glm::mat4 camRot = glm::rotate(glm::mat4(1.0f), (rotate+90), glm::vec3( 0.0f, 0.0f, 1.0f));
  166.     glm::vec4 up = camRot * glm::vec4(0,1,0,1);
  167.  
  168.     float upX = (float)cos((rotate) * 3.14 / 180);
  169.     float upY = (float)sin((rotate) * 3.14 / 180);
  170.     camera.setUp( glm::vec3( upX, -upY,0) );
  171.  
  172.     float camTZ = 0;
  173.     float camTY = posY - 3*upY;
  174.     float camTX = posX + 3*upX;
  175.     camera.setTarget(glm::vec3(camTX, camTY, camTZ));
  176.  
  177. }
  178.  
  179.  
  180. // rysowanie planszy gry skladajacej sie z obiektow sceneModelBox
  181. void Game::drawScene(void) {
  182.  
  183.     int i = 0;
  184.  
  185.     shaderColor->GetParameter("matColor")->SetValue(sceneModelBox->GetMesh(i)->GetMaterial().Color);
  186.     shaderColor->GetParameter("mode")->SetValue(-1.0f);
  187.  
  188.     // kostka automatyczna
  189.     this->shaderColor->GetParameter("World")->SetValue(
  190.         sceneModelBox->GetMesh(i)->getLocalWorld() *
  191.         glm::translate(glm::mat4(1.0f), glm::vec3(ruch, 0.0f, 0.0f)) *
  192.         glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(1.0f, 0.0f, 0.0f)) *
  193.         glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.01f, 0.01f))
  194.     );
  195.  
  196.     // rysowanie modelu
  197.     sceneModelBox->GetMesh(i)->Draw();
  198.  
  199.     ruch=ruch+zmianaruchu;
  200.     if (ruch > 2){
  201.         zmianaruchu=-0.05;
  202.     }
  203.     if (ruch < -2){
  204.         zmianaruchu=0.05;
  205.     }
  206.  
  207.     ///// kostka reczna
  208.     this->shaderColor->GetParameter("World")->SetValue(
  209.         sceneModelBox->GetMesh(i)->getLocalWorld() *
  210.         glm::translate(glm::mat4(1.0f), glm::vec3(0.01f, 0.0f, polozeniekostki)) *
  211.         glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3(1.0f, 0.0f, 0.0f)) *
  212.         glm::scale(glm::mat4(1.0f), glm::vec3(0.01, wielkosckostki, 0.01f))
  213.     );
  214.  
  215.     // rysowanie modelu
  216.     sceneModelBox->GetMesh(i)->Draw();
  217.  
  218.  
  219.     //Kolizja - jeszcze nie dziala
  220.     if (polozeniekostki > 0)
  221.     {
  222.         wysokosckostki
  223.  
  224.     wysokosckostki=
  225.     if (polozeniekostki < 0 && wysokosckostki
  226. }
  227.  
  228.  
  229. // rysowanie sceny (glowna petla)
  230. void Game::Redraw()
  231. {
  232.     //ustawienie textury do ktorej chcemy renderować
  233.     rt->SetRenderTarget();
  234.     glClearColor(0.6f, 0.5f, 1.0f, 1.0f);
  235.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  236.    
  237.     //ustawienie shadera e jako aktywnego
  238.     shaderColor->Apply();
  239.     //ustawienie macierzy widoku i projekcji
  240.     shaderColor->GetParameter("View")->SetValue(camera.getView());
  241.     shaderColor->GetParameter("Projection")->SetValue(camera.getProjection());
  242.     //ustawienie pozycji światła i camery
  243.     shaderColor->GetParameter("LightPosition")->SetValue(LightPosition);
  244.     shaderColor->GetParameter("EyePosition")->SetValue(camera.getPosition());
  245.  
  246.     int i = 0;
  247.  
  248.     //ustawienie koloru materiału
  249.     shaderColor->GetParameter("matColor")->SetValue(testModel->GetMesh(i)->GetMaterial().Color);
  250.  
  251.     if(testModel->GetMesh(i)->GetMaterial().texture != NULL)
  252.     {
  253.         //jeśli mamy teksturę to ją bindujemy i ustawiamy tryb teskturowania w shaderze
  254.         shaderColor->GetParameter("mode")->SetValue(1.0f);
  255.         shaderColor->GetParameter("tex")->SetValue(*testModel->GetMesh(i)->GetMaterial().texture);
  256.     }
  257.     else
  258.     {
  259.         //włączenie trybu bez tekstury
  260.         shaderColor->GetParameter("mode")->SetValue(-1.0f);
  261.     }
  262.  
  263.     // ustawienie transformacji obiektu
  264.     // model może się składać z kilku części (meshy) które znajdują się w przestrzeni lokalnej modelu,
  265.     // musimy skorygować ich pozycję i przekształcić do przestrzeni naszego świata,
  266.     // w tym celu wyciągamy macierz transformacji mesha testModel->GetMesh(i)->getLocalWorld(),
  267.     // a następnie przekształcamy w podobny sposób jak w starszych wersjach OpenGL
  268.  
  269.     for(int i = 0; i < testModel->Elements(); i++) {
  270.  
  271.         shaderColor->GetParameter("World")->SetValue(
  272.            
  273.             testModel->GetMesh(i)->getLocalWorld() *
  274.                 glm::translate(glm::mat4(1.0f), glm::vec3( posX, posY, 0 )) *
  275.                 glm::rotate(glm::mat4(1.0f), -rotate, glm::vec3( 0.0f, 0.0f, 1.0f )) *
  276.                 glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3( 1.0f, 0.0f, 0.0f )) *
  277.        
  278.                 glm::scale(glm::mat4(1.0f), glm::vec3( 0.1, 0.1, 0.1 ))
  279.                 );
  280.  
  281.         // rysowanie modelu
  282.         testModel->GetMesh(i)->Draw();
  283.     }
  284.  
  285.     // rysowanie sceny
  286.     drawScene();
  287.  
  288.  
  289.     // mapowanie tonow za pomoca drugiego shadera, wynik renderowany jest do drugiego render targetu (rtTMO)
  290.     rtTMO->SetRenderTarget();
  291.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  292.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  293.     shaderTMO->Apply();
  294.     shaderTMO->GetParameter("tex")->SetValue(*rt);
  295.     shaderTMO->GetParameter("gamma")->SetValue(1.6f);
  296.     quad->Draw(0, 0, 800, 600, shaderTMO->GetParameter("World"));
  297.        
  298.     //rendering na ekran (do framebuffera)
  299.     glBindFramebuffer(GL_FRAMEBUFFER, 0);
  300.     glViewport(0, 0, 800, 600);
  301.     glClearColor(0.0, 0.0, 0.0, 0.0); //zmiana glClearColor by sprawdzić czy faktycznie wyrenderowaliśmy coś do tekstury
  302.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  303.     shaderTextureDrawer->Apply();
  304.     quad->Draw(0, 0, 800, 600, shaderTextureDrawer->GetParameter("World"));
  305.  
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement