diff --git a/src/content/Content.cpp b/src/content/Content.cpp index 0a1f88bc..c74395a3 100644 --- a/src/content/Content.cpp +++ b/src/content/Content.cpp @@ -18,22 +18,27 @@ void ContentBuilder::add(Block* def) { Content* ContentBuilder::build() { vector blockDefsIndices; + DrawGroups* groups = new DrawGroups; for (const string& name : blockIds) { Block* def = blockDefs[name]; def->id = blockDefsIndices.size(); blockDefsIndices.push_back(def); + if (groups->find(def->drawGroup) == groups->end()) { + groups->insert(def->drawGroup); + } } ContentIndices* indices = new ContentIndices(blockDefsIndices); - return new Content(indices, blockDefs); + return new Content(indices, groups, blockDefs); } ContentIndices::ContentIndices(vector blockDefs) : blockDefs(blockDefs) { } -Content::Content(ContentIndices* indices, +Content::Content(ContentIndices* indices, DrawGroups* drawGroups, unordered_map blockDefs) : blockDefs(blockDefs), + drawGroups(drawGroups), indices(indices) { } diff --git a/src/content/Content.h b/src/content/Content.h index 184d866d..70c68cc6 100644 --- a/src/content/Content.h +++ b/src/content/Content.h @@ -4,8 +4,11 @@ #include #include #include +#include #include "../typedefs.h" +typedef std::set DrawGroups; + class Block; class Content; @@ -46,8 +49,9 @@ class Content { std::unordered_map blockDefs; public: ContentIndices* const indices; - - Content(ContentIndices* indices, + DrawGroups* const drawGroups; + + Content(ContentIndices* indices, DrawGroups* drawGroups, std::unordered_map blockDefs); ~Content(); diff --git a/src/definitions.cpp b/src/definitions.cpp index 6378d523..1484b3e6 100644 --- a/src/definitions.cpp +++ b/src/definitions.cpp @@ -9,7 +9,6 @@ // All in-game definitions (blocks, items, etc..) void setup_definitions(ContentBuilder* builder) { Block* block = new Block("core:air", "air"); - block->drawGroup = 1; block->lightPassing = true; block->skyLightPassing = true; block->obstacle = false; @@ -52,7 +51,7 @@ void setup_definitions(ContentBuilder* builder) { builder->add(block); block = new Block("base:water", "water"); - block->drawGroup = 4; + block->drawGroup = 3; block->lightPassing = true; block->skyLightPassing = false; block->obstacle = false; @@ -67,7 +66,7 @@ void setup_definitions(ContentBuilder* builder) { builder->add(block); block = new Block("base:grass", "grass"); - block->drawGroup = 5; + block->drawGroup = 1; block->lightPassing = true; block->obstacle = false; block->model = BlockModel::xsprite; @@ -75,7 +74,7 @@ void setup_definitions(ContentBuilder* builder) { builder->add(block); block = new Block("base:flower", "flower"); - block->drawGroup = 5; + block->drawGroup = 1; block->lightPassing = true; block->obstacle = false; block->model = BlockModel::xsprite; diff --git a/src/graphics/BlocksRenderer.cpp b/src/graphics/BlocksRenderer.cpp index 801e11b7..8cfcaca8 100644 --- a/src/graphics/BlocksRenderer.cpp +++ b/src/graphics/BlocksRenderer.cpp @@ -317,12 +317,12 @@ vec4 BlocksRenderer::pickSoftLight(int x, int y, int z, const ivec3& right, cons void BlocksRenderer::render(const voxel* voxels, int atlas_size) { int begin = chunk->bottom * (CHUNK_W * CHUNK_D); int end = chunk->top * (CHUNK_W * CHUNK_D); - for (ubyte group = 0; group < 8; group++) { + for (const auto drawGroup : *content->drawGroups) { for (int i = begin; i < end; i++) { const voxel& vox = voxels[i]; blockid_t id = vox.id; const Block& def = *blockDefsCache[id]; - if (!id || def.drawGroup != group) + if (!id || def.drawGroup != drawGroup) continue; const UVRegion texfaces[6]{ cache->getRegion(id, 0), cache->getRegion(id, 1), cache->getRegion(id, 2), cache->getRegion(id, 3),