From 55d66be929346d0abc3e67f60441f3fd349d4b8f Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 9 Oct 2016 21:59:56 +0200 Subject: [PATCH] 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. --- .../render/FacadeDispatcherBakedModel.java | 9 +++-- .../appeng/client/render/FacadeItemModel.java | 2 +- .../render/FacadeWithBlockBakedModel.java | 29 ++++++++++++---- .../client/render/cablebus/FacadeBuilder.java | 34 ++++++++++++++++--- .../java/appeng/items/parts/ItemFacade.java | 30 +++------------- 5 files changed, 63 insertions(+), 41 deletions(-) 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 )