#pragma once #include "../RenderGraph/RenderPass.h" #include "../RHI/RHITypes.h" #include namespace grove { class ResourceCache; // ============================================================================ // Sprite Pass - Renders 2D sprites with batching by texture // ============================================================================ class SpritePass : public RenderPass { public: /** * @brief Construct SpritePass with required shader * @param shader The shader program to use for sprite rendering */ explicit SpritePass(rhi::ShaderHandle shader); const char* getName() const override { return "Sprites"; } uint32_t getSortOrder() const override { return 100; } std::vector getDependencies() const override { return {"Clear"}; } void setup(rhi::IRHIDevice& device) override; void shutdown(rhi::IRHIDevice& device) override; void execute(const FramePacket& frame, rhi::IRHIDevice& device, rhi::RHICommandBuffer& cmd) override; /** * @brief Set resource cache for texture lookup by ID */ void setResourceCache(ResourceCache* cache) { m_resourceCache = cache; } /** * @brief Set fallback texture when textureId=0 or texture not found */ void setDefaultTexture(rhi::TextureHandle texture) { m_activeTexture = texture; } /** * @brief Legacy: Set a single texture for all sprites (backward compat) * @deprecated Use setResourceCache for multi-texture support */ void setTexture(rhi::TextureHandle texture) { m_activeTexture = texture; } private: void flushBatch(rhi::IRHIDevice& device, rhi::RHICommandBuffer& cmd, rhi::TextureHandle texture, uint32_t count); rhi::ShaderHandle m_shader; rhi::BufferHandle m_quadVB; rhi::BufferHandle m_quadIB; rhi::BufferHandle m_instanceBuffer; rhi::UniformHandle m_textureSampler; rhi::TextureHandle m_defaultTexture; // White 1x1 texture fallback rhi::TextureHandle m_activeTexture; // Default texture for textureId=0 ResourceCache* m_resourceCache = nullptr; // Sorted sprite indices for batching std::vector m_sortedIndices; static constexpr uint32_t MAX_SPRITES_PER_BATCH = 10000; }; } // namespace grove