Rotate facedir-rotated top and bottom textures too, and re-implement nodebox side rotation
This commit is contained in:
parent
47d30d12cb
commit
1788709e2d
|
@ -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);
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Reference in New Issue