2014-12-15 00:11:48 +00:00
|
|
|
package com.cricketcraft.chisel.client.render;
|
|
|
|
|
|
2014-10-27 16:26:14 -04:00
|
|
|
import net.minecraft.block.Block;
|
|
|
|
|
import net.minecraft.world.IBlockAccess;
|
2015-01-07 21:47:45 -05:00
|
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
2014-10-27 16:26:14 -04:00
|
|
|
|
2015-01-07 19:50:18 -05:00
|
|
|
import com.cricketcraft.chisel.api.IFacade;
|
2014-10-27 16:26:14 -04:00
|
|
|
|
2015-01-07 19:50:18 -05:00
|
|
|
public class CTM {
|
|
|
|
|
|
|
|
|
|
static int submaps[][] = { { 16, 17, 18, 19 }, { 16, 9, 18, 13 }, { 8, 9, 12, 13 }, { 8, 17, 12, 19 }, { 16, 9, 6, 15 }, { 8, 17, 14, 7 }, { 2, 11, 6, 15 }, { 8, 9, 14, 15 }, { 10, 1, 14, 15 },
|
|
|
|
|
{ 10, 11, 14, 5 }, { 0, 11, 4, 15 }, { 0, 1, 14, 15 }, {}, {}, {}, {}, { 16, 17, 6, 7 }, { 16, 9, 6, 5 }, { 8, 9, 4, 5 }, { 8, 17, 4, 7 }, { 2, 11, 18, 13 }, { 10, 3, 12, 19 },
|
|
|
|
|
{ 10, 11, 12, 13 }, { 10, 3, 14, 7 }, { 0, 11, 14, 15 }, { 10, 11, 4, 15 }, { 10, 11, 4, 5 }, { 10, 1, 14, 5 }, {}, {}, {}, {}, { 2, 3, 6, 7 }, { 2, 1, 6, 5 }, { 0, 1, 4, 5 },
|
|
|
|
|
{ 0, 3, 4, 7 }, { 2, 11, 6, 5 }, { 8, 9, 4, 15 }, { 2, 1, 6, 15 }, { 8, 9, 14, 5 }, { 0, 1, 4, 15 }, { 0, 1, 14, 5 }, { 10, 1, 4, 15 }, { 0, 11, 14, 5 }, {}, {}, {}, {}, { 2, 3, 18, 19 },
|
|
|
|
|
{ 2, 1, 18, 13 }, { 0, 1, 12, 13 }, { 0, 3, 12, 19 }, { 10, 1, 12, 13 }, { 0, 3, 14, 7 }, { 0, 11, 12, 13 }, { 10, 3, 4, 7 }, { 0, 11, 4, 5 }, { 10, 1, 4, 5 }, { 10, 11, 14, 15 },
|
|
|
|
|
{ 0, 1, 4, 5 }, {}, {}, {}, {}, };
|
|
|
|
|
|
|
|
|
|
public static int[] getSubmapIndices(IBlockAccess world, int x, int y, int z, int side) {
|
|
|
|
|
int index = getTexture(world, x, y, z, side);
|
|
|
|
|
|
|
|
|
|
return submaps[index];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int getTexture(IBlockAccess world, int x, int y, int z, int side) {
|
|
|
|
|
if (world == null)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
int texture = 0;
|
|
|
|
|
Block block = world.getBlock(x, y, z);
|
|
|
|
|
int blockMetadata = world.getBlockMetadata(x, y, z);
|
|
|
|
|
|
|
|
|
|
boolean b[] = new boolean[6];
|
|
|
|
|
if (side <= 1) {
|
|
|
|
|
b[0] = isConnected(world, x - 1, y, z, side, block, blockMetadata);
|
|
|
|
|
b[1] = isConnected(world, x + 1, y, z, side, block, blockMetadata);
|
|
|
|
|
b[2] = isConnected(world, x, y, z + 1, side, block, blockMetadata);
|
|
|
|
|
b[3] = isConnected(world, x, y, z - 1, side, block, blockMetadata);
|
|
|
|
|
} else if (side == 2) {
|
|
|
|
|
b[0] = isConnected(world, x + 1, y, z, side, block, blockMetadata);
|
|
|
|
|
b[1] = isConnected(world, x - 1, y, z, side, block, blockMetadata);
|
|
|
|
|
b[2] = isConnected(world, x, y - 1, z, side, block, blockMetadata);
|
|
|
|
|
b[3] = isConnected(world, x, y + 1, z, side, block, blockMetadata);
|
|
|
|
|
} else if (side == 3) {
|
|
|
|
|
b[0] = isConnected(world, x - 1, y, z, side, block, blockMetadata);
|
|
|
|
|
b[1] = isConnected(world, x + 1, y, z, side, block, blockMetadata);
|
|
|
|
|
b[2] = isConnected(world, x, y - 1, z, side, block, blockMetadata);
|
|
|
|
|
b[3] = isConnected(world, x, y + 1, z, side, block, blockMetadata);
|
|
|
|
|
} else if (side == 4) {
|
|
|
|
|
b[0] = isConnected(world, x, y, z - 1, side, block, blockMetadata);
|
|
|
|
|
b[1] = isConnected(world, x, y, z + 1, side, block, blockMetadata);
|
|
|
|
|
b[2] = isConnected(world, x, y - 1, z, side, block, blockMetadata);
|
|
|
|
|
b[3] = isConnected(world, x, y + 1, z, side, block, blockMetadata);
|
|
|
|
|
} else if (side == 5) {
|
|
|
|
|
b[0] = isConnected(world, x, y, z + 1, side, block, blockMetadata);
|
|
|
|
|
b[1] = isConnected(world, x, y, z - 1, side, block, blockMetadata);
|
|
|
|
|
b[2] = isConnected(world, x, y - 1, z, side, block, blockMetadata);
|
|
|
|
|
b[3] = isConnected(world, x, y + 1, z, side, block, blockMetadata);
|
|
|
|
|
}
|
|
|
|
|
if (b[0] & !b[1] & !b[2] & !b[3])
|
|
|
|
|
texture = 3;
|
|
|
|
|
else if (!b[0] & b[1] & !b[2] & !b[3])
|
|
|
|
|
texture = 1;
|
|
|
|
|
else if (!b[0] & !b[1] & b[2] & !b[3])
|
|
|
|
|
texture = 16;
|
|
|
|
|
else if (!b[0] & !b[1] & !b[2] & b[3])
|
|
|
|
|
texture = 48;
|
|
|
|
|
else if (b[0] & b[1] & !b[2] & !b[3])
|
|
|
|
|
texture = 2;
|
|
|
|
|
else if (!b[0] & !b[1] & b[2] & b[3])
|
|
|
|
|
texture = 32;
|
|
|
|
|
else if (b[0] & !b[1] & b[2] & !b[3])
|
|
|
|
|
texture = 19;
|
|
|
|
|
else if (b[0] & !b[1] & !b[2] & b[3])
|
|
|
|
|
texture = 51;
|
|
|
|
|
else if (!b[0] & b[1] & b[2] & !b[3])
|
|
|
|
|
texture = 17;
|
|
|
|
|
else if (!b[0] & b[1] & !b[2] & b[3])
|
|
|
|
|
texture = 49;
|
|
|
|
|
else if (!b[0] & b[1] & b[2] & b[3])
|
|
|
|
|
texture = 33;
|
|
|
|
|
else if (b[0] & !b[1] & b[2] & b[3])
|
|
|
|
|
texture = 35;
|
|
|
|
|
else if (b[0] & b[1] & !b[2] & b[3])
|
|
|
|
|
texture = 50;
|
|
|
|
|
else if (b[0] & b[1] & b[2] & !b[3])
|
|
|
|
|
texture = 18;
|
|
|
|
|
else if (b[0] & b[1] & b[2] & b[3])
|
|
|
|
|
texture = 34;
|
|
|
|
|
|
|
|
|
|
boolean b2[] = new boolean[6];
|
|
|
|
|
if (side <= 1) {
|
|
|
|
|
b2[0] = !isConnected(world, x + 1, y, z + 1, side, block, blockMetadata);
|
|
|
|
|
b2[1] = !isConnected(world, x - 1, y, z + 1, side, block, blockMetadata);
|
|
|
|
|
b2[2] = !isConnected(world, x + 1, y, z - 1, side, block, blockMetadata);
|
|
|
|
|
b2[3] = !isConnected(world, x - 1, y, z - 1, side, block, blockMetadata);
|
|
|
|
|
} else if (side == 2) {
|
|
|
|
|
b2[0] = !isConnected(world, x - 1, y - 1, z, side, block, blockMetadata);
|
|
|
|
|
b2[1] = !isConnected(world, x + 1, y - 1, z, side, block, blockMetadata);
|
|
|
|
|
b2[2] = !isConnected(world, x - 1, y + 1, z, side, block, blockMetadata);
|
|
|
|
|
b2[3] = !isConnected(world, x + 1, y + 1, z, side, block, blockMetadata);
|
|
|
|
|
} else if (side == 3) {
|
|
|
|
|
b2[0] = !isConnected(world, x + 1, y - 1, z, side, block, blockMetadata);
|
|
|
|
|
b2[1] = !isConnected(world, x - 1, y - 1, z, side, block, blockMetadata);
|
|
|
|
|
b2[2] = !isConnected(world, x + 1, y + 1, z, side, block, blockMetadata);
|
|
|
|
|
b2[3] = !isConnected(world, x - 1, y + 1, z, side, block, blockMetadata);
|
|
|
|
|
} else if (side == 4) {
|
|
|
|
|
b2[0] = !isConnected(world, x, y - 1, z + 1, side, block, blockMetadata);
|
|
|
|
|
b2[1] = !isConnected(world, x, y - 1, z - 1, side, block, blockMetadata);
|
|
|
|
|
b2[2] = !isConnected(world, x, y + 1, z + 1, side, block, blockMetadata);
|
|
|
|
|
b2[3] = !isConnected(world, x, y + 1, z - 1, side, block, blockMetadata);
|
|
|
|
|
} else if (side == 5) {
|
|
|
|
|
b2[0] = !isConnected(world, x, y - 1, z - 1, side, block, blockMetadata);
|
|
|
|
|
b2[1] = !isConnected(world, x, y - 1, z + 1, side, block, blockMetadata);
|
|
|
|
|
b2[2] = !isConnected(world, x, y + 1, z - 1, side, block, blockMetadata);
|
|
|
|
|
b2[3] = !isConnected(world, x, y + 1, z + 1, side, block, blockMetadata);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (texture == 17 && b2[0])
|
|
|
|
|
texture = 4;
|
|
|
|
|
if (texture == 19 && b2[1])
|
|
|
|
|
texture = 5;
|
|
|
|
|
if (texture == 49 && b2[2])
|
|
|
|
|
texture = 20;
|
|
|
|
|
if (texture == 51 && b2[3])
|
|
|
|
|
texture = 21;
|
|
|
|
|
|
|
|
|
|
if (texture == 18 && b2[0] && b2[1])
|
|
|
|
|
texture = 7;
|
|
|
|
|
if (texture == 33 && b2[0] && b2[2])
|
|
|
|
|
texture = 6;
|
|
|
|
|
if (texture == 35 && b2[3] && b2[1])
|
|
|
|
|
texture = 23;
|
|
|
|
|
if (texture == 50 && b2[3] && b2[2])
|
|
|
|
|
texture = 22;
|
|
|
|
|
|
|
|
|
|
if (texture == 18 && !b2[0] && b2[1])
|
|
|
|
|
texture = 39;
|
|
|
|
|
if (texture == 33 && b2[0] && !b2[2])
|
|
|
|
|
texture = 38;
|
|
|
|
|
if (texture == 35 && !b2[3] && b2[1])
|
|
|
|
|
texture = 53;
|
|
|
|
|
if (texture == 50 && b2[3] && !b2[2])
|
|
|
|
|
texture = 52;
|
|
|
|
|
|
|
|
|
|
if (texture == 18 && b2[0] && !b2[1])
|
|
|
|
|
texture = 37;
|
|
|
|
|
if (texture == 33 && !b2[0] && b2[2])
|
|
|
|
|
texture = 36;
|
|
|
|
|
if (texture == 35 && b2[3] && !b2[1])
|
|
|
|
|
texture = 55;
|
|
|
|
|
if (texture == 50 && !b2[3] && b2[2])
|
|
|
|
|
texture = 54;
|
|
|
|
|
|
|
|
|
|
if (texture == 34 && b2[0] && b2[1] && b2[2] && b2[3])
|
|
|
|
|
texture = 58;
|
|
|
|
|
|
|
|
|
|
if (texture == 34 && !b2[0] && b2[1] && b2[2] && b2[3])
|
|
|
|
|
texture = 9;
|
|
|
|
|
if (texture == 34 && b2[0] && !b2[1] && b2[2] && b2[3])
|
|
|
|
|
texture = 25;
|
|
|
|
|
if (texture == 34 && b2[0] && b2[1] && !b2[2] && b2[3])
|
|
|
|
|
texture = 8;
|
|
|
|
|
if (texture == 34 && b2[0] && b2[1] && b2[2] && !b2[3])
|
|
|
|
|
texture = 24;
|
|
|
|
|
|
|
|
|
|
if (texture == 34 && b2[0] && b2[1] && !b2[2] && !b2[3])
|
|
|
|
|
texture = 11;
|
|
|
|
|
if (texture == 34 && !b2[0] && !b2[1] && b2[2] && b2[3])
|
|
|
|
|
texture = 26;
|
|
|
|
|
if (texture == 34 && !b2[0] && b2[1] && !b2[2] && b2[3])
|
|
|
|
|
texture = 27;
|
|
|
|
|
if (texture == 34 && b2[0] && !b2[1] && b2[2] && !b2[3])
|
|
|
|
|
texture = 10;
|
|
|
|
|
|
|
|
|
|
if (texture == 34 && b2[0] && !b2[1] && !b2[2] && b2[3])
|
|
|
|
|
texture = 42;
|
|
|
|
|
if (texture == 34 && !b2[0] && b2[1] && b2[2] && !b2[3])
|
|
|
|
|
texture = 43;
|
|
|
|
|
|
|
|
|
|
if (texture == 34 && b2[0] && !b2[1] && !b2[2] && !b2[3])
|
|
|
|
|
texture = 40;
|
|
|
|
|
if (texture == 34 && !b2[0] && b2[1] && !b2[2] && !b2[3])
|
|
|
|
|
texture = 41;
|
|
|
|
|
if (texture == 34 && !b2[0] && !b2[1] && b2[2] && !b2[3])
|
|
|
|
|
texture = 56;
|
|
|
|
|
if (texture == 34 && !b2[0] && !b2[1] && !b2[2] && b2[3])
|
|
|
|
|
texture = 57;
|
|
|
|
|
return texture;
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-07 21:47:45 -05:00
|
|
|
public static boolean isConnected(IBlockAccess world, int x, int y, int z, int side, Block block, int meta) {
|
|
|
|
|
|
|
|
|
|
ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[side];
|
|
|
|
|
|
|
|
|
|
int x2 = x + dir.offsetX;
|
|
|
|
|
int y2 = y + dir.offsetY;
|
|
|
|
|
int z2 = z + dir.offsetZ;
|
2015-01-08 20:31:07 -05:00
|
|
|
|
|
|
|
|
Block con = getBlockOrFacade(world, x, y, z, side);
|
|
|
|
|
Block obscuring = getBlockOrFacade(world, x2, y2, z2, side);
|
|
|
|
|
|
|
|
|
|
// no block or a bad API user
|
|
|
|
|
if (con == null) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
boolean ret = con.equals(block) && getBlockOrFacadeMetadata(world, x, y, z, side) == meta;
|
|
|
|
|
|
|
|
|
|
// no block obscuring this face
|
|
|
|
|
if (obscuring == null) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// check that we aren't already connected outwards from this side
|
|
|
|
|
ret &= !(obscuring.equals(block) && getBlockOrFacadeMetadata(world, x2, y2, z2, side) == meta);
|
|
|
|
|
|
|
|
|
|
return ret;
|
2015-01-07 19:50:18 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int getBlockOrFacadeMetadata(IBlockAccess world, int x, int y, int z, int side) {
|
|
|
|
|
Block blk = world.getBlock(x, y, z);
|
|
|
|
|
if (blk instanceof IFacade) {
|
|
|
|
|
return ((IFacade) blk).getFacadeMetadata(world, x, y, z, side);
|
|
|
|
|
}
|
|
|
|
|
return world.getBlockMetadata(x, y, z);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Block getBlockOrFacade(IBlockAccess world, int x, int y, int z, int side) {
|
|
|
|
|
Block blk = world.getBlock(x, y, z);
|
|
|
|
|
if (blk instanceof IFacade) {
|
|
|
|
|
blk = ((IFacade) blk).getFacade(world, x, y, z, side);
|
|
|
|
|
}
|
|
|
|
|
return blk;
|
|
|
|
|
}
|
2014-10-27 16:26:14 -04:00
|
|
|
|
|
|
|
|
}
|