Fixes #2448: Facades items and blocks now use the same algorithm to determine the block texture.

Facades will now use the correct side to determine the texture to use, and will fall back to general quads.
Fixed crafting of facades on the server by removing the check for model simplicity.
This commit is contained in:
Sebastian Hartte 2016-10-09 21:59:56 +02:00
parent 5de15d5b2c
commit 55d66be929
5 changed files with 63 additions and 41 deletions

View File

@ -21,7 +21,6 @@ package appeng.client.render;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.block.Block;
@ -31,6 +30,7 @@ import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
@ -49,9 +49,12 @@ public class FacadeDispatcherBakedModel implements IBakedModel
private final IBakedModel baseModel;
public FacadeDispatcherBakedModel( IBakedModel baseModel )
private final VertexFormat format;
public FacadeDispatcherBakedModel( IBakedModel baseModel, VertexFormat format )
{
this.baseModel = baseModel;
this.format = format;
}
// This is never used. See the item override list below.
@ -111,7 +114,7 @@ public class FacadeDispatcherBakedModel implements IBakedModel
// This is kinda fascinating, how do we get the meta from the itemblock
IBlockState state = block.getStateFromMeta( meta );
return new FacadeWithBlockBakedModel( baseModel, state );
return new FacadeWithBlockBakedModel( baseModel, state, format );
}
};
}

View File

@ -73,7 +73,7 @@ public class FacadeItemModel implements IModel
IBakedModel bakedBaseModel = baseModel.bake( state, format, bakedTextureGetter );
return new FacadeDispatcherBakedModel( bakedBaseModel );
return new FacadeDispatcherBakedModel( bakedBaseModel, format );
}
@Override

View File

@ -19,8 +19,9 @@
package appeng.client.render;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.block.state.IBlockState;
@ -30,8 +31,12 @@ import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.EnumFacing;
import appeng.client.render.cablebus.CubeBuilder;
import appeng.client.render.cablebus.FacadeBuilder;
/**
* This is the actual baked model that will combine the north face of a given block state
@ -46,11 +51,14 @@ public class FacadeWithBlockBakedModel implements IBakedModel
private final IBakedModel textureModel;
public FacadeWithBlockBakedModel( IBakedModel baseModel, IBlockState blockState )
private final VertexFormat format;
public FacadeWithBlockBakedModel( IBakedModel baseModel, IBlockState blockState, VertexFormat format )
{
this.baseModel = baseModel;
this.blockState = blockState;
this.textureModel = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState( blockState );
this.format = format;
}
@Override
@ -59,12 +67,19 @@ public class FacadeWithBlockBakedModel implements IBakedModel
// Only the north side is actually read from the base model for item models
if( side == EnumFacing.NORTH )
{
return textureModel.getQuads( blockState, side, rand );
}
else
{
return baseModel.getQuads( state, side, rand );
List<BakedQuad> quads = new ArrayList<>( 1 );
CubeBuilder builder = new CubeBuilder( format, quads );
TextureAtlasSprite sprite = FacadeBuilder.getSprite( textureModel, blockState, side, rand );
if ( sprite != null )
{
builder.setTexture( sprite );
builder.setDrawFaces( EnumSet.of( EnumFacing.NORTH ) );
builder.addCube( 0, 0, 0, 16, 16, 16 );
return quads;
}
}
return baseModel.getQuads( state, side, rand );
}
@Override

View File

@ -51,7 +51,7 @@ import appeng.core.AppEng;
/**
* Handles creating the quads for facades attached to cable busses.
*/
class FacadeBuilder
public class FacadeBuilder
{
static final ResourceLocation TEXTURE_FACADE = new ResourceLocation( AppEng.MOD_ID, "parts/cable_anchor" );
@ -97,6 +97,28 @@ class FacadeBuilder
} );
}
public static TextureAtlasSprite getSprite( IBakedModel blockModel, IBlockState state, EnumFacing facing, long rand)
{
for( BakedQuad bakedQuad : blockModel.getQuads( state, facing, rand ) )
{
return bakedQuad.getSprite();
}
TextureAtlasSprite firstFound = null;
for( BakedQuad bakedQuad : blockModel.getQuads( state, null, rand ) )
{
if( firstFound == null )
{
firstFound = bakedQuad.getSprite();
}
if( bakedQuad.getFace() == facing )
{
return bakedQuad.getSprite();
}
}
return firstFound;
}
private void addFacade( Map<EnumFacing, FacadeRenderState> facades, EnumFacing side, AEAxisAlignedBB busBounds, boolean thinFacades, boolean renderStilt, long rand, CubeBuilder builder )
{
@ -155,10 +177,14 @@ class FacadeBuilder
// TODO: Cache this
for( EnumFacing facing : facadeState.getOpenFaces() )
{
List<BakedQuad> quads = blockModel.getQuads( blockState, facing, rand );
for( BakedQuad quad : quads )
TextureAtlasSprite sprite = getSprite( blockModel, blockState, facing, rand );
if( sprite != null )
{
builder.setTexture( quad.getSprite() );
builder.setTexture( facing, sprite );
}
else
{
builder.setTexture( facing, facadeTexture );
}
}

View File

@ -26,9 +26,6 @@ import net.minecraft.block.Block;
import net.minecraft.block.BlockGlass;
import net.minecraft.block.BlockStainedGlass;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
@ -136,33 +133,14 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte
}
}
private static boolean hasSimpleModel( Block b, IBlockState blockState )
private static boolean hasSimpleModel( IBlockState blockState )
{
if( b.getRenderType( blockState ) != EnumBlockRenderType.MODEL )
if( blockState.getRenderType() != EnumBlockRenderType.MODEL )
{
return false;
}
IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes().getModelForState( blockState );
for( EnumFacing facing : EnumFacing.values() )
{
List<BakedQuad> quads = model.getQuads( blockState, facing, 0 );
if( quads.size() != 1 )
{
return false;
}
BakedQuad q = quads.get( 0 );
if( q.getFace() != facing )
{
return false;
}
// TODO We could also check that the quad is fully encompassing the side
}
return true;
return blockState.isFullCube();
}
public ItemStack createFacadeForItem( final ItemStack l, final boolean returnItem )
@ -197,7 +175,7 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte
return null;
}
final boolean defaultValue = ( b.isFullyOpaque( blockState ) && hasSimpleModel( b, blockState ) && !b.getTickRandomly() && !hasTile && !disableOre ) || enableGlass;
final boolean defaultValue = ( b.isFullyOpaque( blockState ) && hasSimpleModel( blockState ) && !b.getTickRandomly() && !hasTile && !disableOre ) || enableGlass;
if( FacadeConfig.instance.checkEnabled( b, metadata, defaultValue ) )
{
if( returnItem )