package org.dynmap.hdmap.renderer; import java.util.ArrayList; import java.util.Map; import org.dynmap.Log; import org.dynmap.renderer.CustomRenderer; import org.dynmap.renderer.MapDataContext; import org.dynmap.renderer.RenderPatch; import org.dynmap.renderer.RenderPatchFactory; public class RotatedBoxRenderer extends CustomRenderer { // Models for rotation values private RenderPatch[][] models; private Integer[] rotValues; // Indexing attribute private String idx_attrib = null; private String[] tileEntityAttribs = null; @Override public boolean initializeRenderer(RenderPatchFactory rpf, int blkid, int blockdatamask, Map<String,String> custparm) { if(!super.initializeRenderer(rpf, blkid, blockdatamask, custparm)) return false; /* See if index attribute defined */ idx_attrib = custparm.get("textureIndex"); ArrayList<Integer> map = new ArrayList<Integer>(); for(int id = 0; ; id++) { String v = custparm.get("index" + id); if(v == null) break; map.add(Integer.valueOf(v)); } rotValues = map.toArray(new Integer[map.size()]); models = new RenderPatch[rotValues.length][]; /* Build unrotated base model */ ArrayList<RenderPatch> list = new ArrayList<RenderPatch>(); addBox(rpf, list, 0, 1, 0, 1, 0, 1, null); for(int id = 0; id < rotValues.length; id++) { String v = custparm.get("map" + id); if(v == null) v = Integer.toString(90*id); /* Check if side swap mapping */ if(v.startsWith("S")) { models[id] = new RenderPatch[6]; for(int i = 0; i < 6; i++) { int idx = 0; try { idx = v.charAt(i+1) - '0'; models[id][i] = rpf.getRotatedPatch(list.get(i), 0, 0, 0, idx); } catch (Exception x) { Log.severe("Invalid map format:" + v); return false; } } } else { String sv[] = v.split("/"); int x = 0, y = 0, z = 0; if(sv.length == 1) { /* Only 1 = Y axis */ try { y = Integer.parseInt(v); } catch (NumberFormatException nfx) { Log.severe("Invalid map format:" + v); return false; } } else if(sv.length == 3) { try { x = Integer.parseInt(sv[0]); y = Integer.parseInt(sv[1]); z = Integer.parseInt(sv[2]); } catch (NumberFormatException nfx) { Log.severe("Invalid map format:" + v); return false; } } else { Log.severe("Invalid map format:" + v); return false; } models[id] = new RenderPatch[6]; for(int i = 0; i < 6; i++) { models[id][i] = rpf.getRotatedPatch(list.get(i), x, y, z, i); } } } if(idx_attrib != null) { tileEntityAttribs = new String[1]; tileEntityAttribs[0] = idx_attrib; } else { tileEntityAttribs = null; } return true; } @Override public int getMaximumTextureCount() { return 6; } @Override public String[] getTileEntityFieldsNeeded() { return tileEntityAttribs; } @Override public RenderPatch[] getRenderPatchList(MapDataContext ctx) { int textureIdx = 0; /* See if we have texture index */ if(idx_attrib != null) { Object idxv = ctx.getBlockTileEntityField(idx_attrib); if(idxv instanceof Number) { textureIdx = ((Number)idxv).intValue(); } } else { /* Else, use data if no index attribute */ textureIdx = ctx.getBlockData(); } //Log.info("index=" + textureIdx); for(int i = 0; i < rotValues.length; i++) { if(rotValues[i] == textureIdx) { //Log.info("match: " + i); return models[i]; } } Log.info("Unmatched rotation index: " + textureIdx + " for " + ctx.getBlockTypeID() + ":" + ctx.getBlockData()); return models[0]; } }