diff options
| author | hachem <im@hachem.wtf> | 2025-08-22 12:24:05 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2025-08-22 12:24:05 +0200 |
| commit | 0d819f2b9a71e862bce8799c6b0c1304e62219b3 (patch) | |
| tree | a3011c8f5b04c98de5a8a24bc2b4ded312de958e /src/Engine | |
| parent | c20a400e620154f0c334fe0a37d547625b6ee65b (diff) | |
[add]: add HDRI
Diffstat (limited to 'src/Engine')
| -rw-r--r-- | src/Engine/Engine.cpp | 24 | ||||
| -rw-r--r-- | src/Engine/Engine.h | 28 |
2 files changed, 37 insertions, 15 deletions
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>(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<uint32_t>(std::ceil(cw / 16.0f)); uint32_t groupsY = static_cast<uint32_t>(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<Donut::Object>& objects); void ExportHighResFrame(const std::string& filename, int width = 4096, int height = 3072); void PrintObjectInfo() const; + + void SetHDRIEnvironment(Ref<CubemapTexture> hdri) { m_HDRIEnvironment = hdri; } + Ref<CubemapTexture> GetHDRIEnvironment() const { return m_HDRIEnvironment; } private: Ref<Shader> CreateComputeProgram(const char* path); std::pair<Ref<VertexArray>, Ref<Texture2D>> QuadVAO(); private: Ref<VertexArray> m_QuadVAO; Ref<Texture2D> m_Texture; + Ref<CubemapTexture> m_HDRIEnvironment; Ref<Shader> m_ShaderProgram; Ref<Shader> m_ComputeProgram; Ref<Shader> 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; |
