diff options
author | Jason Mitchell <mitchej@gmail.com> | 2022-07-17 12:57:04 -0700 |
---|---|---|
committer | Jason Mitchell <mitchej+github@gmail.com> | 2022-07-22 12:57:20 -0700 |
commit | 8c4dd7de80e06875b942b1343f2ca4895ce2d758 (patch) | |
tree | 82f9185d76899d581950cc71f2406b9bc702bcbf /src/main/java/gregtech/common/render/GT_Renderer_Block.java | |
parent | 48e6a5fde81f33d3ff4cb2ef610c39abd33a5821 (diff) | |
download | GT5-Unofficial-8c4dd7de80e06875b942b1343f2ca4895ce2d758.tar.gz GT5-Unofficial-8c4dd7de80e06875b942b1343f2ca4895ce2d758.tar.bz2 GT5-Unofficial-8c4dd7de80e06875b942b1343f2ca4895ce2d758.zip |
MultiTileEntity
Diffstat (limited to 'src/main/java/gregtech/common/render/GT_Renderer_Block.java')
-rw-r--r-- | src/main/java/gregtech/common/render/GT_Renderer_Block.java | 134 |
1 files changed, 105 insertions, 29 deletions
diff --git a/src/main/java/gregtech/common/render/GT_Renderer_Block.java b/src/main/java/gregtech/common/render/GT_Renderer_Block.java index e09130acb4..ef8748064f 100644 --- a/src/main/java/gregtech/common/render/GT_Renderer_Block.java +++ b/src/main/java/gregtech/common/render/GT_Renderer_Block.java @@ -21,12 +21,20 @@ import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityDiggingFX; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import org.lwjgl.opengl.GL11; +import java.util.Arrays; +import java.util.Collections; + +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; +import static gregtech.api.enums.GT_Values.OFFX; +import static gregtech.api.enums.GT_Values.OFFY; +import static gregtech.api.enums.GT_Values.OFFZ; import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_DOWN; import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_EAST; import static gregtech.api.interfaces.metatileentity.IConnectable.CONNECTED_NORTH; @@ -60,7 +68,7 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { } public static boolean renderStandardBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, RenderBlocks aRenderer) { - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); if ((tTileEntity instanceof IPipeRenderedTileEntity)) { return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, new ITexture[][]{ ((IPipeRenderedTileEntity) tTileEntity).getTextureCovered((byte) DOWN.ordinal()), @@ -77,7 +85,8 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) NORTH.ordinal()), ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) SOUTH.ordinal()), ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) WEST.ordinal()), - ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) EAST.ordinal())}); + ((ITexturedTileEntity) tTileEntity).getTexture(aBlock, (byte) EAST.ordinal())} + ); } return false; } @@ -454,7 +463,7 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { return true; } - + @SideOnly(Side.CLIENT) public static void addHitEffects(EffectRenderer effectRenderer, Block block, World world, int x, int y, int z, int side) { double rX = x + XSTR.XSTR_INSTANCE.nextDouble() * 0.8 + 0.1; @@ -481,9 +490,9 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { for (int iX = 0; iX < 4; ++iX) { for (int iY = 0; iY < 4; ++iY) { for (int iZ = 0; iZ < 4; ++iZ) { - double bX = x + (iX + 0.5) / 4.0; - double bY = y + (iY + 0.5) / 4.0; - double bZ = z + (iZ + 0.5) / 4.0; + final double bX = x + (iX + 0.5) / 4.0; + final double bY = y + (iY + 0.5) / 4.0; + final double bZ = z + (iZ + 0.5) / 4.0; effectRenderer.addEffect((new EntityDiggingFX(world, bX, bY, bZ, bX - x - 0.5, bY - y - 0.5, bZ - z - 0.5, block, block.getDamageValue(world, x, y, z))).applyColourMultiplier(x, y, z)); } } @@ -497,28 +506,58 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + if(aBlock instanceof IRenderedBlock) { + boolean tNeedsToSetBounds = true; + final ItemStack aStack = new ItemStack(aBlock, 1, aMeta); + IRenderedBlock tRenderer = ((IRenderedBlock)aBlock).passRenderingToObject(aStack); + if (tRenderer != null) tRenderer = tRenderer.passRenderingToObject(aStack); + if (tRenderer == null) + tRenderer = IRenderedBlock.ErrorRenderer.INSTANCE; + for (int i = 0, j = tRenderer.getRenderPasses(aBlock); i < j; i++) { + if (tRenderer.usesRenderPass(i)) { + if (tRenderer.setBlockBounds(aBlock, i)) { + tNeedsToSetBounds = true; + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + if (tNeedsToSetBounds) aBlock.setBlockBoundsForItemRender(); + aRenderer.setRenderBoundsFromBlock(aBlock); + tNeedsToSetBounds = false; + } + + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) DOWN.ordinal(), true, i), !tNeedsToSetBounds); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) UP.ordinal(), true, i), !tNeedsToSetBounds); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) NORTH.ordinal(), true, i), !tNeedsToSetBounds); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) SOUTH.ordinal(), true, i), !tNeedsToSetBounds); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) WEST.ordinal(), true, i), !tNeedsToSetBounds); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tRenderer.getTexture(aBlock, (byte) EAST.ordinal(), true, i), !tNeedsToSetBounds); + } + } + if (tNeedsToSetBounds) aBlock.setBlockBounds(0, 0, 0, 1, 1, 1); - if (aBlock instanceof GT_Block_Ores_Abstract) { - GT_TileEntity_Ores tTileEntity = new GT_TileEntity_Ores(); - tTileEntity.mMetaData = ((short) aMeta); + } else { + if (aBlock instanceof GT_Block_Ores_Abstract) { + final GT_TileEntity_Ores tTileEntity = new GT_TileEntity_Ores(); + tTileEntity.mMetaData = ((short) aMeta); - aBlock.setBlockBoundsForItemRender(); - aRenderer.setRenderBoundsFromBlock(aBlock); - renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) DOWN.ordinal()), true); - renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) UP.ordinal()), true); - renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) NORTH.ordinal()), true); - renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) SOUTH.ordinal()), true); - renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) WEST.ordinal()), true); - renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) EAST.ordinal()), true); - - } else if (aMeta > 0 + aBlock.setBlockBoundsForItemRender(); + aRenderer.setRenderBoundsFromBlock(aBlock); + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) DOWN.ordinal()), true); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) UP.ordinal()), true); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) NORTH.ordinal()), true); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) SOUTH.ordinal()), true); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) WEST.ordinal()), true); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, (byte) EAST.ordinal()), true); + } else if (aMeta > 0 && (aMeta < GregTech_API.METATILEENTITIES.length) && aBlock instanceof GT_Block_Machines && (GregTech_API.METATILEENTITIES[aMeta] != null) - && (!GregTech_API.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer))) { - renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer); + && (!GregTech_API.METATILEENTITIES[aMeta].renderInInventory(aBlock, aMeta, aRenderer))) + { + renderNormalInventoryMetaTileEntity(aBlock, aMeta, aRenderer); + } + aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); } - aBlock.setBlockBounds(blockMin, blockMin, blockMin, blockMax, blockMax, blockMax); + aRenderer.setRenderBoundsFromBlock(aBlock); GL11.glTranslatef(0.5F, 0.5F, 0.5F); @@ -529,7 +568,7 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { if ((aMeta <= 0) || (aMeta >= GregTech_API.METATILEENTITIES.length)) { return; } - IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aMeta]; + final IMetaTileEntity tMetaTileEntity = GregTech_API.METATILEENTITIES[aMeta]; if (tMetaTileEntity == null) { return; } @@ -643,18 +682,55 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { public boolean renderWorldBlock(IBlockAccess aWorld, int aX, int aY, int aZ, Block aBlock, int aModelID, RenderBlocks aRenderer) { aRenderer.enableAO = Minecraft.isAmbientOcclusionEnabled() && GT_Mod.gregtechproxy.mRenderTileAmbientOcclusion; aRenderer.useInventoryTint = false; - TileEntity tileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (aBlock instanceof IRenderedBlock) { + IRenderedBlock tRenderer = ((IRenderedBlock)aBlock).passRenderingToObject(aWorld, aX, aY, aZ); + if (tRenderer != null) tRenderer = tRenderer.passRenderingToObject(aWorld, aX, aY, aZ); + if (tRenderer == null) tRenderer = IRenderedBlock.ErrorRenderer.INSTANCE; + boolean tNeedsToSetBounds = true; + boolean rReturn = false; + if (tRenderer.renderBlock(aBlock, aRenderer, aWorld, aX, aY, aZ)) { + rReturn = true; + } else { + final boolean[] tSides = new boolean[6]; + if (tRenderer instanceof IRenderedBlockSideCheck) { + for (byte tSide : ALL_VALID_SIDES) rReturn |= (tSides[tSide] = ((IRenderedBlockSideCheck)tRenderer).renderFullBlockSide(aBlock, aRenderer, tSide)); + } else { + for (byte tSide : ALL_VALID_SIDES) rReturn |= (tSides[tSide] = aBlock.shouldSideBeRendered(aWorld, aX+OFFX[tSide], aY+OFFY[tSide], aZ+OFFZ[tSide], tSide)); + } + for (int i = 0, j = tRenderer.getRenderPasses(aBlock); i < j; i++) { + if (tRenderer.usesRenderPass(i)) { + if (tRenderer.setBlockBounds(aBlock, i)) { + tNeedsToSetBounds = true; + aRenderer.setRenderBoundsFromBlock(aBlock); + } else { + if (tNeedsToSetBounds) aBlock.setBlockBounds(0, 0, 0, 1, 1, 1); + aRenderer.setRenderBoundsFromBlock(aBlock); + tNeedsToSetBounds = false; + } + renderNegativeYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) DOWN.ordinal(), i, tSides), tSides[DOWN.ordinal()]); + renderPositiveYFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) UP.ordinal(), i, tSides), tSides[UP.ordinal()]); + renderNegativeZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) NORTH.ordinal(), i, tSides), tSides[NORTH.ordinal()]); + renderPositiveZFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) SOUTH.ordinal(), i, tSides), tSides[SOUTH.ordinal()]); + renderNegativeXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) WEST.ordinal(), i, tSides), tSides[WEST.ordinal()]); + renderPositiveXFacing(aWorld, aRenderer, aBlock, aX, aY, aZ, tRenderer.getTexture(aBlock, (byte) EAST.ordinal(), i, tSides), tSides[EAST.ordinal()]); + } + } + if (tNeedsToSetBounds) aBlock.setBlockBounds(0, 0, 0, 1, 1, 1); + } + + return rReturn; + } + + final TileEntity tileEntity = aWorld.getTileEntity(aX, aY, aZ); if (tileEntity == null) return false; if (tileEntity instanceof IGregTechTileEntity) { - IMetaTileEntity metaTileEntity; - if ((metaTileEntity = ((IGregTechTileEntity) tileEntity).getMetaTileEntity()) != null && - metaTileEntity.renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)) { + final IMetaTileEntity metaTileEntity; + if ((metaTileEntity = ((IGregTechTileEntity) tileEntity).getMetaTileEntity()) != null && metaTileEntity.renderInWorld(aWorld, aX, aY, aZ, aBlock, aRenderer)) { aRenderer.enableAO = false; return true; } } - if (tileEntity instanceof IPipeRenderedTileEntity && - renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer)) { + if (tileEntity instanceof IPipeRenderedTileEntity && renderPipeBlock(aWorld, aX, aY, aZ, aBlock, (IPipeRenderedTileEntity) tileEntity, aRenderer)) { aRenderer.enableAO = false; return true; } |