From 1102f92dacf688cdbefd7813b1ee89f7dc9faf02 Mon Sep 17 00:00:00 2001 From: numzero Date: Thu, 2 Mar 2023 15:26:04 +0300 Subject: [PATCH] Use a enum for tile rotation --- src/client/content_mapblock.cpp | 22 +++++------ src/client/mapblock_mesh.cpp | 68 ++++++++++++++++++--------------- src/client/tile.h | 15 +++++++- 3 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/client/content_mapblock.cpp b/src/client/content_mapblock.cpp index ed210d170f04..407093b8359e 100644 --- a/src/client/content_mapblock.cpp +++ b/src/client/content_mapblock.cpp @@ -197,37 +197,37 @@ static std::array setupCuboidVertices(const aabb3f &box, c video::S3DVertex &vertex = vertices[face * 4 + j]; v2f &tcoords = vertex.TCoords; switch (tile.rotation) { - case 0: + case TileRotation::None: break; - case 1: // R90 + case TileRotation::R90: tcoords.set(-tcoords.Y, tcoords.X); break; - case 2: // R180 + case TileRotation::R180: tcoords.set(-tcoords.X, -tcoords.Y); break; - case 3: // R270 + case TileRotation::R270: tcoords.set(tcoords.Y, -tcoords.X); break; - case 4: // FXR90 + case TileRotation::FXR90: tcoords.X = 1.0 - tcoords.X; tcoords.set(-tcoords.Y, tcoords.X); break; - case 5: // FXR270 + case TileRotation::FXR270: tcoords.X = 1.0 - tcoords.X; tcoords.set(tcoords.Y, -tcoords.X); break; - case 6: // FYR90 + case TileRotation::FYR90: tcoords.Y = 1.0 - tcoords.Y; tcoords.set(-tcoords.Y, tcoords.X); break; - case 7: // FYR270 + case TileRotation::FYR270: tcoords.Y = 1.0 - tcoords.Y; tcoords.set(tcoords.Y, -tcoords.X); break; - case 8: // FX + case TileRotation::FX: tcoords.X = 1.0 - tcoords.X; break; - case 9: // FY + case TileRotation::FY: tcoords.Y = 1.0 - tcoords.Y; break; default: @@ -1335,7 +1335,7 @@ void MapblockMeshGenerator::drawFencelikeNode() // Put wood the right way around in the posts TileSpec tile_rot = tile; - tile_rot.rotation = 1; + tile_rot.rotation = TileRotation::R90; static const f32 post_rad = BS / 8; static const f32 bar_rad = BS / 16; diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 5c2561168b57..e009f2e063ad 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -400,42 +400,48 @@ void getNodeTile(MapNode mn, const v3s16 &p, const v3s16 &dir, MeshMakeData *dat // Get rotation for things like chests u8 facedir = mn.getFaceDir(ndef, true); + static constexpr auto + R0 = TileRotation::None, + R1 = TileRotation::R90, + R2 = TileRotation::R180, + R3 = TileRotation::R270; static const struct { - u8 tile, rotation; + u8 tile; + TileRotation rotation; } dir_to_tile[24][8] = { // 0 +X +Y +Z -Z -Y -X -> value=tile,rotation - 0,0, 2,0 , 0,0 , 4,0 , 0,0, 5,0 , 1,0 , 3,0 , // rotate around y+ 0 - 3 - 0,0, 4,0 , 0,3 , 3,0 , 0,0, 2,0 , 1,1 , 5,0 , - 0,0, 3,0 , 0,2 , 5,0 , 0,0, 4,0 , 1,2 , 2,0 , - 0,0, 5,0 , 0,1 , 2,0 , 0,0, 3,0 , 1,3 , 4,0 , - - 0,0, 2,3 , 5,0 , 0,2 , 0,0, 1,0 , 4,2 , 3,1 , // rotate around z+ 4 - 7 - 0,0, 4,3 , 2,0 , 0,1 , 0,0, 1,1 , 3,2 , 5,1 , - 0,0, 3,3 , 4,0 , 0,0 , 0,0, 1,2 , 5,2 , 2,1 , - 0,0, 5,3 , 3,0 , 0,3 , 0,0, 1,3 , 2,2 , 4,1 , - - 0,0, 2,1 , 4,2 , 1,2 , 0,0, 0,0 , 5,0 , 3,3 , // rotate around z- 8 - 11 - 0,0, 4,1 , 3,2 , 1,3 , 0,0, 0,3 , 2,0 , 5,3 , - 0,0, 3,1 , 5,2 , 1,0 , 0,0, 0,2 , 4,0 , 2,3 , - 0,0, 5,1 , 2,2 , 1,1 , 0,0, 0,1 , 3,0 , 4,3 , - - 0,0, 0,3 , 3,3 , 4,1 , 0,0, 5,3 , 2,3 , 1,3 , // rotate around x+ 12 - 15 - 0,0, 0,2 , 5,3 , 3,1 , 0,0, 2,3 , 4,3 , 1,0 , - 0,0, 0,1 , 2,3 , 5,1 , 0,0, 4,3 , 3,3 , 1,1 , - 0,0, 0,0 , 4,3 , 2,1 , 0,0, 3,3 , 5,3 , 1,2 , - - 0,0, 1,1 , 2,1 , 4,3 , 0,0, 5,1 , 3,1 , 0,1 , // rotate around x- 16 - 19 - 0,0, 1,2 , 4,1 , 3,3 , 0,0, 2,1 , 5,1 , 0,0 , - 0,0, 1,3 , 3,1 , 5,3 , 0,0, 4,1 , 2,1 , 0,3 , - 0,0, 1,0 , 5,1 , 2,3 , 0,0, 3,1 , 4,1 , 0,2 , - - 0,0, 3,2 , 1,2 , 4,2 , 0,0, 5,2 , 0,2 , 2,2 , // rotate around y- 20 - 23 - 0,0, 5,2 , 1,3 , 3,2 , 0,0, 2,2 , 0,1 , 4,2 , - 0,0, 2,2 , 1,0 , 5,2 , 0,0, 4,2 , 0,0 , 3,2 , - 0,0, 4,2 , 1,1 , 2,2 , 0,0, 3,2 , 0,3 , 5,2 + 0,R0, 2,R0 , 0,R0 , 4,R0 , 0,R0, 5,R0 , 1,R0 , 3,R0 , // rotate around y+ 0 - 3 + 0,R0, 4,R0 , 0,R3 , 3,R0 , 0,R0, 2,R0 , 1,R1 , 5,R0 , + 0,R0, 3,R0 , 0,R2 , 5,R0 , 0,R0, 4,R0 , 1,R2 , 2,R0 , + 0,R0, 5,R0 , 0,R1 , 2,R0 , 0,R0, 3,R0 , 1,R3 , 4,R0 , + + 0,R0, 2,R3 , 5,R0 , 0,R2 , 0,R0, 1,R0 , 4,R2 , 3,R1 , // rotate around z+ 4 - 7 + 0,R0, 4,R3 , 2,R0 , 0,R1 , 0,R0, 1,R1 , 3,R2 , 5,R1 , + 0,R0, 3,R3 , 4,R0 , 0,R0 , 0,R0, 1,R2 , 5,R2 , 2,R1 , + 0,R0, 5,R3 , 3,R0 , 0,R3 , 0,R0, 1,R3 , 2,R2 , 4,R1 , + + 0,R0, 2,R1 , 4,R2 , 1,R2 , 0,R0, 0,R0 , 5,R0 , 3,R3 , // rotate around z- 8 - 11 + 0,R0, 4,R1 , 3,R2 , 1,R3 , 0,R0, 0,R3 , 2,R0 , 5,R3 , + 0,R0, 3,R1 , 5,R2 , 1,R0 , 0,R0, 0,R2 , 4,R0 , 2,R3 , + 0,R0, 5,R1 , 2,R2 , 1,R1 , 0,R0, 0,R1 , 3,R0 , 4,R3 , + + 0,R0, 0,R3 , 3,R3 , 4,R1 , 0,R0, 5,R3 , 2,R3 , 1,R3 , // rotate around x+ 12 - 15 + 0,R0, 0,R2 , 5,R3 , 3,R1 , 0,R0, 2,R3 , 4,R3 , 1,R0 , + 0,R0, 0,R1 , 2,R3 , 5,R1 , 0,R0, 4,R3 , 3,R3 , 1,R1 , + 0,R0, 0,R0 , 4,R3 , 2,R1 , 0,R0, 3,R3 , 5,R3 , 1,R2 , + + 0,R0, 1,R1 , 2,R1 , 4,R3 , 0,R0, 5,R1 , 3,R1 , 0,R1 , // rotate around x- 16 - 19 + 0,R0, 1,R2 , 4,R1 , 3,R3 , 0,R0, 2,R1 , 5,R1 , 0,R0 , + 0,R0, 1,R3 , 3,R1 , 5,R3 , 0,R0, 4,R1 , 2,R1 , 0,R3 , + 0,R0, 1,R0 , 5,R1 , 2,R3 , 0,R0, 3,R1 , 4,R1 , 0,R2 , + + 0,R0, 3,R2 , 1,R2 , 4,R2 , 0,R0, 5,R2 , 0,R2 , 2,R2 , // rotate around y- 20 - 23 + 0,R0, 5,R2 , 1,R3 , 3,R2 , 0,R0, 2,R2 , 0,R1 , 4,R2 , + 0,R0, 2,R2 , 1,R0 , 5,R2 , 0,R0, 4,R2 , 0,R0 , 3,R2 , + 0,R0, 4,R2 , 1,R1 , 2,R2 , 0,R0, 3,R2 , 0,R3 , 5,R2 }; getNodeTileN(mn, p, dir_to_tile[facedir][dir_i].tile, data, tile); - tile.rotation = tile.world_aligned ? 0 : dir_to_tile[facedir][dir_i].rotation; + tile.rotation = tile.world_aligned ? TileRotation::None : dir_to_tile[facedir][dir_i].rotation; } static void applyTileColor(PreMeshBuffer &pmb) diff --git a/src/client/tile.h b/src/client/tile.h index 48ddeef7c72a..65129baef0aa 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -295,6 +295,19 @@ struct TileLayer u8 scale = 1; }; +enum class TileRotation: u8 { + None, + R90, + R180, + R270, + FXR90, + FXR270, + FYR90, + FYR270, + FX, + FY, +}; + /*! * Defines a face of a node. May have up to two layers. */ @@ -305,7 +318,7 @@ struct TileSpec //! If true, the tile rotation is ignored. bool world_aligned = false; //! Tile rotation. - u8 rotation = 0; + TileRotation rotation = TileRotation::None; //! This much light does the tile emit. u8 emissive_light = 0; //! The first is base texture, the second is overlay.