hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/engine/engine.cpp
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-23 05:53:33 +0200
committerhachem <im@hachem.wtf>2026-08-23 05:53:33 +0200
commit380b4d5d5a3e66d89ca7b3b1601bb23e5a01bf7b (patch)
treeb4b0f3b43bedac1ef6ae16834ca03c1181964959 /src/engine/engine.cpp
parent2b0661b7d6edacbc4a4ad87cdb625d559e08a5f9 (diff)
feat: unified interface
Diffstat (limited to 'src/engine/engine.cpp')
-rw-r--r--src/engine/engine.cpp44
1 files changed, 28 insertions, 16 deletions
diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp
index 87eda62..496dd56 100644
--- a/src/engine/engine.cpp
+++ b/src/engine/engine.cpp
@@ -48,7 +48,7 @@ namespace Donut
}
m_camera_ubo = UniformBuffer::create(128, 1);
- m_disk_ubo = UniformBuffer::create(sizeof(float) * 5, 2);
+ m_disk_ubo = UniformBuffer::create(sizeof(float) * 6, 2);
uint32_t obj_ubo_size = sizeof(int) + 3 * sizeof(float)
+ 16 * (sizeof(glm::vec4) + sizeof(glm::vec4))
@@ -214,16 +214,25 @@ namespace Donut
int _pad4;
} data;
- glm::vec3 fwd = glm::normalize(cam.get_orbital_target() - cam.get_orbital_position());
- glm::vec3 up = glm::vec3(0, 1, 0);
- glm::vec3 right = glm::normalize(glm::cross(fwd, up));
- up = glm::cross(right, fwd);
+ glm::vec3 pos, fwd;
+ if (cam.get_camera_mode() == CameraMode::FPS)
+ {
+ pos = cam.get_position();
+ fwd = cam.get_forward_direction();
+ }
+ else
+ {
+ pos = cam.get_orbital_position();
+ fwd = glm::normalize(cam.get_orbital_target() - pos);
+ }
+ glm::vec3 right = glm::normalize(glm::cross(fwd, glm::vec3(0, 1, 0)));
+ glm::vec3 up = glm::cross(right, fwd);
- data.pos = cam.get_orbital_position();
+ data.pos = pos;
data.right = right;
data.up = up;
data.forward = fwd;
- data.tan_half_fov = static_cast<float>(tan(glm::radians(60.0f * 0.5f)));
+ data.tan_half_fov = static_cast<float>(tan(glm::radians(m_bh.fov_degrees * 0.5f)));
data.aspect = static_cast<float>(get_compute_width()) / static_cast<float>(m_compute_height);
data.moving = cam.is_dragging() || cam.is_panning();
@@ -258,12 +267,15 @@ namespace Donut
auto Engine::upload_disk_ubo() -> void
{
- float r1 = static_cast<float>(m_sag_a.m_rs * 2.2);
- float r2 = static_cast<float>(m_sag_a.m_rs * 5.2);
- float num = 2.0f;
- float thickness = static_cast<float>(m_sag_a.m_rs * m_disk_thickness);
- float disk_data[5] = { r1, r2, num, thickness, m_disk_density };
-
+ const float rs = 1.269e10f;
+ float disk_data[6] = {
+ std::max(m_bh.disk_inner_rs, 3.0f) * rs,
+ std::max(m_bh.disk_outer_rs, m_bh.disk_inner_rs + 0.5f) * rs,
+ std::max(m_bh.turbulence, 0.0f),
+ rs * 0.1f,
+ std::max(m_bh.brightness, 0.0f),
+ std::max(m_bh.temperature, 1000.0f),
+ };
m_disk_ubo->set_data(disk_data, sizeof(disk_data));
m_disk_ubo->bind(2);
}
@@ -278,13 +290,13 @@ namespace Donut
float time;
} data;
- data.max_steps_moving = m_max_steps_moving;
- data.max_steps_static = m_max_steps_static;
+ data.max_steps_moving = m_bh.quality_steps;
+ data.max_steps_static = m_bh.quality_steps;
data.early_exit_distance = m_early_exit_distance;
data.time = static_cast<float>(glfwGetTime()) * m_rotation_speed;
#ifdef __APPLE__
- data.max_steps_moving = std::min(data.max_steps_moving, 4000);
+ data.max_steps_moving = std::min(data.max_steps_moving, 6000);
data.max_steps_static = std::min(data.max_steps_static, 6000);
#endif