package org.dynmap.hdmap.renderer;
import java.util.Map;
import org.dynmap.renderer.CustomRenderer;
import org.dynmap.renderer.MapDataContext;
import org.dynmap.renderer.RenderPatch;
import org.dynmap.renderer.RenderPatchFactory;
import org.dynmap.renderer.RenderPatchFactory.SideVisible;
/*
* Plant (crossed texture) renderer : includes option for tall plants (index derived from meta below block)
*/
public class PlantRenderer extends CustomRenderer {
// Meshes, indexed by metadata
private RenderPatch[][] meshes;
private boolean metaFromBelow = false;
private int metaCnt = 16;
@Override
public boolean initializeRenderer(RenderPatchFactory rpf, int blkid, int blockdatamask, Map<String,String> custparm) {
if(!super.initializeRenderer(rpf, blkid, blockdatamask, custparm))
return false;
String idxsrc = custparm.get("metasrc");
if ((idxsrc != null) && (idxsrc.equals("below"))) {
metaFromBelow = true;
}
String maxmeta = custparm.get("metacnt");
if (maxmeta != null) {
metaCnt = Integer.parseInt(maxmeta, 10);
if (metaCnt > 16) metaCnt = 16;
}
buildPatches(rpf);
return true;
}
private void buildPatches(RenderPatchFactory rpf) {
meshes = new RenderPatch[metaCnt][];
for (int txtid = 0; txtid < metaCnt; txtid++) {
RenderPatch VertX1Z0ToX0Z1 = rpf.getPatch(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, SideVisible.FLIP, txtid);
RenderPatch VertX1Z0ToX0Z1_90 = rpf.getRotatedPatch(VertX1Z0ToX0Z1, 0, 90, 0, txtid);
meshes[txtid] = new RenderPatch[] { VertX1Z0ToX0Z1, VertX1Z0ToX0Z1_90 };
}
}
@Override
public int getMaximumTextureCount() {
return metaCnt;
}
@Override
public RenderPatch[] getRenderPatchList(MapDataContext ctx) {
int idx = 0;
if (metaFromBelow) {
idx = ctx.getBlockDataAt(0, -1, 0);
}
else {
idx = ctx.getBlockData();
}
if (idx >= metaCnt) {
idx = 0;
}
return meshes[idx];
}
}