Improved battery rendering

This commit is contained in:
Calclavia 2014-01-21 20:29:04 +08:00
parent be722cc586
commit 51ed61cb46
15 changed files with 89 additions and 40 deletions

View file

@ -12,7 +12,7 @@ public class BatteryNetwork extends Network<BatteryNetwork, TileBattery>
for (TileBattery battery : this.getConnectors())
{
totalEnergy += battery.getEnergy(null);
totalEnergy += battery.energy.getEnergy();
}
int amountOfNodes = this.getConnectors().size() - exclusion.length;
@ -30,11 +30,11 @@ public class BatteryNetwork extends Network<BatteryNetwork, TileBattery>
{
if (battery == firstNode)
{
battery.setEnergy(null, totalPerBatteryRemainder);
battery.energy.setEnergy(totalPerBatteryRemainder);
}
else
{
battery.setEnergy(null, totalPerBattery);
battery.energy.setEnergy(totalPerBattery);
}
}
}

View file

@ -5,6 +5,7 @@ package resonantinduction.electrical.battery;
import static org.lwjgl.opengl.GL11.glPopMatrix;
import static org.lwjgl.opengl.GL11.glPushMatrix;
import static org.lwjgl.opengl.GL11.glRotatef;
import static org.lwjgl.opengl.GL11.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
@ -18,6 +19,7 @@ import org.lwjgl.opengl.GL11;
import resonantinduction.core.Reference;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.render.RenderUtility;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -31,7 +33,6 @@ public class RenderBattery extends TileEntitySpecialRenderer
{
public static final ResourceLocation TEXTURE_CAP = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "battery/bat_base_cap_tex.png");
public static final ResourceLocation TEXTURE_CASE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "battery/bat_case_tex.png");
public static final ResourceLocation TEXTURE_LEVELS = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "battery/bat_levels.png");
public static final WavefrontObject MODEL = (WavefrontObject) AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "battery/battery.obj");
@Override
@ -41,52 +42,88 @@ public class RenderBattery extends TileEntitySpecialRenderer
{
glPushMatrix();
glTranslatef((float) x + 0.5F, (float) y, (float) z + 0.5F);
glScalef(0.46f, 0.46f, 0.46f);
GL11.glRotatef(90 * i, 0, 1, 0);
glScalef(0.5f, 0.5f, 0.5f);
ForgeDirection dir = ForgeDirection.getOrientation(i);
switch (dir)
{
case NORTH:
glRotatef(0, 0, 1, 0);
break;
case SOUTH:
glRotatef(180, 0, 1, 0);
break;
case WEST:
glRotatef(90, 0, 1, 0);
break;
case EAST:
glRotatef(-90, 0, 1, 0);
break;
}
/**
* If we're rendering in the world:
*/
if (t.worldObj != null)
{
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_LEVELS);
MODEL.renderPart("Battery");
// Render top and bottom
//if (!(new Vector3(t).translate(dir).getTileEntity(t.worldObj) instanceof TileBattery))
{
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP);
TileBattery tile = (TileBattery) t;
if (!(new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("CapCorner");
if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("BaseCorner");
}
RenderUtility.bind(Reference.DOMAIN, Reference.MODEL_PATH + "battery/bat_level_" + (int) (((double) tile.energy.getEnergy() / (double) tile.energy.getEnergyCapacity()) * 10) + ".png");
MODEL.renderPart("Battery");
// Render top and bottom
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP);
if (!(new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("CapCorner");
if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("BaseCorner");
// If quadrant with one external neighbor
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP);
if (!(new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("CapEdge");
if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("BaseEdge");
// if quadrant with three external neighbors //can't have quadrant with 2 external
// neighbors in rectangular prism
/*
* If quadrant with three external neighbors //can't have quadrant with 2 external
* neighbors in rectangular prism
*/
if (!(new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("CapInterior");
if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("BaseInterior");
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CASE);
if (tile.getInputDirections().contains(dir))
{
GL11.glColor3f(0, 0.294f, 0.498f);
}
else if (tile.getOutputDirections().contains(dir))
{
GL11.glColor3f(1, 0.478f, 0.01f);
}
MODEL.renderPart("BatteryCase");
GL11.glColor3f(1, 1, 1);
if (new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery)
MODEL.renderPart("VertConnector");
}else
{
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP);
MODEL.renderAll();
}
else
{
// TODO: Fix energy level.
RenderUtility.bind(Reference.DOMAIN, Reference.MODEL_PATH + "battery/bat_level_0.png");
MODEL.renderPart("Battery");
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP);
MODEL.renderOnly("CapCorner", "BaseCorner", "CapEdge", "BaseEdge", "CapInterior", "BaseInterior");
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CASE);
MODEL.renderOnly("BatteryCase");
}
glPopMatrix();
}
}

