aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/render/GT_Renderer_Block.java
diff options
context:
space:
mode:
authorJason Mitchell <mitchej@gmail.com>2022-07-17 12:57:04 -0700
committerJason Mitchell <mitchej+github@gmail.com>2022-07-22 12:57:20 -0700
commit8c4dd7de80e06875b942b1343f2ca4895ce2d758 (patch)
tree82f9185d76899d581950cc71f2406b9bc702bcbf /src/main/java/gregtech/common/render/GT_Renderer_Block.java
parent48e6a5fde81f33d3ff4cb2ef610c39abd33a5821 (diff)
downloadGT5-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.java134
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;
}