aboutsummaryrefslogtreecommitdiff
path: root/src/rendering/renderer.cpp
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-20 22:20:49 +0200
committerhachem <im@hachem.wtf>2026-08-20 22:20:49 +0200
commit45baf48db974c66cfdc51f26cee191abbbd89a0b (patch)
treeb60c27506f1e1c37b7238161156c83e7e159fc12 /src/rendering/renderer.cpp
parent00bf9a8cce28ab1dbc77ba24428be12391c4a576 (diff)
[feat]: reduce renderer abstraction
Diffstat (limited to 'src/rendering/renderer.cpp')
-rw-r--r--src/rendering/renderer.cpp128
1 files changed, 116 insertions, 12 deletions
diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp
index 28b7962..1c82447 100644
--- a/src/rendering/renderer.cpp
+++ b/src/rendering/renderer.cpp
@@ -1,26 +1,130 @@
#include "renderer.h"
-#include "platform/opengl/opengl_renderer_api.h"
-#include "platform/vulkan/vulkan_renderer_api.h"
+#include "core/log.h"
+#include <glad/glad.h>
+#include <GLFW/glfw3.h>
#include <glm/gtc/matrix_transform.hpp>
-namespace Donut
+namespace Donut
{
+ RendererAPI::API RendererAPI::s_api = RendererAPI::API::OpenGL;
+
auto RendererAPI::create() -> Scope<RendererAPI>
- {
- switch (s_api)
+ {
+ return create_scope<RendererAPI>();
+ }
+
+ auto RendererAPI::init() -> void
+ {
+ if (!glfwGetCurrentContext())
+ {
+ DONUT_ERROR("No OpenGL context is current! Cannot initialize GLAD.");
+ return;
+ }
+
+ if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
- case API::OpenGL:
- return create_scope<OpenGLRendererAPI>();
- case API::Vulkan:
- return create_scope<VulkanRendererAPI>();
- default:
- return nullptr;
+ DONUT_ERROR("Failed to initialize GLAD!");
+ return;
}
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glFrontFace(GL_CCW);
}
- RendererAPI::API RendererAPI::s_api = RendererAPI::API::OpenGL;
+ auto RendererAPI::set_viewport(uint32_t x, uint32_t y, uint32_t width, uint32_t height) -> void
+ {
+ glViewport(x, y, width, height);
+ }
+
+ auto RendererAPI::set_clear_color(const glm::vec4& color) -> void
+ {
+ glClearColor(color.r, color.g, color.b, color.a);
+ }
+
+ auto RendererAPI::clear() -> void
+ {
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ }
+
+ auto RendererAPI::enable_depth_test() -> void
+ {
+ glEnable(GL_DEPTH_TEST);
+ }
+
+ auto RendererAPI::disable_depth_test() -> void
+ {
+ glDisable(GL_DEPTH_TEST);
+ }
+
+ auto RendererAPI::set_face_culling(bool enabled) -> void
+ {
+ if (enabled)
+ {
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glFrontFace(GL_CCW);
+ }
+ else
+ glDisable(GL_CULL_FACE);
+ }
+
+ auto RendererAPI::enable_blending() -> void
+ {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ auto RendererAPI::disable_blending() -> void
+ {
+ glDisable(GL_BLEND);
+ }
+
+ auto RendererAPI::draw_indexed(const Ref<VertexArray>& vertex_array, uint32_t index_count) -> void
+ {
+ uint32_t count = index_count ? index_count : vertex_array->get_index_buffer()->get_count();
+ glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, nullptr);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ }
+
+ auto RendererAPI::draw_arrays(uint32_t vertex_count, uint32_t first) -> void
+ {
+ glDrawArrays(GL_TRIANGLES, first, vertex_count);
+ }
+
+ auto RendererAPI::draw_lines(const Ref<VertexArray>& vertex_array, uint32_t index_count) -> void
+ {
+ uint32_t count = index_count ? index_count : vertex_array->get_index_buffer()->get_count();
+ glDrawElements(GL_LINES, count, GL_UNSIGNED_INT, nullptr);
+ }
+
+ auto RendererAPI::bind_texture(uint32_t texture_id, uint32_t slot) -> void
+ {
+ glActiveTexture(GL_TEXTURE0 + slot);
+ glBindTexture(GL_TEXTURE_2D, texture_id);
+ }
+
+ auto RendererAPI::bind_image_texture(uint32_t texture_id, uint32_t slot, bool read_only) -> void
+ {
+ // Image load/store is OpenGL 4.2; the pointer is null on macOS (4.1).
+ if (glBindImageTexture == nullptr)
+ return;
+ glBindImageTexture(slot, texture_id, 0, GL_FALSE, 0,
+ read_only ? GL_READ_ONLY : GL_WRITE_ONLY, GL_RGBA8);
+ }
+
+ auto RendererAPI::read_pixels(uint32_t x, uint32_t y, uint32_t width, uint32_t height,
+ uint32_t format, uint32_t type, void* pixels) -> void
+ {
+ glReadPixels(x, y, width, height, format, type, pixels);
+ }
auto Renderer::init() -> void
{