Use a enum for tile rotation

This commit is contained in:
numzero 2023-03-02 15:26:04 +03:00 committed by sfan5
parent 729671d6ae
commit 1102f92dac
3 changed files with 57 additions and 38 deletions

@ -197,37 +197,37 @@ static std::array<video::S3DVertex, 24> setupCuboidVertices(const aabb3f &box, c
video::S3DVertex &vertex = vertices[face * 4 + j]; video::S3DVertex &vertex = vertices[face * 4 + j];
v2f &tcoords = vertex.TCoords; v2f &tcoords = vertex.TCoords;
switch (tile.rotation) { switch (tile.rotation) {
case 0: case TileRotation::None:
break; break;
case 1: // R90 case TileRotation::R90:
tcoords.set(-tcoords.Y, tcoords.X); tcoords.set(-tcoords.Y, tcoords.X);
break; break;
case 2: // R180 case TileRotation::R180:
tcoords.set(-tcoords.X, -tcoords.Y); tcoords.set(-tcoords.X, -tcoords.Y);
break; break;
case 3: // R270 case TileRotation::R270:
tcoords.set(tcoords.Y, -tcoords.X); tcoords.set(tcoords.Y, -tcoords.X);
break; break;
case 4: // FXR90 case TileRotation::FXR90:
tcoords.X = 1.0 - tcoords.X; tcoords.X = 1.0 - tcoords.X;
tcoords.set(-tcoords.Y, tcoords.X); tcoords.set(-tcoords.Y, tcoords.X);
break; break;
case 5: // FXR270 case TileRotation::FXR270:
tcoords.X = 1.0 - tcoords.X; tcoords.X = 1.0 - tcoords.X;
tcoords.set(tcoords.Y, -tcoords.X); tcoords.set(tcoords.Y, -tcoords.X);
break; break;
case 6: // FYR90 case TileRotation::FYR90:
tcoords.Y = 1.0 - tcoords.Y; tcoords.Y = 1.0 - tcoords.Y;
tcoords.set(-tcoords.Y, tcoords.X); tcoords.set(-tcoords.Y, tcoords.X);
break; break;
case 7: // FYR270 case TileRotation::FYR270:
tcoords.Y = 1.0 - tcoords.Y; tcoords.Y = 1.0 - tcoords.Y;
tcoords.set(tcoords.Y, -tcoords.X); tcoords.set(tcoords.Y, -tcoords.X);
break; break;
case 8: // FX case TileRotation::FX:
tcoords.X = 1.0 - tcoords.X; tcoords.X = 1.0 - tcoords.X;
break; break;
case 9: // FY case TileRotation::FY:
tcoords.Y = 1.0 - tcoords.Y; tcoords.Y = 1.0 - tcoords.Y;
break; break;
default: default:
@ -1335,7 +1335,7 @@ void MapblockMeshGenerator::drawFencelikeNode()
// Put wood the right way around in the posts // Put wood the right way around in the posts
TileSpec tile_rot = tile; TileSpec tile_rot = tile;
tile_rot.rotation = 1; tile_rot.rotation = TileRotation::R90;
static const f32 post_rad = BS / 8; static const f32 post_rad = BS / 8;
static const f32 bar_rad = BS / 16; static const f32 bar_rad = BS / 16;

@ -400,42 +400,48 @@ void getNodeTile(MapNode mn, const v3s16 &p, const v3s16 &dir, MeshMakeData *dat
// Get rotation for things like chests // Get rotation for things like chests
u8 facedir = mn.getFaceDir(ndef, true); u8 facedir = mn.getFaceDir(ndef, true);
static constexpr auto
R0 = TileRotation::None,
R1 = TileRotation::R90,
R2 = TileRotation::R180,
R3 = TileRotation::R270;
static const struct { static const struct {
u8 tile, rotation; u8 tile;
TileRotation rotation;
} dir_to_tile[24][8] = { } dir_to_tile[24][8] = {
// 0 +X +Y +Z -Z -Y -X -> value=tile,rotation // 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,R0, 2,R0 , 0,R0 , 4,R0 , 0,R0, 5,R0 , 1,R0 , 3,R0 , // rotate around y+ 0 - 3
0,0, 4,0 , 0,3 , 3,0 , 0,0, 2,0 , 1,1 , 5,0 , 0,R0, 4,R0 , 0,R3 , 3,R0 , 0,R0, 2,R0 , 1,R1 , 5,R0 ,
0,0, 3,0 , 0,2 , 5,0 , 0,0, 4,0 , 1,2 , 2,0 , 0,R0, 3,R0 , 0,R2 , 5,R0 , 0,R0, 4,R0 , 1,R2 , 2,R0 ,
0,0, 5,0 , 0,1 , 2,0 , 0,0, 3,0 , 1,3 , 4,0 , 0,R0, 5,R0 , 0,R1 , 2,R0 , 0,R0, 3,R0 , 1,R3 , 4,R0 ,
0,0, 2,3 , 5,0 , 0,2 , 0,0, 1,0 , 4,2 , 3,1 , // rotate around z+ 4 - 7 0,R0, 2,R3 , 5,R0 , 0,R2 , 0,R0, 1,R0 , 4,R2 , 3,R1 , // rotate around z+ 4 - 7
0,0, 4,3 , 2,0 , 0,1 , 0,0, 1,1 , 3,2 , 5,1 , 0,R0, 4,R3 , 2,R0 , 0,R1 , 0,R0, 1,R1 , 3,R2 , 5,R1 ,
0,0, 3,3 , 4,0 , 0,0 , 0,0, 1,2 , 5,2 , 2,1 , 0,R0, 3,R3 , 4,R0 , 0,R0 , 0,R0, 1,R2 , 5,R2 , 2,R1 ,
0,0, 5,3 , 3,0 , 0,3 , 0,0, 1,3 , 2,2 , 4,1 , 0,R0, 5,R3 , 3,R0 , 0,R3 , 0,R0, 1,R3 , 2,R2 , 4,R1 ,
0,0, 2,1 , 4,2 , 1,2 , 0,0, 0,0 , 5,0 , 3,3 , // rotate around z- 8 - 11 0,R0, 2,R1 , 4,R2 , 1,R2 , 0,R0, 0,R0 , 5,R0 , 3,R3 , // rotate around z- 8 - 11
0,0, 4,1 , 3,2 , 1,3 , 0,0, 0,3 , 2,0 , 5,3 , 0,R0, 4,R1 , 3,R2 , 1,R3 , 0,R0, 0,R3 , 2,R0 , 5,R3 ,
0,0, 3,1 , 5,2 , 1,0 , 0,0, 0,2 , 4,0 , 2,3 , 0,R0, 3,R1 , 5,R2 , 1,R0 , 0,R0, 0,R2 , 4,R0 , 2,R3 ,
0,0, 5,1 , 2,2 , 1,1 , 0,0, 0,1 , 3,0 , 4,3 , 0,R0, 5,R1 , 2,R2 , 1,R1 , 0,R0, 0,R1 , 3,R0 , 4,R3 ,
0,0, 0,3 , 3,3 , 4,1 , 0,0, 5,3 , 2,3 , 1,3 , // rotate around x+ 12 - 15 0,R0, 0,R3 , 3,R3 , 4,R1 , 0,R0, 5,R3 , 2,R3 , 1,R3 , // rotate around x+ 12 - 15
0,0, 0,2 , 5,3 , 3,1 , 0,0, 2,3 , 4,3 , 1,0 , 0,R0, 0,R2 , 5,R3 , 3,R1 , 0,R0, 2,R3 , 4,R3 , 1,R0 ,
0,0, 0,1 , 2,3 , 5,1 , 0,0, 4,3 , 3,3 , 1,1 , 0,R0, 0,R1 , 2,R3 , 5,R1 , 0,R0, 4,R3 , 3,R3 , 1,R1 ,
0,0, 0,0 , 4,3 , 2,1 , 0,0, 3,3 , 5,3 , 1,2 , 0,R0, 0,R0 , 4,R3 , 2,R1 , 0,R0, 3,R3 , 5,R3 , 1,R2 ,
0,0, 1,1 , 2,1 , 4,3 , 0,0, 5,1 , 3,1 , 0,1 , // rotate around x- 16 - 19 0,R0, 1,R1 , 2,R1 , 4,R3 , 0,R0, 5,R1 , 3,R1 , 0,R1 , // rotate around x- 16 - 19
0,0, 1,2 , 4,1 , 3,3 , 0,0, 2,1 , 5,1 , 0,0 , 0,R0, 1,R2 , 4,R1 , 3,R3 , 0,R0, 2,R1 , 5,R1 , 0,R0 ,
0,0, 1,3 , 3,1 , 5,3 , 0,0, 4,1 , 2,1 , 0,3 , 0,R0, 1,R3 , 3,R1 , 5,R3 , 0,R0, 4,R1 , 2,R1 , 0,R3 ,
0,0, 1,0 , 5,1 , 2,3 , 0,0, 3,1 , 4,1 , 0,2 , 0,R0, 1,R0 , 5,R1 , 2,R3 , 0,R0, 3,R1 , 4,R1 , 0,R2 ,
0,0, 3,2 , 1,2 , 4,2 , 0,0, 5,2 , 0,2 , 2,2 , // rotate around y- 20 - 23 0,R0, 3,R2 , 1,R2 , 4,R2 , 0,R0, 5,R2 , 0,R2 , 2,R2 , // rotate around y- 20 - 23
0,0, 5,2 , 1,3 , 3,2 , 0,0, 2,2 , 0,1 , 4,2 , 0,R0, 5,R2 , 1,R3 , 3,R2 , 0,R0, 2,R2 , 0,R1 , 4,R2 ,
0,0, 2,2 , 1,0 , 5,2 , 0,0, 4,2 , 0,0 , 3,2 , 0,R0, 2,R2 , 1,R0 , 5,R2 , 0,R0, 4,R2 , 0,R0 , 3,R2 ,
0,0, 4,2 , 1,1 , 2,2 , 0,0, 3,2 , 0,3 , 5,2 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); 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) static void applyTileColor(PreMeshBuffer &pmb)

@ -295,6 +295,19 @@ struct TileLayer
u8 scale = 1; 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. * 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. //! If true, the tile rotation is ignored.
bool world_aligned = false; bool world_aligned = false;
//! Tile rotation. //! Tile rotation.
u8 rotation = 0; TileRotation rotation = TileRotation::None;
//! This much light does the tile emit. //! This much light does the tile emit.
u8 emissive_light = 0; u8 emissive_light = 0;
//! The first is base texture, the second is overlay. //! The first is base texture, the second is overlay.