]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/dragonblocks/render_engine.cpp
Added player, refactored mesh code
[dragonblocks3d.git] / src / dragonblocks / render_engine.cpp
1 #include <stdexcept>
2 #include <glm/gtc/matrix_transform.hpp>
3 #include "camera.hpp"
4 #include "gldebug.hpp"
5 #include "input_handler.hpp"
6 #include "mesh_gen_mgr.hpp"
7 #include "render_engine.hpp"
8 #include "scene.hpp"
9 #include "shader_program.hpp"
10 #include "window.hpp"
11
12 using namespace std;
13 using namespace glm;
14 using namespace dragonblocks;
15
16 void RenderEngine::render()
17 {
18         double dtime = glfwGetTime() - last_time;
19         last_time = glfwGetTime();
20         
21         input_handler->processInput(dtime);
22         
23         glEnable(GL_DEPTH_TEST); CHECKERR
24         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); CHECKERR
25
26         updateViewMatrix();     CHECKERR
27         
28         scene->render(dtime, shader_program);
29         
30         window->swapBuffers(); CHECKERR
31         glfwPollEvents(); CHECKERR
32 }
33
34 bool RenderEngine::running()
35 {
36         return ! window->shouldClose();
37 }
38
39 void RenderEngine::updateProjectionMatrix()
40 {
41         dvec2 bounds = window->getSize();
42         mat4 projection_matrix = perspective(radians(fov), bounds.x / bounds.y, 0.01, render_distance);
43         shader_program->set("projection", projection_matrix); CHECKERR
44 }
45
46 void RenderEngine::updateViewMatrix()
47 {
48         shader_program->set("view", camera->getViewMatrix()); CHECKERR
49 }
50
51 void RenderEngine::setSky(vec3 sky)
52 {
53         glClearColor(sky.r, sky.g, sky.b, 1.0); CHECKERR
54         shader_program->set("sky", sky); CHECKERR
55 }
56
57 void RenderEngine::setRenderDistance(double d)
58 {
59         render_distance = d;
60         updateProjectionMatrix();
61 }
62
63 void RenderEngine::setFov(double f)
64 {
65         fov = f;
66         updateProjectionMatrix();
67 }
68
69 void RenderEngine::startMeshGenMgr()
70 {
71         mesh_gen_mgr->start();
72 }
73
74 RenderEngine::RenderEngine()
75 {
76         if (! glfwInit())
77                 throw runtime_error("Failed to initialize GLFW");
78         glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
79         glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
80         glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
81         
82         window = Window::create(this);
83         camera = new Camera;
84         input_handler = new InputHandler(window);
85         mesh_gen_mgr = new MeshGenMgr;
86         scene = new Scene;
87         
88         GLenum glew_init_err = glewInit();
89         if (glew_init_err != GLEW_OK)
90                 throw runtime_error("Failed to initialize GLEW");
91
92         shader_program = new ShaderProgram("shaders");
93
94         setSky(vec3(1.0, 1.0, 1.0));
95         setRenderDistance(16);
96         setFov(45);
97         
98         last_time = glfwGetTime();
99 }
100
101 RenderEngine::~RenderEngine()
102 {
103         delete window;
104         delete camera;
105         delete input_handler;
106         delete mesh_gen_mgr;
107         delete scene;
108         delete shader_program;
109 }