X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fblock.hpp;h=56f9eace671193c3a9376a0912a9e7b822893b12;hb=e74f1ad236429f05db90c0ace825277e2a3fbc05;hp=72954ce596a6b846c2b14e0ac8227064c3c7d792;hpb=75e72685a7398d2e30d51fadeaacde849518e188;p=blank.git diff --git a/src/block.hpp b/src/block.hpp index 72954ce..56f9eac 100644 --- a/src/block.hpp +++ b/src/block.hpp @@ -47,6 +47,42 @@ struct Block { Turn GetTurn() const { return Turn(orient % 4); } void SetTurn(Turn turn) { orient = GetFace() * TURN_COUNT + turn; } + static glm::tvec3 FaceNormal(Face face) { + switch (face) { + case FACE_UP: + return { 0, 1, 0 }; + case FACE_DOWN: + return { 0, -1, 0 }; + case FACE_RIGHT: + return { 1, 0, 0 }; + case FACE_LEFT: + return { -1, 0, 0 }; + case FACE_FRONT: + return { 0, 0, 1 }; + case FACE_BACK: + return { 0, 0, -1 }; + default: + return { 0, 0, 0 }; + } + } + + static Face NormalFace(const glm::vec3 &norm) { + const glm::vec3 anorm(abs(norm)); + if (anorm.x > anorm.y) { + if (anorm.x > anorm.z) { + return norm.x > 0.0f ? FACE_RIGHT : FACE_LEFT; + } else { + return norm.z > 0.0f ? FACE_FRONT : FACE_BACK; + } + } else { + if (anorm.y > anorm.z) { + return norm.y > 0.0f ? FACE_UP : FACE_DOWN; + } else { + return norm.z > 0.0f ? FACE_FRONT : FACE_BACK; + } + } + } + }; @@ -59,7 +95,10 @@ struct BlockType { Block::Type id; + int luminosity; + bool visible; + bool block_light; struct Faces { bool face[Block::FACE_COUNT]; @@ -89,6 +128,11 @@ struct BlockType { const glm::mat4 &transform = glm::mat4(1.0f), Model::Index idx_offset = 0 ) const; + void FillBlockModel( + BlockModel::Buffer &m, + const glm::mat4 &transform = glm::mat4(1.0f), + BlockModel::Index idx_offset = 0 + ) const; void FillOutlineModel( OutlineModel &m, const glm::vec3 &pos_offset = { 0, 0, 0 },