GroveEngine/modules/BgfxRenderer/Passes/TilemapPass.h
StillHammer 613283d75c feat(BgfxRenderer): Phase 7-8 - Text, Tilemap, Multi-texture, Resize
Phase 7 - Text Rendering:
- Add BitmapFont with embedded 8x8 CP437 font (ASCII 32-126)
- Add TextPass for instanced glyph rendering
- Fix SceneCollector::parseText() to copy strings to FrameAllocator

Phase 8A - Multi-texture Support:
- Add numeric texture ID system in ResourceCache
- SpritePass sorts by textureId and batches per texture
- Flush batch on texture change for efficient rendering

Phase 8B - Tilemap Rendering:
- Add TilemapPass for grid-based tile rendering
- Support tileData as comma-separated string
- Tiles rendered as instanced quads

Window Resize:
- Handle window resize via process() input
- Call bgfx::reset() on size change

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 22:09:48 +08:00

71 lines
2.2 KiB
C++

#pragma once
#include "../RenderGraph/RenderPass.h"
#include "../RHI/RHITypes.h"
#include <vector>
namespace grove {
class ResourceCache;
// ============================================================================
// Tilemap Pass - Renders 2D tilemaps efficiently
// ============================================================================
class TilemapPass : public RenderPass {
public:
/**
* @brief Construct TilemapPass with required shader
* @param shader The shader program to use (sprite shader)
*/
explicit TilemapPass(rhi::ShaderHandle shader);
const char* getName() const override { return "Tilemaps"; }
uint32_t getSortOrder() const override { return 50; } // Before sprites
std::vector<const char*> 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
*/
void setResourceCache(ResourceCache* cache) { m_resourceCache = cache; }
/**
* @brief Set default tileset texture
*/
void setDefaultTileset(rhi::TextureHandle texture) { m_defaultTileset = texture; }
/**
* @brief Set tileset dimensions (tiles per row/column in atlas)
*/
void setTilesetLayout(uint16_t tilesPerRow, uint16_t tilesPerCol) {
m_tilesPerRow = tilesPerRow;
m_tilesPerCol = tilesPerCol;
}
private:
rhi::ShaderHandle m_shader;
rhi::BufferHandle m_quadVB;
rhi::BufferHandle m_quadIB;
rhi::BufferHandle m_instanceBuffer;
rhi::UniformHandle m_textureSampler;
rhi::TextureHandle m_defaultTexture;
rhi::TextureHandle m_defaultTileset;
ResourceCache* m_resourceCache = nullptr;
// Tileset layout (for UV calculation)
uint16_t m_tilesPerRow = 16;
uint16_t m_tilesPerCol = 16;
// Reusable buffer for tile instances
std::vector<SpriteInstance> m_tileInstances;
static constexpr uint32_t MAX_TILES_PER_BATCH = 16384;
};
} // namespace grove