Golias Engine
A C++ 20 'game engine' built with SDL3 with wide platform support.
renderer.h
Go to the documentation of this file.
1 #pragma once
3 #include "base_struct.h"
4 
5 struct RenderBatch {
7  const Material* material;
8  std::vector<glm::mat4> model_matrices;
9 
10  void clear() {
11  model_matrices.clear();
12  }
13 };
14 
18 
19  bool operator==(const MeshMaterialKey& other) const {
20  return mesh == other.mesh && material == other.material;
21  }
22 };
23 
25  std::size_t operator()(const MeshMaterialKey& key) const {
26  std::size_t h1 = std::hash<const void*>{}(key.mesh);
27  std::size_t h2 = std::hash<const void*>{}(key.material);
28  return h1 ^ (h2 << 1);
29  }
30 };
31 
32 
33 class Renderer {
34 public:
35  virtual ~Renderer() = default;
36 
37  virtual bool initialize(int width, int height, SDL_Window* window) = 0;
38  virtual void resize(int width, int height) = 0;
39  virtual void cleanup() = 0;
40 
41  virtual std::shared_ptr<GpuBuffer> allocate_gpu_buffer(GpuBufferType type) = 0;
42 
43  virtual std::shared_ptr<GpuVertexLayout> create_vertex_layout(
44  const GpuBuffer* vertex_buffer,
45  const GpuBuffer* index_buffer,
46  const std::vector<VertexAttribute>& attributes,
47  uint32_t stride) = 0;
48 
49  virtual Uint32 load_texture_from_file(const std::string& path) = 0;
50  virtual Uint32 load_texture_from_memory(const unsigned char* buffer, size_t size, const std::string& name = "") = 0;
51  virtual Uint32 load_texture_from_raw_data(const unsigned char* data, int width, int height, int channels = 4,
52  const std::string& name = "") = 0;
53  virtual void begin_frame() = 0;
54 
55  virtual void begin_shadow_pass() = 0;
56  virtual void render_shadow_pass(const glm::mat4& light_space_matrix) = 0;
57  virtual void end_shadow_pass() = 0;
58 
59  virtual void begin_render_target() = 0;
60  virtual void render_main_target(const Camera3D& camera,
61  const Transform3D& camera_transform,
62  const glm::mat4& light_space_matrix,
63  const std::vector<DirectionalLight>& directional_lights,
64  const std::vector<std::pair<Transform3D, SpotLight>>& spot_lights) = 0;
65  virtual void end_render_target() = 0;
66 
67  virtual void begin_environment_pass() =0;
68  virtual void render_environment_pass(const Camera3D& camera) =0;
69  virtual void end_environment_pass() =0;
70 
71  virtual void add_to_render_batch(const Transform3D& transform,
72  const MeshRef& mesh_ref, const MaterialRef& mat_ref) = 0;
73 
74  virtual void add_to_shadow_batch(const Transform3D& transform,const MeshRef& mesh_ref) = 0;
75 
76 
77  virtual void swap_chain() = 0;
78 
79  std::unordered_map<std::string, Uint32> _textures;
80  std::unordered_map<std::string, std::vector<MeshInstance3D>> _meshes;
81  std::unordered_map<std::string, std::vector<Material>> _materials;
82 
83  void register_material(const char* name, const Material& material) {
84  _materials[name].push_back(material);
85  }
86 
87 protected:
88  SDL_Window* _window = nullptr;
89 
90  std::unique_ptr<Shader> _default_shader = nullptr;
91  std::unique_ptr<Shader> _shadow_shader = nullptr;
92  std::unique_ptr<Shader> _environment_shader = nullptr;
93 
95 
96  std::shared_ptr<Framebuffer> shadow_map_fbo = nullptr;
97 
98  int width = 0, height = 0;
99 
100  std::shared_ptr<GpuBuffer> instance_buffer;
101 
102  std::unordered_map<MeshMaterialKey, RenderBatch, MeshMaterialKeyHash> _instanced_batches;
103 
104  std::unordered_map<const MeshInstance3D*, RenderBatch> shadow_batches;
105 
106  size_t max_instances = 1000;
107 
108 };
GpuBufferType
GpuBuffer Abstract class.
Definition: base_struct.h:29
GpuBuffer Abstract class.
Definition: base_struct.h:46
Definition: renderer.h:33
std::shared_ptr< GpuBuffer > instance_buffer
Definition: renderer.h:100
std::unordered_map< std::string, std::vector< MeshInstance3D > > _meshes
Definition: renderer.h:80
int width
Definition: renderer.h:98
virtual void begin_render_target()=0
std::unique_ptr< Shader > _environment_shader
Definition: renderer.h:92
std::unordered_map< const MeshInstance3D *, RenderBatch > shadow_batches
Definition: renderer.h:104
virtual void end_environment_pass()=0
virtual bool initialize(int width, int height, SDL_Window *window)=0
virtual std::shared_ptr< GpuVertexLayout > create_vertex_layout(const GpuBuffer *vertex_buffer, const GpuBuffer *index_buffer, const std::vector< VertexAttribute > &attributes, uint32_t stride)=0
virtual void begin_environment_pass()=0
std::unique_ptr< Shader > _shadow_shader
Definition: renderer.h:91
virtual void swap_chain()=0
size_t max_instances
Definition: renderer.h:106
virtual void cleanup()=0
virtual void resize(int width, int height)=0
virtual void add_to_render_batch(const Transform3D &transform, const MeshRef &mesh_ref, const MaterialRef &mat_ref)=0
std::unordered_map< std::string, std::vector< Material > > _materials
Definition: renderer.h:81
virtual void end_render_target()=0
virtual void begin_shadow_pass()=0
virtual void render_environment_pass(const Camera3D &camera)=0
virtual Uint32 load_texture_from_raw_data(const unsigned char *data, int width, int height, int channels=4, const std::string &name="")=0
SDL_Window * _window
Definition: renderer.h:88
virtual void render_shadow_pass(const glm::mat4 &light_space_matrix)=0
int height
Definition: renderer.h:98
virtual Uint32 load_texture_from_file(const std::string &path)=0
void register_material(const char *name, const Material &material)
Definition: renderer.h:83
std::unordered_map< std::string, Uint32 > _textures
Definition: renderer.h:79
std::unordered_map< MeshMaterialKey, RenderBatch, MeshMaterialKeyHash > _instanced_batches
Definition: renderer.h:102
virtual void begin_frame()=0
virtual ~Renderer()=default
virtual std::shared_ptr< GpuBuffer > allocate_gpu_buffer(GpuBufferType type)=0
std::unique_ptr< Shader > _default_shader
Definition: renderer.h:90
virtual void end_shadow_pass()=0
std::shared_ptr< Framebuffer > shadow_map_fbo
Definition: renderer.h:96
virtual Uint32 load_texture_from_memory(const unsigned char *buffer, size_t size, const std::string &name="")=0
virtual void add_to_shadow_batch(const Transform3D &transform, const MeshRef &mesh_ref)=0
virtual void render_main_target(const Camera3D &camera, const Transform3D &camera_transform, const glm::mat4 &light_space_matrix, const std::vector< DirectionalLight > &directional_lights, const std::vector< std::pair< Transform3D, SpotLight >> &spot_lights)=0
WorldEnvironment * _world_environment
Definition: renderer.h:94
3D Camera
Definition: components.h:80
Definition: components.h:152
Definition: components.h:41
Definition: components.h:29
Definition: renderer.h:24
std::size_t operator()(const MeshMaterialKey &key) const
Definition: renderer.h:25
Definition: renderer.h:15
bool operator==(const MeshMaterialKey &other) const
Definition: renderer.h:19
const Material * material
Definition: renderer.h:17
const MeshInstance3D * mesh
Definition: renderer.h:16
Definition: components.h:148
Definition: renderer.h:5
std::vector< glm::mat4 > model_matrices
Definition: renderer.h:8
const MeshInstance3D * mesh
Definition: renderer.h:6
void clear()
Definition: renderer.h:10
const Material * material
Definition: renderer.h:7
Represents material properties for 3D rendering.
Definition: components.h:10
Definition: base_struct.h:201