From 104b08ef24d1dcf6f63ba12509daad20c6967ec5 Mon Sep 17 00:00:00 2001 From: Atdunbg Date: Sat, 22 Nov 2025 15:19:48 +0800 Subject: [PATCH] merge vertexbuffer and indexbuffer to buffer.cpp/h file --- .gitmodules | 3 + Prism/CMakeLists.txt | 25 ++++-- Prism/src/Prism.h | 3 +- .../Prism/Platform/OpenGL/OpenGLBuffer.cpp | 81 +++++++++++++++++++ .../src/Prism/Platform/OpenGL/OpenGLBuffer.h | 55 +++++++++++++ .../Platform/OpenGL/OpenGLIndexBuffer.cpp | 41 ---------- .../Prism/Platform/OpenGL/OpenGLIndexBuffer.h | 30 ------- .../Prism/Platform/OpenGL/OpenGLShader.cpp | 41 +++++++++- .../src/Prism/Platform/OpenGL/OpenGLShader.h | 7 ++ .../Platform/OpenGL/OpenGLVertexBuffer.cpp | 44 ---------- .../Platform/OpenGL/OpenGLVertexBuffer.h | 30 ------- Prism/src/Prism/Renderer/Buffer.cpp | 31 +++++++ .../Renderer/{VertexBuffer.h => Buffer.h} | 21 ++++- Prism/src/Prism/Renderer/IndexBuffer.cpp | 20 ----- Prism/src/Prism/Renderer/IndexBuffer.h | 28 ------- Prism/src/Prism/Renderer/RendererAPI.h | 2 +- Prism/src/Prism/Renderer/Shader.h | 70 ++++++++++++++++ Prism/src/Prism/Renderer/VertexBuffer.cpp | 21 ----- Prism/vendor/glm | 1 + Sandbox/CMakeLists.txt | 2 +- Sandbox/Sandbox/Layer/DemoLayer.cpp | 6 ++ Sandbox/Sandbox/Layer/DemoLayer.h | 1 + Sandbox/assets/shaders/shader.glsl | 4 +- 23 files changed, 337 insertions(+), 230 deletions(-) create mode 100644 Prism/src/Prism/Platform/OpenGL/OpenGLBuffer.cpp create mode 100644 Prism/src/Prism/Platform/OpenGL/OpenGLBuffer.h delete mode 100644 Prism/src/Prism/Platform/OpenGL/OpenGLIndexBuffer.cpp delete mode 100644 Prism/src/Prism/Platform/OpenGL/OpenGLIndexBuffer.h delete mode 100644 Prism/src/Prism/Platform/OpenGL/OpenGLVertexBuffer.cpp delete mode 100644 Prism/src/Prism/Platform/OpenGL/OpenGLVertexBuffer.h create mode 100644 Prism/src/Prism/Renderer/Buffer.cpp rename Prism/src/Prism/Renderer/{VertexBuffer.h => Buffer.h} (50%) delete mode 100644 Prism/src/Prism/Renderer/IndexBuffer.cpp delete mode 100644 Prism/src/Prism/Renderer/IndexBuffer.h delete mode 100644 Prism/src/Prism/Renderer/VertexBuffer.cpp create mode 160000 Prism/vendor/glm diff --git a/.gitmodules b/.gitmodules index 35548fb..134e3bc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,3 +8,6 @@ path = Prism/vendor/ImGui url = https://github.com/ocornut/imgui.git branch = docking +[submodule "Prism/vendor/glm"] + path = Prism/vendor/glm + url = https://github.com/g-truc/glm.git diff --git a/Prism/CMakeLists.txt b/Prism/CMakeLists.txt index 4355dad..7157afd 100644 --- a/Prism/CMakeLists.txt +++ b/Prism/CMakeLists.txt @@ -8,6 +8,7 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_subdirectory(vendor/spdlog EXCLUDE_FROM_ALL) add_subdirectory(vendor/glfw EXCLUDE_FROM_ALL) add_subdirectory(vendor/glad EXCLUDE_FROM_ALL) +add_subdirectory(vendor/glm EXCLUDE_FROM_ALL) # ------------- imgui ------------- @@ -22,18 +23,22 @@ file(GLOB IMGUI_SOURCE list(APPEND SRC_SOURCE ${IMGUI_SOURCE}) # ------------- link libraries ------------- -set(LINK_LIBRARIES +set(LINK_LIBRARIES_PRIVATE spdlog glfw glad ) +set(LINK_LIBRARIES_PUBLIC + glm +) + # link library opengl if(WIN32) - list(APPEND LINK_LIBRARIES opengl32) + list(APPEND LINK_LIBRARIES_PRIVATE opengl32) elseif(UNIX AND NOT APPLE) find_package(X11 REQUIRED) - list(APPEND LINK_LIBRARIES GL ${X11_LIBRARIES}) + list(APPEND LINK_LIBRARIES_PRIVATE GL ${X11_LIBRARIES}) endif() @@ -62,8 +67,11 @@ target_compile_definitions(${STATIC_LIBRARY} PRIVATE target_include_directories(${STATIC_LIBRARY} PUBLIC ${TARGET_INCLUDE_DIR} ) -target_link_libraries(${STATIC_LIBRARY} PRIVATE - ${LINK_LIBRARIES} +target_link_libraries(${STATIC_LIBRARY} + PRIVATE + ${LINK_LIBRARIES_PRIVATE} + PUBLIC + ${LINK_LIBRARIES_PUBLIC} ) target_precompile_headers(${STATIC_LIBRARY} PRIVATE src/pmpch.h @@ -87,8 +95,11 @@ target_compile_definitions(${SHARED_LIBRARY} PRIVATE target_include_directories(${SHARED_LIBRARY} PUBLIC ${TARGET_INCLUDE_DIR} ) -target_link_libraries(${SHARED_LIBRARY} PRIVATE - ${LINK_LIBRARIES} +target_link_libraries(${SHARED_LIBRARY} + PRIVATE + ${LINK_LIBRARIES_PRIVATE} + PUBLIC + ${LINK_LIBRARIES_PUBLIC} ) target_precompile_headers(${SHARED_LIBRARY} PRIVATE src/pmpch.h diff --git a/Prism/src/Prism.h b/Prism/src/Prism.h index e5d0482..fab8a3c 100644 --- a/Prism/src/Prism.h +++ b/Prism/src/Prism.h @@ -11,10 +11,9 @@ #include "Prism/Core/Events/Event.h" #include "Prism/Core/Events/KeyEvent.h" #include "Prism/Core/Events/MouseEvent.h" -#include "Prism/Renderer/IndexBuffer.h" +#include "Prism/Renderer/Buffer.h" #include "Prism/Renderer/Renderer.h" #include "Prism/Renderer/Shader.h" #include "Prism/Renderer/Texture.h" -#include "Prism/Renderer/VertexBuffer.h" #endif //PRISM_H diff --git a/Prism/src/Prism/Platform/OpenGL/OpenGLBuffer.cpp b/Prism/src/Prism/Platform/OpenGL/OpenGLBuffer.cpp new file mode 100644 index 0000000..72fd0c6 --- /dev/null +++ b/Prism/src/Prism/Platform/OpenGL/OpenGLBuffer.cpp @@ -0,0 +1,81 @@ +// +// Created by sfd on 25-11-22. +// + +#include "OpenGLBuffer.h" + +#include "Prism/Renderer/Renderer.h" + +namespace Prism +{ + + // ****************************************** + // Vertex + // ****************************************** + OpenGLVertexBuffer::OpenGLVertexBuffer(unsigned int size) + : m_RendererID(0), m_Size(size) + { + PM_RENDER_S({ + glGenBuffers(1, &self->m_RendererID); + }); + } + + OpenGLVertexBuffer::~OpenGLVertexBuffer() + { + PM_RENDER_S({ + glDeleteBuffers(1, &self->m_RendererID); + }); + } + + void OpenGLVertexBuffer::SetData(void* buffer, unsigned int size, unsigned int offset) + { + PM_RENDER_S3(buffer, size, offset, { + glBindBuffer(GL_ARRAY_BUFFER, self->m_RendererID); + glBufferData(GL_ARRAY_BUFFER, size, buffer, GL_STATIC_DRAW); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, 0); + }); + } + + void OpenGLVertexBuffer::Bind() const + { + PM_RENDER_S({ + glBindBuffer(GL_ARRAY_BUFFER, self->m_RendererID); + }); + } + + + // ****************************************** + // IndexBuffer + // ****************************************** + OpenGLIndexBuffer::OpenGLIndexBuffer(unsigned int size) + : m_RendererID(0), m_Size(size) + { + PM_RENDER_S({ + glGenBuffers(1, &self->m_RendererID); + }); + } + + OpenGLIndexBuffer::~OpenGLIndexBuffer() + { + PM_RENDER_S({ + glDeleteBuffers(1, &self->m_RendererID); + }); + } + + void OpenGLIndexBuffer::SetData(void* buffer, unsigned int size, unsigned int offset) + { + PM_RENDER_S3(buffer, size, offset, { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self->m_RendererID); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buffer, GL_STATIC_DRAW); + }); + } + + void OpenGLIndexBuffer::Bind() const + { + PM_RENDER_S({ + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self->m_RendererID); + }); + } +} diff --git a/Prism/src/Prism/Platform/OpenGL/OpenGLBuffer.h b/Prism/src/Prism/Platform/OpenGL/OpenGLBuffer.h new file mode 100644 index 0000000..10ac455 --- /dev/null +++ b/Prism/src/Prism/Platform/OpenGL/OpenGLBuffer.h @@ -0,0 +1,55 @@ +// +// Created by sfd on 25-11-22. +// + +#ifndef OPENGLBUFFER_H +#define OPENGLBUFFER_H + +#include "glad/glad.h" +#include "Prism/Renderer/Buffer.h" + +namespace Prism +{ + + // ****************************************** + // Vertex + // ****************************************** + class OpenGLVertexBuffer : public VertexBuffer + { + public: + OpenGLVertexBuffer(unsigned int size); + virtual ~OpenGLVertexBuffer(); + + virtual void SetData(void* buffer, unsigned int size, unsigned int offset = 0); + virtual void Bind() const; + + virtual unsigned int GetSize() const { return m_Size; } + virtual RendererID GetRendererID() const { return m_RendererID; } + private: + RendererID m_RendererID; + unsigned int m_Size; + }; + + // ****************************************** + // IndexBuffer + // ****************************************** + + class OpenGLIndexBuffer : public IndexBuffer + { + public: + OpenGLIndexBuffer(unsigned int size); + virtual ~OpenGLIndexBuffer(); + + virtual void SetData(void* buffer, unsigned int size, unsigned int offset = 0); + virtual void Bind() const; + + virtual unsigned int GetSize() const { return m_Size; } + virtual RendererID GetRendererID() const { return m_RendererID; } + private: + RendererID m_RendererID; + unsigned int m_Size; + }; + +} + +#endif //OPENGLBUFFER_H diff --git a/Prism/src/Prism/Platform/OpenGL/OpenGLIndexBuffer.cpp b/Prism/src/Prism/Platform/OpenGL/OpenGLIndexBuffer.cpp deleted file mode 100644 index f0769ec..0000000 --- a/Prism/src/Prism/Platform/OpenGL/OpenGLIndexBuffer.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// -// Created by sfd on 25-11-22. -// - -#include "OpenGLIndexBuffer.h" - -#include "glad/glad.h" -#include "Prism/Renderer/Renderer.h" - -namespace Prism -{ - OpenGLIndexBuffer::OpenGLIndexBuffer(unsigned int size) - : m_RendererID(0), m_Size(size) - { - PM_RENDER_S({ - glGenBuffers(1, &self->m_RendererID); - }); - } - - OpenGLIndexBuffer::~OpenGLIndexBuffer() - { - PM_RENDER_S({ - glDeleteBuffers(1, &self->m_RendererID); - }); - } - - void OpenGLIndexBuffer::SetData(void* buffer, unsigned int size, unsigned int offset) - { - PM_RENDER_S3(buffer, size, offset, { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self->m_RendererID); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buffer, GL_STATIC_DRAW); - }); - } - - void OpenGLIndexBuffer::Bind() const - { - PM_RENDER_S({ - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self->m_RendererID); - }); - } -} diff --git a/Prism/src/Prism/Platform/OpenGL/OpenGLIndexBuffer.h b/Prism/src/Prism/Platform/OpenGL/OpenGLIndexBuffer.h deleted file mode 100644 index a46e98d..0000000 --- a/Prism/src/Prism/Platform/OpenGL/OpenGLIndexBuffer.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// Created by sfd on 25-11-22. -// - -#ifndef OPENGLINDEXBUFFER_H -#define OPENGLINDEXBUFFER_H -#include "Prism/Renderer/IndexBuffer.h" - - -namespace Prism -{ - class OpenGLIndexBuffer : public IndexBuffer - { - public: - OpenGLIndexBuffer(unsigned int size); - virtual ~OpenGLIndexBuffer(); - - virtual void SetData(void* buffer, unsigned int size, unsigned int offset = 0); - virtual void Bind() const; - - virtual unsigned int GetSize() const { return m_Size; } - virtual RendererID GetRendererID() const { return m_RendererID; } - private: - RendererID m_RendererID; - unsigned int m_Size; - }; -} - - -#endif //OPENGLINDEXBUFFER_H diff --git a/Prism/src/Prism/Platform/OpenGL/OpenGLShader.cpp b/Prism/src/Prism/Platform/OpenGL/OpenGLShader.cpp index a0c833d..315640e 100644 --- a/Prism/src/Prism/Platform/OpenGL/OpenGLShader.cpp +++ b/Prism/src/Prism/Platform/OpenGL/OpenGLShader.cpp @@ -22,6 +22,33 @@ namespace Prism }); } + void OpenGLShader::UploadUniformBuffer(const UniformBufferBase& uniformBuffer) + { + for (unsigned int i = 0; i < uniformBuffer.GetUniformCount(); i++) + { + const UniformDecl& decl = uniformBuffer.GetUniforms()[i]; + switch (decl.Type) + { + case UniformType::Float: + { + const std::string& name = decl.Name; + float value = *(float*)(uniformBuffer.GetBuffer() + decl.Offset); + PM_RENDER_S2(name, value, { + self->UploadUniformFloat(name, value); + }); + } + case UniformType::Float4: + { + const std::string& name = decl.Name; + glm::vec4& values = *(glm::vec4*)(uniformBuffer.GetBuffer() + decl.Offset); + PM_RENDER_S2(name, values, { + self->UploadUniformFloat4(name, values); + }); + } + } + } + } + void OpenGLShader::ReadShaderFromFile(const std::string& filepath) { std::ifstream file(filepath, std::ios::in | std::ios::binary); @@ -53,7 +80,7 @@ namespace Prism PM_CORE_TRACE("Type={0}", type); } - printf("%s \n", token.c_str()); + PM_CORE_TRACE("{}", token.c_str()); } std::unordered_map shaderSources; @@ -144,4 +171,16 @@ namespace Prism return GL_NONE; } + + void OpenGLShader::UploadUniformFloat(const std::string& name, float value) + { + glUseProgram(m_RendererID); + glUniform1f(glGetUniformLocation(m_RendererID, name.c_str()), value); + } + + void OpenGLShader::UploadUniformFloat4(const std::string& name, const glm::vec4& values) + { + glUseProgram(m_RendererID); + glUniform4f(glGetUniformLocation(m_RendererID, name.c_str()), values.x, values.y, values.z, values.w); + } } diff --git a/Prism/src/Prism/Platform/OpenGL/OpenGLShader.h b/Prism/src/Prism/Platform/OpenGL/OpenGLShader.h index bc7cd02..ff027e2 100644 --- a/Prism/src/Prism/Platform/OpenGL/OpenGLShader.h +++ b/Prism/src/Prism/Platform/OpenGL/OpenGLShader.h @@ -17,11 +17,18 @@ namespace Prism OpenGLShader(const std::string& filepath); virtual void Bind() override; + + virtual void UploadUniformBuffer(const UniformBufferBase& uniformBuffer) override; private: void ReadShaderFromFile(const std::string& filepath); void CompileAndUploadShader(); static GLenum ShaderTypeFromString(const std::string& type); + + void UploadUniformFloat(const std::string& name, float value); + void UploadUniformFloat2(const std::string& name, float* values); + void UploadUniformFloat3(const std::string& name, float* values); + void UploadUniformFloat4(const std::string& name, const glm::vec4& values); private: RendererID m_RendererID; diff --git a/Prism/src/Prism/Platform/OpenGL/OpenGLVertexBuffer.cpp b/Prism/src/Prism/Platform/OpenGL/OpenGLVertexBuffer.cpp deleted file mode 100644 index 2f0eb65..0000000 --- a/Prism/src/Prism/Platform/OpenGL/OpenGLVertexBuffer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// Created by sfd on 25-11-22. -// - -#include "OpenGLVertexBuffer.h" - -#include "glad/glad.h" -#include "Prism/Renderer/Renderer.h" - -namespace Prism -{ - OpenGLVertexBuffer::OpenGLVertexBuffer(unsigned int size) - : m_RendererID(0), m_Size(size) - { - PM_RENDER_S({ - glGenBuffers(1, &self->m_RendererID); - }); - } - - OpenGLVertexBuffer::~OpenGLVertexBuffer() - { - PM_RENDER_S({ - glDeleteBuffers(1, &self->m_RendererID); - }); - } - - void OpenGLVertexBuffer::SetData(void* buffer, unsigned int size, unsigned int offset) - { - PM_RENDER_S3(buffer, size, offset, { - glBindBuffer(GL_ARRAY_BUFFER, self->m_RendererID); - glBufferData(GL_ARRAY_BUFFER, size, buffer, GL_STATIC_DRAW); - - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, 0); - }); - } - - void OpenGLVertexBuffer::Bind() const - { - PM_RENDER_S({ - glBindBuffer(GL_ARRAY_BUFFER, self->m_RendererID); - }); - } -} diff --git a/Prism/src/Prism/Platform/OpenGL/OpenGLVertexBuffer.h b/Prism/src/Prism/Platform/OpenGL/OpenGLVertexBuffer.h deleted file mode 100644 index 550beff..0000000 --- a/Prism/src/Prism/Platform/OpenGL/OpenGLVertexBuffer.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// Created by sfd on 25-11-22. -// - -#ifndef OPENGLVERTEXBUFFER_H -#define OPENGLVERTEXBUFFER_H -#include "Prism/Renderer/VertexBuffer.h" - - -namespace Prism -{ - class OpenGLVertexBuffer : public VertexBuffer - { - public: - OpenGLVertexBuffer(unsigned int size); - virtual ~OpenGLVertexBuffer(); - - virtual void SetData(void* buffer, unsigned int size, unsigned int offset = 0); - virtual void Bind() const; - - virtual unsigned int GetSize() const { return m_Size; } - virtual RendererID GetRendererID() const { return m_RendererID; } - private: - RendererID m_RendererID; - unsigned int m_Size; - }; -} - - -#endif //OPENGLVERTEXBUFFER_H diff --git a/Prism/src/Prism/Renderer/Buffer.cpp b/Prism/src/Prism/Renderer/Buffer.cpp new file mode 100644 index 0000000..e96e1c8 --- /dev/null +++ b/Prism/src/Prism/Renderer/Buffer.cpp @@ -0,0 +1,31 @@ +// +// Created by sfd on 25-11-22. +// + +#include "Buffer.h" + +#include "Prism/Platform/OpenGL/OpenGLBuffer.h" + +namespace Prism +{ + VertexBuffer* VertexBuffer::Create(unsigned int size) + { + switch (RendererAPI::Current()) + { + case RendererAPIType::None: return nullptr; + case RendererAPIType::OpenGL: return new OpenGLVertexBuffer(size); + } + return nullptr; + } + + + IndexBuffer* IndexBuffer::Create(const unsigned int size) + { + switch (RendererAPI::Current()) + { + case RendererAPIType::None: return nullptr; + case RendererAPIType::OpenGL: return new OpenGLIndexBuffer(size); + } + return nullptr; + } +} diff --git a/Prism/src/Prism/Renderer/VertexBuffer.h b/Prism/src/Prism/Renderer/Buffer.h similarity index 50% rename from Prism/src/Prism/Renderer/VertexBuffer.h rename to Prism/src/Prism/Renderer/Buffer.h index 8e02194..54d3b86 100644 --- a/Prism/src/Prism/Renderer/VertexBuffer.h +++ b/Prism/src/Prism/Renderer/Buffer.h @@ -2,8 +2,8 @@ // Created by sfd on 25-11-22. // -#ifndef VERTEXBUFFER_H -#define VERTEXBUFFER_H +#ifndef RENDERER_BUFFER_H +#define RENDERER_BUFFER_H #include "RendererAPI.h" @@ -21,9 +21,24 @@ namespace Prism virtual RendererID GetRendererID() const = 0; static VertexBuffer* Create(unsigned int size = 0); + }; + + class PRISM_API IndexBuffer + { + public: + virtual ~IndexBuffer() {} + + virtual void SetData(void* buffer, unsigned int size, unsigned int offset = 0) = 0; + virtual void Bind() const = 0; + + virtual unsigned int GetSize() const = 0; + virtual RendererID GetRendererID() const = 0; + + static IndexBuffer* Create(unsigned int size = 0); }; } -#endif //VERTEXBUFFER_H + +#endif //RENDERER_BUFFER_H diff --git a/Prism/src/Prism/Renderer/IndexBuffer.cpp b/Prism/src/Prism/Renderer/IndexBuffer.cpp deleted file mode 100644 index 65ffe85..0000000 --- a/Prism/src/Prism/Renderer/IndexBuffer.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by sfd on 25-11-22. -// - -#include "IndexBuffer.h" - -#include "Prism/Platform/OpenGL/OpenGLIndexBuffer.h" - -namespace Prism -{ - IndexBuffer* IndexBuffer::Create(const unsigned int size) - { - switch (RendererAPI::Current()) - { - case RendererAPIType::None: return nullptr; - case RendererAPIType::OpenGL: return new OpenGLIndexBuffer(size); - } - return nullptr; - } -} diff --git a/Prism/src/Prism/Renderer/IndexBuffer.h b/Prism/src/Prism/Renderer/IndexBuffer.h deleted file mode 100644 index 06fe90e..0000000 --- a/Prism/src/Prism/Renderer/IndexBuffer.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// Created by sfd on 25-11-22. -// - -#ifndef INDEXBUFFER_H -#define INDEXBUFFER_H -#include "RendererAPI.h" - - -namespace Prism -{ - class PRISM_API IndexBuffer - { - public: - virtual ~IndexBuffer() {} - - virtual void SetData(void* buffer, unsigned int size, unsigned int offset = 0) = 0; - virtual void Bind() const = 0; - - virtual unsigned int GetSize() const = 0; - virtual RendererID GetRendererID() const = 0; - - static IndexBuffer* Create(unsigned int size = 0); - }; -} - - -#endif //INDEXBUFFER_H diff --git a/Prism/src/Prism/Renderer/RendererAPI.h b/Prism/src/Prism/Renderer/RendererAPI.h index 9f11e21..8038c9a 100644 --- a/Prism/src/Prism/Renderer/RendererAPI.h +++ b/Prism/src/Prism/Renderer/RendererAPI.h @@ -10,7 +10,7 @@ namespace Prism using RendererID = unsigned int; - enum class PRISM_API RendererAPIType + enum class RendererAPIType { None, OpenGL diff --git a/Prism/src/Prism/Renderer/Shader.h b/Prism/src/Prism/Renderer/Shader.h index 9a1579e..7829b02 100644 --- a/Prism/src/Prism/Renderer/Shader.h +++ b/Prism/src/Prism/Renderer/Shader.h @@ -5,13 +5,83 @@ #ifndef SHADER_H #define SHADER_H +#include + +#include "glm/gtc/type_ptr.hpp" namespace Prism { + + enum class UniformType + { + None = 0, + Float, Float2, Float3, Float4, + Mat3, Mat4, + Int32, Uint32 + }; + + struct UniformDecl + { + UniformType Type; + std::ptrdiff_t Offset; + std::string Name; + }; + + struct UniformBuffer + { + // TODO: This currently represents a byte buffer that has been + // packed with uniforms. This was primarily created for OpenGL, + // and needs to be revisted for other rendering APIs. Furthermore, + // this currently does not assume any alignment. This also has + // nothing to do with GL uniform buffers, this is simply a CPU-side + // buffer abstraction. + byte* Buffer; + std::vector Uniforms; + }; + + struct UniformBufferBase + { + virtual const byte* GetBuffer() const = 0; + virtual const UniformDecl* GetUniforms() const = 0; + virtual unsigned int GetUniformCount() const = 0; + }; + + + template + struct UniformBufferDeclaration : public UniformBufferBase + { + byte Buffer[N]; + UniformDecl Uniforms[U]; + std::ptrdiff_t Cursor = 0; + + virtual const byte* GetBuffer() const override { return Buffer; } + virtual const UniformDecl* GetUniforms() const override { return Uniforms; } + virtual unsigned int GetUniformCount() const { return U; } + + template + void Push(const std::string& name, const T& data) {} + + void Push(const std::string& name, const float& data) + { + Uniforms[0] = { UniformType::Float, Cursor, name }; + memcpy(Buffer + Cursor, &data, sizeof(float)); + Cursor += sizeof(float); + } + + void Push(const std::string& name, const glm::vec4& data) + { + Uniforms[0] = { UniformType::Float4, Cursor, name }; + memcpy(Buffer + Cursor, glm::value_ptr(data), sizeof(glm::vec4)); + Cursor += sizeof(glm::vec4); + } + + }; + class PRISM_API Shader { public: virtual void Bind() = 0; + virtual void UploadUniformBuffer(const UniformBufferBase& uniformBuffer) = 0; static Shader* Create(const std::string& filepath); }; diff --git a/Prism/src/Prism/Renderer/VertexBuffer.cpp b/Prism/src/Prism/Renderer/VertexBuffer.cpp deleted file mode 100644 index 0a52879..0000000 --- a/Prism/src/Prism/Renderer/VertexBuffer.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Created by sfd on 25-11-22. -// - -#include "VertexBuffer.h" - -#include "Prism/Platform/OpenGL/OpenGLVertexBuffer.h" - -namespace Prism -{ - VertexBuffer* VertexBuffer::Create(unsigned int size) - { - switch (RendererAPI::Current()) - { - case RendererAPIType::None: return nullptr; - case RendererAPIType::OpenGL: return new OpenGLVertexBuffer(size); - } - return nullptr; - - } -} diff --git a/Prism/vendor/glm b/Prism/vendor/glm new file mode 160000 index 0000000..a583c59 --- /dev/null +++ b/Prism/vendor/glm @@ -0,0 +1 @@ +Subproject commit a583c59e1616a628b18195869767ea4d6faca5f4 diff --git a/Sandbox/CMakeLists.txt b/Sandbox/CMakeLists.txt index e01a866..b334233 100644 --- a/Sandbox/CMakeLists.txt +++ b/Sandbox/CMakeLists.txt @@ -9,4 +9,4 @@ file(COPY ${ASSETS} DESTINATION ${CMAKE_BINARY_DIR}/bin) add_executable(${PROJECT_NAME} ${SRC_SOURCE}) target_link_libraries(${PROJECT_NAME} PRIVATE Prism) -target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_DOCKSPACE) \ No newline at end of file +#target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_DOCKSPACE) \ No newline at end of file diff --git a/Sandbox/Sandbox/Layer/DemoLayer.cpp b/Sandbox/Sandbox/Layer/DemoLayer.cpp index 2e6facb..910df6f 100644 --- a/Sandbox/Sandbox/Layer/DemoLayer.cpp +++ b/Sandbox/Sandbox/Layer/DemoLayer.cpp @@ -57,6 +57,11 @@ void DemoLayer::OnDetach() void DemoLayer::OnUpdate() { Prism::Renderer::Clear(m_ClearColor[0], m_ClearColor[1], m_ClearColor[2], m_ClearColor[3]); + + Prism::UniformBufferDeclaration buffer; + buffer.Push("u_Color", m_TriangleColor); + m_Shader->UploadUniformBuffer(buffer); + m_Shader->Bind(); m_VertexBuffer->Bind(); m_IndexBuffer->Bind(); @@ -71,6 +76,7 @@ void DemoLayer::OnImGuiRender() ImGui::Begin("GameLayer"); ImGui::ColorEdit4("Clear Color", m_ClearColor); + ImGui::ColorEdit4("Triangle Color", glm::value_ptr(m_TriangleColor)); ImGui::End(); #if ENABLE_DOCKSPACE diff --git a/Sandbox/Sandbox/Layer/DemoLayer.h b/Sandbox/Sandbox/Layer/DemoLayer.h index ecf3d54..f661899 100644 --- a/Sandbox/Sandbox/Layer/DemoLayer.h +++ b/Sandbox/Sandbox/Layer/DemoLayer.h @@ -21,6 +21,7 @@ public: private: float m_ClearColor[4] = { 0.2f, 0.2f, 0.2f, 1.0f }; + glm::vec4 m_TriangleColor = { 0.4f, 0.5f, 0.6f, 1.0f }; std::unique_ptr m_VertexBuffer; std::unique_ptr m_IndexBuffer; diff --git a/Sandbox/assets/shaders/shader.glsl b/Sandbox/assets/shaders/shader.glsl index a56ca4e..5f23455 100644 --- a/Sandbox/assets/shaders/shader.glsl +++ b/Sandbox/assets/shaders/shader.glsl @@ -13,7 +13,9 @@ void main() layout(location = 0) out vec4 o_Color; +uniform vec4 u_Color; + void main() { - o_Color = vec4(1.0, 0.0, 1.0, 1.0); + o_Color = u_Color; }