diff --git a/src/main/java/appeng/block/misc/BlockCharger.java b/src/main/java/appeng/block/misc/BlockCharger.java index 355dedf28..73a230146 100644 --- a/src/main/java/appeng/block/misc/BlockCharger.java +++ b/src/main/java/appeng/block/misc/BlockCharger.java @@ -26,9 +26,14 @@ import java.util.Random; import javax.annotation.Nullable; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.lwjgl.util.vector.Matrix4f; +import org.lwjgl.util.vector.Vector3f; + import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -44,6 +49,8 @@ import appeng.api.AEApi; import appeng.api.util.AEAxisAlignedBB; import appeng.block.AEBaseTileBlock; import appeng.client.render.effects.LightningFX; +import appeng.client.render.renderable.ItemRenderable; +import appeng.client.render.tesr.ModularTESR; import appeng.core.AEConfig; import appeng.core.CommonHelper; import appeng.core.features.AEFeature; @@ -123,6 +130,13 @@ public class BlockCharger extends AEBaseTileBlock implements ICustomCollision } } + @Override + @SideOnly( Side.CLIENT ) + public TileEntitySpecialRenderer getTESR() + { + return new ModularTESR( new ItemRenderable( tile -> new ImmutablePair( tile.getStackInSlot( 0 ), new Matrix4f().translate( new Vector3f( 0.5f, 0.4f, 0.5f ) ) ) ) ); + } + @Override public Iterable getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b ) { diff --git a/src/main/java/appeng/client/render/renderable/ItemRenderable.java b/src/main/java/appeng/client/render/renderable/ItemRenderable.java new file mode 100644 index 000000000..778e38d84 --- /dev/null +++ b/src/main/java/appeng/client/render/renderable/ItemRenderable.java @@ -0,0 +1,55 @@ + +package appeng.client.render.renderable; + + +import java.nio.FloatBuffer; +import java.util.function.Function; + +import org.apache.commons.lang3.tuple.Pair; +import org.lwjgl.BufferUtils; +import org.lwjgl.util.vector.Matrix4f; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + + +public class ItemRenderable implements Renderable +{ + + private final Function> f; + + public ItemRenderable( Function> f ) + { + this.f = f; + } + + @Override + public void renderTileEntityAt( T te, double x, double y, double z, float partialTicks, int destroyStage ) + { + Pair pair = f.apply( te ); + if( pair != null && pair.getLeft() != null ) + { + GlStateManager.pushMatrix(); + if( pair.getRight() != null ) + { + FloatBuffer matrix = BufferUtils.createFloatBuffer( 16 ); + pair.getRight().store( matrix ); + matrix.flip(); + GlStateManager.multMatrix( matrix ); + } + Minecraft.getMinecraft().getRenderItem().renderItem( pair.getLeft(), TransformType.GROUND ); + GlStateManager.popMatrix(); + } + } + + @Override + public void renderTileEntityFast( T te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer buffer ) + { + + } + +} diff --git a/src/main/java/appeng/client/render/renderable/Renderable.java b/src/main/java/appeng/client/render/renderable/Renderable.java new file mode 100644 index 000000000..7d982a506 --- /dev/null +++ b/src/main/java/appeng/client/render/renderable/Renderable.java @@ -0,0 +1,16 @@ + +package appeng.client.render.renderable; + + +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.tileentity.TileEntity; + + +public interface Renderable +{ + + public void renderTileEntityAt( T te, double x, double y, double z, float partialTicks, int destroyStage ); + + public void renderTileEntityFast( T te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer buffer ); + +} diff --git a/src/main/java/appeng/client/render/tesr/ModularTESR.java b/src/main/java/appeng/client/render/tesr/ModularTESR.java new file mode 100644 index 000000000..d9540edb5 --- /dev/null +++ b/src/main/java/appeng/client/render/tesr/ModularTESR.java @@ -0,0 +1,54 @@ + +package appeng.client.render.tesr; + + +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; + +import appeng.client.render.FacingToRotation; +import appeng.client.render.renderable.Renderable; +import appeng.tile.AEBaseTile; + + +public class ModularTESR extends TileEntitySpecialRenderer +{ + + private final Renderable[] renderables; + + public ModularTESR( Renderable... renderables ) + { + this.renderables = renderables; + } + + @Override + public void renderTileEntityAt( T te, double x, double y, double z, float partialTicks, int destroyStage ) + { + GlStateManager.pushMatrix(); + GlStateManager.translate( x, y, z ); + GlStateManager.translate( 0.5, 0.5, 0.5 ); + FacingToRotation.get( te.getForward(), te.getUp() ).glRotateCurrentMat(); + GlStateManager.translate( -0.5, -0.5, -0.5 ); + for( Renderable renderable : renderables ) + { + renderable.renderTileEntityAt( te, x, y, z, partialTicks, destroyStage ); + } + GlStateManager.popMatrix(); + } + + @Override + public void renderTileEntityFast( T te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer buffer ) + { + GlStateManager.pushMatrix(); + GlStateManager.translate( x, y, z ); + GlStateManager.translate( 0.5, 0.5, 0.5 ); + FacingToRotation.get( te.getForward(), te.getUp() ).glRotateCurrentMat(); + GlStateManager.translate( -0.5, -0.5, -0.5 ); + for( Renderable renderable : renderables ) + { + renderable.renderTileEntityFast( te, x, y, z, partialTicks, destroyStage, buffer ); + } + GlStateManager.popMatrix(); + } + +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/blockstates/tile.BlockCharger.ignore.json b/src/main/resources/assets/appliedenergistics2/blockstates/tile.BlockCharger.ignore.json deleted file mode 100644 index 4d3e85f27..000000000 --- a/src/main/resources/assets/appliedenergistics2/blockstates/tile.BlockCharger.ignore.json +++ /dev/null @@ -1 +0,0 @@ -up \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/blockstates/tile.BlockCharger.json b/src/main/resources/assets/appliedenergistics2/blockstates/tile.BlockCharger.json index 763b5198c..dade42d41 100644 --- a/src/main/resources/assets/appliedenergistics2/blockstates/tile.BlockCharger.json +++ b/src/main/resources/assets/appliedenergistics2/blockstates/tile.BlockCharger.json @@ -1,8 +1,5 @@ { "variants": { - "forward=north": { "model": "appliedenergistics2:tile.BlockCharger", "y": 180 }, - "forward=south": { "model": "appliedenergistics2:tile.BlockCharger", "y": 0 }, - "forward=east": { "model": "appliedenergistics2:tile.BlockCharger", "y": 90 }, - "forward=west": { "model": "appliedenergistics2:tile.BlockCharger", "y": 270 } + "normal": { "model": "appliedenergistics2:tile.BlockCharger" } } } \ No newline at end of file