Skip to content

Commit

Permalink
Render blocks and fluids inside of smelteries according to size (exac…
Browse files Browse the repository at this point in the history
…tly the same behaviour as with the old 3x3 smeltery)
  • Loading branch information
bonii-xx committed Sep 11, 2014
1 parent 13f1b63 commit 6bbd392
Show file tree
Hide file tree
Showing 4 changed files with 211 additions and 61 deletions.
8 changes: 6 additions & 2 deletions src/main/java/tconstruct/smeltery/SmelteryProxyClient.java
Expand Up @@ -43,8 +43,12 @@ void registerRenderer ()
RenderingRegistry.registerBlockHandler(new RenderBlockFluid());
RenderingRegistry.registerBlockHandler(new BlockRenderCastingChannel());

if (!PHConstruct.newSmeltery)
RenderingRegistry.registerBlockHandler(new SmelteryRender());
if (!PHConstruct.newSmeltery) {
if(PHConstruct.oldSmeltery)
RenderingRegistry.registerBlockHandler(new SmelteryRenderOld());
else
RenderingRegistry.registerBlockHandler(new SmelteryRender());
}

ClientRegistry.bindTileEntitySpecialRenderer(CastingTableLogic.class, new CastingTableSpecialRenderer());
ClientRegistry.bindTileEntitySpecialRenderer(CastingBasinLogic.class, new CastingBasinSpecialRender());
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/tconstruct/smeltery/blocks/SmelteryBlock.java
Expand Up @@ -16,9 +16,11 @@
import net.minecraft.world.*;
import tconstruct.TConstruct;
import tconstruct.library.TConstructRegistry;
import tconstruct.library.crafting.Smeltery;
import tconstruct.smeltery.SmelteryProxyCommon;
import tconstruct.smeltery.logic.*;
import tconstruct.smeltery.model.SmelteryRender;
import tconstruct.smeltery.model.SmelteryRenderOld;
import tconstruct.util.config.PHConstruct;

public class SmelteryBlock extends InventoryBlock
Expand Down Expand Up @@ -48,6 +50,8 @@ public SmelteryBlock(String prefix)
@Override
public int getRenderType ()
{
if(PHConstruct.oldSmeltery)
return SmelteryRenderOld.smelteryModel;
return PHConstruct.newSmeltery ? 0 : SmelteryRender.smelteryModel;
}

Expand Down
90 changes: 31 additions & 59 deletions src/main/java/tconstruct/smeltery/model/SmelteryRender.java
@@ -1,6 +1,7 @@
package tconstruct.smeltery.model;

