mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	Rotate facedir-rotated top and bottom textures too, and re-implement nodebox side rotation
This commit is contained in:
		@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user