+ Type type;
+ unsigned char orient;
+
+ constexpr explicit Block(Type type = 0, Face face = FACE_UP, Turn turn = TURN_NONE)
+ : type(type), orient(face * TURN_COUNT + turn) { }
+
+ const glm::mat4 &Transform() const;
+
+ Face GetFace() const { return Face(orient / 4); }
+ void SetFace(Face face) { orient = face * TURN_COUNT + GetTurn(); }
+ Turn GetTurn() const { return Turn(orient % 4); }
+ void SetTurn(Turn turn) { orient = GetFace() * TURN_COUNT + turn; }
+
+ static glm::tvec3<int> 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 };
+ }
+ }