From 0d819f2b9a71e862bce8799c6b0c1304e62219b3 Mon Sep 17 00:00:00 2001 From: hachem Date: Fri, 22 Aug 2025 12:24:05 +0200 Subject: [add]: add HDRI --- src/Engine/Engine.cpp | 24 +++++++++++++++++++++--- src/Engine/Engine.h | 28 ++++++++++++++++------------ 2 files changed, 37 insertions(+), 15 deletions(-) (limited to 'src/Engine') diff --git a/src/Engine/Engine.cpp b/src/Engine/Engine.cpp index 20a295f..a947357 100644 --- a/src/Engine/Engine.cpp +++ b/src/Engine/Engine.cpp @@ -10,6 +10,7 @@ #include "Engine.h" #include "Core/Log.h" +#include "Core/HDRIManager.h" #include "Rendering/VertexBuffer.h" #include "Rendering/IndexBuffer.h" @@ -36,15 +37,25 @@ namespace Donut m_ComputeProgram = CreateComputeProgram("Assets/Shaders/Geodesic.glsl"); m_BlurShader = Ref(Shader::Create("Assets/Shaders/Blur.glsl")); + auto& hdriManager = HDRIManager::Get(); + m_HDRIEnvironment = hdriManager.GetCurrentHDRI(); + if (!m_HDRIEnvironment) + { + hdriManager.SetCurrentHDRI("Assets/HDRI/HDR_blue_nebulae-1.hdr"); + m_HDRIEnvironment = hdriManager.GetCurrentHDRI(); + if (!m_HDRIEnvironment) + DONUT_WARN("Failed to load default HDRI, using fallback"); + } + m_CameraUBO = UniformBuffer::Create(128, 1); - m_DiskUBO = UniformBuffer::Create(sizeof(float) * 5, 2); // Added density parameter + m_DiskUBO = UniformBuffer::Create(sizeof(float) * 5, 2); uint32_t objUBOSize = sizeof(int) + 3 * sizeof(float) + 16 * (sizeof(glm::vec4) + sizeof(glm::vec4)) + 16 * sizeof(float); m_ObjectsUBO = UniformBuffer::Create(objUBOSize, 3); - m_SimulationUBO = UniformBuffer::Create(sizeof(int) * 2 + sizeof(float) * 2, 4); // time added to existing float + m_SimulationUBO = UniformBuffer::Create(sizeof(int) * 2 + sizeof(float) * 2, 4); auto result = QuadVAO(); m_QuadVAO = result.first; @@ -117,6 +128,9 @@ namespace Donut void Engine::DispatchCompute(const Camera& cam) { + auto& hdriManager = HDRIManager::Get(); + m_HDRIEnvironment = hdriManager.GetCurrentHDRI(); + int cw = GetComputeWidth(); int ch = m_ComputeHeight; @@ -128,7 +142,10 @@ namespace Donut UploadObjectsUBO(m_Objects); UploadSimulationUBO(); m_Texture->BindAsImage(0, false); - + + if (m_HDRIEnvironment) + m_HDRIEnvironment->Bind(5); + uint32_t groupsX = static_cast(std::ceil(cw / 16.0f)); uint32_t groupsY = static_cast(std::ceil(ch / 16.0f)); m_ComputeProgram->Dispatch(groupsX, groupsY, 1); @@ -509,4 +526,5 @@ namespace Donut RenderCommand::SetViewport(0, 0, originalWidth, originalHeight); } + } diff --git a/src/Engine/Engine.h b/src/Engine/Engine.h index 83f0b19..c3cfdd0 100644 --- a/src/Engine/Engine.h +++ b/src/Engine/Engine.h @@ -101,30 +101,34 @@ namespace Donut void SetMaxStepsStatic(int steps) { m_MaxStepsStatic = steps; } void SetEarlyExitDistance(float distance) { m_EarlyExitDistance = distance; } - float GetDiskThickness() const { return m_DiskThickness; } + float GetDiskThickness() const { return m_DiskThickness; } void SetDiskThickness(float thickness) { m_DiskThickness = thickness; } - float GetDiskDensity() const { return m_DiskDensity; } - void SetDiskDensity(float density) { m_DiskDensity = density; } + float GetDiskDensity() const { return m_DiskDensity; } + void SetDiskDensity(float density) { m_DiskDensity = density; } - float GetRotationSpeed() const { return m_RotationSpeed; } - void SetRotationSpeed(float speed) { m_RotationSpeed = speed; } + float GetRotationSpeed() const { return m_RotationSpeed; } + void SetRotationSpeed(float speed) { m_RotationSpeed = speed; } - float GetBlurStrength() const { return m_BlurStrength; } - void SetBlurStrength(float strength) { m_BlurStrength = strength; } + float GetBlurStrength() const { return m_BlurStrength; } + void SetBlurStrength(float strength) { m_BlurStrength = strength; } - float GetGlowIntensity() const { return m_GlowIntensity; } + float GetGlowIntensity() const { return m_GlowIntensity; } void SetGlowIntensity(float intensity) { m_GlowIntensity = intensity; } void LoadObjectsFromScene(const std::vector& objects); void ExportHighResFrame(const std::string& filename, int width = 4096, int height = 3072); void PrintObjectInfo() const; + + void SetHDRIEnvironment(Ref hdri) { m_HDRIEnvironment = hdri; } + Ref GetHDRIEnvironment() const { return m_HDRIEnvironment; } private: Ref CreateComputeProgram(const char* path); std::pair, Ref> QuadVAO(); private: Ref m_QuadVAO; Ref m_Texture; + Ref m_HDRIEnvironment; Ref m_ShaderProgram; Ref m_ComputeProgram; Ref m_BlurShader; @@ -135,8 +139,8 @@ namespace Donut int m_Width; int m_Height; - float m_Width_f = 100*10e10f; - float m_Height_f = 75*10e10f; + float m_Width_f = 100.0f*1e10f; + float m_Height_f = 75.0f*1e10f; int m_TargetFPS = 60; float m_CurrentFPS = 60.0f; @@ -150,9 +154,9 @@ namespace Donut int m_MaxStepsMoving = 60000; int m_MaxStepsStatic = 30000; - float m_EarlyExitDistance = 5e11f; + float m_EarlyExitDistance = 5.0e11f; - float m_DiskThickness = 0.1; + float m_DiskThickness = 0.1f; float m_DiskDensity = 0.1f; float m_RotationSpeed = 1.0f; float m_BlurStrength = 2.0f; -- cgit v1.3