From 8fbc3e35349ad00ad904c806989d5b2109f15277 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Wed, 9 Feb 2022 22:38:09 -0600 Subject: [PATCH] More modsupport updates for improved DynmapBlockScan --- .../java/org/dynmap/hdmap/HDBlockModels.java | 15 +- .../impl/ModModelDefinitionImpl.java | 6 - .../modsupport/impl/ModelBlockModelImpl.java | 134 +++++++----------- .../org/dynmap/utils/PatchDefinition.java | 82 ++++------- .../dynmap/modsupport/ModModelDefinition.java | 10 -- .../dynmap/modsupport/ModelBlockModel.java | 10 +- 6 files changed, 98 insertions(+), 159 deletions(-) diff --git a/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java b/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java index dcd777b0..1a961157 100644 --- a/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java +++ b/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java @@ -317,6 +317,7 @@ public class HDBlockModels { double[] to = new double[3]; double xrot = 0, yrot = 0, zrot = 0; double xrotorig = 8, yrotorig = 8, zrotorig = 8; + int modrotx = 0, modroty = 0, modrotz = 0; // Model level rotation boolean shade = true; ArrayList sides = new ArrayList(); }; @@ -953,9 +954,17 @@ public class HDBlockModels { } } // Rest are faces (//umin/vmin/umax/vmax> or </) + // OR R/mrx/mry/mrz for model rotation for (int faceidx = 2; faceidx < prms.length; faceidx++) { String v = prms[faceidx]; String[] flds = v.split("/"); + // If rotation + if (flds[0].equals("R") && (flds.length == 4)) { + box.modrotx = Integer.parseInt(flds[1]); + box.modroty = Integer.parseInt(flds[2]); + box.modrotz = Integer.parseInt(flds[3]); + continue; + } ModelBoxSide side = new ModelBoxSide(); side.rot = null; if ((flds.length != 2) && (flds.length != 6)) { @@ -1016,6 +1025,10 @@ public class HDBlockModels { new Vector3D(bl.xrotorig / 16, bl.yrotorig / 16, bl.zrotorig / 16), patch.textureindex); } + // If model rotation, apply too + if ((bl.modrotx != 0) || (bl.modroty != 0) || (bl.modrotz != 0)) { + patch = pdf.getPatch(patch, bl.modrotx, bl.modroty, bl.modrotz, patch.textureindex); + } pd.add(patch); } else { @@ -1025,7 +1038,7 @@ public class HDBlockModels { } PatchDefinition[] patcharray = new PatchDefinition[pd.size()]; for (int i = 0; i < patcharray.length; i++) { - patcharray[i] = pd.get(i); + patcharray[i] = pd.get(i); } if (patcharray.length > max_patches) max_patches = patcharray.length; diff --git a/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModModelDefinitionImpl.java b/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModModelDefinitionImpl.java index 6d5877a7..9d584b9d 100644 --- a/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModModelDefinitionImpl.java +++ b/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModModelDefinitionImpl.java @@ -210,12 +210,6 @@ public class ModModelDefinitionImpl implements ModModelDefinition { blkModel.add(mod); return mod; } - @Override - public ModelBlockModel addRotatedModelBlockModel(String blockname, ModelBlockModel model, int xrot, int yrot, int zrot) { - ModelBlockModelImpl mod = new ModelBlockModelImpl(blockname, this, model, xrot, yrot, zrot); - blkModel.add(mod); - return mod; - } public String getPatchID(double x0, double y0, double z0, double xu, double yu, double zu, double xv, double yv, double zv, double umin, diff --git a/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModelBlockModelImpl.java b/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModelBlockModelImpl.java index 6bf1c5f9..39d8eee7 100644 --- a/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModelBlockModelImpl.java +++ b/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModelBlockModelImpl.java @@ -23,6 +23,7 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod private double xrot = 0, yrot = 0, zrot = 0; private boolean shade; private double[] rotorigin; + private int modrotx = 0, modroty = 0, modrotz = 0; @Override public void addBlockSide(BlockSide side, double[] uv, SideRotation rot, int textureid, int tintidx) { ModelSide ms = new ModelSide(); @@ -48,21 +49,10 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod } } private ArrayList boxes = new ArrayList(); - private String rotsourceblockname; - private Map rotsourcestatemap; - private int xrot, yrot, zrot; public ModelBlockModelImpl(String blkname, ModModelDefinitionImpl mdf) { super(blkname, mdf); } - - public ModelBlockModelImpl(String blkname, ModModelDefinitionImpl mdf, ModelBlockModel mod, int xrot, int yrot, int zrot) { - super(blkname, mdf); - this.rotsourceblockname = mod.getBlockNames()[0]; - this.rotsourcestatemap = new HashMap(); - this.rotsourcestatemap.putAll(mod.getBlockStateMappings().get(0)); - this.xrot = xrot; this.yrot = yrot; this.zrot = zrot; - } private static HashMap fromBlockSide = new HashMap(); static { @@ -79,76 +69,50 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod String ids = this.getIDsAndMeta(); if (ids == null) return null; String line; - // If rotating another model - if (rotsourceblockname != null) { - line = String.format("patchblock:%s", ids); - line += "\npatchrotate:id=" + rotsourceblockname; - if (rotsourcestatemap != null) { - line += ",state="; - boolean first = true; - for (Entry r : rotsourcestatemap.entrySet()) { - if (first) { - first = false; - } - else { - line += '/'; - } - line += r.getKey() + ":" + r.getValue(); - } - } - if (xrot != 0) { - line += ",rotx=" + xrot; - } - if (yrot != 0) { - line += ",roty=" + yrot; - } - if (zrot != 0) { - line += ",rotz=" + yrot; - } - } - else { - line = String.format("modellist:%s", ids); - for (ModelBlockImpl mb: boxes) { - line += String.format(",box=%f/%f/%f", mb.from[0], mb.from[1], mb.from[2]); - if (!mb.shade) { // if shade=false - line += "/false"; - } - line += String.format(":%f/%f/%f", mb.to[0], mb.to[1], mb.to[2]); - if ((mb.xrot != 0) || (mb.yrot != 0) || (mb.zrot != 0)) { // If needed, add rotation - line += String.format("/%f/%f/%f", mb.xrot, mb.yrot, mb.zrot); - // If origin also defined, add it - if (mb.rotorigin != null) { - line += String.format("/%f/%f/%f", mb.rotorigin[0], mb.rotorigin[1], mb.rotorigin[2]); - } - } - for (BlockSide bs : fromBlockSide.keySet()) { - String side = fromBlockSide.get(bs); - ModelSide mside = mb.sides.get(bs); - if (mside != null) { - String rval = side; - switch (mside.rot) { - case DEG0: - default: - break; - case DEG90: - rval += "90"; - break; - case DEG180: - rval += "180"; - break; - case DEG270: - rval += "270"; - break; - } - if (mside.uv != null) { - line += String.format(":%s/%d/%f/%f/%f/%f", rval, mside.textureid, mside.uv[0], mside.uv[1], mside.uv[2], mside.uv[3]); - } - else { - line += String.format(":%s/%d", rval, mside.textureid); - } - } - } - } + line = String.format("modellist:%s", ids); + for (ModelBlockImpl mb: boxes) { + line += String.format(",box=%f/%f/%f", mb.from[0], mb.from[1], mb.from[2]); + if (!mb.shade) { // if shade=false + line += "/false"; + } + line += String.format(":%f/%f/%f", mb.to[0], mb.to[1], mb.to[2]); + if ((mb.xrot != 0) || (mb.yrot != 0) || (mb.zrot != 0)) { // If needed, add rotation + line += String.format("/%f/%f/%f", mb.xrot, mb.yrot, mb.zrot); + // If origin also defined, add it + if (mb.rotorigin != null) { + line += String.format("/%f/%f/%f", mb.rotorigin[0], mb.rotorigin[1], mb.rotorigin[2]); + } + } + for (BlockSide bs : fromBlockSide.keySet()) { + String side = fromBlockSide.get(bs); + ModelSide mside = mb.sides.get(bs); + if (mside != null) { + String rval = side; + switch (mside.rot) { + case DEG0: + default: + break; + case DEG90: + rval += "90"; + break; + case DEG180: + rval += "180"; + break; + case DEG270: + rval += "270"; + break; + } + if (mside.uv != null) { + line += String.format(":%s/%d/%f/%f/%f/%f", rval, mside.textureid, mside.uv[0], mside.uv[1], mside.uv[2], mside.uv[3]); + } + else { + line += String.format(":%s/%d", rval, mside.textureid); + } + } + } + if ((mb.modrotx != 0) || (mb.modroty != 0) || (mb.modrotz != 0)) { + line += String.format(":R/%d/%d/%d", mb.modrotx, mb.modroty, mb.modrotz); + } } return line; } @@ -168,11 +132,14 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod * @param zrot - degrees of rotation of block around Z * @param shade - shade setting for model * @param rotorigin - rotation origin, if any (default [ 8, 8, 8 ]( + * @param modrotx - model level rotation in degrees (0, 90, 180, 270) + * @param modroty - model level rotation in degrees (0, 90, 180, 270) + * @param modrotz - model level rotation in degrees (0, 90, 180, 270) * @return model block to add faces to */ @Override public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot, - boolean shade, double[] rotorigin) { + boolean shade, double[] rotorigin, int modrotx, int modroty, int modrotz) { ModelBlockImpl mbi = new ModelBlockImpl(); if (from != null) { mbi.from[0] = from[0]; mbi.from[1] = from[1]; mbi.from[2] = from[2]; } if (to != null) { mbi.to[0] = to[0]; mbi.to[1] = to[1]; mbi.to[2] = to[2]; } @@ -181,6 +148,9 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod if (rotorigin != null) { mbi.rotorigin = Arrays.copyOf(rotorigin, 3); } + mbi.modrotx = modrotx; + mbi.modroty = modroty; + mbi.modrotz = modrotz; boxes.add(mbi); return mbi; } diff --git a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java index 64aca6f5..54415c8e 100644 --- a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java +++ b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java @@ -215,67 +215,35 @@ public class PatchDefinition implements RenderPatch { } } } + private boolean outOfRange(double v) { + return (v < -1.0) || (v > 2.0); + } public boolean validate() { boolean good = true; - if((x0 < -1.0) || (x0 > 2.0)) { - Log.severe("Invalid x0=" + x0); - good = false; + // Compute visible corners to see if we're inside cube + double xx0 = x0 + (xu - x0) * umin; + double xx1 = x0 + (xv - x0) * vmin; + double xx2 = x0 + (xu - x0) * umax; + double xx3 = x0 + (xv - x0) * vmax; + if (outOfRange(xx0) || outOfRange(xx1) || outOfRange(xx2) || outOfRange(xx3)) { + Log.severe(String.format("Invalid visible range xu=[%f:%f], xv=[%f:%f]", xx0, xx2, xx1, xx3)); + good = false; } - if((y0 < -1.0) || (y0 > 2.0)) { - Log.severe("Invalid y0=" + y0); - good = false; + double yy0 = y0 + (yu - y0) * umin; + double yy1 = y0 + (yv - y0) * vmin; + double yy2 = y0 + (yu - y0) * umax; + double yy3 = y0 + (yv - y0) * vmax; + if (outOfRange(yy0) || outOfRange(yy1) || outOfRange(yy2) || outOfRange(yy3)) { + Log.severe(String.format("Invalid visible range yu=[%f:%f], yv=[%f:%f]", yy0, yy2, yy1, yy3)); + good = false; } - if((z0 < -1.0) || (z0 > 2.0)) { - Log.severe("Invalid z0=" + z0); - good = false; - } - if((xu < -1.0) || (xu > 2.0)) { - Log.severe("Invalid xu=" + xu); - good = false; - } - if((yu < -1.0) || (yu > 2.0)) { - Log.severe("Invalid yu=" + yu); - good = false; - } - if((zu < -1.0) || (zu > 2.0)) { - Log.severe("Invalid zu=" + zu); - good = false; - } - if((xv < -1.0) || (xv > 2.0)) { - Log.severe("Invalid xv=" + xv); - good = false; - } - if((yv < -1.0) || (yv > 2.0)) { - Log.severe("Invalid yv=" + yv); - good = false; - } - if((zv < -1.0) || (zv > 2.0)) { - Log.severe("Invalid zv=" + zv); - good = false; - } - if((umin < 0.0) || (umin > umax)) { - Log.severe("Invalid umin=" + umin); - good = false; - } - if((vmin < 0.0) || (vmin > vmax)) { - Log.severe("Invalid vmin=" + vmin); - good = false; - } - if(umax > 1.0) { - Log.severe("Invalid umax=" + umax); - good = false; - } - if(vmax > 1.0) { - Log.severe("Invalid vmax=" + vmax); - good = false; - } - if ((vminatumax < 0.0) || (vminatumax > vmaxatumax)) { - Log.severe("Invalid vminatumax=" + vminatumax); - good = false; - } - if(vmaxatumax > 1.0) { - Log.severe("Invalid vmaxatumax=" + vmaxatumax); - good = false; + double zz0 = z0 + (zu - z0) * umin; + double zz1 = z0 + (zv - z0) * vmin; + double zz2 = z0 + (zu - z0) * umax; + double zz3 = z0 + (zv - z0) * vmax; + if (outOfRange(zz0) || outOfRange(zz1) || outOfRange(zz2) || outOfRange(zz3)) { + Log.severe(String.format("Invalid visible range zu=[%f:%f], zv=[%f:%f]", zz0, zz2, zz1, zz3)); + good = false; } if (!good) { Log.warning("Patch not valid: " + toString()); diff --git a/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModModelDefinition.java b/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModModelDefinition.java index a7b44eaa..561228ab 100644 --- a/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModModelDefinition.java +++ b/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModModelDefinition.java @@ -168,16 +168,6 @@ public interface ModModelDefinition { * @return block model record */ public ModelBlockModel addModelBlockModel(String blockname); - /** - * Add rotated model block model, based on existing model : default assumes all metadata values are matching - * @param blockname - block name - * @param model - existing model to be rotated - * @param xrot - x rotation in degrees (0, 90, 180, 270) - * @param yrot - y rotation in degrees (0, 90, 180, 270) - * @param zrot - z rotation in degrees (0, 90, 180, 270) - * @return block model record - */ - public ModelBlockModel addRotatedModelBlockModel(String blockname, ModelBlockModel model, int xrot, int yrot, int zrot); /** * Final call for model definition: publishes definiiton to Dynmap to be used for the mod * @return true if successful, false if error diff --git a/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModelBlockModel.java b/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModelBlockModel.java index d36e0b8e..576c9486 100644 --- a/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModelBlockModel.java +++ b/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModelBlockModel.java @@ -39,13 +39,17 @@ public interface ModelBlockModel extends BlockModel { * @param zrot - degrees of rotation of block around Z * @param shade - shade setting for model * @param rotorigin = rotation origin [x, y, z] (if null, [ 8,8,8 ] is assumed + * @param modrotx - model level rotation in degrees (0, 90, 180, 270) + * @param modroty - model level rotation in degrees (0, 90, 180, 270) + * @param modrotz - model level rotation in degrees (0, 90, 180, 270) * @return model block to add faces to */ - public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot, boolean shade, double[] rotorigin); + public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot, + boolean shade, double[] rotorigin, int modrotx, int modroty, int modrotz); default public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot, boolean shade) { - return addModelBlock(from, to, xrot, yrot, zrot, shade, null); + return addModelBlock(from, to, xrot, yrot, zrot, shade, null, 0, 0, 0); } default public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot) { - return addModelBlock(from, to, xrot, yrot, zrot, true, null); + return addModelBlock(from, to, xrot, yrot, zrot, true, null, 0, 0, 0); } }