From 3d8d3259e1cf5a7d88e5d1e530cc8c9bf9140734 Mon Sep 17 00:00:00 2001 From: hachem Date: Thu, 14 Aug 2025 18:21:00 +0200 Subject: feat: I am going to throw my computer out a window --- src/rendering/index_buffer.cpp | 6 +++--- src/rendering/index_buffer.h | 3 ++- src/rendering/renderer.cpp | 8 ++++---- src/rendering/renderer.h | 22 ++++++++++++++++++++-- src/rendering/shader.cpp | 22 +++++++++++----------- src/rendering/shader.h | 6 +++--- src/rendering/uniform_buffer.cpp | 23 +++++++++++++++++++++++ src/rendering/uniform_buffer.h | 18 ++++++++++++++++++ src/rendering/vertex_array.cpp | 6 +++--- src/rendering/vertex_array.h | 2 +- src/rendering/vertex_buffer.cpp | 6 +++--- src/rendering/vertex_buffer.h | 6 ++++-- 12 files changed, 95 insertions(+), 33 deletions(-) create mode 100644 src/rendering/uniform_buffer.cpp create mode 100644 src/rendering/uniform_buffer.h (limited to 'src/rendering') diff --git a/src/rendering/index_buffer.cpp b/src/rendering/index_buffer.cpp index 1095e3b..3271a5a 100644 --- a/src/rendering/index_buffer.cpp +++ b/src/rendering/index_buffer.cpp @@ -6,14 +6,14 @@ namespace Donut { - IndexBuffer* IndexBuffer::create(const uint32_t* indices, uint32_t count) + Ref IndexBuffer::create(const uint32_t* indices, uint32_t count) { switch (Renderer::get_api()) { case RendererAPI::API::OpenGL: - return new OpenGLIndexBuffer(indices, count); + return create_ref(indices, count); case RendererAPI::API::Vulkan: - return new VulkanIndexBuffer((uint32_t*)indices, count); + return create_ref((uint32_t*)indices, count); default: return nullptr; } diff --git a/src/rendering/index_buffer.h b/src/rendering/index_buffer.h index 856559a..9859c20 100644 --- a/src/rendering/index_buffer.h +++ b/src/rendering/index_buffer.h @@ -1,5 +1,6 @@ #pragma once +#include "core/memory.h" #include namespace Donut @@ -13,6 +14,6 @@ namespace Donut virtual void unbind() const = 0; virtual uint32_t get_count() const = 0; - static IndexBuffer* create(const uint32_t* indices, uint32_t count); + static Ref create(const uint32_t* indices, uint32_t count); }; }; diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 5e4682c..f34e2b0 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -7,14 +7,14 @@ namespace Donut { - Scope RendererAPI::create() + Ref RendererAPI::create() { switch (s_api) { case API::OpenGL: - return create_scope(); + return create_ref(); case API::Vulkan: - return create_scope(); + return create_ref(); default: return nullptr; } @@ -50,7 +50,7 @@ namespace Donut RenderCommand::draw_indexed(vertex_array); } - Scope RenderCommand::s_renderer_api = RendererAPI::create(); + Ref RenderCommand::s_renderer_api = RendererAPI::create(); void Renderer::set_clear_color(const glm::vec4& color) { diff --git a/src/rendering/renderer.h b/src/rendering/renderer.h index 6212b21..4a028e5 100644 --- a/src/rendering/renderer.h +++ b/src/rendering/renderer.h @@ -26,14 +26,17 @@ namespace Donut virtual void set_clear_color(const glm::vec4& color) = 0; virtual void clear() = 0; virtual void enable_depth_test() = 0; + virtual void disable_depth_test() = 0; virtual void set_face_culling(bool enabled) = 0; + virtual void enable_blending() = 0; + virtual void disable_blending() = 0; virtual void draw_indexed(const Ref& vertex_array, uint32_t index_count = 0) = 0; inline static API get_api() { return s_api; } inline static void set_api(API api) { s_api = api; } - static Scope create(); + static Ref create(); private: static API s_api; }; @@ -66,18 +69,33 @@ namespace Donut s_renderer_api->enable_depth_test(); } + inline static void disable_depth_test() + { + s_renderer_api->disable_depth_test(); + } + inline static void set_face_culling(bool enabled) { s_renderer_api->set_face_culling(enabled); } + inline static void enable_blending() + { + s_renderer_api->enable_blending(); + } + + inline static void disable_blending() + { + s_renderer_api->disable_blending(); + } + inline static void draw_indexed(const Ref& vertex_array, uint32_t index_count = 0) { s_renderer_api->draw_indexed(vertex_array, index_count); } private: - static Scope s_renderer_api; + static Ref s_renderer_api; }; class Renderer diff --git a/src/rendering/shader.cpp b/src/rendering/shader.cpp index 1bbd0fc..833b719 100644 --- a/src/rendering/shader.cpp +++ b/src/rendering/shader.cpp @@ -6,40 +6,40 @@ namespace Donut { - Shader* Shader::create(const std::string& filepath) + Ref Shader::create(const std::string& filepath) { switch (Renderer::get_api()) { case RendererAPI::API::OpenGL: - return new OpenGLShader(filepath); + return create_ref(filepath); case RendererAPI::API::Vulkan: - return new VulkanShader(filepath); + return create_ref(filepath); default: return nullptr; } } - Shader* Shader::create(const std::string& name, const std::string& vertex_src, const std::string& fragment_src) + Ref Shader::create(const std::string& name, const std::string& vertex_src, const std::string& fragment_src) { switch (Renderer::get_api()) { case RendererAPI::API::OpenGL: - return new OpenGLShader(name, vertex_src, fragment_src); + return create_ref(name, vertex_src, fragment_src); case RendererAPI::API::Vulkan: - return new VulkanShader(name, vertex_src, fragment_src); + return create_ref(name, vertex_src, fragment_src); default: return nullptr; } } - Shader* Shader::create_compute(const std::string& name, const std::string& compute_src) + Ref Shader::create_compute(const std::string& name, const std::string& compute_src) { switch (Renderer::get_api()) { case RendererAPI::API::OpenGL: - return new OpenGLShader(name, compute_src); + return create_ref(name, compute_src); case RendererAPI::API::Vulkan: - return new VulkanShader(name, compute_src); + return create_ref(name, compute_src); default: return nullptr; } @@ -58,14 +58,14 @@ namespace Donut Ref ShaderLibrary::load(const std::string& filepath) { - auto shader = Ref(Shader::create(filepath)); + auto shader = Shader::create(filepath); add(shader); return shader; } Ref ShaderLibrary::load(const std::string& name, const std::string& filepath) { - auto shader = Ref(Shader::create(filepath)); + auto shader = Shader::create(filepath); add(name, shader); return shader; } diff --git a/src/rendering/shader.h b/src/rendering/shader.h index 814f0cf..7f024bd 100644 --- a/src/rendering/shader.h +++ b/src/rendering/shader.h @@ -35,9 +35,9 @@ namespace Donut virtual const std::string& get_name() const = 0; - static Shader* create(const std::string& filepath); - static Shader* create(const std::string& name, const std::string& vertex_src, const std::string& fragment_src); - static Shader* create_compute(const std::string& name, const std::string& compute_src); + static Ref create(const std::string& filepath); + static Ref create(const std::string& name, const std::string& vertex_src, const std::string& fragment_src); + static Ref create_compute(const std::string& name, const std::string& compute_src); }; class ShaderLibrary diff --git a/src/rendering/uniform_buffer.cpp b/src/rendering/uniform_buffer.cpp new file mode 100644 index 0000000..4e693a2 --- /dev/null +++ b/src/rendering/uniform_buffer.cpp @@ -0,0 +1,23 @@ +#include "uniform_buffer.h" +#include "renderer.h" + +#include "platform/opengl/opengl_uniform_buffer.h" +#include "platform/vulkan/vulkan_uniform_buffer.h" + +namespace Donut +{ + Ref UniformBuffer::create(uint32_t size, uint32_t binding) + { + switch (Renderer::get_api()) + { + case RendererAPI::API::OpenGL: + return create_ref(size, binding); + case RendererAPI::API::Vulkan: + return create_ref(size, binding); + case RendererAPI::API::None: + return nullptr; + default: + return nullptr; + } + } +}; diff --git a/src/rendering/uniform_buffer.h b/src/rendering/uniform_buffer.h new file mode 100644 index 0000000..4df39d9 --- /dev/null +++ b/src/rendering/uniform_buffer.h @@ -0,0 +1,18 @@ +#pragma once + +#include "core/memory.h" +#include + +namespace Donut +{ + class UniformBuffer + { + public: + virtual ~UniformBuffer() = default; + + virtual void set_data(const void* data, uint32_t size, uint32_t offset = 0) = 0; + virtual void bind(uint32_t binding) = 0; + + static Ref create(uint32_t size, uint32_t binding); + }; +}; diff --git a/src/rendering/vertex_array.cpp b/src/rendering/vertex_array.cpp index bb92ff3..d0cd4b0 100644 --- a/src/rendering/vertex_array.cpp +++ b/src/rendering/vertex_array.cpp @@ -17,14 +17,14 @@ namespace Donut } } - VertexArray* VertexArray::create() + Ref VertexArray::create() { switch (Renderer::get_api()) { case RendererAPI::API::OpenGL: - return new OpenGLVertexArray(); + return create_ref(); case RendererAPI::API::Vulkan: - return new VulkanVertexArray(); + return create_ref(); default: return nullptr; } diff --git a/src/rendering/vertex_array.h b/src/rendering/vertex_array.h index a39849f..3729167 100644 --- a/src/rendering/vertex_array.h +++ b/src/rendering/vertex_array.h @@ -23,6 +23,6 @@ namespace Donut virtual const std::vector>& get_vertex_buffers() const = 0; virtual const Ref& get_index_buffer() const = 0; - static VertexArray* create(); + static Ref create(); }; }; diff --git a/src/rendering/vertex_buffer.cpp b/src/rendering/vertex_buffer.cpp index 4929711..ef2b288 100644 --- a/src/rendering/vertex_buffer.cpp +++ b/src/rendering/vertex_buffer.cpp @@ -6,14 +6,14 @@ namespace Donut { - VertexBuffer* VertexBuffer::create(const void* data, uint32_t size) + Ref VertexBuffer::create(const void* data, uint32_t size) { switch (Renderer::get_api()) { case RendererAPI::API::OpenGL: - return new OpenGLVertexBuffer(data, size); + return create_ref(data, size); case RendererAPI::API::Vulkan: - return new VulkanVertexBuffer((float*)data, size); + return create_ref((float*)data, size); default: return nullptr; } diff --git a/src/rendering/vertex_buffer.h b/src/rendering/vertex_buffer.h index 77a76c9..39f43ba 100644 --- a/src/rendering/vertex_buffer.h +++ b/src/rendering/vertex_buffer.h @@ -1,5 +1,7 @@ #pragma once +#include "core/memory.h" + #include #include @@ -22,7 +24,7 @@ namespace Donut ~VertexBufferLayout() = default; template - void push(uint32_t count) + void push(uint32_t count) { static_assert(false); } @@ -68,6 +70,6 @@ namespace Donut virtual const VertexBufferLayout& get_layout() const = 0; virtual void set_layout(const VertexBufferLayout& layout) = 0; - static VertexBuffer* create(const void* data, uint32_t size); + static Ref create(const void* data, uint32_t size); }; }; -- cgit v1.3