Implemented translucent facades.
This commit is contained in:
parent
9c69352f9a
commit
ea8c02b591
|
@ -66,9 +66,7 @@ import appeng.block.AEBaseTileBlock;
|
||||||
import appeng.client.UnlistedProperty;
|
import appeng.client.UnlistedProperty;
|
||||||
import appeng.client.render.cablebus.CableBusBakedModel;
|
import appeng.client.render.cablebus.CableBusBakedModel;
|
||||||
import appeng.client.render.cablebus.CableBusRenderState;
|
import appeng.client.render.cablebus.CableBusRenderState;
|
||||||
import appeng.core.AEConfig;
|
|
||||||
import appeng.core.Api;
|
import appeng.core.Api;
|
||||||
import appeng.core.features.AEFeature;
|
|
||||||
import appeng.helpers.AEGlassMaterial;
|
import appeng.helpers.AEGlassMaterial;
|
||||||
import appeng.integration.IntegrationRegistry;
|
import appeng.integration.IntegrationRegistry;
|
||||||
import appeng.integration.IntegrationType;
|
import appeng.integration.IntegrationType;
|
||||||
|
@ -226,17 +224,6 @@ public class BlockCableBus extends AEBaseTileBlock
|
||||||
return this.cb( w, pos ).canConnectRedstone( EnumSet.of( side ) );
|
return this.cb( w, pos ).canConnectRedstone( EnumSet.of( side ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canRenderInLayer( final BlockRenderLayer layer )
|
|
||||||
{
|
|
||||||
if( AEConfig.instance.isFeatureEnabled( AEFeature.AlphaPass ) )
|
|
||||||
{
|
|
||||||
return layer == BlockRenderLayer.CUTOUT || layer == BlockRenderLayer.TRANSLUCENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
return layer == BlockRenderLayer.CUTOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getPickBlock( final IBlockState state, final RayTraceResult target, final World world, final BlockPos pos, final EntityPlayer player )
|
public ItemStack getPickBlock( final IBlockState state, final RayTraceResult target, final World world, final BlockPos pos, final EntityPlayer player )
|
||||||
{
|
{
|
||||||
|
@ -423,7 +410,7 @@ public class BlockCableBus extends AEBaseTileBlock
|
||||||
{
|
{
|
||||||
if( AEApi.instance().partHelper().getCableRenderMode().transparentFacades )
|
if( AEApi.instance().partHelper().getCableRenderMode().transparentFacades )
|
||||||
{
|
{
|
||||||
return layer == BlockRenderLayer.TRANSLUCENT;
|
return layer == BlockRenderLayer.CUTOUT || layer == BlockRenderLayer.TRANSLUCENT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,8 +34,10 @@ import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||||
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
|
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
|
||||||
import net.minecraft.client.renderer.block.model.ItemOverrideList;
|
import net.minecraft.client.renderer.block.model.ItemOverrideList;
|
||||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
|
import net.minecraft.util.BlockRenderLayer;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraftforge.client.MinecraftForgeClient;
|
||||||
import net.minecraftforge.common.property.IExtendedBlockState;
|
import net.minecraftforge.common.property.IExtendedBlockState;
|
||||||
|
|
||||||
import appeng.api.util.AECableType;
|
import appeng.api.util.AECableType;
|
||||||
|
@ -72,38 +74,47 @@ public class CableBusBakedModel implements IBakedModel
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
// First, handle the cable at the center of the cable bus
|
BlockRenderLayer layer = MinecraftForgeClient.getRenderLayer();
|
||||||
|
|
||||||
List<BakedQuad> quads = new ArrayList<>();
|
List<BakedQuad> quads = new ArrayList<>();
|
||||||
addCableQuads( renderState, quads );
|
|
||||||
|
|
||||||
for( EnumFacing facing : EnumFacing.values() )
|
// The core parts of the cable will only be rendered in the CUTOUT layer. TRANSLUCENT is used only for translucent facades further down below.
|
||||||
|
if ( layer == BlockRenderLayer.CUTOUT )
|
||||||
{
|
{
|
||||||
List<ResourceLocation> models = renderState.getAttachments().get( facing );
|
// First, handle the cable at the center of the cable bus
|
||||||
if( models == null )
|
addCableQuads( renderState, quads );
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for( ResourceLocation model : models )
|
// Then handle attachments
|
||||||
|
for( EnumFacing facing : EnumFacing.values() )
|
||||||
{
|
{
|
||||||
IBakedModel bakedModel = partModels.get( model );
|
List<ResourceLocation> models = renderState.getAttachments().get( facing );
|
||||||
|
if( models == null )
|
||||||
if( bakedModel == null )
|
|
||||||
{
|
{
|
||||||
throw new IllegalStateException( "Trying to use an unregistered part model: " + model );
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<BakedQuad> partQuads = bakedModel.getQuads( state, null, rand );
|
for( ResourceLocation model : models )
|
||||||
|
{
|
||||||
|
IBakedModel bakedModel = partModels.get( model );
|
||||||
|
|
||||||
// Rotate quads accordingly
|
if( bakedModel == null )
|
||||||
QuadRotator rotator = new QuadRotator();
|
{
|
||||||
partQuads = rotator.rotateQuads( partQuads, facing, EnumFacing.UP );
|
throw new IllegalStateException( "Trying to use an unregistered part model: " + model );
|
||||||
|
}
|
||||||
|
|
||||||
quads.addAll( partQuads );
|
List<BakedQuad> partQuads = bakedModel.getQuads( state, null, rand );
|
||||||
|
|
||||||
|
// Rotate quads accordingly
|
||||||
|
QuadRotator rotator = new QuadRotator();
|
||||||
|
partQuads = rotator.rotateQuads( partQuads, facing, EnumFacing.UP );
|
||||||
|
|
||||||
|
quads.addAll( partQuads );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
facadeBuilder.addFacades(
|
facadeBuilder.addFacades(
|
||||||
|
layer,
|
||||||
renderState.getFacades(),
|
renderState.getFacades(),
|
||||||
renderState.getBoundingBoxes(),
|
renderState.getBoundingBoxes(),
|
||||||
renderState.getAttachments().keySet(),
|
renderState.getAttachments().keySet(),
|
||||||
|
|
|
@ -38,6 +38,7 @@ import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||||
import net.minecraft.client.renderer.color.BlockColors;
|
import net.minecraft.client.renderer.color.BlockColors;
|
||||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
import net.minecraft.client.renderer.vertex.VertexFormat;
|
import net.minecraft.client.renderer.vertex.VertexFormat;
|
||||||
|
import net.minecraft.util.BlockRenderLayer;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
@ -54,7 +55,7 @@ import appeng.core.AppEng;
|
||||||
public class FacadeBuilder
|
public class FacadeBuilder
|
||||||
{
|
{
|
||||||
|
|
||||||
static final ResourceLocation TEXTURE_FACADE = new ResourceLocation( AppEng.MOD_ID, "parts/cable_anchor" );
|
private static final ResourceLocation TEXTURE_FACADE = new ResourceLocation( AppEng.MOD_ID, "parts/cable_anchor" );
|
||||||
|
|
||||||
private final BlockColors blockColors = Minecraft.getMinecraft().getBlockColors();
|
private final BlockColors blockColors = Minecraft.getMinecraft().getBlockColors();
|
||||||
|
|
||||||
|
@ -74,7 +75,7 @@ public class FacadeBuilder
|
||||||
return Collections.singletonList( TEXTURE_FACADE );
|
return Collections.singletonList( TEXTURE_FACADE );
|
||||||
}
|
}
|
||||||
|
|
||||||
void addFacades( Map<EnumFacing, FacadeRenderState> facadesState, List<AxisAlignedBB> partBoxes, Set<EnumFacing> sidesWithParts, long rand, List<BakedQuad> quads )
|
void addFacades( BlockRenderLayer layer, Map<EnumFacing, FacadeRenderState> facadesState, List<AxisAlignedBB> partBoxes, Set<EnumFacing> sidesWithParts, long rand, List<BakedQuad> quads )
|
||||||
{
|
{
|
||||||
boolean thinFacades = isUseThinFacades( partBoxes );
|
boolean thinFacades = isUseThinFacades( partBoxes );
|
||||||
|
|
||||||
|
@ -88,7 +89,7 @@ public class FacadeBuilder
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
addFacade( facadesState, side, cutOutBox, thinFacades, renderStilt, rand, builder );
|
addFacade( layer, facadesState, side, cutOutBox, thinFacades, renderStilt, rand, builder );
|
||||||
}
|
}
|
||||||
catch( Throwable t )
|
catch( Throwable t )
|
||||||
{
|
{
|
||||||
|
@ -119,7 +120,7 @@ public class FacadeBuilder
|
||||||
return firstFound;
|
return firstFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addFacade( Map<EnumFacing, FacadeRenderState> facades, EnumFacing side, AEAxisAlignedBB busBounds, boolean thinFacades, boolean renderStilt, long rand, CubeBuilder builder )
|
private void addFacade( BlockRenderLayer layer, Map<EnumFacing, FacadeRenderState> facades, EnumFacing side, AEAxisAlignedBB busBounds, boolean thinFacades, boolean renderStilt, long rand, CubeBuilder builder )
|
||||||
{
|
{
|
||||||
|
|
||||||
FacadeRenderState facadeState = facades.get( side );
|
FacadeRenderState facadeState = facades.get( side );
|
||||||
|
@ -128,7 +129,7 @@ public class FacadeBuilder
|
||||||
builder.setDrawFaces( EnumSet.allOf( EnumFacing.class ) );
|
builder.setDrawFaces( EnumSet.allOf( EnumFacing.class ) );
|
||||||
|
|
||||||
// We only render the stilt if we don't intersect with any part directly, and if there's no part on our side
|
// We only render the stilt if we don't intersect with any part directly, and if there's no part on our side
|
||||||
if( renderStilt && busBounds == null )
|
if( renderStilt && busBounds == null && layer == BlockRenderLayer.CUTOUT )
|
||||||
{
|
{
|
||||||
builder.setTexture( facadeTexture );
|
builder.setTexture( facadeTexture );
|
||||||
switch( side )
|
switch( side )
|
||||||
|
@ -154,15 +155,17 @@ public class FacadeBuilder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do not add the translucent facade in any other layer than translucent
|
||||||
|
boolean translucent = AEApi.instance().partHelper().getCableRenderMode().transparentFacades;
|
||||||
|
if( translucent && layer != BlockRenderLayer.TRANSLUCENT )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final float thickness = thinFacades ? 1 : 2;
|
final float thickness = thinFacades ? 1 : 2;
|
||||||
|
|
||||||
IBakedModel blockModel = blockRendererDispatcher.getModelForState( blockState );
|
IBakedModel blockModel = blockRendererDispatcher.getModelForState( blockState );
|
||||||
|
|
||||||
if( AEApi.instance().partHelper().getCableRenderMode().transparentFacades )
|
|
||||||
{
|
|
||||||
// TODO rbw.setOpacity( 0.3f );
|
|
||||||
}
|
|
||||||
|
|
||||||
int color = 0xffffff;
|
int color = 0xffffff;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -172,7 +175,16 @@ public class FacadeBuilder
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.setColorRGB( color );
|
if( translucent )
|
||||||
|
{
|
||||||
|
color &= 0xFFFFFF;
|
||||||
|
color |= 0x4C000000;
|
||||||
|
builder.setColor( color );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
builder.setColorRGB( color );
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Cache this
|
// TODO: Cache this
|
||||||
for( EnumFacing facing : facadeState.getOpenFaces() )
|
for( EnumFacing facing : facadeState.getOpenFaces() )
|
||||||
|
|
Loading…
Reference in a new issue