light/modules/engine/include/engine/graphics/renderer.hpp

143 lines
3.3 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#pragma once
#include <engine/base/base.hpp>
#include <engine/graphics/renderer_programs/quad.hpp>
#include <engine/graphics/renderer_programs/texture.hpp>
#include <engine/graphics/renderer_programs/tinted_texture.hpp>
#define LT_MAX_QUAD_RENDERER_VERTICES 1028u * 4u
#define LT_MAX_TEXTURE_RENDERER_VERTICES 1028u * 4u
#define LT_MAX_TINTED_TEXTURE_RENDERER_VERTICES 1028u * 4u
struct GLFWwindow;
namespace Light {
class Blender;
class ConstantBuffer;
class Framebuffer;
class RenderCommand;
class Texture;
class SharedContext;
class Camera;
class WindowResizedEvent;
class renderer
2025-07-05 13:28:41 +03:30
{
public:
static Scope<renderer> create(GLFWwindow *windowHandle, Ref<SharedContext> sharedContext);
2025-07-05 13:28:41 +03:30
static inline void draw_quad(
2025-07-05 13:28:41 +03:30
const glm::vec3 &position,
const glm::vec2 &size,
const glm::vec4 &tint,
Ref<Texture> texture
)
{
2025-07-05 16:07:51 +03:30
s_context->draw_quad_impl(position, size, tint, texture);
2025-07-05 13:28:41 +03:30
}
2025-07-05 16:07:51 +03:30
static inline void draw_quad(
2025-07-05 13:28:41 +03:30
const glm::vec3 &position,
const glm::vec2 &size,
const glm::vec4 &tint
)
{
2025-07-05 16:07:51 +03:30
s_context->draw_quad_impl(position, size, tint);
2025-07-05 13:28:41 +03:30
}
2025-07-05 16:07:51 +03:30
static inline void draw_quad(
2025-07-05 13:28:41 +03:30
const glm::vec3 &position,
const glm::vec2 &size,
Ref<Texture> texture
)
{
2025-07-05 16:07:51 +03:30
s_context->draw_quad_impl(position, size, texture);
2025-07-05 13:28:41 +03:30
}
static void draw_quad(const glm::mat4 &transform, const glm::vec4 &tint, Ref<Texture> texture)
2025-07-05 13:28:41 +03:30
{
2025-07-05 16:07:51 +03:30
s_context->draw_quad_impl(transform, tint, texture);
2025-07-05 13:28:41 +03:30
}
2025-07-05 16:07:51 +03:30
static void draw_quad(const glm::mat4 &transform, const glm::vec4 &tint)
2025-07-05 13:28:41 +03:30
{
2025-07-05 16:07:51 +03:30
s_context->draw_quad_impl(transform, tint);
2025-07-05 13:28:41 +03:30
}
2025-07-05 16:07:51 +03:30
static void draw_quad(const glm::mat4 &transform, Ref<Texture> texture)
2025-07-05 13:28:41 +03:30
{
2025-07-05 16:07:51 +03:30
s_context->draw_quad_impl(transform, texture);
2025-07-05 13:28:41 +03:30
}
static inline void begin_scene(
2025-07-05 13:28:41 +03:30
Camera *camera,
const glm::mat4 &cameraTransform,
const Ref<Framebuffer> &targetFrameBuffer = nullptr
)
{
2025-07-05 16:07:51 +03:30
s_context->begin_scene_impl(camera, cameraTransform, targetFrameBuffer);
2025-07-05 13:28:41 +03:30
}
static inline void end_scene()
2025-07-05 13:28:41 +03:30
{
2025-07-05 16:07:51 +03:30
s_context->end_scene_impl();
2025-07-05 13:28:41 +03:30
}
void on_window_resize(const WindowResizedEvent &event);
2025-07-05 13:28:41 +03:30
void begin_frame();
void end_frame();
2025-07-05 13:28:41 +03:30
private:
2025-07-05 16:07:51 +03:30
static renderer *s_context;
QuadRendererProgram m_quad_renderer;
TextureRendererProgram m_texture_renderer;
TintedTextureRendererProgram m_tinted_texture_renderer;
Scope<ConstantBuffer> m_view_projection_buffer;
Scope<RenderCommand> m_render_command;
Scope<Blender> m_blender;
Camera *m_default_framebuffer_camera;
Ref<Framebuffer> m_target_framebuffer;
bool m_should_clear_backbuffer;
renderer(GLFWwindow *windowHandle, Ref<SharedContext> sharedContext);
2025-07-05 13:28:41 +03:30
void draw_quad_impl(
2025-07-05 13:28:41 +03:30
const glm::vec3 &position,
const glm::vec2 &size,
const glm::vec4 &tint,
Ref<Texture> texture
);
2025-07-05 16:07:51 +03:30
void draw_quad_impl(const glm::vec3 &position, const glm::vec2 &size, const glm::vec4 &tint);
2025-07-05 16:07:51 +03:30
void draw_quad_impl(const glm::vec3 &position, const glm::vec2 &size, Ref<Texture> texture);
2025-07-05 13:28:41 +03:30
void draw_quad_impl(const glm::mat4 &transform, const glm::vec4 &tint, Ref<Texture> texture);
2025-07-05 16:07:51 +03:30
void draw_quad_impl(const glm::mat4 &transform, const glm::vec4 &tint);
2025-07-05 16:07:51 +03:30
void draw_quad_impl(const glm::mat4 &transform, Ref<Texture> texture);
2025-07-05 13:28:41 +03:30
void begin_scene_impl(
2025-07-05 13:28:41 +03:30
Camera *camera,
const glm::mat4 &cameraTransform,
const Ref<Framebuffer> &targetFrameBuffer = nullptr
);
2025-07-05 16:07:51 +03:30
void flush_scene();
2025-07-05 16:07:51 +03:30
void end_scene_impl();
2025-07-05 13:28:41 +03:30
};
} // namespace Light