#pragma once #include #include #include #include "renderer/sprite_render_system.hpp" #include "resources/resource_registry.hpp" namespace sophia { /** * !TEMP to be decoupled once scene batching and rendering impl * * Turns a scene's components into draw calls for a SceneView. */ class SceneRenderer { public: SceneRenderer(const SceneRenderer&) = delete; SceneRenderer& operator=(const SceneRenderer&) = delete; SceneRenderer(const SceneRegistry& sceneRegistry, ResourceRegistry& resources, Device& device, vk::Format colorFormat); // Call once per frame, before any render(). void beginFrame(u32 frameIndex); // Records `sceneView` as seen through `camera` (an entity of the view's // scene with a CameraComponent) into `commandBuffer`. Rendering into the // view's target must already have begun. void render(vk::CommandBuffer commandBuffer, const SceneView& sceneView, Entity camera); private: struct SpriteDrawItem { s32 sortOrder; float depth; TextureHandle texture; SpriteRenderSystem::Instance instance; }; void renderSprites(vk::CommandBuffer commandBuffer, const Scene& scene, const glm::mat4& viewProjection); const SceneRegistry& sceneRegistry; ResourceRegistry& resources; SpriteRenderSystem spriteRenderSystem; // Reused across frames to avoid reallocating. std::vector spriteDrawItems; std::vector spriteInstances; std::vector spriteBatches; }; } // namespace sophia