From: Daniel Karbach Date: Mon, 16 Nov 2015 11:43:50 +0000 (+0100) Subject: move block type loading details to BlockType X-Git-Url: https://git.localhorst.tv/?a=commitdiff_plain;h=a7eb097d4c1513108b5588eb2e99014ace85c9c5;p=blank.git move block type loading details to BlockType --- diff --git a/src/app/app.cpp b/src/app/app.cpp index 35a3e3e..2b1a494 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -308,14 +308,6 @@ Assets::Assets(const AssetLoader &loader) } -namespace { - -CuboidBounds block_shape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f }}); -StairBounds stair_shape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f }}, { 0.0f, 0.0f }); -CuboidBounds slab_shape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.0f, 0.5f }}); - -} - void AssetLoader::LoadBlockTypes( const string &set_name, BlockTypeRegistry ®, @@ -329,99 +321,13 @@ void AssetLoader::LoadBlockTypes( throw std::runtime_error("failed to open block type file " + full); } TokenStreamReader in(file); - string type_name; string name; - string tex_name; - string shape_name; while (in.HasMore()) { - in.ReadIdentifier(type_name); + in.ReadIdentifier(name); in.Skip(Token::EQUALS); BlockType type; - - // read block type - in.Skip(Token::ANGLE_BRACKET_OPEN); - while (in.Peek().type != Token::ANGLE_BRACKET_CLOSE) { - in.ReadIdentifier(name); - in.Skip(Token::EQUALS); - if (name == "visible") { - type.visible = in.GetBool(); - } else if (name == "texture") { - in.ReadString(tex_name); - type.textures.push_back(tex_index.GetID(tex_name)); - } else if (name == "textures") { - in.Skip(Token::BRACKET_OPEN); - while (in.Peek().type != Token::BRACKET_CLOSE) { - in.ReadString(tex_name); - type.textures.push_back(tex_index.GetID(tex_name)); - if (in.Peek().type == Token::COMMA) { - in.Skip(Token::COMMA); - } - } - in.Skip(Token::BRACKET_CLOSE); - } else if (name == "rgb_mod") { - in.ReadVec(type.rgb_mod); - } else if (name == "hsl_mod") { - in.ReadVec(type.hsl_mod); - } else if (name == "outline") { - in.ReadVec(type.outline_color); - } else if (name == "label") { - in.ReadString(type.label); - } else if (name == "place_sound") { - in.ReadString(tex_name); - type.place_sound = snd_index.GetID(tex_name); - } else if (name == "remove_sound") { - in.ReadString(tex_name); - type.remove_sound = snd_index.GetID(tex_name); - } else if (name == "luminosity") { - type.luminosity = in.GetInt(); - } else if (name == "block_light") { - type.block_light = in.GetBool(); - } else if (name == "collision") { - type.collision = in.GetBool(); - } else if (name == "collide_block") { - type.collide_block = in.GetBool(); - } else if (name == "generate") { - type.generate = in.GetBool(); - } else if (name == "min_solidity") { - type.min_solidity = in.GetFloat(); - } else if (name == "mid_solidity") { - type.mid_solidity = in.GetFloat(); - } else if (name == "max_solidity") { - type.max_solidity = in.GetFloat(); - } else if (name == "min_humidity") { - type.min_humidity = in.GetFloat(); - } else if (name == "mid_humidity") { - type.mid_humidity = in.GetFloat(); - } else if (name == "max_humidity") { - type.max_humidity = in.GetFloat(); - } else if (name == "min_temperature") { - type.min_temperature = in.GetFloat(); - } else if (name == "mid_temperature") { - type.mid_temperature = in.GetFloat(); - } else if (name == "max_temperature") { - type.max_temperature = in.GetFloat(); - } else if (name == "min_richness") { - type.min_richness = in.GetFloat(); - } else if (name == "mid_richness") { - type.mid_richness = in.GetFloat(); - } else if (name == "max_richness") { - type.max_richness = in.GetFloat(); - } else if (name == "commonness") { - type.commonness = in.GetFloat(); - } else if (name == "shape") { - in.ReadIdentifier(shape_name); - type.shape = &shapes.Get(shape_name); - } else { - std::cerr << "warning: unknown block type property " << name << std::endl; - while (in.Peek().type != Token::SEMICOLON) { - in.Next(); - } - } - in.Skip(Token::SEMICOLON); - } - in.Skip(Token::ANGLE_BRACKET_CLOSE); + type.Read(in, snd_index, tex_index, shapes); in.Skip(Token::SEMICOLON); - reg.Add(type); } } diff --git a/src/world/BlockType.hpp b/src/world/BlockType.hpp index b50169c..8837ca9 100644 --- a/src/world/BlockType.hpp +++ b/src/world/BlockType.hpp @@ -13,6 +13,10 @@ namespace blank { +class ResourceIndex; +class ShapeRegistry; +class TokenStreamReader; + /// single 1x1x1 cube /// attributes of a type of block struct BlockType { @@ -66,6 +70,12 @@ struct BlockType { BlockType() noexcept; + void Read( + TokenStreamReader &in, + ResourceIndex &snd_index, + ResourceIndex &tex_index, + const ShapeRegistry &shapes); + bool FaceFilled(const Block &block, Block::Face face) const noexcept { return shape && shape->FaceFilled(block.OrientedFace(face)); } diff --git a/src/world/block.cpp b/src/world/block.cpp index d6e5507..04209e1 100644 --- a/src/world/block.cpp +++ b/src/world/block.cpp @@ -2,7 +2,11 @@ #include "BlockType.hpp" #include "BlockTypeRegistry.hpp" -#include +#include "../io/TokenStreamReader.hpp" +#include "../model/ShapeRegistry.hpp" +#include "../shared/ResourceIndex.hpp" + +#include #include #include @@ -96,6 +100,96 @@ BlockType::BlockType() noexcept } +void BlockType::Read( + TokenStreamReader &in, + ResourceIndex &snd_index, + ResourceIndex &tex_index, + const ShapeRegistry &shapes +) { + std::string name; + in.Skip(Token::ANGLE_BRACKET_OPEN); + while (in.Peek().type != Token::ANGLE_BRACKET_CLOSE) { + in.ReadIdentifier(name); + in.Skip(Token::EQUALS); + if (name == "visible") { + visible = in.GetBool(); + } else if (name == "texture") { + in.ReadString(name); + textures.push_back(tex_index.GetID(name)); + } else if (name == "textures") { + in.Skip(Token::BRACKET_OPEN); + while (in.Peek().type != Token::BRACKET_CLOSE) { + in.ReadString(name); + textures.push_back(tex_index.GetID(name)); + if (in.Peek().type == Token::COMMA) { + in.Skip(Token::COMMA); + } + } + in.Skip(Token::BRACKET_CLOSE); + } else if (name == "rgb_mod") { + in.ReadVec(rgb_mod); + } else if (name == "hsl_mod") { + in.ReadVec(hsl_mod); + } else if (name == "outline") { + in.ReadVec(outline_color); + } else if (name == "label") { + in.ReadString(label); + } else if (name == "place_sound") { + in.ReadString(name); + place_sound = snd_index.GetID(name); + } else if (name == "remove_sound") { + in.ReadString(name); + remove_sound = snd_index.GetID(name); + } else if (name == "luminosity") { + luminosity = in.GetInt(); + } else if (name == "block_light") { + block_light = in.GetBool(); + } else if (name == "collision") { + collision = in.GetBool(); + } else if (name == "collide_block") { + collide_block = in.GetBool(); + } else if (name == "generate") { + generate = in.GetBool(); + } else if (name == "min_solidity") { + min_solidity = in.GetFloat(); + } else if (name == "mid_solidity") { + mid_solidity = in.GetFloat(); + } else if (name == "max_solidity") { + max_solidity = in.GetFloat(); + } else if (name == "min_humidity") { + min_humidity = in.GetFloat(); + } else if (name == "mid_humidity") { + mid_humidity = in.GetFloat(); + } else if (name == "max_humidity") { + max_humidity = in.GetFloat(); + } else if (name == "min_temperature") { + min_temperature = in.GetFloat(); + } else if (name == "mid_temperature") { + mid_temperature = in.GetFloat(); + } else if (name == "max_temperature") { + max_temperature = in.GetFloat(); + } else if (name == "min_richness") { + min_richness = in.GetFloat(); + } else if (name == "mid_richness") { + mid_richness = in.GetFloat(); + } else if (name == "max_richness") { + max_richness = in.GetFloat(); + } else if (name == "commonness") { + commonness = in.GetFloat(); + } else if (name == "shape") { + in.ReadIdentifier(name); + shape = &shapes.Get(name); + } else { + std::cerr << "warning: unknown block type property " << name << std::endl; + while (in.Peek().type != Token::SEMICOLON) { + in.Next(); + } + } + in.Skip(Token::SEMICOLON); + } + in.Skip(Token::ANGLE_BRACKET_CLOSE); +} + void BlockType::FillEntityMesh( EntityMesh::Buffer &buf, const glm::mat4 &transform diff --git a/src/world/chunk.cpp b/src/world/chunk.cpp index b275315..1d120bb 100644 --- a/src/world/chunk.cpp +++ b/src/world/chunk.cpp @@ -779,6 +779,7 @@ void ChunkRenderer::Render(Viewport &viewport) { for (int i = 0; i < index.TotalChunks(); ++i) { if (!index[i]) continue; + // TODO: optimize chunk culling, shoudn't be that hard glm::mat4 m(index[i]->Transform(index.Base())); glm::mat4 mvp(chunk_prog.GetVP() * m); if (!CullTest(Chunk::Bounds(), mvp)) {