diff options
| author | hachem <im@hachem.wtf> | 2026-08-20 02:27:02 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-08-20 02:40:07 +0200 |
| commit | 5b361d81dbd2af0d0e99b9eb1adebea76ff05db0 (patch) | |
| tree | 34db1df17e8c7248aeeb92156d635d31c2484e3f /src/Platform/OpenGL | |
| parent | e3abaaf59777258ba06705135a0cafcb5918ad12 (diff) | |
[chore]: MASSIVE refactor + more vulkan bs
Diffstat (limited to 'src/Platform/OpenGL')
| -rw-r--r-- | src/Platform/OpenGL/OpenGLFramebuffer.cpp | 246 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLFramebuffer.h | 35 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLIndexBuffer.cpp | 28 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLIndexBuffer.h | 22 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLRendererAPI.cpp | 118 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLRendererAPI.h | 44 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLShader.cpp | 302 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLShader.h | 58 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLTexture.cpp | 272 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLTexture.h | 68 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLUniformBuffer.cpp | 29 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLUniformBuffer.h | 21 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLVertexArray.cpp | 58 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLVertexArray.h | 41 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLVertexBuffer.cpp | 35 | ||||
| -rw-r--r-- | src/Platform/OpenGL/OpenGLVertexBuffer.h | 25 |
16 files changed, 0 insertions, 1402 deletions
diff --git a/src/Platform/OpenGL/OpenGLFramebuffer.cpp b/src/Platform/OpenGL/OpenGLFramebuffer.cpp deleted file mode 100644 index c46e0e6..0000000 --- a/src/Platform/OpenGL/OpenGLFramebuffer.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#include "OpenGLFramebuffer.h" -#include "Core/Log.h" - -#include <glad/glad.h> - -namespace Donut -{ - namespace Utils - { - static GLenum TextureTarget(bool multisampled) - { - return multisampled ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D; - } - - static void BindTexture(bool multisampled, uint32_t id) - { - glBindTexture(TextureTarget(multisampled), id); - } - - static void CreateTextures(bool multisampled, uint32_t* outID, uint32_t count) - { - // glCreateTextures is 4.5 DSA; macOS caps at 4.1. Callers bind each - // texture (with the correct target) before use. - glGenTextures(count, outID); - } - - static void AttachColorTexture(uint32_t id, int samples, GLenum internalFormat, GLenum format, uint32_t width, uint32_t height, int index) - { - bool multisampled = samples > 1; - if (multisampled) - { - glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, internalFormat, width, height, GL_FALSE); - } - else - { - // Integer color formats require an integer pixel type even when - // data is null, or macOS's strict core profile rejects the call. - GLenum type = (format == GL_RED_INTEGER) ? GL_INT : GL_UNSIGNED_BYTE; - glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, nullptr); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, TextureTarget(multisampled), id, 0); - } - - static void AttachDepthTexture(uint32_t id, int samples, GLenum format, GLenum attachmentType, uint32_t width, uint32_t height) - { - bool multisampled = samples > 1; - if (multisampled) - { - glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, format, width, height, GL_FALSE); - } - else - { - // glTexStorage2D is 4.2; use mutable storage for macOS (4.1). - GLenum depthFormat = (format == GL_DEPTH24_STENCIL8) ? GL_DEPTH_STENCIL : GL_DEPTH_COMPONENT; - GLenum depthType = (format == GL_DEPTH24_STENCIL8) ? GL_UNSIGNED_INT_24_8 : GL_FLOAT; - glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, depthFormat, depthType, nullptr); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } - - glFramebufferTexture2D(GL_FRAMEBUFFER, attachmentType, TextureTarget(multisampled), id, 0); - } - - static bool IsDepthFormat(FramebufferTextureFormat format) - { - switch (format) - { - case FramebufferTextureFormat::DEPTH24STENCIL8: return true; - } - return false; - } - - static GLenum DonutFBTextureFormatToGL(FramebufferTextureFormat format) - { - switch (format) - { - case FramebufferTextureFormat::RGBA8: return GL_RGBA8; - case FramebufferTextureFormat::RED_INTEGER: return GL_RED_INTEGER; - } - - return 0; - } - } - - OpenGLFramebuffer::OpenGLFramebuffer(const FramebufferSpecification& spec) - : m_Specification(spec) - { - for (auto spec : m_Specification.Attachments.Attachments) - { - if (!Utils::IsDepthFormat(spec.TextureFormat)) - m_ColorAttachmentSpecifications.emplace_back(spec); - else - m_DepthAttachmentSpecification = spec; - } - - Invalidate(); - } - - OpenGLFramebuffer::~OpenGLFramebuffer() - { - glDeleteFramebuffers(1, &m_RendererID); - glDeleteTextures(static_cast<GLsizei>(m_ColorAttachments.size()), m_ColorAttachments.data()); - glDeleteTextures(1, &m_DepthAttachment); - } - - void OpenGLFramebuffer::Invalidate() - { - if (m_RendererID) - { - glDeleteFramebuffers(1, &m_RendererID); - glDeleteTextures(static_cast<GLsizei>(m_ColorAttachments.size()), m_ColorAttachments.data()); - glDeleteTextures(1, &m_DepthAttachment); - - m_ColorAttachments.clear(); - m_DepthAttachment = 0; - } - - glGenFramebuffers(1, &m_RendererID); // glCreateFramebuffers is 4.5 DSA; unavailable on macOS 4.1 - glBindFramebuffer(GL_FRAMEBUFFER, m_RendererID); - - bool multisample = m_Specification.Samples > 1; - - if (m_ColorAttachmentSpecifications.size()) - { - m_ColorAttachments.resize(m_ColorAttachmentSpecifications.size()); - Utils::CreateTextures(multisample, m_ColorAttachments.data(), static_cast<uint32_t>(m_ColorAttachments.size())); - - for (size_t i = 0; i < m_ColorAttachments.size(); i++) - { - Utils::BindTexture(multisample, m_ColorAttachments[i]); - switch (m_ColorAttachmentSpecifications[i].TextureFormat) - { - case FramebufferTextureFormat::RGBA8: - Utils::AttachColorTexture(m_ColorAttachments[i], m_Specification.Samples, GL_RGBA8, GL_RGBA, m_Specification.Width, m_Specification.Height, static_cast<int>(i)); - break; - case FramebufferTextureFormat::RED_INTEGER: - Utils::AttachColorTexture(m_ColorAttachments[i], m_Specification.Samples, GL_R32I, GL_RED_INTEGER, m_Specification.Width, m_Specification.Height, static_cast<int>(i)); - break; - } - } - } - - if (m_DepthAttachmentSpecification.TextureFormat != FramebufferTextureFormat::None) - { - Utils::CreateTextures(multisample, &m_DepthAttachment, 1); - Utils::BindTexture(multisample, m_DepthAttachment); - switch (m_DepthAttachmentSpecification.TextureFormat) - { - case FramebufferTextureFormat::DEPTH24STENCIL8: - Utils::AttachDepthTexture(m_DepthAttachment, m_Specification.Samples, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL_ATTACHMENT, m_Specification.Width, m_Specification.Height); - break; - } - } - - if (m_ColorAttachments.size() > 1) - { - GLenum buffers[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; - glDrawBuffers(static_cast<GLsizei>(m_ColorAttachments.size()), buffers); - } - else if (m_ColorAttachments.empty()) - glDrawBuffer(GL_NONE); - - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - switch (status) - { - case GL_FRAMEBUFFER_UNDEFINED: - DONUT_ERROR("Framebuffer is undefined"); - break; - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: - DONUT_ERROR("Framebuffer has incomplete attachment"); - break; - case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: - DONUT_ERROR("Framebuffer is missing attachment"); - break; - case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: - DONUT_ERROR("Framebuffer has incomplete draw buffer"); - break; - case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: - DONUT_ERROR("Framebuffer has incomplete read buffer"); - break; - case GL_FRAMEBUFFER_UNSUPPORTED: - DONUT_ERROR("Framebuffer format is unsupported"); - break; - case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: - DONUT_ERROR("Framebuffer has incomplete multisample"); - break; - case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: - DONUT_ERROR("Framebuffer has incomplete layer targets"); - break; - default: - DONUT_ERROR("Framebuffer is incomplete (unknown error: {})", status); - break; - } - } - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } - - void OpenGLFramebuffer::Bind() - { - glBindFramebuffer(GL_FRAMEBUFFER, m_RendererID); - glViewport(0, 0, m_Specification.Width, m_Specification.Height); - } - - void OpenGLFramebuffer::Unbind() - { - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } - - void OpenGLFramebuffer::Resize(uint32_t width, uint32_t height) - { - m_Specification.Width = width; - m_Specification.Height = height; - - Invalidate(); - } - - int OpenGLFramebuffer::ReadPixel(uint32_t attachmentIndex, int x, int y) - { - glReadBuffer(GL_COLOR_ATTACHMENT0 + attachmentIndex); - int pixelData; - glReadPixels(x, y, 1, 1, GL_RED_INTEGER, GL_INT, &pixelData); - return pixelData; - } - - void OpenGLFramebuffer::ClearAttachment(uint32_t attachmentIndex, int value) - { - // glClearTexImage is 4.4 and unavailable on macOS. Clear the integer - // attachment by binding this framebuffer and clearing its draw buffer. - glBindFramebuffer(GL_FRAMEBUFFER, m_RendererID); - glClearBufferiv(GL_COLOR, static_cast<GLint>(attachmentIndex), &value); - } -}; diff --git a/src/Platform/OpenGL/OpenGLFramebuffer.h b/src/Platform/OpenGL/OpenGLFramebuffer.h deleted file mode 100644 index 8cd376c..0000000 --- a/src/Platform/OpenGL/OpenGLFramebuffer.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "Rendering/Framebuffer.h" - -namespace Donut -{ - class OpenGLFramebuffer : public Framebuffer - { - public: - OpenGLFramebuffer(const FramebufferSpecification& spec); - virtual ~OpenGLFramebuffer(); - - void Invalidate(); - - virtual void Bind() override; - virtual void Unbind() override; - - virtual void Resize(uint32_t width, uint32_t height) override; - virtual int ReadPixel(uint32_t attachmentIndex, int x, int y) override; - - virtual void ClearAttachment(uint32_t attachmentIndex, int value) override; - virtual uint32_t GetColorAttachmentRendererID(uint32_t index = 0) const override { return m_ColorAttachments[index]; } - - virtual const FramebufferSpecification& GetSpecification() const override { return m_Specification; } - private: - uint32_t m_RendererID = 0; - FramebufferSpecification m_Specification; - - std::vector<FramebufferTextureSpecification> m_ColorAttachmentSpecifications; - FramebufferTextureSpecification m_DepthAttachmentSpecification = FramebufferTextureFormat::None; - - std::vector<uint32_t> m_ColorAttachments; - uint32_t m_DepthAttachment = 0; - }; -}; diff --git a/src/Platform/OpenGL/OpenGLIndexBuffer.cpp b/src/Platform/OpenGL/OpenGLIndexBuffer.cpp deleted file mode 100644 index 668a898..0000000 --- a/src/Platform/OpenGL/OpenGLIndexBuffer.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "OpenGLIndexBuffer.h" -#include <glad/glad.h> - -namespace Donut -{ - OpenGLIndexBuffer::OpenGLIndexBuffer(const uint32_t* indices, uint32_t count) - : m_Count(count) - { - glGenBuffers(1, &m_RendererID); // glCreateBuffers is 4.5 DSA; unavailable on macOS 4.1 - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(uint32_t), indices, GL_STATIC_DRAW); - } - - OpenGLIndexBuffer::~OpenGLIndexBuffer() - { - glDeleteBuffers(1, &m_RendererID); - } - - void OpenGLIndexBuffer::Bind() const - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID); - } - - void OpenGLIndexBuffer::Unbind() const - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - } -}; diff --git a/src/Platform/OpenGL/OpenGLIndexBuffer.h b/src/Platform/OpenGL/OpenGLIndexBuffer.h deleted file mode 100644 index b3048a3..0000000 --- a/src/Platform/OpenGL/OpenGLIndexBuffer.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "Rendering/IndexBuffer.h" - -namespace Donut -{ - class OpenGLIndexBuffer - : public IndexBuffer - { - public: - OpenGLIndexBuffer(const uint32_t* indices, uint32_t count); - virtual ~OpenGLIndexBuffer(); - - virtual void Bind() const override; - virtual void Unbind() const override; - virtual uint32_t GetCount() const override { return m_Count; } - - private: - uint32_t m_RendererID; - uint32_t m_Count; - }; -}; diff --git a/src/Platform/OpenGL/OpenGLRendererAPI.cpp b/src/Platform/OpenGL/OpenGLRendererAPI.cpp deleted file mode 100644 index fd3c491..0000000 --- a/src/Platform/OpenGL/OpenGLRendererAPI.cpp +++ /dev/null @@ -1,118 +0,0 @@ -#include "OpenGLRendererAPI.h" - -#include <glad/glad.h> -#include <GLFW/glfw3.h> - -namespace Donut -{ - void OpenGLRendererAPI::Init() - { - if (!glfwGetCurrentContext()) - { - DONUT_ERROR("No OpenGL context is current! Cannot initialize GLAD."); - return; - } - - if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) - { - 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); - } - - void OpenGLRendererAPI::SetViewport(uint32_t x, uint32_t y, uint32_t width, uint32_t height) - { - glViewport(x, y, width, height); - } - - void OpenGLRendererAPI::SetClearColor(const glm::vec4& color) - { - glClearColor(color.r, color.g, color.b, color.a); - } - - void OpenGLRendererAPI::Clear() - { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - } - - void OpenGLRendererAPI::EnableDepthTest() - { - glEnable(GL_DEPTH_TEST); - } - - void OpenGLRendererAPI::DisableDepthTest() - { - glDisable(GL_DEPTH_TEST); - } - - void OpenGLRendererAPI::SetFaceCulling(bool enabled) - { - if (enabled) - { - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - glFrontFace(GL_CCW); - } - else - glDisable(GL_CULL_FACE); - } - - void OpenGLRendererAPI::EnableBlending() - { - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - - void OpenGLRendererAPI::DisableBlending() - { - glDisable(GL_BLEND); - } - - void OpenGLRendererAPI::DrawIndexed(const Ref<VertexArray>& vertexArray, uint32_t indexCount) - { - uint32_t count = indexCount ? indexCount : vertexArray->GetIndexBuffer()->GetCount(); - glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, nullptr); - glBindTexture(GL_TEXTURE_2D, 0); - } - - void OpenGLRendererAPI::DrawArrays(uint32_t vertexCount, uint32_t first) - { - glDrawArrays(GL_TRIANGLES, first, vertexCount); - } - - void OpenGLRendererAPI::DrawLines(const Ref<VertexArray>& vertexArray, uint32_t indexCount) - { - uint32_t count = indexCount ? indexCount : vertexArray->GetIndexBuffer()->GetCount(); - glDrawElements(GL_LINES, count, GL_UNSIGNED_INT, nullptr); - } - - void OpenGLRendererAPI::BindTexture(uint32_t textureID, uint32_t slot) - { - glActiveTexture(GL_TEXTURE0 + slot); - glBindTexture(GL_TEXTURE_2D, textureID); - } - - void OpenGLRendererAPI::BindImageTexture(uint32_t textureID, uint32_t slot, bool readOnly) - { - // Image load/store is OpenGL 4.2; the pointer is null on macOS (4.1). - if (glBindImageTexture == nullptr) - return; - glBindImageTexture(slot, textureID, 0, GL_FALSE, 0, - readOnly ? GL_READ_ONLY : GL_WRITE_ONLY, GL_RGBA8); - } - - void OpenGLRendererAPI::ReadPixels(uint32_t x, uint32_t y, uint32_t width, uint32_t height, - uint32_t format, uint32_t type, void* pixels) - { - glReadPixels(x, y, width, height, format, type, pixels); - } -}; diff --git a/src/Platform/OpenGL/OpenGLRendererAPI.h b/src/Platform/OpenGL/OpenGLRendererAPI.h deleted file mode 100644 index 5a68622..0000000 --- a/src/Platform/OpenGL/OpenGLRendererAPI.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include "Core/Memory.h" -#include "Core/Log.h" - -#include "Rendering/Renderer.h" - -#include <glad/glad.h> - -namespace Donut -{ - class OpenGLRendererAPI - : public RendererAPI - { - public: - virtual void Init() override; - virtual void SetViewport(uint32_t x, uint32_t y, - uint32_t width, uint32_t height) override; - virtual void SetClearColor(const glm::vec4& color) override; - virtual void Clear() override; - virtual void EnableDepthTest() override; - virtual void DisableDepthTest() override; - virtual void SetFaceCulling(bool enabled) override; - virtual void EnableBlending() override; - virtual void DisableBlending() override; - - virtual void DrawIndexed(const Ref<VertexArray>& vertexArray, - uint32_t indexCount = 0) override; - - virtual void DrawArrays(uint32_t vertexCount, - uint32_t first = 0) override; - virtual void DrawLines(const Ref<VertexArray>& vertexArray, - uint32_t indexCount = 0) override; - virtual void BindTexture(uint32_t textureID, - uint32_t slot = 0) override; - virtual void BindImageTexture(uint32_t textureID, - uint32_t slot = 0, - bool readOnly = false) override; - virtual void ReadPixels(uint32_t x, uint32_t y, - uint32_t width, uint32_t height, - uint32_t format, uint32_t type, - void* pixels) override; - }; -}; diff --git a/src/Platform/OpenGL/OpenGLShader.cpp b/src/Platform/OpenGL/OpenGLShader.cpp deleted file mode 100644 index 5d6dd66..0000000 --- a/src/Platform/OpenGL/OpenGLShader.cpp +++ /dev/null @@ -1,302 +0,0 @@ -#include "OpenGLShader.h" - -#include <glad/glad.h> -#include <glm/gtc/type_ptr.hpp> - -#include <fstream> -#include <iostream> - -namespace Donut -{ - static uint32_t ShaderTypeFromString(const std::string& type) - { - if (type == "vertex") - return GL_VERTEX_SHADER; - if (type == "fragment" || type == "pixel") - return GL_FRAGMENT_SHADER; - if (type == "compute") - return GL_COMPUTE_SHADER; - return 0; - } - - // Shaders are authored in Slang and compiled to Assets/Shaders/generated/ - // <name>.glsl by Tools/compile-shaders.sh. Given a legacy ".../<name>.glsl" - // path, prefer that generated file when present; otherwise fall back to the - // hand-written GLSL (e.g. shaders not yet ported to Slang). - static std::string ResolveShaderPath(const std::string& filepath) - { - size_t slash = filepath.find_last_of("/\\"); - std::string dir = (slash == std::string::npos) ? std::string() : filepath.substr(0, slash + 1); - std::string file = (slash == std::string::npos) ? filepath : filepath.substr(slash + 1); - size_t dot = file.rfind('.'); - std::string base = (dot == std::string::npos) ? file : file.substr(0, dot); - - std::string generated = dir + "generated/" + base + ".glsl"; - std::ifstream test(generated); - if (test.good()) - return generated; - return filepath; - } - - OpenGLShader::OpenGLShader(const std::string& filepath) - { - std::string resolved = ResolveShaderPath(filepath); - m_IsSlang = (resolved != filepath); - std::string source = ReadFile(resolved); - auto shaderSources = PreProcess(source); - Compile(shaderSources); - - auto lastSlash = filepath.find_last_of("/\\"); - lastSlash = lastSlash == std::string::npos ? 0 : lastSlash + 1; - auto lastDot = filepath.rfind('.'); - auto count = lastDot == std::string::npos ? filepath.size() - lastSlash : lastDot - lastSlash; - m_Name = filepath.substr(lastSlash, count); - } - - OpenGLShader::OpenGLShader(const std::string& name, const std::string& vertexSrc, const std::string& fragmentSrc) - : m_Name(name) - { - std::unordered_map<uint32_t, std::string> sources; - sources[GL_VERTEX_SHADER] = vertexSrc; - sources[GL_FRAGMENT_SHADER] = fragmentSrc; - Compile(sources); - } - - OpenGLShader::OpenGLShader(const std::string& name, const std::string& computeSrc) - : m_Name(name) - { - std::unordered_map<uint32_t, std::string> sources; - sources[GL_COMPUTE_SHADER] = computeSrc; - Compile(sources); - } - - OpenGLShader::~OpenGLShader() - { - glDeleteProgram(m_RendererID); - } - - std::string OpenGLShader::ReadFile(const std::string& filepath) - { - std::string result; - std::ifstream in(filepath, std::ios::in | - std::ios::binary); - - if (in) - { - in.seekg(0, std::ios::end); - size_t size = in.tellg(); - if (size != -1) - { - result.resize(size); - in.seekg(0, std::ios::beg); - in.read(&result[0], size); - } - } - return result; - } - - std::unordered_map<uint32_t, std::string> OpenGLShader::PreProcess(const std::string& source) - { - std::unordered_map<uint32_t, std::string> shaderSources; - - const char* typeToken = "#type"; - size_t typeTokenLength = strlen(typeToken); - size_t pos = source.find(typeToken, 0); - - while (pos != std::string::npos) - { - size_t eol = source.find_first_of("\r\n", pos); - size_t begin = pos + typeTokenLength + 1; - std::string type = source.substr(begin, eol - begin); - - size_t nextLinePos = source.find_first_not_of("\r\n", eol); - pos = source.find(typeToken, nextLinePos); - shaderSources[ShaderTypeFromString(type)] = (pos == std::string::npos) ? source.substr(nextLinePos) : - source.substr(nextLinePos, pos - nextLinePos); - } - - return shaderSources; - } - - void OpenGLShader::Compile(const std::unordered_map<uint32_t, std::string>& shaderSources) - { - uint32_t program = glCreateProgram(); - std::vector<uint32_t> glShaderIDs(shaderSources.size()); - for (auto& kv : shaderSources) - { - uint32_t type = kv.first; - const std::string& source = kv.second; - - uint32_t shader = glCreateShader(type); - const char* sourceCStr = source.c_str(); - glShaderSource(shader, 1, &sourceCStr, 0); - glCompileShader(shader); - - int isCompiled = 0; - glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled); - if (isCompiled == GL_FALSE) - { - int maxLength = 0; - glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength); - std::vector<char> infoLog(maxLength); - glGetShaderInfoLog(shader, maxLength, &maxLength, &infoLog[0]); - glDeleteShader(shader); - for (auto id : glShaderIDs) - glDeleteShader(id); - glDeleteProgram(program); - m_RendererID = 0; - // infoLog.data() is null when the driver returns an empty log - // (e.g. macOS rejecting a compute shader); streaming a null - // char* into std::cout calls strlen(NULL) and crashes. - const char* log = infoLog.empty() ? "" : infoLog.data(); - std::cout << "Shader compilation failure!" << std::endl << log << std::endl; - return; - } - glAttachShader(program, shader); - glShaderIDs.push_back(shader); - } - - m_RendererID = program; - glLinkProgram(m_RendererID); - - int isLinked = 0; - glGetProgramiv(m_RendererID, GL_LINK_STATUS, (int*)&isLinked); - if (isLinked == GL_FALSE) - { - int maxLength = 0; - glGetProgramiv(m_RendererID, GL_INFO_LOG_LENGTH, &maxLength); - std::vector<char> infoLog(maxLength); - glGetProgramInfoLog(m_RendererID, maxLength, &maxLength, &infoLog[0]); - glDeleteProgram(m_RendererID); - for (auto id : glShaderIDs) - glDeleteShader(id); - m_RendererID = 0; - const char* log = infoLog.empty() ? "" : infoLog.data(); - std::cout << "Shader link failure!" << std::endl << log << std::endl; - return; - } - - for (auto id : glShaderIDs) - { - glDetachShader(m_RendererID, id); - glDeleteShader(id); - } - } - - void OpenGLShader::Bind() const - { - glUseProgram(m_RendererID); - } - - void OpenGLShader::Unbind() const - { - glUseProgram(0); - } - - void OpenGLShader::SetInt(const std::string& name, int value) - { - UploadUniformInt(name, value); - } - - void OpenGLShader::SetIntArray(const std::string& name, int* values, uint32_t count) - { - UploadUniformIntArray(name, values, count); - } - - void OpenGLShader::SetFloat(const std::string& name, float value) - { - UploadUniformFloat(name, value); - } - - void OpenGLShader::SetFloat2(const std::string& name, const glm::vec2& value) - { - UploadUniformFloat2(name, value); - } - - void OpenGLShader::SetFloat3(const std::string& name, const glm::vec3& value) - { - UploadUniformFloat3(name, value); - } - - void OpenGLShader::SetFloat4(const std::string& name, const glm::vec4& value) - { - UploadUniformFloat4(name, value); - } - - void OpenGLShader::SetMat4(const std::string& name, const glm::mat4& value) - { - UploadUniformMat4(name, value); - } - - void OpenGLShader::UploadUniformInt(const std::string& name, int value) - { - int location = glGetUniformLocation(m_RendererID, name.c_str()); - glUniform1i(location, value); - } - - void OpenGLShader::UploadUniformIntArray(const std::string& name, int* values, uint32_t count) - { - int location = glGetUniformLocation(m_RendererID, name.c_str()); - glUniform1iv(location, count, values); - } - - void OpenGLShader::UploadUniformFloat(const std::string& name, float value) - { - int location = glGetUniformLocation(m_RendererID, name.c_str()); - glUniform1f(location, value); - } - - void OpenGLShader::UploadUniformFloat2(const std::string& name, const glm::vec2& value) - { - int location = glGetUniformLocation(m_RendererID, name.c_str()); - glUniform2f(location, value.x, value.y); - } - - void OpenGLShader::UploadUniformFloat3(const std::string& name, const glm::vec3& value) - { - int location = glGetUniformLocation(m_RendererID, name.c_str()); - glUniform3f(location, value.x, value.y, value.z); - } - - void OpenGLShader::UploadUniformFloat4(const std::string& name, const glm::vec4& value) - { - int location = glGetUniformLocation(m_RendererID, name.c_str()); - glUniform4f(location, value.x, value.y, value.z, value.w); - } - - void OpenGLShader::UploadUniformMat3(const std::string& name, const glm::mat3& matrix) - { - int location = glGetUniformLocation(m_RendererID, name.c_str()); - glUniformMatrix3fv(location, 1, m_IsSlang ? GL_TRUE : GL_FALSE, glm::value_ptr(matrix)); - } - - void OpenGLShader::UploadUniformMat4(const std::string& name, const glm::mat4& matrix) - { - int location = glGetUniformLocation(m_RendererID, name.c_str()); - glUniformMatrix4fv(location, 1, m_IsSlang ? GL_TRUE : GL_FALSE, glm::value_ptr(matrix)); - } - - void OpenGLShader::Dispatch(uint32_t x, uint32_t y, uint32_t z) - { - // Compute shaders require OpenGL 4.3+. On drivers that cap out earlier - // (e.g. macOS, which is frozen at 4.1) glDispatchCompute is never - // loaded and the pointer is null. Guard so we no-op instead of crash. - if (m_RendererID == 0 || glDispatchCompute == nullptr) - return; - glDispatchCompute(x, y, z); - } - - void OpenGLShader::DispatchIndirect(uint32_t offset) - { - if (m_RendererID == 0 || glDispatchComputeIndirect == nullptr) - return; - glDispatchComputeIndirect(offset); - } - - void OpenGLShader::MemoryBarrier(uint32_t barriers) - { - if (glMemoryBarrier == nullptr) - return; - glMemoryBarrier(barriers); - } -}; diff --git a/src/Platform/OpenGL/OpenGLShader.h b/src/Platform/OpenGL/OpenGLShader.h deleted file mode 100644 index 4b63597..0000000 --- a/src/Platform/OpenGL/OpenGLShader.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include "Rendering/Shader.h" - -#include <unordered_map> -#include <glm/glm.hpp> - -namespace Donut -{ - class OpenGLShader - : public Shader - { - public: - OpenGLShader(const std::string& filepath); - OpenGLShader(const std::string& name, const std::string& vertexSrc, const std::string& fragmentSrc); - OpenGLShader(const std::string& name, const std::string& computeSrc); - virtual ~OpenGLShader(); - - virtual void Bind() const override; - virtual void Unbind() const override; - - virtual void SetInt( const std::string& name, int value) override; - virtual void SetIntArray(const std::string& name, int* values, uint32_t count) override; - virtual void SetFloat( const std::string& name, float value) override; - virtual void SetFloat2( const std::string& name, const glm::vec2& value) override; - virtual void SetFloat3( const std::string& name, const glm::vec3& value) override; - virtual void SetFloat4( const std::string& name, const glm::vec4& value) override; - virtual void SetMat4( const std::string& name, const glm::mat4& value) override; - - virtual void Dispatch(uint32_t x, uint32_t y = 1, uint32_t z = 1) override; - virtual void DispatchIndirect(uint32_t offset = 0) override; - virtual void MemoryBarrier(uint32_t barriers) override; - - virtual const std::string& GetName() const override { return m_Name; } - virtual uint32_t GetRendererID() const override { return m_RendererID; } - - void UploadUniformInt( const std::string& name, int value); - void UploadUniformIntArray(const std::string& name, int* values, uint32_t count); - void UploadUniformFloat( const std::string& name, float value); - void UploadUniformFloat2( const std::string& name, const glm::vec2& value); - void UploadUniformFloat3( const std::string& name, const glm::vec3& value); - void UploadUniformFloat4( const std::string& name, const glm::vec4& value); - void UploadUniformMat3( const std::string& name, const glm::mat3& matrix); - void UploadUniformMat4( const std::string& name, const glm::mat4& matrix); - - private: - std::string ReadFile(const std::string& filepath); - std::unordered_map<uint32_t, std::string> PreProcess(const std::string& source); - void Compile(const std::unordered_map<uint32_t, std::string>& shaderSources); - private: - uint32_t m_RendererID = 0; - std::string m_Name; - // True when loaded from a Slang-compiled GLSL. Slang expects row-major - // matrix data, so matrix uniforms are transposed on upload (glm is - // column-major) to keep all matrix math correct. - bool m_IsSlang = false; - }; -}; diff --git a/src/Platform/OpenGL/OpenGLTexture.cpp b/src/Platform/OpenGL/OpenGLTexture.cpp deleted file mode 100644 index 16892c6..0000000 --- a/src/Platform/OpenGL/OpenGLTexture.cpp +++ /dev/null @@ -1,272 +0,0 @@ -#include "OpenGLTexture.h" - -#include "Rendering/Shader.h" - -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" -#include <glm/glm.hpp> -#include <glm/gtc/matrix_transform.hpp> -#include <glm/gtc/type_ptr.hpp> - -// NOTE: This file targets OpenGL 4.1 (the maximum macOS exposes). It uses the -// classic bind-based texture API rather than 4.5 Direct State Access -// (glCreateTextures / glTextureStorage2D / glTextureParameteri / glBindTextureUnit), -// none of which exist on macOS. - -namespace Donut -{ - OpenGLTexture2D::OpenGLTexture2D(uint32_t width, uint32_t height) - : m_Width(width), m_Height(height) - { - m_InternalFormat = GL_RGBA8; - m_DataFormat = GL_RGBA; - - glGenTextures(1, &m_RendererID); - glBindTexture(GL_TEXTURE_2D, m_RendererID); - glTexImage2D(GL_TEXTURE_2D, 0, m_InternalFormat, m_Width, m_Height, 0, m_DataFormat, GL_UNSIGNED_BYTE, nullptr); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - } - - OpenGLTexture2D::OpenGLTexture2D(const std::string& path) - : m_Path(path) - { - m_Width = 1; - m_Height = 1; - m_InternalFormat = GL_RGBA8; - m_DataFormat = GL_RGBA; - - glGenTextures(1, &m_RendererID); - glBindTexture(GL_TEXTURE_2D, m_RendererID); - glTexImage2D(GL_TEXTURE_2D, 0, m_InternalFormat, m_Width, m_Height, 0, m_DataFormat, GL_UNSIGNED_BYTE, nullptr); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - - uint32_t whitePixel = 0xFFFFFFFF; - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_Height, m_DataFormat, GL_UNSIGNED_BYTE, &whitePixel); - - DONUT_INFO("Created default texture (stb_image not available for loading: ", path, ")"); - } - - OpenGLTexture2D::~OpenGLTexture2D() - { - glDeleteTextures(1, &m_RendererID); - } - - void OpenGLTexture2D::SetData(void* data, uint32_t size) - { - uint32_t bpp = m_DataFormat == GL_RGBA ? 4 : 3; - if (size != m_Width * m_Height * bpp) - { - DONUT_ERROR("Data must be entire texture!"); - return; - } - - glBindTexture(GL_TEXTURE_2D, m_RendererID); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_Height, m_DataFormat, GL_UNSIGNED_BYTE, data); - } - - void OpenGLTexture2D::Bind(uint32_t slot) const - { - glActiveTexture(GL_TEXTURE0 + slot); - glBindTexture(GL_TEXTURE_2D, m_RendererID); - } - - void OpenGLTexture2D::BindAsImage(uint32_t slot, bool readOnly) const - { - // Image load/store is OpenGL 4.2 and unavailable on macOS. Guard the - // function pointer so this degrades to a no-op instead of crashing. - if (glBindImageTexture == nullptr) - return; - GLenum access = readOnly ? GL_READ_ONLY : GL_WRITE_ONLY; - glBindImageTexture(slot, m_RendererID, 0, GL_FALSE, 0, access, m_InternalFormat); - } - - OpenGLCubemapTexture::OpenGLCubemapTexture(uint32_t width, uint32_t height) - : m_Width(width), m_Height(height) - { - m_InternalFormat = GL_RGBA16F; - m_DataFormat = GL_RGBA; - - glGenTextures(1, &m_RendererID); - glBindTexture(GL_TEXTURE_CUBE_MAP, m_RendererID); - for (uint32_t i = 0; i < 6; ++i) - glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, m_InternalFormat, m_Width, m_Height, 0, m_DataFormat, GL_FLOAT, nullptr); - - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - } - - OpenGLCubemapTexture::OpenGLCubemapTexture(const std::string& path) - : m_Path(path) - { - m_Width = 1024; - m_Height = 1024; - m_InternalFormat = GL_RGBA16F; - m_DataFormat = GL_RGBA; - - glGenTextures(1, &m_RendererID); - glBindTexture(GL_TEXTURE_CUBE_MAP, m_RendererID); - for (uint32_t i = 0; i < 6; ++i) - glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, m_InternalFormat, m_Width, m_Height, 0, m_DataFormat, GL_FLOAT, nullptr); - - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - - LoadHDRI(path); - } - - OpenGLCubemapTexture::~OpenGLCubemapTexture() - { - glDeleteTextures(1, &m_RendererID); - } - - void OpenGLCubemapTexture::LoadHDRI(const std::string& path) - { - stbi_set_flip_vertically_on_load(true); - int width, height, channels; - float* hdrData = stbi_loadf(path.c_str(), &width, &height, &channels, 3); - - if (!hdrData) - { - DONUT_ERROR("Failed to load HDRI: {}", path); - float defaultSky[6 * 4] = - { - 0.5f, 0.7f, 1.0f, 1.0f, // Right - 0.5f, 0.7f, 1.0f, 1.0f, // Left - 0.5f, 0.7f, 1.0f, 1.0f, // Top - 0.5f, 0.7f, 1.0f, 1.0f, // Bottom - 0.5f, 0.7f, 1.0f, 1.0f, // Front - 0.5f, 0.7f, 1.0f, 1.0f // Back - }; - - glBindTexture(GL_TEXTURE_CUBE_MAP, m_RendererID); - for (int i = 0; i < 6; ++i) - glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, 1, 1, GL_RGBA, GL_FLOAT, &defaultSky[i * 4]); - return; - } - - ConvertEquirectangularToCubemap(hdrData, width, height); - stbi_image_free(hdrData); - - DONUT_INFO("Successfully loaded HDRI: {} ({}x{})", path, width, height); - } - - void OpenGLCubemapTexture::ConvertEquirectangularToCubemap(float* hdrData, int width, int height) - { - uint32_t captureFBO, captureRBO; - glGenFramebuffers(1, &captureFBO); - glGenRenderbuffers(1, &captureRBO); - - glBindFramebuffer(GL_FRAMEBUFFER, captureFBO); - glBindRenderbuffer(GL_RENDERBUFFER, captureRBO); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, m_Width, m_Height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, captureRBO); - - uint32_t hdrTexture; - glGenTextures(1, &hdrTexture); - glBindTexture(GL_TEXTURE_2D, hdrTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, hdrData); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - auto equirectShader = Shader::Create("Assets/Shaders/EquirectToCubemap.glsl"); - if (!equirectShader) - { - DONUT_ERROR("Failed to create equirectangular to cubemap shader"); - return; - } - - uint32_t shaderProgram = equirectShader->GetRendererID(); - - float vertices[] = - { - -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, - -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, - 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, - -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, - -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, - -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f - }; - - uint32_t cubeVAO, cubeVBO; - glGenVertexArrays(1, &cubeVAO); - glGenBuffers(1, &cubeVBO); - glBindVertexArray(cubeVAO); - glBindBuffer(GL_ARRAY_BUFFER, cubeVBO); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); - - glm::mat4 captureProjection = glm::perspective(glm::radians(90.0f), 1.0f, 0.1f, 10.0f); - glm::mat4 captureViews[] = - { - glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)), - glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)), - glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f)), - glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f)), - glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, 0.0f, 1.0f), glm::vec3(0.0f, -1.0f, 0.0f)), - glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, 0.0f, -1.0f), glm::vec3(0.0f, -1.0f, 0.0f)) - }; - - glUseProgram(shaderProgram); - glUniform1i(glGetUniformLocation(shaderProgram, "u_EquirectangularMap"), 0); - // EquirectToCubemap is authored in Slang (row-major); transpose glm's - // column-major matrices on upload (GL_TRUE) to match. - glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "u_Projection"), 1, GL_TRUE, &captureProjection[0][0]); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, hdrTexture); - - glViewport(0, 0, m_Width, m_Height); - glBindFramebuffer(GL_FRAMEBUFFER, captureFBO); - for (unsigned int i = 0; i < 6; ++i) - { - glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "u_View"), 1, GL_TRUE, &captureViews[i][0][0]); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, m_RendererID, 0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glBindVertexArray(cubeVAO); - glDrawArrays(GL_TRIANGLES, 0, 36); - } - glBindVertexArray(0); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glDeleteVertexArrays(1, &cubeVAO); - glDeleteBuffers(1, &cubeVBO); - glDeleteTextures(1, &hdrTexture); - glDeleteFramebuffers(1, &captureFBO); - glDeleteRenderbuffers(1, &captureRBO); - } - - void OpenGLCubemapTexture::SetData(void* data, uint32_t size) - { - DONUT_WARN("SetData not implemented for cubemaps"); - } - - void OpenGLCubemapTexture::Bind(uint32_t slot) const - { - glActiveTexture(GL_TEXTURE0 + slot); - glBindTexture(GL_TEXTURE_CUBE_MAP, m_RendererID); - } - - void OpenGLCubemapTexture::BindAsImage(uint32_t slot, bool readOnly) const - { - if (glBindImageTexture == nullptr) - return; - GLenum access = readOnly ? GL_READ_ONLY : GL_WRITE_ONLY; - glBindImageTexture(slot, m_RendererID, 0, GL_TRUE, 0, access, m_InternalFormat); - } -}; diff --git a/src/Platform/OpenGL/OpenGLTexture.h b/src/Platform/OpenGL/OpenGLTexture.h deleted file mode 100644 index 220df09..0000000 --- a/src/Platform/OpenGL/OpenGLTexture.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include "Rendering/Texture.h" -#include "Core/Log.h" - -#include <glad/glad.h> - -namespace Donut -{ - class OpenGLTexture2D - : public Texture2D - { - public: - OpenGLTexture2D(uint32_t width, uint32_t height); - OpenGLTexture2D(const std::string& path); - virtual ~OpenGLTexture2D(); - - virtual uint32_t GetWidth() const override { return m_Width; } - virtual uint32_t GetHeight() const override { return m_Height; } - virtual uint32_t GetRendererID() const override { return m_RendererID; } - - virtual void SetData(void* data, uint32_t size) override; - virtual void Bind(uint32_t slot = 0) const override; - virtual void BindAsImage(uint32_t slot = 0, bool readOnly = false) const override; - - virtual bool operator==(const Texture& other) const override - { - return m_RendererID == other.GetRendererID(); - } - - private: - std::string m_Path; - uint32_t m_Width, m_Height; - uint32_t m_RendererID; - GLenum m_InternalFormat, m_DataFormat; - }; - - class OpenGLCubemapTexture - : public CubemapTexture - { - public: - OpenGLCubemapTexture(uint32_t width, uint32_t height); - OpenGLCubemapTexture(const std::string& path); - virtual ~OpenGLCubemapTexture(); - - virtual uint32_t GetWidth() const override { return m_Width; } - virtual uint32_t GetHeight() const override { return m_Height; } - virtual uint32_t GetRendererID() const override { return m_RendererID; } - - virtual void SetData(void* data, uint32_t size) override; - virtual void Bind(uint32_t slot = 0) const override; - virtual void BindAsImage(uint32_t slot = 0, bool readOnly = false) const override; - - virtual bool operator==(const Texture& other) const override - { - return m_RendererID == other.GetRendererID(); - } - - private: - void LoadHDRI(const std::string& path); - void ConvertEquirectangularToCubemap(float* hdrData, int width, int height); - - std::string m_Path; - uint32_t m_Width, m_Height; - uint32_t m_RendererID; - GLenum m_InternalFormat, m_DataFormat; - }; -} diff --git a/src/Platform/OpenGL/OpenGLUniformBuffer.cpp b/src/Platform/OpenGL/OpenGLUniformBuffer.cpp deleted file mode 100644 index 631b863..0000000 --- a/src/Platform/OpenGL/OpenGLUniformBuffer.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "OpenGLUniformBuffer.h" - -namespace Donut -{ - OpenGLUniformBuffer::OpenGLUniformBuffer(uint32_t size, uint32_t binding) - : m_Size(size), m_Binding(binding) - { - glGenBuffers(1, &m_RendererID); - glBindBuffer(GL_UNIFORM_BUFFER, m_RendererID); - glBufferData(GL_UNIFORM_BUFFER, size, nullptr, GL_DYNAMIC_DRAW); - glBindBufferBase(GL_UNIFORM_BUFFER, binding, m_RendererID); - } - - OpenGLUniformBuffer::~OpenGLUniformBuffer() - { - glDeleteBuffers(1, &m_RendererID); - } - - void OpenGLUniformBuffer::SetData(const void* data, uint32_t size, uint32_t offset) - { - glBindBuffer(GL_UNIFORM_BUFFER, m_RendererID); - glBufferSubData(GL_UNIFORM_BUFFER, offset, size, data); - } - - void OpenGLUniformBuffer::Bind(uint32_t binding) - { - glBindBufferBase(GL_UNIFORM_BUFFER, binding, m_RendererID); - } -}; diff --git a/src/Platform/OpenGL/OpenGLUniformBuffer.h b/src/Platform/OpenGL/OpenGLUniformBuffer.h deleted file mode 100644 index fd96f37..0000000 --- a/src/Platform/OpenGL/OpenGLUniformBuffer.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "Rendering/UniformBuffer.h" -#include <glad/glad.h> - -namespace Donut -{ - class OpenGLUniformBuffer : public UniformBuffer - { - public: - OpenGLUniformBuffer(uint32_t size, uint32_t binding); - virtual ~OpenGLUniformBuffer(); - - virtual void SetData(const void* data, uint32_t size, uint32_t offset = 0) override; - virtual void Bind(uint32_t binding) override; - private: - uint32_t m_RendererID = 0; - uint32_t m_Size = 0; - uint32_t m_Binding = 0; - }; -}; diff --git a/src/Platform/OpenGL/OpenGLVertexArray.cpp b/src/Platform/OpenGL/OpenGLVertexArray.cpp deleted file mode 100644 index afe5fe2..0000000 --- a/src/Platform/OpenGL/OpenGLVertexArray.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include <glad/glad.h> - -#include "OpenGLVertexArray.h" -#include "Rendering/VertexBuffer.h" -#include "Rendering/IndexBuffer.h" - -namespace Donut -{ - OpenGLVertexArray::OpenGLVertexArray() - { - // glCreateVertexArrays is 4.5 DSA; macOS caps at 4.1. glGenVertexArrays - // reserves the name and the VAO is created on first bind (done below). - glGenVertexArrays(1, &m_RendererID); - } - - OpenGLVertexArray::~OpenGLVertexArray() - { - glDeleteVertexArrays(1, &m_RendererID); - } - - void OpenGLVertexArray::Bind() const - { - glBindVertexArray(m_RendererID); - } - - void OpenGLVertexArray::Unbind() const - { - glBindVertexArray(0); - } - - void OpenGLVertexArray::AddVertexBuffer(const Ref<VertexBuffer>& vertexBuffer) - { - glBindVertexArray(m_RendererID); - vertexBuffer->Bind(); - - const auto& layout = vertexBuffer->GetLayout(); - for (const auto& element : layout.GetElements()) - { - glEnableVertexAttribArray(m_VertexBufferIndex); - glVertexAttribPointer(m_VertexBufferIndex, - element.count, - element.type, - element.normalized ? GL_TRUE : GL_FALSE, - layout.GetStride(), - reinterpret_cast<const void*>(static_cast<uintptr_t>(element.offset))); - m_VertexBufferIndex++; - } - - m_VertexBuffers.push_back(vertexBuffer); - } - - void OpenGLVertexArray::SetIndexBuffer(const Ref<IndexBuffer>& indexBuffer) - { - glBindVertexArray(m_RendererID); - indexBuffer->Bind(); - m_IndexBuffer = indexBuffer; - } -}; diff --git a/src/Platform/OpenGL/OpenGLVertexArray.h b/src/Platform/OpenGL/OpenGLVertexArray.h deleted file mode 100644 index b6ae82f..0000000 --- a/src/Platform/OpenGL/OpenGLVertexArray.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "Core/Memory.h" - -#include "Rendering/VertexArray.h" -#include "Rendering/VertexBuffer.h" -#include "Rendering/IndexBuffer.h" - -#include <vector> - -namespace Donut -{ - class OpenGLVertexArray - : public VertexArray - { - public: - OpenGLVertexArray(); - virtual ~OpenGLVertexArray(); - - virtual void Bind() const override; - virtual void Unbind() const override; - - virtual void AddVertexBuffer(const Ref<VertexBuffer>& vertexBuffer) override; - virtual void SetIndexBuffer(const Ref<IndexBuffer>& indexBuffer) override; - - virtual const std::vector<Ref<VertexBuffer>>& GetVertexBuffers() const override - { - return m_VertexBuffers; - } - - virtual const Ref<IndexBuffer>& GetIndexBuffer() const override - { - return m_IndexBuffer; - } - private: - uint32_t m_RendererID; - uint32_t m_VertexBufferIndex = 0; - std::vector<Ref<VertexBuffer>> m_VertexBuffers; - Ref<IndexBuffer> m_IndexBuffer; - }; -}; diff --git a/src/Platform/OpenGL/OpenGLVertexBuffer.cpp b/src/Platform/OpenGL/OpenGLVertexBuffer.cpp deleted file mode 100644 index 4f5e48f..0000000 --- a/src/Platform/OpenGL/OpenGLVertexBuffer.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "OpenGLVertexBuffer.h" -#include "Rendering/VertexBuffer.h" - -#include <glad/glad.h> - -namespace Donut -{ - OpenGLVertexBuffer::OpenGLVertexBuffer(const void* data, uint32_t size) - { - glGenBuffers(1, &m_RendererID); // glCreateBuffers is 4.5 DSA; unavailable on macOS 4.1 - glBindBuffer(GL_ARRAY_BUFFER, m_RendererID); - glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); - } - - OpenGLVertexBuffer::~OpenGLVertexBuffer() - { - glDeleteBuffers(1, &m_RendererID); - } - - void OpenGLVertexBuffer::Bind() const - { - glBindBuffer(GL_ARRAY_BUFFER, m_RendererID); - } - - void OpenGLVertexBuffer::Unbind() const - { - glBindBuffer(GL_ARRAY_BUFFER, 0); - } - - void OpenGLVertexBuffer::SetData(const void* data, uint32_t size) - { - glBindBuffer(GL_ARRAY_BUFFER, m_RendererID); - glBufferSubData(GL_ARRAY_BUFFER, 0, size, data); - } -}; diff --git a/src/Platform/OpenGL/OpenGLVertexBuffer.h b/src/Platform/OpenGL/OpenGLVertexBuffer.h deleted file mode 100644 index 6244f7d..0000000 --- a/src/Platform/OpenGL/OpenGLVertexBuffer.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "Rendering/VertexBuffer.h" - -namespace Donut -{ - class OpenGLVertexBuffer - : public VertexBuffer - { - public: - OpenGLVertexBuffer(const void* data, uint32_t size); - virtual ~OpenGLVertexBuffer(); - - virtual void Bind() const override; - virtual void Unbind() const override; - virtual void SetData(const void* data, uint32_t size) override; - - virtual const VertexBufferLayout& GetLayout() const override { return m_Layout; } - virtual void SetLayout(const VertexBufferLayout& layout) override { m_Layout = layout; } - - private: - uint32_t m_RendererID; - VertexBufferLayout m_Layout; - }; -}; |
