2 #include <glm/gtc/matrix_transform.hpp>
3 #include "FrustumCull.h"
6 #include "input_handler.hpp"
7 #include "mesh_gen_mgr.hpp"
8 #include "render_engine.hpp"
10 #include "shader_program.hpp"
15 using namespace dragonblocks;
17 void RenderEngine::render()
19 double dtime = glfwGetTime() - last_time;
20 last_time = glfwGetTime();
22 input_handler->processInput(dtime);
24 glEnable(GL_DEPTH_TEST); CHECKERR
25 glEnable(GL_CULL_FACE); CHECKERR
26 glCullFace(GL_BACK); CHECKERR
27 glFrontFace(GL_CW); CHECKERR
28 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); CHECKERR
30 updateViewMatrix(); CHECKERR
32 Frustum frustum(projection_matrix * view_matrix);
34 scene->render(dtime, shader_program, &frustum);
36 window->swapBuffers(); CHECKERR
37 glfwPollEvents(); CHECKERR
40 bool RenderEngine::running()
42 return ! window->shouldClose();
45 void RenderEngine::updateProjectionMatrix()
47 dvec2 bounds = window->getSize();
48 projection_matrix = perspective(radians(fov), bounds.x / bounds.y, 0.01, render_distance);
49 shader_program->set("projection", projection_matrix); CHECKERR
52 void RenderEngine::updateViewMatrix()
54 view_matrix = camera->getViewMatrix();
55 shader_program->set("view", view_matrix); CHECKERR
58 void RenderEngine::setSky(vec3 sky)
60 glClearColor(sky.r, sky.g, sky.b, 1.0); CHECKERR
61 shader_program->set("sky", sky); CHECKERR
64 void RenderEngine::setRenderDistance(double d)
67 updateProjectionMatrix();
70 void RenderEngine::setFov(double f)
73 updateProjectionMatrix();
76 void RenderEngine::startMeshGenMgr()
78 mesh_gen_mgr->start();
81 RenderEngine::RenderEngine()
84 throw runtime_error("Failed to initialize GLFW");
85 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
86 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
87 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
89 window = Window::create(this);
91 input_handler = new InputHandler(window);
92 mesh_gen_mgr = new MeshGenMgr;
95 GLenum glew_init_err = glewInit();
96 if (glew_init_err != GLEW_OK)
97 throw runtime_error("Failed to initialize GLEW");
99 shader_program = new ShaderProgram("shaders");
101 setSky(vec3(1.0, 1.0, 1.0));
102 setRenderDistance(16);
105 last_time = glfwGetTime();
108 RenderEngine::~RenderEngine()
112 delete input_handler;
115 delete shader_program;