package org.dynmap.hdmap.renderer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.dynmap.renderer.CustomRenderer;
import org.dynmap.renderer.MapDataContext;
import org.dynmap.renderer.RenderPatch;
import org.dynmap.renderer.RenderPatchFactory;
public class TFCWoodRenderer extends CustomRenderer {
private int blkid;
private static final int SIDE_XP = 0x1;
private static final int SIDE_XN = 0x2;
private static final int SIDE_X = SIDE_XN | SIDE_XP;
private static final int SIDE_ZP = 0x4;
private static final int SIDE_ZN = 0x8;
private static final int SIDE_Z = SIDE_ZN | SIDE_ZP;
private static final int SIDE_YN = 0x10;
// Meshes, indexed by connection combination (bit 0=X+, bit 1=X-, bit 2=Z+, bit 3=Z-, bit 4=Y-)
private RenderPatch[][] meshes = new RenderPatch[32][];
@Override
public boolean initializeRenderer(RenderPatchFactory rpf, int blkid, int blockdatamask, Map<String,String> custparm) {
if(!super.initializeRenderer(rpf, blkid, blockdatamask, custparm))
return false;
this.blkid = blkid; /* Remember our block ID */
/* Generate meshes */
buildMeshes(rpf);
return true;
}
@Override
public int getMaximumTextureCount() {
return 1;
}
private static final int[] patchlist = { 0, 0, 0, 0, 0, 0 };
private void addBox(RenderPatchFactory rpf, List<RenderPatch> list, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax) {
addBox(rpf, list, xmin, xmax, ymin, ymax, zmin, zmax, patchlist);
}
private void buildMeshes(RenderPatchFactory rpf) {
ArrayList<RenderPatch> list = new ArrayList<RenderPatch>();
for(int dat = 0; dat < 32; dat++) {
int dat2 = dat;
if((dat & SIDE_YN) == 0) { /* Nothing below, always X-Y */
dat2 |= SIDE_X | SIDE_Z;
}
else { /* Else, add center */
addBox(rpf, list, 0.3125, 0.6875, 0.0, 1.0, 0.3125, 0.6875);
}
switch(dat2 & SIDE_X) {
case SIDE_XP: // Just X+
addBox(rpf, list, 0.6875, 1.0, 0.375, 0.625, 0.375, 0.625);
break;
case SIDE_XN: // Just X-
addBox(rpf, list, 0.0, 0.3125, 0.375, 0.625, 0.375, 0.625);
break;
case SIDE_X: // X- and X+
addBox(rpf, list, 0.0, 1.0, 0.375, 0.625, 0.375, 0.625);
break;
}
switch(dat2 & SIDE_Z) {
case SIDE_ZP: // Just Z+
addBox(rpf, list, 0.375, 0.625, 0.375, 0.625, 0.6875, 1.0);
break;
case SIDE_ZN: // Just Z-
addBox(rpf, list, 0.375, 0.625, 0.375, 0.625, 0.0, 0.3125);
break;
case SIDE_Z: // Z- and Z+
addBox(rpf, list, 0.375, 0.625, 0.375, 0.625, 0.0, 1.0);
break;
}
meshes[dat] = list.toArray(new RenderPatch[list.size()]);
list.clear();
}
}
private static int[][] sides = {
{ 1, 0, 0, SIDE_XP },
{ -1, 0, 0, SIDE_XN },
{ 0, 0, 1, SIDE_ZP },
{ 0, 0, -1, SIDE_ZN }
};
@Override
public RenderPatch[] getRenderPatchList(MapDataContext ctx) {
/* Build connection map - check each axis */
int connect = 0;
for(int i = 0; i < sides.length; i++) {
int id = ctx.getBlockTypeIDAt(sides[i][0], sides[i][1], sides[i][2]);
if(id == blkid) {
connect |= sides[i][3];
}
}
int id = ctx.getBlockTypeIDAt(0, -1, 0);
if(id > 0) {
connect |= SIDE_YN;
}
return meshes[connect];
}
}