import cpw.mods.fml.client.registry.*;
import mantle.world.CoordTuple;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack;
Expand Down Expand Up @@ -44,14 +45,15 @@ public boolean renderSmeltery (IBlockAccess world, int x, int y, int z, Block bl
SmelteryLogic logic = (SmelteryLogic) world.getTileEntity(x, y, z);
if (logic.validStructure)
{
//int posX = logic.centerPos.x - 1, posY = logic.centerPos.y, posZ = logic.centerPos.z - 1;
int posX = logic.minPos.x, posY = logic.minPos.y, posZ = logic.minPos.z; // todo: proper rendering
CoordTuple from = logic.minPos;
CoordTuple to = logic.maxPos;

//Melting
if (logic.getSizeInventory() > 0)
{
for (int i = 0; i < logic.layers; i++)
{
renderLayer(logic, i * 9, posX, posY + i, posZ, renderer, world);
renderLayer(logic, i * logic.getBlocksPerLayer(), from, to, from.y + i, renderer, world);
}
}

Expand All @@ -75,46 +77,21 @@ public boolean renderSmeltery (IBlockAccess world, int x, int y, int z, Block bl
base += height;
liquidBase += countSize;

renderer.setRenderBounds(0, renderBase, 0, 1, renderHeight, 1);
Fluid fluid = liquid.getFluid();
for (int i = 0; i < 9; i++)
{
float minX = i % 3 == 0 ? -0.001F : 0F;
float minZ = i / 3 == 0 ? -0.001F : 0F;
float maxX = i % 3 == 2 ? 1.001F : 1F;
float maxZ = i / 3 == 2 ? 1.001F : 1F;
renderer.setRenderBounds(minX, renderBase, minZ, maxX, renderHeight, maxZ);
if (fluid.canBePlacedInWorld())
BlockSkinRenderHelper.renderMetadataBlock(fluid.getBlock(), 0, posX + i % 3, posY + yBase, posZ + i / 3, renderer, world);
else
BlockSkinRenderHelper.renderLiquidBlock(fluid.getStillIcon(), fluid.getFlowingIcon(), posX + i % 3, posY + yBase, posZ + i / 3, renderer, world);
}
/*if (liquid.itemID < 4096) //Block
{
Block liquidBlock = Block.blocksList[liquid.itemID];
for (int i = 0; i < 9; i++)
for(int xi = from.x; xi <= to.x; xi++)
for(int zi = from.z; zi <= to.z; zi++)
{
float minX = i % 3 == 0 ? -0.001F : 0F;
float minZ = i / 3 == 0 ? -0.001F : 0F;
float maxX = i % 3 == 2 ? 1.001F : 1F;
float maxZ = i / 3 == 2 ? 1.001F : 1F;
float minX = xi == from.x ? -0.001F : 0F;
float minZ = zi == from.z ? -0.001F : 0F;
float maxX = xi == to.x ? 1.001F : 1F;
float maxZ = zi == to.z ? 1.001F : 1F;
renderer.setRenderBounds(minX, renderBase, minZ, maxX, renderHeight, maxZ);
BlockSkinRenderHelper.renderMetadataBlock(liquidBlock, liquid.itemMeta, posX + i % 3, posY + yBase, posZ + i / 3, renderer, world);
if (fluid.canBePlacedInWorld())
BlockSkinRenderHelper.renderMetadataBlock(fluid.getBlock(), 0, xi, from.y + yBase, zi, renderer, world);
else
BlockSkinRenderHelper.renderLiquidBlock(fluid.getStillIcon(), fluid.getFlowingIcon(), xi, from.y + yBase, zi, renderer, world);
}
}
else
//Item
{
Item liquidItem = Item.itemsList[liquid.itemID];
for (int i = 0; i < 9; i++)
{
float minX = i % 3 == 0 ? -0.001F : 0F;
float minZ = i / 3 == 0 ? -0.001F : 0F;
float maxX = i % 3 == 2 ? 1.001F : 1F;
float maxZ = i / 3 == 2 ? 1.001F : 1F;
renderer.setRenderBounds(minX, renderBase, minZ, maxX, renderHeight, maxZ);
BlockSkinRenderHelper.renderFakeBlock(liquidItem.getIconFromDamage(liquid.itemMeta), posX, posY + yBase, posZ, renderer, world);
}
}*/

if (countSize == room)
{
Expand All @@ -128,33 +105,28 @@ public boolean renderSmeltery (IBlockAccess world, int x, int y, int z, Block bl
return true;
}

void renderLayer (SmelteryLogic logic, int start, int posX, int posY, int posZ, RenderBlocks renderer, IBlockAccess world)
void renderLayer (SmelteryLogic logic, int start, CoordTuple from, CoordTuple to, int posY, RenderBlocks renderer, IBlockAccess world)
{
renderer.setRenderBounds(-0.001F, -0.001F, -0.001F, 1.001F, 1.001F, 1.001F);
for (int i = 0; i < 9; i++)
{
ItemStack input = logic.getStackInSlot(i + start);
if (input != null && logic.getTempForSlot(i + start) > 20)
int i = start;
for(int x = from.x; x <= to.x; x++)
for(int z = from.z; z <= to.z; z++)
{
ItemStack blockToRender = Smeltery.getRenderIndex(input);
if (blockToRender != null)
ItemStack input = logic.getStackInSlot(i);
if (input != null && logic.getTempForSlot(i) > 20)
{
float blockHeight = input.stackSize / (float) blockToRender.stackSize;
renderer.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, MathHelper.clamp_float(blockHeight, 0.01F, 1.0F), 1.0F);

Block liquidBlock = Block.getBlockFromItem(blockToRender.getItem());
BlockSkinRenderHelper.renderMetadataBlock(liquidBlock, blockToRender.getItemDamage(), posX + i % 3, posY, posZ + i / 3, renderer, world);

/*else //No items, only blocks
//Item
ItemStack blockToRender = Smeltery.getRenderIndex(input);
if (blockToRender != null)
{
Item liquidItem = Item.itemsList[blockToRender.itemID];
int metadata = blockToRender.getItemDamage();
BlockSkinRenderHelper.renderFakeBlock(liquidItem.getIconFromDamage(metadata), posX + i % 3, posY, posZ + i / 3, renderer, world);
}*/
float blockHeight = input.stackSize / (float) blockToRender.stackSize;
renderer.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, MathHelper.clamp_float(blockHeight, 0.01F, 1.0F), 1.0F);

Block liquidBlock = Block.getBlockFromItem(blockToRender.getItem());
BlockSkinRenderHelper.renderMetadataBlock(liquidBlock, blockToRender.getItemDamage(), x, posY, z, renderer, world);
}
}
i++;
}
}
}

@Override
Expand Down
170 changes: 170 additions & 0 deletions src/main/java/tconstruct/smeltery/model/SmelteryRenderOld.java
@@ -0,0 +1,170 @@
package tconstruct.smeltery.model;

import cpw.mods.fml.client.registry.*;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.fluids.*;
import tconstruct.client.BlockSkinRenderHelper;
import tconstruct.library.crafting.Smeltery;
import tconstruct.smeltery.logic.SmelteryLogicOld;
import tconstruct.util.ItemHelper;

public class SmelteryRenderOld implements ISimpleBlockRenderingHandler
{
public static int smelteryModel = RenderingRegistry.getNextAvailableRenderId();

@Override
public void renderInventoryBlock (Block block, int metadata, int modelID, RenderBlocks renderer)
{
if (modelID == smelteryModel)
{
ItemHelper.renderStandardInvBlock(renderer, block, metadata);
}
}

@Override
public boolean renderWorldBlock (IBlockAccess world, int x, int y, int z, Block block, int modelID, RenderBlocks renderer)
{
if (modelID == smelteryModel)
{
if (world.getBlockMetadata(x, y, z) == 0)
return renderSmeltery(world, x, y, z, block, modelID, renderer);
else
renderer.renderStandardBlock(block, x, y, z);
}
return true;
}

public boolean renderSmeltery (IBlockAccess world, int x, int y, int z, Block block, int modelID, RenderBlocks renderer)
{
renderer.renderStandardBlock(block, x, y, z);
SmelteryLogicOld logic = (SmelteryLogicOld) world.getTileEntity(x, y, z);
if (logic.validStructure)
{
int posX = logic.centerPos.x - 1, posY = logic.centerPos.y, posZ = logic.centerPos.z - 1;
//Melting
if (logic.getSizeInventory() > 0)
{
for (int i = 0; i < logic.layers; i++)
{
renderLayer(logic, i * 9, posX, posY + i, posZ, renderer, world);
}
}

//Liquids
float base = 0F;
int yBase = 0;
int liquidBase = 0;
for (FluidStack liquid : logic.moltenMetal)
{
int liquidSize = liquid.amount;
while (liquidSize > 0)
{
int room = 20000 - liquidBase;
int countSize = liquidSize > room ? room : liquidSize;
liquidSize -= countSize;

float height = countSize > 20000 ? 1.0F : countSize / 20000F;
//renderer.setRenderBounds(0, base, 0, 1, height + base, 1);
float renderBase = base;
float renderHeight = height + base;
base += height;
liquidBase += countSize;

Fluid fluid = liquid.getFluid();
for (int i = 0; i < 9; i++)
{
float minX = i % 3 == 0 ? -0.001F : 0F;
float minZ = i / 3 == 0 ? -0.001F : 0F;
float maxX = i % 3 == 2 ? 1.001F : 1F;
float maxZ = i / 3 == 2 ? 1.001F : 1F;
renderer.setRenderBounds(minX, renderBase, minZ, maxX, renderHeight, maxZ);
if (fluid.canBePlacedInWorld())
BlockSkinRenderHelper.renderMetadataBlock(fluid.getBlock(), 0, posX + i % 3, posY + yBase, posZ + i / 3, renderer, world);
else
BlockSkinRenderHelper.renderLiquidBlock(fluid.getStillIcon(), fluid.getFlowingIcon(), posX + i % 3, posY + yBase, posZ + i / 3, renderer, world);
}
/*if (liquid.itemID < 4096) //Block
{
Block liquidBlock = Block.blocksList[liquid.itemID];
for (int i = 0; i < 9; i++)
{
float minX = i % 3 == 0 ? -0.001F : 0F;
float minZ = i / 3 == 0 ? -0.001F : 0F;
float maxX = i % 3 == 2 ? 1.001F : 1F;
float maxZ = i / 3 == 2 ? 1.001F : 1F;
renderer.setRenderBounds(minX, renderBase, minZ, maxX, renderHeight, maxZ);
BlockSkinRenderHelper.renderMetadataBlock(liquidBlock, liquid.itemMeta, posX + i % 3, posY + yBase, posZ + i / 3, renderer, world);
}
}
else
//Item
{
Item liquidItem = Item.itemsList[liquid.itemID];
for (int i = 0; i < 9; i++)
{
float minX = i % 3 == 0 ? -0.001F : 0F;
float minZ = i / 3 == 0 ? -0.001F : 0F;
float maxX = i % 3 == 2 ? 1.001F : 1F;
float maxZ = i / 3 == 2 ? 1.001F : 1F;
renderer.setRenderBounds(minX, renderBase, minZ, maxX, renderHeight, maxZ);
BlockSkinRenderHelper.renderFakeBlock(liquidItem.getIconFromDamage(liquid.itemMeta), posX, posY + yBase, posZ, renderer, world);
}
}*/

if (countSize == room)
{
base = 0F;
yBase++;
liquidBase = 0;
}
}
}
}
return true;
}

void renderLayer (SmelteryLogicOld logic, int start, int posX, int posY, int posZ, RenderBlocks renderer, IBlockAccess world)
{
renderer.setRenderBounds(-0.001F, -0.001F, -0.001F, 1.001F, 1.001F, 1.001F);
for (int i = 0; i < 9; i++)
{
ItemStack input = logic.getStackInSlot(i + start);
if (input != null && logic.getTempForSlot(i + start) > 20)
{
ItemStack blockToRender = Smeltery.getRenderIndex(input);
if (blockToRender != null)
{
float blockHeight = input.stackSize / (float) blockToRender.stackSize;
renderer.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, MathHelper.clamp_float(blockHeight, 0.01F, 1.0F), 1.0F);

Block liquidBlock = Block.getBlockFromItem(blockToRender.getItem());
BlockSkinRenderHelper.renderMetadataBlock(liquidBlock, blockToRender.getItemDamage(), posX + i % 3, posY, posZ + i / 3, renderer, world);

/*else //No items, only blocks
//Item
{
Item liquidItem = Item.itemsList[blockToRender.itemID];
int metadata = blockToRender.getItemDamage();
BlockSkinRenderHelper.renderFakeBlock(liquidItem.getIconFromDamage(metadata), posX + i % 3, posY, posZ + i / 3, renderer, world);
}*/
}
}
}
}

@Override
public boolean shouldRender3DInInventory (int modelId)
{
return true;
}

@Override
public int getRenderId ()
{
return smelteryModel;
}
}

0 comments on commit 6bbd392

Please sign in to comment.