mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-05 11:01:49 +00:00
68 lines
1.5 KiB
C++
68 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include "assets/assets_util.hpp"
|
|
#include "voxels/Block.hpp"
|
|
#include "MainBatch.hpp"
|
|
#include "typedefs.hpp"
|
|
|
|
#include <array>
|
|
#include <string>
|
|
#include <memory>
|
|
#include <unordered_map>
|
|
#include <map>
|
|
#include <glm/vec4.hpp>
|
|
|
|
class Assets;
|
|
class Player;
|
|
class Level;
|
|
struct voxel;
|
|
class Chunks;
|
|
class Texture;
|
|
class DrawContext;
|
|
|
|
struct BlockWrapper {
|
|
glm::ivec3 position;
|
|
std::array<std::string, 6> textureFaces {};
|
|
std::array<glm::vec3, 6> 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<MainBatch> batch;
|
|
|
|
std::multimap<const Texture*, BlockWrapper*> renderOrder;
|
|
std::unordered_map<u64id_t, std::unique_ptr<BlockWrapper>> 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);
|
|
};
|