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()) for (TileBattery battery : this.getConnectors())
{ {
totalEnergy += battery.getEnergy(null); totalEnergy += battery.energy.getEnergy();
} }
int amountOfNodes = this.getConnectors().size() - exclusion.length; int amountOfNodes = this.getConnectors().size() - exclusion.length;
@ -30,11 +30,11 @@ public class BatteryNetwork extends Network<BatteryNetwork, TileBattery>
{ {
if (battery == firstNode) if (battery == firstNode)
{ {
battery.setEnergy(null, totalPerBatteryRemainder); battery.energy.setEnergy(totalPerBatteryRemainder);
} }
else 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.glPopMatrix;
import static org.lwjgl.opengl.GL11.glPushMatrix; 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.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef; import static org.lwjgl.opengl.GL11.glTranslatef;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
@ -18,6 +19,7 @@ import org.lwjgl.opengl.GL11;
import resonantinduction.core.Reference; import resonantinduction.core.Reference;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.render.RenderUtility;
import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; 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_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_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"); public static final WavefrontObject MODEL = (WavefrontObject) AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "battery/battery.obj");
@Override @Override
@ -41,52 +42,88 @@ public class RenderBattery extends TileEntitySpecialRenderer
{ {
glPushMatrix(); glPushMatrix();
glTranslatef((float) x + 0.5F, (float) y, (float) z + 0.5F); glTranslatef((float) x + 0.5F, (float) y, (float) z + 0.5F);
glScalef(0.46f, 0.46f, 0.46f); glScalef(0.5f, 0.5f, 0.5f);
GL11.glRotatef(90 * i, 0, 1, 0);
ForgeDirection dir = ForgeDirection.getOrientation(i); 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) if (t.worldObj != null)
{ {
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_LEVELS); TileBattery tile = (TileBattery) t;
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);
if (!(new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery)) RenderUtility.bind(Reference.DOMAIN, Reference.MODEL_PATH + "battery/bat_level_" + (int) (((double) tile.energy.getEnergy() / (double) tile.energy.getEnergyCapacity()) * 10) + ".png");
MODEL.renderPart("CapCorner"); MODEL.renderPart("Battery");
if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("BaseCorner"); // 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 // If quadrant with one external neighbor
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP); FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP);
if (!(new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery)) if (!(new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("CapEdge"); MODEL.renderPart("CapEdge");
if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery)) if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("BaseEdge"); 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)) if (!(new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("CapInterior"); MODEL.renderPart("CapInterior");
if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery)) if (!(new Vector3(t).translate(ForgeDirection.DOWN).getTileEntity(t.worldObj) instanceof TileBattery))
MODEL.renderPart("BaseInterior"); MODEL.renderPart("BaseInterior");
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CASE); 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"); MODEL.renderPart("BatteryCase");
GL11.glColor3f(1, 1, 1);
if (new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery) if (new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery)
MODEL.renderPart("VertConnector"); 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(); glPopMatrix();
} }
} }

View file

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