aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2025-08-16 15:36:25 +0200
committerhachem <im@hachem.wtf>2025-08-16 15:36:25 +0200
commit46ab589e5e1351f3081b5b4c76350967ef2f88a8 (patch)
treeadf56c5041a82a17864ddd04d5a82ec1cbc18313 /src
parent4172869e54093eee6e1595ebe0fa55c9fe98aef7 (diff)
[fix]: First optimization
Diffstat (limited to 'src')
-rw-r--r--src/Engine/Engine.cpp22
-rw-r--r--src/Engine/Engine.h16
-rw-r--r--src/States/SimulationState.cpp13
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");