VEndymionV

Game.cpp

Jan 8th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.28 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.     mov = 0.0f;
  23.     scale = 0.01f;
  24.     // przesuniecie boxa
  25.     var = 0.0f;
  26.     direction = 0;
  27.     // parametry polozenia i ruchu gracza
  28.     sceneWidth = 10;
  29.     sceneHeight = 8;
  30.     rotate = -90;
  31.     speed = 0.05f; // predkosc ruchu czajnika
  32.     posX = 0.0f;
  33.     posY = 0.0f;
  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.         mov += 0.01f;
  124.     }
  125.     if(Keyboard::isPressed(GLFW_KEY_DOWN)) {
  126.         mov -= 0.01f;
  127.     }
  128.  
  129.     if(Keyboard::isPressed(GLFW_KEY_RIGHT)) {
  130.         scale += 0.001f;
  131.         //rotate += 0.4f;
  132.     }
  133.     if(Keyboard::isPressed(GLFW_KEY_LEFT)) {
  134.         //rotate -= 0.4f;
  135.         scale -= 0.001f;
  136.     }
  137.  
  138.     if(Keyboard::isPressed(GLFW_KEY_ESCAPE))
  139.     {
  140.         glfwSetWindowShouldClose(glfwGetCurrentContext(), GL_TRUE);
  141.     }
  142.  
  143.     // zmiana parametrow kamery w czasie ruchu
  144.     camera.setPosition(glm::vec3( posX, posY, 0.6 ));
  145.    
  146.     glm::mat4 camRot = glm::rotate(glm::mat4(1.0f), (rotate+90), glm::vec3( 0.0f, 0.0f, 1.0f));
  147.     glm::vec4 up = camRot * glm::vec4(0,1,0,1);
  148.  
  149.     float upX = (float)cos((rotate) * 3.14 / 180);
  150.     float upY = (float)sin((rotate) * 3.14 / 180);
  151.     camera.setUp( glm::vec3( upX, -upY,0) );
  152.  
  153.     float camTZ = 0;
  154.     float camTY = posY - 3*upY;
  155.     float camTX = posX + 3*upX;
  156.     camera.setTarget(glm::vec3(camTX, camTY, camTZ));
  157.  
  158. }
  159.  
  160.  
  161. // rysowanie planszy gry skladajacej sie z obiektow sceneModelBox
  162. void Game::drawScene( void ) {
  163.  
  164.     int i = 0;
  165.  
  166.     shaderColor->GetParameter("matColor")->SetValue(sceneModelBox->GetMesh(i)->GetMaterial().Color);
  167.     shaderColor->GetParameter("mode")->SetValue(-1.0f);
  168.  
  169.     this->shaderColor->GetParameter("World")->SetValue(
  170.         sceneModelBox->GetMesh(i)->getLocalWorld() *
  171.         glm::translate(glm::mat4(1.0f), glm::vec3(var, 10.0f, 0.0f)) *
  172.         glm::rotate(glm::mat4(1.0f), 0.0f, glm::vec3(1.0f, 0.0f, 0.0f)) *
  173.         glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.01f, 0.04f))
  174.     );
  175.     // rysowanie modelu
  176.     sceneModelBox->GetMesh(i)->Draw();
  177.  
  178.     this->shaderColor->GetParameter("World")->SetValue(
  179.         sceneModelBox->GetMesh(i)->getLocalWorld() *
  180.         glm::translate(glm::mat4(1.0f), glm::vec3(2.0f, 10.0f, mov)) *
  181.         glm::rotate(glm::mat4(1.0f), 0.0f, glm::vec3(1.0f, 0.0f, 0.0f)) *
  182.         glm::scale(glm::mat4(1.0f), glm::vec3(0.01f, 0.01f, scale))
  183.     );
  184.     // rysowanie modelu
  185.     sceneModelBox->GetMesh(i)->Draw();
  186.  
  187.     if (direction)
  188.     {
  189.         var -= 0.05f;
  190.     }
  191.     else
  192.     {
  193.         var += 0.05f;
  194.     }
  195.     if (var >= 5.0f)
  196.     {
  197.         direction = 1;
  198.     }
  199.     if (var <= 0.0f)
  200.     {
  201.         direction = 0;
  202.     }
  203. }
  204.  
  205.  
  206. // rysowanie sceny (glowna petla)
  207. void Game::Redraw()
  208. {
  209.     //ustawienie textury do ktorej chcemy renderować
  210.     rt->SetRenderTarget();
  211.     glClearColor(0.6f, 0.5f, 1.0f, 1.0f);
  212.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  213.    
  214.     //ustawienie shadera e jako aktywnego
  215.     shaderColor->Apply();
  216.     //ustawienie macierzy widoku i projekcji
  217.     shaderColor->GetParameter("View")->SetValue(camera.getView());
  218.     shaderColor->GetParameter("Projection")->SetValue(camera.getProjection());
  219.     //ustawienie pozycji światła i camery
  220.     shaderColor->GetParameter("LightPosition")->SetValue(LightPosition);
  221.     shaderColor->GetParameter("EyePosition")->SetValue(camera.getPosition());
  222.  
  223.     int i = 0;
  224.  
  225.     //ustawienie koloru materiału
  226.     shaderColor->GetParameter("matColor")->SetValue(testModel->GetMesh(i)->GetMaterial().Color);
  227.  
  228.     if(testModel->GetMesh(i)->GetMaterial().texture != NULL)
  229.     {
  230.         //jeśli mamy teksturę to ją bindujemy i ustawiamy tryb teskturowania w shaderze
  231.         shaderColor->GetParameter("mode")->SetValue(1.0f);
  232.         shaderColor->GetParameter("tex")->SetValue(*testModel->GetMesh(i)->GetMaterial().texture);
  233.     }
  234.     else
  235.     {
  236.         //włączenie trybu bez tekstury
  237.         shaderColor->GetParameter("mode")->SetValue(-1.0f);
  238.     }
  239.  
  240.     // ustawienie transformacji obiektu
  241.     // model może się składać z kilku części (meshy) które znajdują się w przestrzeni lokalnej modelu,
  242.     // musimy skorygować ich pozycję i przekształcić do przestrzeni naszego świata,
  243.     // w tym celu wyciągamy macierz transformacji mesha testModel->GetMesh(i)->getLocalWorld(),
  244.     // a następnie przekształcamy w podobny sposób jak w starszych wersjach OpenGL
  245.  
  246.     for(int i = 0; i < testModel->Elements(); i++) {
  247.  
  248.         shaderColor->GetParameter("World")->SetValue(
  249.            
  250.             testModel->GetMesh(i)->getLocalWorld() *
  251.                 glm::translate(glm::mat4(1.0f), glm::vec3( posX, posY, 0 )) *
  252.                 glm::rotate(glm::mat4(1.0f), -rotate, glm::vec3( 0.0f, 0.0f, 1.0f )) *
  253.                 glm::rotate(glm::mat4(1.0f), 90.0f, glm::vec3( 1.0f, 0.0f, 0.0f )) *
  254.        
  255.                 glm::scale(glm::mat4(1.0f), glm::vec3( 0.1, 0.1, 0.1 ))
  256.                 );
  257.  
  258.         // rysowanie modelu
  259.         testModel->GetMesh(i)->Draw();
  260.     }
  261.  
  262.     // rysowanie sceny
  263.     drawScene();
  264.  
  265.  
  266.     // mapowanie tonow za pomoca drugiego shadera, wynik renderowany jest do drugiego render targetu (rtTMO)
  267.     rtTMO->SetRenderTarget();
  268.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  269.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  270.     shaderTMO->Apply();
  271.     shaderTMO->GetParameter("tex")->SetValue(*rt);
  272.     shaderTMO->GetParameter("gamma")->SetValue(1.6f);
  273.     quad->Draw(0, 0, 800, 600, shaderTMO->GetParameter("World"));
  274.        
  275.     //rendering na ekran (do framebuffera)
  276.     glBindFramebuffer(GL_FRAMEBUFFER, 0);
  277.     glViewport(0, 0, 800, 600);
  278.     glClearColor(0.0, 0.0, 0.0, 0.0); //zmiana glClearColor by sprawdzić czy faktycznie wyrenderowaliśmy coś do tekstury
  279.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  280.     shaderTextureDrawer->Apply();
  281.     quad->Draw(0, 0, 800, 600, shaderTextureDrawer->GetParameter("World"));
  282.  
  283. }
Advertisement
Add Comment
Please, Sign In to add comment