Rotate facedir-rotated top and bottom textures too, and re-implement nodebox side rotation

This commit is contained in:
Perttu Ahola 2012-07-21 20:23:32 +03:00
parent 47d30d12cb
commit 1788709e2d
2 changed files with 51 additions and 44 deletions

View File

@ -1029,52 +1029,20 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
break;} break;}
case NDT_NODEBOX: 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]; TileSpec tiles[6];
for(int i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
{ {
tiles[i] = getNodeTileN(n, p, i, data); // Handles facedir rotation for textures
} tiles[i] = getNodeTile(n, p, tile_dirs[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];
}
} }
u16 l = getInteriorLight(n, 0, data); u16 l = getInteriorLight(n, 0, data);

View File

@ -605,7 +605,46 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data)
0, 5, 0, 2, 0, 3, 1, 4, // facedir = 3 0, 5, 0, 2, 0, 3, 1, 4, // facedir = 3
}; };
u8 tileindex = dir_to_tile[facedir*8 + dir_i]; u8 tileindex = dir_to_tile[facedir*8 + dir_i];
// If not rotated or is side tile, we're done
if(facedir == 0 || (tileindex != 0 && tileindex != 1))
return getNodeTileN(mn, p, tileindex, data); 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( static void getTileInfo(