View file

@ -1,14 +1,12 @@
package resonantinduction.electrical.battery;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.packet.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.core.ResonantInduction;
import resonantinduction.mechanical.network.IMechanical;
import universalelectricity.api.UniversalElectricity;
import universalelectricity.api.electricity.IVoltageInput;
import universalelectricity.api.electricity.IVoltageOutput;
@ -23,8 +21,6 @@ import calclavia.lib.prefab.tile.TileElectrical;
import com.google.common.io.ByteArrayDataInput;
import cpw.mods.fml.common.network.PacketDispatcher;
/**
* A modular battery.
*
@ -40,11 +36,7 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
private BatteryNetwork network;
public Set<EntityPlayer> playersUsing = new HashSet<EntityPlayer>();
public float clientEnergy;
public int clientCells;
public float clientMaxEnergy;
public boolean markUpdate = false;
public TileBattery()
{
@ -74,7 +66,7 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
energy.setCapacity(getEnergyForTier(getBlockMetadata()));
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{
TileEntity tile = new Vector3(this).modifyPositionFromSide(dir).getTileEntity(this.worldObj);
TileEntity tile = new Vector3(this).translate(dir).getTileEntity(this.worldObj);
if (tile instanceof TileBattery)
{
@ -84,6 +76,7 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
this.energy.setMaxTransfer(DEFAULT_WATTAGE * this.getNetwork().getConnectors().size());
this.getNetwork().redistribute();
markUpdate = true;
}
}
@ -98,6 +91,11 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
{
this.getNetwork().redistribute();
}
if (markUpdate && ticks % 5 == 0)
{
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
}
}
@ -106,6 +104,7 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
{
long returnValue = super.onReceiveEnergy(from, receive, doReceive);
this.getNetwork().redistribute();
markUpdate = true;
return returnValue;
}
@ -114,23 +113,29 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
{
long returnValue = super.onExtractEnergy(from, extract, doExtract);
this.getNetwork().redistribute();
markUpdate = true;
return returnValue;
}
public void updateClient()
@Override
public Packet getDescriptionPacket()
{
PacketDispatcher.sendPacketToAllPlayers(ResonantInduction.PACKET_TILE.getPacket(this, getPacketData(0).toArray()));
return ResonantInduction.PACKET_TILE.getPacket(this, getPacketData(0).toArray());
}
@Override
public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra)
{
energy.setEnergy(data.readLong());
ioMap = data.readShort();
}
@Override
public ArrayList getPacketData(int type)
{
ArrayList data = new ArrayList();
data.add(energy.getEnergy());
data.add((short) ioMap);
return data;
}
@ -159,7 +164,7 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{
TileEntity tile = new Vector3(this).modifyPositionFromSide(dir).getTileEntity(this.worldObj);
TileEntity tile = new Vector3(this).translate(dir).getTileEntity(this.worldObj);
if (tile instanceof TileBattery)
{
@ -201,4 +206,11 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
{
return this;
}
@Override
public void setIO(ForgeDirection dir, int type)
{
super.setIO(dir, type);
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B