From 1788709e2d9cfa8de36742ed21aec877d48c64d7 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 21 Jul 2012 20:23:32 +0300 Subject: [PATCH] Rotate facedir-rotated top and bottom textures too, and re-implement nodebox side rotation --- src/content_mapblock.cpp | 54 ++++++++-------------------------------- src/mapblock_mesh.cpp | 41 +++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 44 deletions(-) diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 3d049f8c..ad819e79 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -1029,52 +1029,20 @@ void mapblock_mesh_generate_special(MeshMakeData *data, break;} case NDT_NODEBOX: { + static const v3s16 tile_dirs[6] = { + v3s16(0, 1, 0), + v3s16(0, -1, 0), + v3s16(1, 0, 0), + v3s16(-1, 0, 0), + v3s16(0, 0, 1), + v3s16(0, 0, -1) + }; + TileSpec tiles[6]; for(int i = 0; i < 6; i++) { - tiles[i] = getNodeTileN(n, p, i, data); - } - - // Facedir rotation for textures - if(f.node_box.type == NODEBOX_FIXED){ - int facedir = n.getFaceDir(nodedef); - if(facedir == 1){ // -90 - TileSpec old[6]; - for(int i=0; i<6; i++) - old[i] = tiles[i]; - // right <- back - tiles[2] = old[4]; - // back <- left - tiles[4] = old[3]; - // left <- front - tiles[3] = old[5]; - // front <- right - tiles[5] = old[2]; - } - if(facedir == 2){ // 180 - TileSpec old[6]; - for(int i=0; i<6; i++) - old[i] = tiles[i]; - // right <-> left - tiles[2] = old[3]; - tiles[3] = old[2]; - // back <-> front - tiles[4] = old[5]; - tiles[5] = old[4]; - } - if(facedir == 3){ // 90 - TileSpec old[6]; - for(int i=0; i<6; i++) - old[i] = tiles[i]; - // right <- front - tiles[2] = old[5]; - // back <- right - tiles[4] = old[2]; - // left <- back - tiles[3] = old[4]; - // front <- left - tiles[5] = old[3]; - } + // Handles facedir rotation for textures + tiles[i] = getNodeTile(n, p, tile_dirs[i], data); } u16 l = getInteriorLight(n, 0, data); diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 3f40f9c0..9ae9b21c 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -605,7 +605,46 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data) 0, 5, 0, 2, 0, 3, 1, 4, // facedir = 3 }; u8 tileindex = dir_to_tile[facedir*8 + dir_i]; - return getNodeTileN(mn, p, tileindex, data); + + // If not rotated or is side tile, we're done + if(facedir == 0 || (tileindex != 0 && tileindex != 1)) + return getNodeTileN(mn, p, tileindex, data); + + // This is the top or bottom tile, and it shall be rotated; thus rotate it + TileSpec spec = getNodeTileN(mn, p, tileindex, data); + if(tileindex == 0){ + if(facedir == 1){ // -90 + std::string name = data->m_gamedef->tsrc()->getTextureName(spec.texture.id); + name += "^[transformR270"; + spec.texture = data->m_gamedef->tsrc()->getTexture(name); + } + else if(facedir == 2){ // 180 + spec.texture.pos += spec.texture.size; + spec.texture.size *= -1; + } + else if(facedir == 3){ // 90 + std::string name = data->m_gamedef->tsrc()->getTextureName(spec.texture.id); + name += "^[transformR90"; + spec.texture = data->m_gamedef->tsrc()->getTexture(name); + } + } + else if(tileindex == 1){ + if(facedir == 1){ // -90 + std::string name = data->m_gamedef->tsrc()->getTextureName(spec.texture.id); + name += "^[transformR90"; + spec.texture = data->m_gamedef->tsrc()->getTexture(name); + } + else if(facedir == 2){ // 180 + spec.texture.pos += spec.texture.size; + spec.texture.size *= -1; + } + else if(facedir == 3){ // 90 + std::string name = data->m_gamedef->tsrc()->getTextureName(spec.texture.id); + name += "^[transformR270"; + spec.texture = data->m_gamedef->tsrc()->getTexture(name); + } + } + return spec; } static void getTileInfo( -- 2.30.2