diff --git a/src/main/java/appeng/client/render/FacadeDispatcherBakedModel.java b/src/main/java/appeng/client/render/FacadeDispatcherBakedModel.java index a88e5c1f..4a413670 100644 --- a/src/main/java/appeng/client/render/FacadeDispatcherBakedModel.java +++ b/src/main/java/appeng/client/render/FacadeDispatcherBakedModel.java @@ -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 ); } }; } diff --git a/src/main/java/appeng/client/render/FacadeItemModel.java b/src/main/java/appeng/client/render/FacadeItemModel.java index beea5945..2c7c5036 100644 --- a/src/main/java/appeng/client/render/FacadeItemModel.java +++ b/src/main/java/appeng/client/render/FacadeItemModel.java @@ -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 diff --git a/src/main/java/appeng/client/render/FacadeWithBlockBakedModel.java b/src/main/java/appeng/client/render/FacadeWithBlockBakedModel.java index 0cfcafb4..30b30c50 100644 --- a/src/main/java/appeng/client/render/FacadeWithBlockBakedModel.java +++ b/src/main/java/appeng/client/render/FacadeWithBlockBakedModel.java @@ -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 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 diff --git a/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java b/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java index 2af55a11..1d577285 100644 --- a/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java +++ b/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java @@ -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 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 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 ); } } diff --git a/src/main/java/appeng/items/parts/ItemFacade.java b/src/main/java/appeng/items/parts/ItemFacade.java index f79a972d..239ac2a2 100644 --- a/src/main/java/appeng/items/parts/ItemFacade.java +++ b/src/main/java/appeng/items/parts/ItemFacade.java @@ -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 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 )