lmgl 1.0.0
A lightweight OpenGL graphics engine library written in C++
Loading...
Searching...
No Matches
renderer.hpp
Go to the documentation of this file.
1
13
14#pragma once
15
18#include "lmgl/scene/camera.hpp"
19#include "lmgl/scene/mesh.hpp"
20#include "lmgl/scene/node.hpp"
21#include "lmgl/scene/scene.hpp"
22
23#include <memory>
24#include <vector>
25
26namespace lmgl {
27
34namespace renderer {
35
43enum class RenderMode { Solid = 0, Wireframe, Points };
44
52enum class RenderLayer { Skybox = 0, Opaque = 100, Transparent = 200, UI = 300 };
53
61class Renderer {
62 public:
68 Renderer();
69
75 ~Renderer() = default;
76
88 void render(std::shared_ptr<scene::Scene> scene, std::shared_ptr<scene::Camera> camera);
89
99 void set_render_mode(RenderMode mode);
100
110 void set_culling(bool enabled);
111
120 void set_depth_test(bool enabled);
121
130 void set_blending(bool enabled);
131
139 inline RenderMode get_render_mode() const { return m_render_mode; }
140
149 inline unsigned int get_draw_calls() const { return m_draw_calls; }
150
159 inline unsigned int get_triangles_count() const { return m_triangles_count; }
160
167 void resize(int width, int height);
168
179 inline void set_tone_map_mode(int mode) { m_tone_map_mode = mode; }
180
186 inline void set_exposure(float exposure) { m_exposure = exposure; }
187
193 inline void set_gamma(float gamma) { m_gamma = gamma; }
194
200 void enable_post_processing(bool enabled);
201
207 inline void set_bloom_enabled(bool enabled) { m_bloom_enabled = enabled; }
208
216 inline void set_bloom_threshold(float threshold) { m_bloom_threshold = threshold; }
217
223 inline void set_bloom_intensity(float intensity) { m_bloom_intensity = intensity; }
224
236 void setup_shadows(std::shared_ptr<scene::Scene> scene, std::shared_ptr<Shader> shader,
237 bool enable_point = true, bool enable_directional = true);
238
239 private:
241 RenderMode m_render_mode;
242
244 unsigned int m_draw_calls;
245
247 unsigned int m_triangles_count;
248
250 bool m_depth_test_enabled;
251
253 bool m_culling_enabled;
254
256 bool m_blending_enabled;
257
259 std::vector<std::shared_ptr<scene::Light>> m_directional_lights;
260
262 std::vector<std::shared_ptr<scene::Light>> m_point_lights;
263
265 std::vector<std::shared_ptr<scene::Light>> m_spot_lights;
266
268 std::shared_ptr<scene::Material> m_default_material;
269
271 std::shared_ptr<scene::Material> m_last_bound_material;
272
274 std::unique_ptr<Framebuffer> m_framebuffer;
275
277 std::unique_ptr<Framebuffer> m_bright_framebuffer;
278
280 std::unique_ptr<Framebuffer> m_blur_framebuffer[2];
281
283 std::shared_ptr<Shader> m_postprocess_shader;
284
286 std::shared_ptr<Shader> m_bright_pass_shader;
287
289 std::shared_ptr<Shader> m_blur_shader;
290
292 std::shared_ptr<scene::Mesh> m_screen_quad;
293
295 int m_tone_map_mode = 2;
296
298 float m_exposure = 1.0f;
299
301 float m_gamma = 2.2f;
302
304 int m_window_width = 1920;
305 int m_window_height = 1080;
306
308 bool m_bloom_enabled = true;
309
311 float m_bloom_threshold = 1.0f;
312
314 float m_bloom_intensity = 0.5f;
315
317 std::shared_ptr<ShadowMap> m_shadow_map;
318
320 std::shared_ptr<CubemapShadowMap> m_cubemap_shadow_map;
321
323 std::unique_ptr<ShadowRenderer> m_shadow_renderer;
324
326 bool m_shadow_enabled = false;
327 glm::vec3 m_shadow_light_pos = glm::vec3(0.0f);
328 float m_shadow_far_plane = 1.0f;
329 glm::mat4 m_light_space_matrix = glm::mat4(1.0f);
330
337 struct RenderItem {
338
340 std::shared_ptr<scene::Mesh> mesh;
341
343 glm::mat4 transform;
344
346 float distance_to_camera;
347
349 RenderLayer layer;
350
352 bool is_transparent;
353 };
354
356 std::vector<RenderItem> m_render_queue;
357
371 void build_render_queue(std::shared_ptr<scene::Node> node, std::shared_ptr<scene::Camera> camera,
372 const glm::mat4 &par_transform, std::vector<RenderItem> &out_items);
373
388 void build_render_queue_culled(std::shared_ptr<scene::Node> node, std::shared_ptr<scene::Camera> camera,
389 const glm::mat4 &par_transform, std::vector<RenderItem> &out_items,
390 const scene::Frustum &frustum);
391
399 void sort_render_queue(std::vector<RenderItem> &items);
400
412 void render_mesh(std::shared_ptr<scene::Mesh> mesh, const glm::mat4 &transform,
413 std::shared_ptr<scene::Camera> camera, std::shared_ptr<scene::Scene> scene);
414
421 void apply_render_mode();
422
428 void collect_lights(std::shared_ptr<scene::Scene> scene);
429
435 void collect_node_lights(std::shared_ptr<scene::Node> node);
436
442 void bind_lights(std::shared_ptr<renderer::Shader> shader);
443
453 void bind_material(std::shared_ptr<scene::Material> material, std::shared_ptr<renderer::Shader> shader);
454
461 void clear_material_cache();
462};
463
464} // namespace renderer
465
466} // namespace lmgl
Declaration of the Camera class for managing viewport and projection.
void resize(int width, int height)
Resizes the framebuffer to specific width and height.
Definition renderer.cpp:417
void set_gamma(float gamma)
Sets the gamma of the tone map.
Definition renderer.hpp:193
unsigned int get_draw_calls() const
Get the number of draw calls made in the last render.
Definition renderer.hpp:149
RenderMode get_render_mode() const
Get the current rendering mode.
Definition renderer.hpp:139
void set_blending(bool enabled)
Enable or disable blending.
Definition renderer.cpp:169
void set_bloom_threshold(float threshold)
Sets the bloom brightness threshold.
Definition renderer.hpp:216
void set_tone_map_mode(int mode)
Sets the tone map mode.
Definition renderer.hpp:179
void set_bloom_intensity(float intensity)
Sets the bloom intensity/strength.
Definition renderer.hpp:223
void setup_shadows(std::shared_ptr< scene::Scene > scene, std::shared_ptr< Shader > shader, bool enable_point=true, bool enable_directional=true)
Configure shadow rendering for the scene.
Definition renderer.cpp:430
~Renderer()=default
Destructor for the Renderer class.
void set_depth_test(bool enabled)
Enable or disable depth testing.
Definition renderer.cpp:150
void render(std::shared_ptr< scene::Scene > scene, std::shared_ptr< scene::Camera > camera)
Render a scene from the perspective of a camera.
Definition renderer.cpp:39
unsigned int get_triangles_count() const
Get the number of triangles rendered in the last render.
Definition renderer.hpp:159
Renderer()
Constructor for the Renderer class.
Definition renderer.cpp:17
void enable_post_processing(bool enabled)
Enables post processing effects based on tone map mode and exposure/gamma.
void set_render_mode(RenderMode mode)
Set the rendering mode.
Definition renderer.cpp:148
void set_exposure(float exposure)
Sets the exposure of the tone map.
Definition renderer.hpp:186
void set_culling(bool enabled)
Enable or disable face culling.
Definition renderer.cpp:159
void set_bloom_enabled(bool enabled)
Enable or disable bloom effect.
Definition renderer.hpp:207
Frustum structure.
Definition frustum.hpp:218
Framebuffer class for off-screen rendering.
Defines the Mesh class for managing 3D mesh data.
Namespace for rendering-related classes and functions.
Definition buffer.cpp:9
RenderMode
Enumerates the different rendering modes.
Definition renderer.hpp:43
RenderLayer
Enumerates the different render layers.
Definition renderer.hpp:52
Namespace for scene-related classes and functions.
Definition camera.cpp:7
Forward declarations for Assimp Material structure.
Definition model_loader.cpp:12
Defines the Node class for managing scene graph nodes in a 3D environment.
Defines the Scene class for managing a 3D scene graph.
This file contains the ShadowMap, CubemapShadowMap, and ShadowRenderer classes for rendering shadows ...