X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fblock.hpp;h=4fcee4cac2f0c2a6e7be58d095e6ee16c982870e;hb=4485397da18a25dfd1a51e864814887b66ba0f2e;hp=0d7d75a5dc8e68460f2413354763e3fbef2e4abf;hpb=3072e2cd49ad1614100d1a1c73afe6a4888fb875;p=blank.git diff --git a/src/block.hpp b/src/block.hpp index 0d7d75a..4fcee4c 100644 --- a/src/block.hpp +++ b/src/block.hpp @@ -42,11 +42,15 @@ struct Block { const glm::mat4 &Transform() const; - Face GetFace() const { return Face(orient / 4); } + Face GetFace() const { return Face(orient / TURN_COUNT); } void SetFace(Face face) { orient = face * TURN_COUNT + GetTurn(); } - Turn GetTurn() const { return Turn(orient % 4); } + Turn GetTurn() const { return Turn(orient % TURN_COUNT); } void SetTurn(Turn turn) { orient = GetFace() * TURN_COUNT + turn; } + static Face Opposite(Face f) { + return Face(f ^ 1); + } + static glm::tvec3 FaceNormal(Face face) { switch (face) { case FACE_UP: @@ -66,6 +70,23 @@ struct Block { } } + 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; + } + } + } + }; @@ -111,6 +132,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 },