57 lines
1.6 KiB
C++
57 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include <sophia/scene_registry.hpp>
|
|
#include <sophia/scene_view.hpp>
|
|
#include <vector>
|
|
|
|
#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<SpriteDrawItem> spriteDrawItems;
|
|
std::vector<SpriteRenderSystem::Instance> spriteInstances;
|
|
std::vector<SpriteRenderSystem::Batch> spriteBatches;
|
|
};
|
|
|
|
} // namespace sophia
|