#pragma once #include "rhi.h" #include "scene/scene_types.h" // SceneObject #include #include namespace Donut { // The world-builder scene view (skybox + lit spheres + reference grid), // written ONCE against the RHI so it renders identically on every backend. // The Application owns the camera, the object list and the HDRI cubemap and // passes them in each frame; this class owns only the GPU resources (meshes, // pipelines, per-object uniform buffers) and records the draws. struct CameraView { glm::mat4 view; glm::mat4 projection; glm::vec3 position; int fb_width = 1; int fb_height = 1; }; class SceneRenderer { public: // Builds the grid/sphere/skybox meshes and pipelines on the given device. auto init(RHI::Device& device) -> bool; // Records the scene into the currently-open swapchain render pass. `cubemap` // is the shared HDRI environment (sphere ambient + skybox background). auto render(RHI::CommandList& cmd, const CameraView& cam, const std::vector& objects, int selected, RHI::Texture* cubemap) -> void; private: static constexpr int MAX_OBJECTS = 64; RHI::Device* m_device = nullptr; Ref m_grid_pipeline; Ref m_grid_vb; Ref m_grid_ubo; int m_grid_vertex_count = 0; Ref m_sphere_pipeline; Ref m_sphere_vb; Ref m_sphere_ib; int m_sphere_index_count = 0; std::vector> m_sphere_ubos; // one per object slot Ref m_bh_ubo; // the black-hole marker sphere at the origin Ref m_skybox_pipeline; Ref m_skybox_vb; Ref m_skybox_ubo; }; }