X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2Fblock.cpp;h=04209e1ac0ecb5bdf8b09baf537f56f88419f7f4;hb=a7eb097d4c1513108b5588eb2e99014ace85c9c5;hp=09acfef9efcc01a2504c63459736fec9df5bd056;hpb=57f4a76edbfd6c2b6077047e9fba31788d161b44;p=blank.git diff --git a/src/world/block.cpp b/src/world/block.cpp index 09acfef..04209e1 100644 --- a/src/world/block.cpp +++ b/src/world/block.cpp @@ -2,18 +2,17 @@ #include "BlockType.hpp" #include "BlockTypeRegistry.hpp" -#include "../model/geometry.hpp" +#include "../io/TokenStreamReader.hpp" +#include "../model/ShapeRegistry.hpp" +#include "../shared/ResourceIndex.hpp" -#include +#include #include #include namespace blank { -const NullShape BlockType::DEFAULT_SHAPE; - - std::ostream &operator <<(std::ostream &out, const Block &block) { return out << "Block(" << block.type << ", " << block.GetFace() << ", " << block.GetTurn() << ')'; } @@ -69,48 +68,163 @@ std::ostream &operator <<(std::ostream &out, const Block::Turn &turn) { } -BlockType::BlockType(bool v, const glm::vec3 &col, const Shape *s) noexcept -: shape(s) -, texture(0) -, color(col) +BlockType::BlockType() noexcept +: shape(nullptr) +, textures() +, hsl_mod(0.0f, 1.0f, 1.0f) +, rgb_mod(1.0f, 1.0f, 1.0f) , outline_color(-1, -1, -1) , label("some block") +, place_sound(-1) +, remove_sound(-1) , id(0) , luminosity(0) -, visible(v) -, block_light(false) -, collision(false) -, collide_block(false) -, fill({ false, false, false, false, false, false }) { +, visible(true) +, block_light(true) +, collision(true) +, collide_block(true) +, generate(false) +, min_solidity(0.5f) +, mid_solidity(0.75f) +, max_solidity(1.0f) +, min_humidity(-1.0f) +, mid_humidity(0.0f) +, max_humidity(1.0f) +, min_temperature(-1.0f) +, mid_temperature(0.0f) +, max_temperature(1.0f) +, min_richness(-1.0f) +, mid_richness(0.0f) +, max_richness(1.0f) +, commonness(1.0f) { } -void BlockType::FillEntityModel( - EntityModel::Buffer &buf, - const glm::mat4 &transform, - EntityModel::Index idx_offset +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 ) const noexcept { - shape->Vertices(buf, transform, texture, idx_offset); - buf.colors.insert(buf.colors.end(), shape->VertexCount(), color); + if (!shape) return; + shape->Fill(buf, transform, textures); + buf.hsl_mods.insert(buf.hsl_mods.end(), shape->VertexCount(), hsl_mod); + buf.rgb_mods.insert(buf.rgb_mods.end(), shape->VertexCount(), rgb_mod); } -void BlockType::FillBlockModel( - BlockModel::Buffer &buf, +void BlockType::FillBlockMesh( + BlockMesh::Buffer &buf, const glm::mat4 &transform, - BlockModel::Index idx_offset + BlockMesh::Index idx_offset ) const noexcept { - shape->Vertices(buf, transform, texture, idx_offset); - buf.colors.insert(buf.colors.end(), shape->VertexCount(), color); + if (!shape) return; + shape->Fill(buf, transform, textures, idx_offset); + buf.hsl_mods.insert(buf.hsl_mods.end(), shape->VertexCount(), hsl_mod); + buf.rgb_mods.insert(buf.rgb_mods.end(), shape->VertexCount(), rgb_mod); } -void BlockType::FillOutlineModel(OutlineModel::Buffer &buf) const noexcept { +void BlockType::OutlinePrimitiveMesh(PrimitiveMesh::Buffer &buf) const noexcept { + if (!shape) return; shape->Outline(buf); - buf.colors.insert(buf.colors.end(), shape->OutlineCount(), outline_color); + buf.colors.insert(buf.colors.end(), shape->OutlineCount(), glm::vec4(outline_color, 1.0f)); } BlockTypeRegistry::BlockTypeRegistry() { - Add(BlockType()); + BlockType air; + air.visible = false; + air.block_light = false; + air.collision = false; + air.collide_block = false; + Add(air); } Block::Type BlockTypeRegistry::Add(const BlockType &t) {