diff options
| author | hachem <im@hachem.wtf> | 2025-08-16 15:36:25 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2025-08-16 15:36:25 +0200 |
| commit | 46ab589e5e1351f3081b5b4c76350967ef2f88a8 (patch) | |
| tree | adf56c5041a82a17864ddd04d5a82ec1cbc18313 /src | |
| parent | 4172869e54093eee6e1595ebe0fa55c9fe98aef7 (diff) | |
[fix]: First optimization
Diffstat (limited to 'src')
| -rw-r--r-- | src/Engine/Engine.cpp | 22 | ||||
| -rw-r--r-- | src/Engine/Engine.h | 16 | ||||
| -rw-r--r-- | src/States/SimulationState.cpp | 13 |
3 files changed, 50 insertions, 1 deletions
diff --git a/src/Engine/Engine.cpp b/src/Engine/Engine.cpp index ac0e891..799a516 100644 --- a/src/Engine/Engine.cpp +++ b/src/Engine/Engine.cpp @@ -39,6 +39,8 @@ namespace Donut + 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); auto result = QuadVAO(); m_QuadVAO = result.first; @@ -97,6 +99,7 @@ namespace Donut UploadCameraUBO(cam); UploadDiskUBO(); UploadObjectsUBO(m_Objects); + UploadSimulationUBO(); m_Texture->BindAsImage(0, false); uint32_t groupsX = static_cast<uint32_t>(std::ceil(cw / 16.0f)); @@ -173,6 +176,25 @@ namespace Donut m_DiskUBO->Bind(2); } + void Engine::UploadSimulationUBO() + { + struct UBOData + { + int maxStepsMoving; + int maxStepsStatic; + float earlyExitDistance; + int padding; + } data; + + data.maxStepsMoving = m_MaxStepsMoving; + data.maxStepsStatic = m_MaxStepsStatic; + data.earlyExitDistance = m_EarlyExitDistance; + data.padding = 0; + + m_SimulationUBO->SetData(&data, sizeof(data)); + m_SimulationUBO->Bind(4); + } + void Engine::UpdatePhysics(float deltaTime) { for (auto& obj : m_Objects) diff --git a/src/Engine/Engine.h b/src/Engine/Engine.h index a004717..e1b4ad8 100644 --- a/src/Engine/Engine.h +++ b/src/Engine/Engine.h @@ -73,6 +73,7 @@ namespace Donut void UploadCameraUBO(const Camera& cam); void UploadObjectsUBO(const std::vector<ObjectData>& objs); void UploadDiskUBO(); + void UploadSimulationUBO(); void RenderScene(); void UpdatePhysics(float deltaTime); void UpdateWindowDimensions(); @@ -93,6 +94,14 @@ namespace Donut int GetComputeHeight() const { return m_ComputeHeight; } int GetComputeWidth() const { return (m_Width * m_ComputeHeight) / m_Height; } void UpdateComputeDimensions(); + + // Simulation parameters + int GetMaxStepsMoving() const { return m_MaxStepsMoving; } + int GetMaxStepsStatic() const { return m_MaxStepsStatic; } + float GetEarlyExitDistance() const { return m_EarlyExitDistance; } + void SetMaxStepsMoving(int steps) { m_MaxStepsMoving = steps; } + void SetMaxStepsStatic(int steps) { m_MaxStepsStatic = steps; } + void SetEarlyExitDistance(float distance) { m_EarlyExitDistance = distance; } private: Ref<Shader> CreateComputeProgram(const char* path); std::pair<Ref<VertexArray>, Ref<Texture2D>> QuadVAO(); @@ -104,6 +113,7 @@ namespace Donut Ref<UniformBuffer> m_CameraUBO; Ref<UniformBuffer> m_DiskUBO; Ref<UniformBuffer> m_ObjectsUBO; + Ref<UniformBuffer> m_SimulationUBO; int m_Width; int m_Height; @@ -113,11 +123,15 @@ namespace Donut int m_TargetFPS = 60; float m_CurrentFPS = 60.0f; float m_LastFrameTime = 0.0f; - int m_ComputeHeight = 320; + int m_ComputeHeight = 150; std::vector<ObjectData> m_Objects; BlackHole m_SagA; Camera m_Camera; bool m_Gravity = false; + + int m_MaxStepsMoving = 60000; + int m_MaxStepsStatic = 30000; + float m_EarlyExitDistance = 5e11f; }; }; diff --git a/src/States/SimulationState.cpp b/src/States/SimulationState.cpp index 98640e0..7a45bd1 100644 --- a/src/States/SimulationState.cpp +++ b/src/States/SimulationState.cpp @@ -124,6 +124,19 @@ namespace Donut ImGui::Separator(); + ImGui::Text("Simulation Quality:"); + int maxStepsMoving = m_Engine.GetMaxStepsMoving(); + if (ImGui::SliderInt("Max Steps (Moving)", &maxStepsMoving, 1000, 60000)) + m_Engine.SetMaxStepsMoving(maxStepsMoving); + int maxStepsStatic = m_Engine.GetMaxStepsStatic(); + if (ImGui::SliderInt("Max Steps (Static)", &maxStepsStatic, 1000, 30000)) + m_Engine.SetMaxStepsStatic(maxStepsStatic); + float earlyExitDistance = m_Engine.GetEarlyExitDistance(); + if (ImGui::SliderFloat("Early Exit Distance", &earlyExitDistance, 1e11f, 1e13f, "%.2e")) + m_Engine.SetEarlyExitDistance(earlyExitDistance); + + ImGui::Separator(); + ImGui::Text("Controls:"); ImGui::Text("Left Mouse: Orbit camera"); ImGui::Text("Scroll: Zoom in/out"); |
