]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/dragonblocks/render_engine.cpp
Frustum & Backface Culling
[dragonblocks3d.git] / src / dragonblocks / render_engine.cpp
1 #include <stdexcept>
2 #include <glm/gtc/matrix_transform.hpp>
3 #include "FrustumCull.h"
4 #include "camera.hpp"
5 #include "gldebug.hpp"
6 #include "input_handler.hpp"
7 #include "mesh_gen_mgr.hpp"
8 #include "render_engine.hpp"
9 #include "scene.hpp"
10 #include "shader_program.hpp"
11 #include "window.hpp"
12
13 using namespace std;
14 using namespace glm;
15 using namespace dragonblocks;
16
17 void RenderEngine::render()
18 {
19         double dtime = glfwGetTime() - last_time;
20         last_time = glfwGetTime();
21         
22         input_handler->processInput(dtime);
23         
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
29
30         updateViewMatrix();     CHECKERR
31         
32         Frustum frustum(projection_matrix * view_matrix);
33         
34         scene->render(dtime, shader_program, &frustum);
35         
36         window->swapBuffers(); CHECKERR
37         glfwPollEvents(); CHECKERR
38 }
39
40 bool RenderEngine::running()
41 {
42         return ! window->shouldClose();
43 }
44
45 void RenderEngine::updateProjectionMatrix()
46 {
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
50 }
51
52 void RenderEngine::updateViewMatrix()
53 {
54         view_matrix = camera->getViewMatrix();
55         shader_program->set("view", view_matrix); CHECKERR
56 }
57
58 void RenderEngine::setSky(vec3 sky)
59 {
60         glClearColor(sky.r, sky.g, sky.b, 1.0); CHECKERR
61         shader_program->set("sky", sky); CHECKERR
62 }
63
64 void RenderEngine::setRenderDistance(double d)
65 {
66         render_distance = d;
67         updateProjectionMatrix();
68 }
69
70 void RenderEngine::setFov(double f)
71 {
72         fov = f;
73         updateProjectionMatrix();
74 }
75
76 void RenderEngine::startMeshGenMgr()
77 {
78         mesh_gen_mgr->start();
79 }
80
81 RenderEngine::RenderEngine()
82 {
83         if (! glfwInit())
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);
88         
89         window = Window::create(this);
90         camera = new Camera;
91         input_handler = new InputHandler(window);
92         mesh_gen_mgr = new MeshGenMgr;
93         scene = new Scene;
94         
95         GLenum glew_init_err = glewInit();
96         if (glew_init_err != GLEW_OK)
97                 throw runtime_error("Failed to initialize GLEW");
98
99         shader_program = new ShaderProgram("shaders");
100
101         setSky(vec3(1.0, 1.0, 1.0));
102         setRenderDistance(16);
103         setFov(45);
104         
105         last_time = glfwGetTime();
106 }
107
108 RenderEngine::~RenderEngine()
109 {
110         delete window;
111         delete camera;
112         delete input_handler;
113         delete mesh_gen_mgr;
114         delete scene;
115         delete shader_program;
116 }