X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FBlockType.hpp;h=f1b887d3eabc56e998fd64917c8a661df9df52b9;hb=fda38181732e58537331c919dd699eaa830ead50;hp=0cae9c00389767c013880e559f3a37bf1126c7c8;hpb=75ebb9101c7aec9c16ef418b822c39e81889f66f;p=blank.git diff --git a/src/world/BlockType.hpp b/src/world/BlockType.hpp index 0cae9c0..f1b887d 100644 --- a/src/world/BlockType.hpp +++ b/src/world/BlockType.hpp @@ -2,28 +2,45 @@ #define BLANK_WORLD_BLOCKTYPE_HPP_ #include "Block.hpp" -#include "../model/BlockModel.hpp" -#include "../model/EntityModel.hpp" -#include "../model/OutlineModel.hpp" -#include "../model/shapes.hpp" +#include "BlockGravity.hpp" +#include "../graphics/BlockMesh.hpp" +#include "../graphics/EntityMesh.hpp" +#include "../graphics/PrimitiveMesh.hpp" +#include "../model/Shape.hpp" #include +#include +#include namespace blank { +class ResourceIndex; +class ShapeRegistry; +class TokenStreamReader; + /// single 1x1x1 cube /// attributes of a type of block struct BlockType { const Shape *shape; - float texture; - glm::vec3 color; - glm::vec3 outline_color; + std::vector textures; + glm::tvec3 hsl_mod; + glm::tvec3 rgb_mod; + glm::tvec3 outline_color; + + /// gravity configuration or null if not emitting gravity + std::unique_ptr gravity; + /// a string identifying in contexts where numbers just won't do + /// must be unique within any given set + std::string name; /// a string to display to the user std::string label; + int place_sound; + int remove_sound; + Block::Type id; /// light level that blocks of this type emit @@ -42,59 +59,87 @@ struct BlockType { // generation properties /// whether to use this block in generation at all bool generate; + // min/mid/max points for the respective properties // should all be in the (-1,1) range - float min_solidity; - float mid_solidity; - float max_solidity; - float min_humidity; - float mid_humidity; - float max_humidity; - float min_temperature; - float mid_temperature; - float max_temperature; - float min_richness; - float mid_richness; - float max_richness; - /// commonness factor, random chance is multiplied by this - float commonness; + class Distribution { + + public: + Distribution(float min, float mid, float max) + : xmin(min), xmid(mid), xmax(max) { Update(); } + + bool Valid(float x) const noexcept { + return x >= xmin && x <= xmax; + } + float Map(float x) const noexcept { + // previous algo as was used by Generator + //return 4.0f - ((x - xmid) * (x - xmid)); - struct Faces { - bool face[Block::FACE_COUNT]; - Faces &operator =(const Faces &other) noexcept { - for (int i = 0; i < Block::FACE_COUNT; ++i) { - face[i] = other.face[i]; - } - return *this; + // linear mapping of [min,mid,max] to [-1,0,1] + x -= xmid; + x *= (x < 0) ? inv_neg : inv_pos; + + // smoothing: x^4 - 2x^2 + 1 + x *= x; + return x * x - 2.0f * x + 1.0f; } - bool operator [](Block::Face f) const noexcept { - return face[f]; + + void Min(float m) noexcept { xmin = m; Update(); } + float Min() const noexcept { return xmin; } + void Mid(float m) noexcept { xmid = m; Update(); } + float Mid() const noexcept { return xmid; } + void Max(float m) noexcept { xmax = m; Update(); } + float Max() const noexcept { return xmax; } + + private: + void Update() { + float abs_min = std::abs(xmin - xmid); + inv_neg = abs_min < std::numeric_limits::epsilon() ? 0.0f : 1.0f / abs_min; + float abs_max = std::abs(xmax - xmid); + inv_pos = abs_max < std::numeric_limits::epsilon() ? 0.0f : 1.0f / abs_max; } - } fill; - explicit BlockType( - bool v = false, - const glm::vec3 &color = { 1, 1, 1 }, - const Shape *shape = &DEFAULT_SHAPE - ) noexcept; + float xmin; + float xmid; + float xmax; + float inv_neg; + float inv_pos; + + }; - static const NullShape DEFAULT_SHAPE; + Distribution solidity; + Distribution humidity; + Distribution temperature; + Distribution richness; + /// commonness factor, random chance is multiplied by this + float commonness; + + BlockType() noexcept; + + /// clone values of given type + /// this copies everything except for ID, name, label, and gravity + void Copy(const 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 fill[block.OrientedFace(face)]; + return shape && shape->FaceFilled(block.OrientedFace(face)); } - void FillEntityModel( - EntityModel::Buffer &m, - const glm::mat4 &transform = glm::mat4(1.0f), - EntityModel::Index idx_offset = 0 + void FillEntityMesh( + EntityMesh::Buffer &m, + const glm::mat4 &transform = glm::mat4(1.0f) ) const noexcept; - void FillBlockModel( - BlockModel::Buffer &m, + void FillBlockMesh( + BlockMesh::Buffer &m, const glm::mat4 &transform = glm::mat4(1.0f), - BlockModel::Index idx_offset = 0 + BlockMesh::Index idx_offset = 0 ) const noexcept; - void FillOutlineModel(OutlineModel::Buffer &m) const noexcept; + void OutlinePrimitiveMesh(PrimitiveMesh::Buffer &) const noexcept; };