package ttftcuts.physis.client.render.tile;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.opengl.GL11;
import net.minecraft.block.Block;
import ttftcuts.physis.Physis;
import ttftcuts.physis.api.item.ITrowel;
import ttftcuts.physis.common.PhysisBlocks;
import ttftcuts.physis.common.block.tile.TileEntityDigSite;
import ttftcuts.physis.puzzle.oddoneout.OddOneOutPuzzle;
import ttftcuts.physis.utils.TPair;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
public class RenderTileDigSite extends TileEntitySpecialRenderer {
private static final ResourceLocation texture = new ResourceLocation(Physis.MOD_ID+":textures/blocks/digsite/shapes/overlay.png");
// coord[number of symbols][symbol][pos][x or y]
private static final double[][][][] coord = {
{
{{6/16.0,10/16.0},{10/16.0,10/16.0},{10/16.0,6/16.0},{6/16.0,6/16.0}}
},
{
{{3/16.0,10/16.0},{7/16.0,10/16.0},{7/16.0,6/16.0},{3/16.0,6/16.0}},
{{9/16.0,10/16.0},{13/16.0,10/16.0},{13/16.0,6/16.0},{9/16.0,6/16.0}}
},
{
{{1/16.0,10/16.0},{5/16.0,10/16.0},{5/16.0,6/16.0},{1/16.0,6/16.0}},
{{6/16.0,10/16.0},{10/16.0,10/16.0},{10/16.0,6/16.0},{6/16.0,6/16.0}},
{{11/16.0,10/16.0},{15/16.0,10/16.0},{15/16.0,6/16.0},{11/16.0,6/16.0}},
}
};
private static final double[][][] shapeuvs = {
{{0,0.5},{0,0.5}},
{{0.5,1},{0,0.5}},
{{0,0.5},{0.5,1}},
{{0.5,1},{0.5,1}}
};
private static int[] shapecolours = {
0x901277,//0xFF1111,//0xFF3333,
0xffee66,//0x66FF44,//0x33FF33,
0x292844,//0x000099,//0x3333FF,
0xFFFFFF
};
private TileEntityDigSite digsite;
public RenderTileDigSite() {}
@Override
public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float tick) {
digsite = (TileEntityDigSite)tile;
if (digsite.getWorldObj() == null) { return; }
World world = digsite.getWorldObj();
Block block = PhysisBlocks.digSiteDirt;
Minecraft mc = Minecraft.getMinecraft();
Tessellator t = Tessellator.instance;
if (digsite.layerlist == null || digsite.layerlist.size() == 0) { return; }
OddOneOutPuzzle puzzle = digsite.layerlist.get(digsite.currentlayer).puzzle;
//if (puzzle == null) { return; }
if (mc.thePlayer == null) { return; }
EntityPlayer player = mc.thePlayer;
if (player.getHeldItem() == null || !(player.getHeldItem().getItem() instanceof ITrowel)) { return; }
MovingObjectPosition hit = mc.objectMouseOver;
if (!(hit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK
&& hit.blockX == digsite.xCoord
&& hit.blockY == digsite.yCoord
&& hit.blockZ == digsite.zCoord))
{ return;}
GL11.glPushMatrix();
GL11.glColor4f(1f, 1f, 1f, 1f);
GL11.glTranslated(x, y, z);
mc.renderEngine.bindTexture(texture);
GL11.glDisable(GL11.GL_CULL_FACE);
// brightness
int b = 0;
// number of symbols
int n = 0;
// symbol to use
int s = 0;
// list of symbols in the current face
List<TPair<Integer>> sym;
// positive x
if (block.shouldSideBeRendered(world, digsite.xCoord+1, digsite.yCoord, digsite.zCoord, 5))
{
b = block.getMixedBrightnessForBlock(world, digsite.xCoord+1, digsite.yCoord, digsite.zCoord);
sym = getSymbols(puzzle, 5);
n = sym.size();
for(int p = 0; p<n; p++) {
s = sym.get(p).val2;
t.startDrawingQuads();
t.setColorOpaque_I(shapecolours[sym.get(p).val1]);
t.setNormal(1, 0, 0);
t.setBrightness(b);
t.addVertexWithUV(1.1, coord[n-1][p][3][1], coord[n-1][p][3][0], shapeuvs[s][0][1], shapeuvs[s][1][1]);
t.addVertexWithUV(1.1, coord[n-1][p][0][1], coord[n-1][p][0][0], shapeuvs[s][0][1], shapeuvs[s][1][0]);
t.addVertexWithUV(1.1, coord[n-1][p][1][1], coord[n-1][p][1][0], shapeuvs[s][0][0], shapeuvs[s][1][0]);
t.addVertexWithUV(1.1, coord[n-1][p][2][1], coord[n-1][p][2][0], shapeuvs[s][0][0], shapeuvs[s][1][1]);
t.draw();
}
}
// negative x
if (block.shouldSideBeRendered(world, digsite.xCoord-1, digsite.yCoord, digsite.zCoord, 4))
{
b = block.getMixedBrightnessForBlock(world, digsite.xCoord-1, digsite.yCoord, digsite.zCoord);
sym = getSymbols(puzzle, 4);
n = sym.size();
for(int p = 0; p<n; p++) {
s = sym.get(p).val2;
t.startDrawingQuads();
t.setColorOpaque_I(shapecolours[sym.get(p).val1]);
t.setNormal(-1, 0, 0);
t.setBrightness(b);
t.addVertexWithUV(-.1, coord[n-1][p][3][1], coord[n-1][p][1][0], shapeuvs[s][0][1], shapeuvs[s][1][1]);
t.addVertexWithUV(-.1, coord[n-1][p][0][1], coord[n-1][p][2][0], shapeuvs[s][0][1], shapeuvs[s][1][0]);
t.addVertexWithUV(-.1, coord[n-1][p][1][1], coord[n-1][p][3][0], shapeuvs[s][0][0], shapeuvs[s][1][0]);
t.addVertexWithUV(-.1, coord[n-1][p][2][1], coord[n-1][p][0][0], shapeuvs[s][0][0], shapeuvs[s][1][1]);
t.draw();
}
}
// positive z
if (block.shouldSideBeRendered(world, digsite.xCoord, digsite.yCoord, digsite.zCoord+1, 3))
{
b = block.getMixedBrightnessForBlock(world, digsite.xCoord, digsite.yCoord, digsite.zCoord+1);
sym = getSymbols(puzzle, 3);
n = sym.size();
for(int p = 0; p<n; p++) {
s = sym.get(p).val2;
t.startDrawingQuads();
t.setColorOpaque_I(shapecolours[sym.get(p).val1]);
t.setNormal(0, 0, 1);
t.setBrightness(b);
t.addVertexWithUV(coord[n-1][p][0][1], coord[n-1][p][0][0], 1.1, shapeuvs[s][0][1], shapeuvs[s][1][1]);
t.addVertexWithUV(coord[n-1][p][1][1], coord[n-1][p][1][0], 1.1, shapeuvs[s][0][1], shapeuvs[s][1][0]);
t.addVertexWithUV(coord[n-1][p][2][1], coord[n-1][p][2][0], 1.1, shapeuvs[s][0][0], shapeuvs[s][1][0]);
t.addVertexWithUV(coord[n-1][p][3][1], coord[n-1][p][3][0], 1.1, shapeuvs[s][0][0], shapeuvs[s][1][1]);
t.draw();
}
}
// negative z
if (block.shouldSideBeRendered(world, digsite.xCoord, digsite.yCoord, digsite.zCoord-1, 2))
{
b = block.getMixedBrightnessForBlock(world, digsite.xCoord, digsite.yCoord, digsite.zCoord-1);
sym = getSymbols(puzzle, 2);
n = sym.size();
for(int p = 0; p<n; p++) {
s = sym.get(p).val2;
t.startDrawingQuads();
t.setColorOpaque_I(shapecolours[sym.get(p).val1]);
t.setNormal(0, 0, -1);
t.setBrightness(b);
t.addVertexWithUV(coord[n-1][p][2][1], coord[n-1][p][0][0], -.1, shapeuvs[s][0][1], shapeuvs[s][1][1]);
t.addVertexWithUV(coord[n-1][p][3][1], coord[n-1][p][1][0], -.1, shapeuvs[s][0][1], shapeuvs[s][1][0]);
t.addVertexWithUV(coord[n-1][p][0][1], coord[n-1][p][2][0], -.1, shapeuvs[s][0][0], shapeuvs[s][1][0]);
t.addVertexWithUV(coord[n-1][p][1][1], coord[n-1][p][3][0], -.1, shapeuvs[s][0][0], shapeuvs[s][1][1]);
t.draw();
}
}
// y stuff is a little different because rotation
int facing = 0;
if (mc.thePlayer != null) {
facing = 3 - (MathHelper.floor_double((double)(mc.thePlayer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3);
}
int[] pos = {0,1,2,3};
pos = new int[]{pos[(facing+0)%4], pos[(facing+1)%4], pos[(facing+2)%4], pos[(facing+3)%4]};
// positive y
if (block.shouldSideBeRendered(world, digsite.xCoord, digsite.yCoord+1, digsite.zCoord, 1))
{
b = block.getMixedBrightnessForBlock(digsite.getWorldObj(), digsite.xCoord, digsite.yCoord+1, digsite.zCoord);
sym = getSymbols(puzzle, 1);
n = sym.size();
for(int p = 0; p<n; p++) {
s = sym.get(p).val2;
t.startDrawingQuads();
t.setColorOpaque_I(shapecolours[sym.get(p).val1]);
t.setNormal(0, 1, 0);
t.setBrightness(b);
t.addVertexWithUV(coord[n-1][p][pos[0]][0], 1.1, coord[n-1][p][pos[0]][1], shapeuvs[s][0][1], shapeuvs[s][1][1]);
t.addVertexWithUV(coord[n-1][p][pos[1]][0], 1.1, coord[n-1][p][pos[1]][1], shapeuvs[s][0][1], shapeuvs[s][1][0]);
t.addVertexWithUV(coord[n-1][p][pos[2]][0], 1.1, coord[n-1][p][pos[2]][1], shapeuvs[s][0][0], shapeuvs[s][1][0]);
t.addVertexWithUV(coord[n-1][p][pos[3]][0], 1.1, coord[n-1][p][pos[3]][1], shapeuvs[s][0][0], shapeuvs[s][1][1]);
t.draw();
}
}
// negative y
if (block.shouldSideBeRendered(world, digsite.xCoord, digsite.yCoord-1, digsite.zCoord, 0))
{
b = block.getMixedBrightnessForBlock(digsite.getWorldObj(), digsite.xCoord, digsite.yCoord-1, digsite.zCoord);
sym = getSymbols(puzzle, 0);
n = sym.size();
for(int p = 0; p<n; p++) {
s = sym.get(p).val2;
t.startDrawingQuads();
t.setColorOpaque_I(shapecolours[sym.get(p).val1]);
t.setNormal(0, -1, 0);
t.setBrightness(b);
t.addVertexWithUV(coord[n-1][p][pos[3]][0], -.1, coord[n-1][p][pos[3]][1], shapeuvs[s][0][0], shapeuvs[s][1][0]);
t.addVertexWithUV(coord[n-1][p][pos[2]][0], -.1, coord[n-1][p][pos[2]][1], shapeuvs[s][0][0], shapeuvs[s][1][1]);
t.addVertexWithUV(coord[n-1][p][pos[1]][0], -.1, coord[n-1][p][pos[1]][1], shapeuvs[s][0][1], shapeuvs[s][1][1]);
t.addVertexWithUV(coord[n-1][p][pos[0]][0], -.1, coord[n-1][p][pos[0]][1], shapeuvs[s][0][1], shapeuvs[s][1][0]);
t.draw();
}
}
GL11.glEnable(GL11.GL_CULL_FACE);
//Physis.logger.info("rendering: "+digsite);
//Physis.logger.info("render at "+x+","+y+","+z);
GL11.glPopMatrix();
}
private static List<TPair<Integer>> hourglass;
static {
hourglass = new ArrayList<TPair<Integer>>();
TPair<Integer> entry = new TPair<Integer>(3,3);
hourglass.add(entry);
}
private List<TPair<Integer>> getSymbols(OddOneOutPuzzle puzzle, int side) {
if (puzzle != null) {
return puzzle.options.get(side).symbols;
}
return hourglass;
}
}