diff options
| author | hachem <im@hachem.wtf> | 2026-08-20 22:20:49 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-08-20 22:20:49 +0200 |
| commit | 45baf48db974c66cfdc51f26cee191abbbd89a0b (patch) | |
| tree | b60c27506f1e1c37b7238161156c83e7e159fc12 /src/rendering/renderer.cpp | |
| parent | 00bf9a8cce28ab1dbc77ba24428be12391c4a576 (diff) | |
[feat]: reduce renderer abstraction
Diffstat (limited to 'src/rendering/renderer.cpp')
| -rw-r--r-- | src/rendering/renderer.cpp | 128 |
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 { |
