aboutsummaryrefslogtreecommitdiff
path: root/src/rendering/scene_renderer.cpp
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-23 22:39:47 +0200
committerhachem <im@hachem.wtf>2026-08-23 22:39:47 +0200
commit90ff03c2fdffc09ddb26bdc7e32c3968a6d274fb (patch)
tree2fdb1b6f54c4e380af43c75f1051935587a87faa /src/rendering/scene_renderer.cpp
parent5ea6c14c0e14bacee766ce1280ab2c71564e05ec (diff)
[feat]: wire in scene into the simulation engine
Diffstat (limited to 'src/rendering/scene_renderer.cpp')
-rw-r--r--src/rendering/scene_renderer.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/rendering/scene_renderer.cpp b/src/rendering/scene_renderer.cpp
index 5ee7657..50b666d 100644
--- a/src/rendering/scene_renderer.cpp
+++ b/src/rendering/scene_renderer.cpp
@@ -42,6 +42,9 @@ namespace Donut
struct SkyboxUBO { glm::mat4 projection; glm::mat4 view; };
static_assert(sizeof(SkyboxUBO) == 128, "SkyboxUBO std140 layout mismatch");
+
+ // The hole's event horizon (1 r_s) as a marker at the origin.
+ constexpr float BH_SCENE_RADIUS = SCENE_UNITS_PER_RS;
}
auto SceneRenderer::init(RHI::Device& device) -> bool
@@ -137,6 +140,8 @@ namespace Donut
m_skybox_pipeline = device.create_pipeline(d);
}
+ m_bh_ubo = device.create_buffer(BufferType::Uniform, sizeof(SphereUBO));
+
DONUT_INFO("SceneRenderer ready ({} grid verts, {} sphere indices, skybox)",
m_grid_vertex_count, m_sphere_index_count);
return true;
@@ -196,6 +201,26 @@ namespace Donut
cmd.bind_index_buffer(m_sphere_ib.get());
cmd.draw_indexed(m_sphere_index_count);
}
+
+ // Black-hole marker: a near-black sphere at the origin (radius = r_s in
+ // scene units), so the Scene shows where the hole the Simulation renders
+ // sits. 1 grid unit == 1 Schwarzschild radius.
+ SphereUBO bh{};
+ bh.view_projection = vp;
+ bh.transform = glm::scale(glm::mat4(1.0f), glm::vec3(BH_SCENE_RADIUS));
+ bh.color = glm::vec3(0.02f); // near-black event horizon
+ bh.specular = 0.10f;
+ bh.light_pos = glm::vec3(10.0f, 20.0f, 10.0f);
+ bh.camera_pos = cam.position;
+ bh.is_selected = 1; // reuse the rim as an
+ bh.outline_color = glm::vec3(0.98f, 0.62f, 0.20f); // amber accretion glow
+ bh.outline_width = 0.30f;
+ m_bh_ubo->update(&bh, sizeof(bh));
+ cmd.bind_uniform(0, m_bh_ubo.get());
+ cmd.bind_texture(1, cubemap);
+ cmd.bind_vertex_buffer(m_sphere_vb.get());
+ cmd.bind_index_buffer(m_sphere_ib.get());
+ cmd.draw_indexed(m_sphere_index_count);
}
// Transparent grid on top (tests depth, doesn't write).