aboutsummaryrefslogtreecommitdiff
path: root/src/Java/miscutil/enderio/conduit/gas/GasConduitRenderer.java
diff options
context:
space:
mode:
authorDraknyte1 <Draknyte1@hotmail.com>2016-02-27 21:24:45 +1000
committerDraknyte1 <Draknyte1@hotmail.com>2016-02-27 21:24:45 +1000
commit7711c80664fdfa703b5e60e62af437655da783ae (patch)
tree1a251a5919b7c6d4f32de7efca6a36d97cef0233 /src/Java/miscutil/enderio/conduit/gas/GasConduitRenderer.java
parent707621bc6afd36856feafb052c2e65c52fe79986 (diff)
downloadGT5-Unofficial-7711c80664fdfa703b5e60e62af437655da783ae.tar.gz
GT5-Unofficial-7711c80664fdfa703b5e60e62af437655da783ae.tar.bz2
GT5-Unofficial-7711c80664fdfa703b5e60e62af437655da783ae.zip
Added Custom GT Cables/Wire & also added a copy of EnderIO's Gas Conduit classes.
Time to combine the two, yeah? Also stripped out a heap of constants and refactored them together.
Diffstat (limited to 'src/Java/miscutil/enderio/conduit/gas/GasConduitRenderer.java')
-rw-r--r--src/Java/miscutil/enderio/conduit/gas/GasConduitRenderer.java178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/Java/miscutil/enderio/conduit/gas/GasConduitRenderer.java b/src/Java/miscutil/enderio/conduit/gas/GasConduitRenderer.java
new file mode 100644
index 0000000000..4bb0a2eb1c
--- /dev/null
+++ b/src/Java/miscutil/enderio/conduit/gas/GasConduitRenderer.java
@@ -0,0 +1,178 @@
+package crazypants.enderio.conduit.gas;
+
+import com.enderio.core.client.render.BoundingBox;
+import com.enderio.core.client.render.CubeRenderer;
+import com.enderio.core.client.render.RenderUtil;
+import com.enderio.core.common.vecmath.Vector2f;
+import com.enderio.core.common.vecmath.Vector3d;
+import com.enderio.core.common.vecmath.Vertex;
+import crazypants.enderio.EnderIO;
+import crazypants.enderio.conduit.BlockConduitBundle;
+import crazypants.enderio.conduit.ConnectionMode;
+import crazypants.enderio.conduit.IConduit;
+import crazypants.enderio.conduit.IConduitBundle;
+import crazypants.enderio.conduit.geom.CollidableComponent;
+import crazypants.enderio.conduit.geom.ConnectionModeGeometry;
+import crazypants.enderio.conduit.geom.Offset;
+import crazypants.enderio.conduit.render.ConduitBundleRenderer;
+import crazypants.enderio.conduit.render.DefaultConduitRenderer;
+import java.util.List;
+import mekanism.api.gas.Gas;
+import mekanism.api.gas.GasStack;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.util.IIcon;
+import net.minecraftforge.common.util.ForgeDirection;
+
+public class GasConduitRenderer
+ extends DefaultConduitRenderer
+{
+ public boolean isRendererForConduit(IConduit conduit)
+ {
+ return conduit instanceof GasConduit;
+ }
+
+ public void renderEntity(ConduitBundleRenderer conduitBundleRenderer, IConduitBundle te, IConduit conduit, double x, double y, double z, float partialTick, float worldLight, RenderBlocks rb)
+ {
+ super.renderEntity(conduitBundleRenderer, te, conduit, x, y, z, partialTick, worldLight, rb);
+ if ((!conduit.hasConnectionMode(ConnectionMode.INPUT)) && (!conduit.hasConnectionMode(ConnectionMode.OUTPUT))) {
+ return;
+ }
+ GasConduit pc = (GasConduit)conduit;
+ for (ForgeDirection dir : conduit.getExternalConnections())
+ {
+ IIcon tex = null;
+ if (conduit.getConnectionMode(dir) == ConnectionMode.INPUT) {
+ tex = pc.getTextureForInputMode();
+ } else if (conduit.getConnectionMode(dir) == ConnectionMode.OUTPUT) {
+ tex = pc.getTextureForOutputMode();
+ }
+ if (tex != null)
+ {
+ Offset offset = te.getOffset(IGasConduit.class, dir);
+ ConnectionModeGeometry.renderModeConnector(dir, offset, tex, true);
+ }
+ }
+ }
+
+ protected void renderConduit(IIcon tex, IConduit conduit, CollidableComponent component, float brightness)
+ {
+ super.renderConduit(tex, conduit, component, brightness);
+ if (isNSEWUD(component.dir))
+ {
+ GasConduit lc = (GasConduit)conduit;
+
+ GasStack gas = lc.getGasType();
+ IIcon texture = null;
+ if (gas != null) {
+ texture = gas.getGas().getIcon();
+ }
+ if (texture == null) {
+ texture = lc.getNotSetEdgeTexture();
+ }
+ float scaleFactor = 0.75F;
+ float xLen = Math.abs(component.dir.offsetX) == 1 ? 1.0F : scaleFactor;
+ float yLen = Math.abs(component.dir.offsetY) == 1 ? 1.0F : scaleFactor;
+ float zLen = Math.abs(component.dir.offsetZ) == 1 ? 1.0F : scaleFactor;
+
+ BoundingBox cube = component.bound;
+ BoundingBox bb = cube.scale(xLen, yLen, zLen);
+ for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) {
+ if ((d != component.dir) && (d != component.dir.getOpposite()))
+ {
+ ForgeDirection vDir = RenderUtil.getVDirForFace(d);
+ if ((component.dir == ForgeDirection.UP) || (component.dir == ForgeDirection.DOWN)) {
+ vDir = RenderUtil.getUDirForFace(d);
+ } else if (((component.dir == ForgeDirection.NORTH) || (component.dir == ForgeDirection.SOUTH)) && (d.offsetY != 0)) {
+ vDir = RenderUtil.getUDirForFace(d);
+ }
+ float minU = texture.getMinU();
+ float maxU = texture.getMaxU();
+ float minV = texture.getMinV();
+ float maxV = texture.getMaxV();
+
+ float sideScale = Math.max(bb.sizeX(), bb.sizeY()) * 2.0F / 16.0F;
+ sideScale = Math.max(sideScale, bb.sizeZ() * 2.0F / 16.0F);
+ float width = Math.min(bb.sizeX(), bb.sizeY()) * 15.0F / 16.0F;
+
+ List<Vertex> corners = bb.getCornersWithUvForFace(d, minU, maxU, minV, maxV);
+ moveEdgeCorners(corners, vDir, width);
+ moveEdgeCorners(corners, component.dir.getOpposite(), sideScale);
+ for (Vertex c : corners) {
+ CubeRenderer.addVecWithUV(c.xyz, c.uv.x, c.uv.y);
+ }
+ corners = bb.getCornersWithUvForFace(d, minU, maxU, minV, maxV);
+ moveEdgeCorners(corners, vDir.getOpposite(), width);
+ moveEdgeCorners(corners, component.dir.getOpposite(), sideScale);
+ for (Vertex c : corners) {
+ CubeRenderer.addVecWithUV(c.xyz, c.uv.x, c.uv.y);
+ }
+ }
+ }
+ if (conduit.getConnectionMode(component.dir) == ConnectionMode.DISABLED)
+ {
+ tex = EnderIO.blockConduitBundle.getConnectorIcon(component.data);
+ Object corners = component.bound.getCornersWithUvForFace(component.dir, tex.getMinU(), tex.getMaxU(), tex.getMinV(), tex.getMaxV());
+ Tessellator tessellator = Tessellator.instance;
+ for (Vertex c : (List)corners) {
+ CubeRenderer.addVecWithUV(c.xyz, c.uv.x, c.uv.y);
+ }
+ for (int i = ((List)corners).size() - 1; i >= 0; i--)
+ {
+ Vertex c = (Vertex)((List)corners).get(i);
+ CubeRenderer.addVecWithUV(c.xyz, c.uv.x, c.uv.y);
+ }
+ }
+ }
+ }
+
+ protected void renderTransmission(IConduit conduit, IIcon tex, CollidableComponent component, float selfIllum)
+ {
+ super.renderTransmission(conduit, tex, component, selfIllum);
+ }
+
+ private void moveEdgeCorners(List<Vertex> vertices, ForgeDirection edge, float scaleFactor)
+ {
+ int[] indices = getClosest(edge, vertices);
+ ((Vertex)vertices.get(indices[0])).xyz.x -= scaleFactor * edge.offsetX;
+ ((Vertex)vertices.get(indices[1])).xyz.x -= scaleFactor * edge.offsetX;
+ ((Vertex)vertices.get(indices[0])).xyz.y -= scaleFactor * edge.offsetY;
+ ((Vertex)vertices.get(indices[1])).xyz.y -= scaleFactor * edge.offsetY;
+ ((Vertex)vertices.get(indices[0])).xyz.z -= scaleFactor * edge.offsetZ;
+ ((Vertex)vertices.get(indices[1])).xyz.z -= scaleFactor * edge.offsetZ;
+ }
+
+ private int[] getClosest(ForgeDirection edge, List<Vertex> vertices)
+ {
+ int[] res = { -1, -1 };
+ boolean highest = (edge.offsetX > 0) || (edge.offsetY > 0) || (edge.offsetZ > 0);
+ double minMax = highest ? -1.797693134862316E+308D : 1.7976931348623157E+308D;
+ int index = 0;
+ for (Vertex v : vertices)
+ {
+ double val = get(v.xyz, edge);
+ if (highest ? val >= minMax : val <= minMax)
+ {
+ if (val != minMax) {
+ res[0] = index;
+ } else {
+ res[1] = index;
+ }
+ minMax = val;
+ }
+ index++;
+ }
+ return res;
+ }
+
+ private double get(Vector3d xyz, ForgeDirection edge)
+ {
+ if ((edge == ForgeDirection.EAST) || (edge == ForgeDirection.WEST)) {
+ return xyz.x;
+ }
+ if ((edge == ForgeDirection.UP) || (edge == ForgeDirection.DOWN)) {
+ return xyz.y;
+ }
+ return xyz.z;
+ }
+}