| package mekanism.client.render.block; |
| |
| import mekanism.client.render.CTM; |
| import mekanism.common.CTMData; |
| import net.minecraft.block.Block; |
| import net.minecraft.client.renderer.RenderBlocks; |
| import net.minecraft.client.renderer.Tessellator; |
| import net.minecraft.util.IIcon; |
| |
| /** |
| * CTM RenderBlocks adapted from Chisel |
| * Code licensed under GPLv2 |
| * @author AUTOMATIC_MAIDEN, asie, pokefenn, unpairedbracket |
| */ |
| public class RenderBlocksCTM extends RenderBlocks |
| { |
| RenderBlocksCTM() |
| { |
| super(); |
| |
| resetVertices(); |
| } |
| |
| Tessellator tessellator; |
| double[] X = new double[26]; |
| double[] Y = new double[26]; |
| double[] Z = new double[26]; |
| double[] U = new double[26]; |
| double[] V = new double[26]; |
| int[] L = new int[26]; |
| float[] R = new float[26]; |
| float[] G = new float[26]; |
| float[] B = new float[26]; |
| CTMData dataCTM; |
| RenderBlocks rendererOld; |
| |
| int bx, by, bz; |
| |
| @Override |
| public boolean renderStandardBlock(Block block, int x, int y, int z) |
| { |
| bx = x; |
| by = y; |
| bz = z; |
| |
| tessellator = Tessellator.instance; |
| tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F); |
| |
| tessellator.addTranslation(x, y, z); |
| |
| boolean res = super.renderStandardBlock(block, x, y, z); |
| |
| tessellator.addTranslation(-x, -y, -z); |
| |
| return res; |
| } |
| |
| void setupSides(int a, int b, int c, int d, int xa, int xb, int xc, int xd, int e) |
| { |
| L[a] = brightnessBottomLeft; |
| L[b] = brightnessBottomRight; |
| L[c] = brightnessTopRight; |
| L[d] = brightnessTopLeft; |
| L[e] = (brightnessBottomLeft + brightnessTopLeft + brightnessTopRight + brightnessBottomRight) / 4; |
| L[xa] = (L[a] + L[b]) / 2; |
| L[xb] = (L[b] + L[c]) / 2; |
| L[xc] = (L[c] + L[d]) / 2; |
| L[xd] = (L[d] + L[a]) / 2; |
| |
| R[a] = colorRedBottomLeft; |
| R[b] = colorRedBottomRight; |
| R[c] = colorRedTopRight; |
| R[d] = colorRedTopLeft; |
| R[e] = (colorRedBottomLeft + colorRedTopLeft + colorRedTopRight + colorRedBottomRight) / 4; |
| R[xa] = (R[a] + R[b]) / 2; |
| R[xb] = (R[b] + R[c]) / 2; |
| R[xc] = (R[c] + R[d]) / 2; |
| R[xd] = (R[d] + R[a]) / 2; |
| |
| G[a] = colorGreenBottomLeft; |
| G[b] = colorGreenBottomRight; |
| G[c] = colorGreenTopRight; |
| G[d] = colorGreenTopLeft; |
| G[e] = (colorGreenBottomLeft + colorGreenTopLeft + colorGreenTopRight + colorGreenBottomRight) / 4; |
| G[xa] = (G[a] + G[b]) / 2; |
| G[xb] = (G[b] + G[c]) / 2; |
| G[xc] = (G[c] + G[d]) / 2; |
| G[xd] = (G[d] + G[a]) / 2; |
| |
| B[a] = colorBlueBottomLeft; |
| B[b] = colorBlueBottomRight; |
| B[c] = colorBlueTopRight; |
| B[d] = colorBlueTopLeft; |
| B[e] = (colorBlueBottomLeft + colorBlueTopLeft + colorBlueTopRight + colorBlueBottomRight) / 4; |
| B[xa] = (B[a] + B[b]) / 2; |
| B[xb] = (B[b] + B[c]) / 2; |
| B[xc] = (B[c] + B[d]) / 2; |
| B[xd] = (B[d] + B[a]) / 2; |
| } |
| |
| void side(int a, int b, int c, int d, int iconIndex, boolean flip, int side) |
| { |
| IIcon icon = iconIndex >= 16 ? dataCTM.getSmallSubmap(side).icons[iconIndex - 16] : dataCTM.getSubmap(side).icons[iconIndex]; |
| |
| double u0 = icon.getMaxU(); |
| double u1 = icon.getMinU(); |
| double v0 = icon.getMaxV(); |
| double v1 = icon.getMinV(); |
| |
| U[a] = flip ? u1 : u1; |
| U[b] = flip ? u0 : u1; |
| U[c] = flip ? u0 : u0; |
| U[d] = flip ? u1 : u0; |
| |
| V[a] = flip ? v1 : v1; |
| V[b] = flip ? v1 : v0; |
| V[c] = flip ? v0 : v0; |
| V[d] = flip ? v0 : v1; |
| |
| vert(a); |
| vert(b); |
| vert(c); |
| vert(d); |
| } |
| |
| void vert(int index) |
| { |
| if(enableAO) |
| { |
| tessellator.setColorOpaque_F(R[index], G[index], B[index]); |
| tessellator.setBrightness(L[index]); |
| } |
| |
| tessellator.addVertexWithUV(X[index], Y[index], Z[index], U[index], V[index]); |
| } |
| |
| @Override |
| public void renderFaceXNeg(Block block, double x, double y, double z, IIcon icon) |
| { |
| if(rendererOld != null && rendererOld.hasOverrideBlockTexture()) |
| { |
| IIcon i = rendererOld.overrideBlockTexture; |
| |
| tessellator.addVertexWithUV(0.0, 1.0, 0.0, i.getMinU(), i.getMinV()); |
| tessellator.addVertexWithUV(0.0, 0.0, 0.0, i.getMinU(), i.getMaxV()); |
| tessellator.addVertexWithUV(0.0, 0.0, 1.0, i.getMaxU(), i.getMaxV()); |
| tessellator.addVertexWithUV(0.0, 1.0, 1.0, i.getMaxU(), i.getMinV()); |
| } |
| else { |
| int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 4, dataCTM.acceptableBlockMetas, dataCTM.renderConvexConnections); |
| |
| setupSides(1, 0, 4, 5, 14, 19, 17, 23, 9); |
| side(1, 14, 9, 23, tex[0], false, 4); |
| side(23, 9, 17, 5, tex[1], false, 4); |
| side(9, 19, 4, 17, tex[3], false, 4); |
| side(14, 0, 19, 9, tex[2], false, 4); |
| } |
| } |
| |
| @Override |
| public void renderFaceXPos(Block block, double x, double y, double z, IIcon icon) |
| { |
| if(rendererOld != null && rendererOld.hasOverrideBlockTexture()) |
| { |
| IIcon i = rendererOld.overrideBlockTexture; |
| |
| tessellator.addVertexWithUV(1.0, 1.0, 1.0, i.getMaxU(), i.getMinV()); |
| tessellator.addVertexWithUV(1.0, 0.0, 1.0, i.getMaxU(), i.getMaxV()); |
| tessellator.addVertexWithUV(1.0, 0.0, 0.0, i.getMinU(), i.getMaxV()); |
| tessellator.addVertexWithUV(1.0, 1.0, 0.0, i.getMinU(), i.getMinV()); |
| } |
| else { |
| int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 5, dataCTM.acceptableBlockMetas, dataCTM.renderConvexConnections); |
| |
| setupSides(3, 2, 6, 7, 15, 25, 16, 21, 11); |
| side(11, 21, 3, 15, tex[3], false, 5); |
| side(16, 7, 21, 11, tex[2], false, 5); |
| side(25, 11, 15, 2, tex[1], false, 5); |
| side(6, 16, 11, 25, tex[0], false, 5); |
| } |
| } |
| |
| @Override |
| public void renderFaceZNeg(Block block, double x, double y, double z, IIcon icon) |
| { |
| if(rendererOld != null && rendererOld.hasOverrideBlockTexture()) |
| { |
| IIcon i = rendererOld.overrideBlockTexture; |
| |
| tessellator.addVertexWithUV(1.0, 1.0, 0.0, i.getMaxU(), i.getMinV()); |
| tessellator.addVertexWithUV(1.0, 0.0, 0.0, i.getMaxU(), i.getMaxV()); |
| tessellator.addVertexWithUV(0.0, 0.0, 0.0, i.getMinU(), i.getMaxV()); |
| tessellator.addVertexWithUV(0.0, 1.0, 0.0, i.getMinU(), i.getMinV()); |
| } |
| else { |
| int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 2, dataCTM.acceptableBlockMetas, dataCTM.renderConvexConnections); |
| |
| setupSides(2, 3, 0, 1, 15, 18, 14, 22, 8); |
| side(2, 15, 8, 22, tex[0], false, 2); |
| side(15, 3, 18, 8, tex[2], false, 2); |
| side(8, 18, 0, 14, tex[3], false, 2); |
| side(22, 8, 14, 1, tex[1], false, 2); |
| } |
| } |
| |
| |
| @Override |
| public void renderFaceZPos(Block block, double x, double y, double z, IIcon icon) |
| { |
| if(rendererOld != null && rendererOld.hasOverrideBlockTexture()) |
| { |
| IIcon i = rendererOld.overrideBlockTexture; |
| |
| tessellator.addVertexWithUV(0.0, 1.0, 1.0, i.getMinU(), i.getMinV()); |
| tessellator.addVertexWithUV(0.0, 0.0, 1.0, i.getMinU(), i.getMaxV()); |
| tessellator.addVertexWithUV(1.0, 0.0, 1.0, i.getMaxU(), i.getMaxV()); |
| tessellator.addVertexWithUV(1.0, 1.0, 1.0, i.getMaxU(), i.getMinV()); |
| } |
| else { |
| int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 3, dataCTM.acceptableBlockMetas, dataCTM.renderConvexConnections); |
| |
| setupSides(4, 7, 6, 5, 20, 16, 24, 17, 10); |
| side(17, 4, 20, 10, tex[2], false, 3); |
| side(5, 17, 10, 24, tex[0], false, 3); |
| side(24, 10, 16, 6, tex[1], false, 3); |
| side(10, 20, 7, 16, tex[3], false, 3); |
| } |
| } |
| |
| @Override |
| public void renderFaceYNeg(Block block, double x, double y, double z, IIcon icon) |
| { |
| if(rendererOld != null && rendererOld.hasOverrideBlockTexture()) |
| { |
| IIcon i = rendererOld.overrideBlockTexture; |
| |
| tessellator.addVertexWithUV(0.0, 0.0, 1.0, i.getMinU(), i.getMaxV()); |
| tessellator.addVertexWithUV(0.0, 0.0, 0.0, i.getMinU(), i.getMinV()); |
| tessellator.addVertexWithUV(1.0, 0.0, 0.0, i.getMaxU(), i.getMinV()); |
| tessellator.addVertexWithUV(1.0, 0.0, 1.0, i.getMaxU(), i.getMaxV()); |
| } |
| else { |
| int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 0, dataCTM.acceptableBlockMetas, dataCTM.renderConvexConnections); |
| |
| setupSides(0, 3, 7, 4, 18, 21, 20, 19, 13); |
| side(13, 21, 7, 20, tex[3], true, 0); |
| side(19, 13, 20, 4, tex[2], true, 0); |
| side(0, 18, 13, 19, tex[0], true, 0); |
| side(18, 3, 21, 13, tex[1], true, 0); |
| } |
| } |
| |
| @Override |
| public void renderFaceYPos(Block block, double x, double y, double z, IIcon icon) |
| { |
| if(rendererOld != null && rendererOld.hasOverrideBlockTexture()) |
| { |
| IIcon i = rendererOld.overrideBlockTexture; |
| |
| tessellator.addVertexWithUV(0.0, 1.0, 0.0, i.getMinU(), i.getMinV()); |
| tessellator.addVertexWithUV(0.0, 1.0, 1.0, i.getMinU(), i.getMaxV()); |
| tessellator.addVertexWithUV(1.0, 1.0, 1.0, i.getMaxU(), i.getMaxV()); |
| tessellator.addVertexWithUV(1.0, 1.0, 0.0, i.getMaxU(), i.getMinV()); |
| } |
| else { |
| int tex[] = CTM.getSubmapIndices(blockAccess, bx, by, bz, 1, dataCTM.acceptableBlockMetas, dataCTM.renderConvexConnections); |
| |
| setupSides(2, 1, 5, 6, 22, 23, 24, 25, 12); |
| side(12, 24, 6, 25, tex[3], false, 1); |
| side(22, 12, 25, 2, tex[1], false, 1); |
| side(1, 23, 12, 22, tex[0], false, 1); |
| side(23, 5, 24, 12, tex[2], false, 1); |
| } |
| } |
| |
| void resetVertices() |
| { |
| X[0] = 0; |
| Z[0] = 0; |
| Y[0] = 0; |
| |
| X[1] = 0; |
| Z[1] = 0; |
| Y[1] = 1; |
| |
| X[2] = 1; |
| Z[2] = 0; |
| Y[2] = 1; |
| |
| X[3] = 1; |
| Z[3] = 0; |
| Y[3] = 0; |
| |
| X[4] = 0; |
| Z[4] = 1; |
| Y[4] = 0; |
| |
| X[5] = 0; |
| Z[5] = 1; |
| Y[5] = 1; |
| |
| X[6] = 1; |
| Z[6] = 1; |
| Y[6] = 1; |
| |
| X[7] = 1; |
| Z[7] = 1; |
| Y[7] = 0; |
| |
| X[8] = 0.5; |
| Z[8] = 0; |
| Y[8] = 0.5; |
| |
| X[9] = 0; |
| Z[9] = 0.5; |
| Y[9] = 0.5; |
| |
| X[10] = 0.5; |
| Z[10] = 1; |
| Y[10] = 0.5; |
| |
| X[11] = 1; |
| Z[11] = 0.5; |
| Y[11] = 0.5; |
| |
| X[12] = 0.5; |
| Z[12] = 0.5; |
| Y[12] = 1; |
| |
| X[13] = 0.5; |
| Z[13] = 0.5; |
| Y[13] = 0; |
| |
| X[14] = 0; |
| Z[14] = 0; |
| Y[14] = 0.5; |
| |
| X[15] = 1; |
| Z[15] = 0; |
| Y[15] = 0.5; |
| |
| X[16] = 1; |
| Z[16] = 1; |
| Y[16] = 0.5; |
| |
| X[17] = 0; |
| Z[17] = 1; |
| Y[17] = 0.5; |
| |
| X[18] = 0.5; |
| Z[18] = 0; |
| Y[18] = 0; |
| |
| X[19] = 0; |
| Z[19] = 0.5; |
| Y[19] = 0; |
| |
| X[20] = 0.5; |
| Z[20] = 1; |
| Y[20] = 0; |
| |
| X[21] = 1; |
| Z[21] = 0.5; |
| Y[21] = 0; |
| |
| X[22] = 0.5; |
| Z[22] = 0; |
| Y[22] = 1; |
| |
| X[23] = 0; |
| Z[23] = 0.5; |
| Y[23] = 1; |
| |
| X[24] = 0.5; |
| Z[24] = 1; |
| Y[24] = 1; |
| |
| X[25] = 1; |
| Z[25] = 0.5; |
| Y[25] = 1; |
| } |
| } |