#pragma once #include "assets/assets_util.hpp" #include "voxels/Block.hpp" #include "MainBatch.hpp" #include "typedefs.hpp" #include #include #include #include #include #include class Assets; class Player; class Level; struct voxel; class Chunks; class Texture; class DrawContext; struct BlockWrapper { glm::ivec3 position; std::array textureFaces {}; std::array tints {}; float emission = 0.0f; // --- render cache --- util::TextureRegion texRegions[6] {}; UVRegion uvRegions[6] {}; BlockModelType modelType {}; uint8_t cullingBits = 0xFF; uint8_t dirtySides = 0xFF; }; class BlockWrapsRenderer { const Assets& assets; const Level& level; const Chunks& chunks; std::unique_ptr batch; std::multimap renderOrder; std::unordered_map> wrappers; u64id_t nextWrapper = 1; void draw(BlockWrapper& wrapper, const Texture* texture); void refreshWrapper(BlockWrapper& wrapper); public: BlockWrapsRenderer( const Assets& assets, const Level& level, const Chunks& chunks ); ~BlockWrapsRenderer(); void draw(const DrawContext& ctx, const Player& player); u64id_t add( const glm::ivec3& position, const std::string& texture, const glm::vec3& tint, float emission ); BlockWrapper* get(u64id_t id) const; void remove(u64id_t id); };