diff --git a/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java b/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java index 76949afd..6318a797 100644 --- a/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java +++ b/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java @@ -331,6 +331,7 @@ public class HDBlockModels { private static class ModelBox { double[] from = new double[3]; double[] to = new double[3]; + double xrot = 0, yrot = 0, zrot = 0; ArrayList sides = new ArrayList(); }; @@ -1017,11 +1018,11 @@ public class HDBlockModels { databits.set(getIntValue(varvals,av[1])); } else if(av[0].equals("box")) { - // box=fromx/y/z:tox/y/z://umin/vmin/umax/vmax>:... + // box=from-x/y/z:to-x/y/z/rotx/roty/rotz://umin/vmin/umax/vmax>:... String[] prms = av[1].split(":"); ModelBox box = new ModelBox(); - if (prms.length > 0) { // Handle from + if (prms.length > 0) { // Handle from (from-x/y/z) String[] xyz = prms[0].split("/"); if (xyz.length == 3) { box.from[0] = Double.parseDouble(xyz[0]); @@ -1032,12 +1033,17 @@ public class HDBlockModels { Log.severe("Invalid modellist FROM value (" + prms[0] + " at line " + rdr.getLineNumber()); } } - if (prms.length > 1) { // Handle to + if (prms.length > 1) { // Handle to (to-x/y/z or to-x/y/z/rotx/roty/rotz) String[] xyz = prms[1].split("/"); - if (xyz.length == 3) { + if (xyz.length >= 3) { box.to[0] = Double.parseDouble(xyz[0]); box.to[1] = Double.parseDouble(xyz[1]); box.to[2] = Double.parseDouble(xyz[2]); + if (xyz.length >= 6) { // If 6, second set are rotations (xrot/yrot/zrot) + box.xrot = Double.parseDouble(xyz[3]); + box.yrot = Double.parseDouble(xyz[4]); + box.zrot = Double.parseDouble(xyz[5]); + } } else { Log.severe("Invalid modellist TO value (" + prms[1] + " at line " + rdr.getLineNumber()); @@ -1052,7 +1058,7 @@ public class HDBlockModels { String face = flds[0]; side.side = toBlockSide.get(face); if (side.side == null) { - Log.severe("Invalid modellist side value (" + face + " at line " + rdr.getLineNumber()); + Log.severe("Invalid modellist side value (" + face + ") at line " + rdr.getLineNumber()); continue; } } @@ -1081,6 +1087,10 @@ public class HDBlockModels { for (ModelBoxSide side : bl.sides) { PatchDefinition patch = pdf.getModelFace(bl.from, bl.to, side.side, side.uv, side.textureid); if (patch != null) { + // If any rotations, apply them here + if ((bl.xrot != 0) || (bl.yrot != 0) || (bl.zrot != 0)) { + patch = pdf.getPatch(patch, bl.xrot, bl.yrot, bl.zrot, patch.textureindex); + } pd.add(patch); } } 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 b26aac70..e3772b76 100644 --- a/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModelBlockModelImpl.java +++ b/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModelBlockModelImpl.java @@ -17,6 +17,7 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod private HashMap sides = new HashMap(); private double[] from = { 0, 0, 0 }; private double[] to = { 16, 16, 16 }; + private double xrot = 0, yrot = 0, zrot = 0; @Override public void addBlockSide(BlockSide side, double[] uv, int textureid) { ModelSide ms = new ModelSide(); @@ -81,6 +82,9 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod else { for (ModelBlockImpl mb: boxes) { line += String.format(",box=%f/%f/%f:%f/%f/%f", mb.from[0], mb.from[1], mb.from[2], 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); + } for (BlockSide bs : fromBlockSide.keySet()) { String side = fromBlockSide.get(bs); ModelSide mside = mb.sides.get(bs); @@ -108,12 +112,16 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod * * @param from - vector of lower left corner of box (0-16 range for coordinates - min x, y, z) * @param to - vector of upper right corner of box (0-16 range for coordinates max x, y, z) + * @param xrot - degrees of rotation of block around X + * @param yrot - degrees of rotation of block around Y + * @param zrot - degrees of rotation of block around Z * @return model block to add faces to */ - public ModelBlock addModelBlock(double[] from, double[] to) { + public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot) { 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]; } + mbi.xrot = xrot; mbi.yrot = yrot; mbi.zrot = zrot; 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 f975fa87..91b72b19 100644 --- a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java +++ b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java @@ -78,7 +78,7 @@ public class PatchDefinition implements RenderPatch { * @param rotatez - z rotation in degrees * @param textureindex - texture index for new patch (-1 = use same as original patch) */ - PatchDefinition(PatchDefinition orig, int rotatex, int rotatey, int rotatez, int textureindex) { + PatchDefinition(PatchDefinition orig, double rotatex, double rotatey, double rotatez, int textureindex) { Vector3D vec = new Vector3D(orig.x0, orig.y0, orig.z0); rotate(vec, rotatex, rotatey, rotatez); /* Rotate origin */ x0 = vec.x; y0 = vec.y; z0 = vec.z; @@ -101,7 +101,7 @@ public class PatchDefinition implements RenderPatch { update(); } - private void rotate(Vector3D vec, int xcnt, int ycnt, int zcnt) { + private void rotate(Vector3D vec, double xcnt, double ycnt, double zcnt) { vec.subtract(offsetCenter); /* Shoft to center of block */ /* Do X rotation */ double rot = Math.toRadians(xcnt); diff --git a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinitionFactory.java b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinitionFactory.java index a1e69fa8..cb981c33 100644 --- a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinitionFactory.java +++ b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinitionFactory.java @@ -81,14 +81,19 @@ public class PatchDefinitionFactory implements RenderPatchFactory { } } + @Override + public RenderPatch getRotatedPatch(RenderPatch patch, double xrot, double yrot, + double zrot, int textureindex) { + return getPatch((PatchDefinition)patch, xrot, yrot, zrot, textureindex); + } @Override public RenderPatch getRotatedPatch(RenderPatch patch, int xrot, int yrot, int zrot, int textureindex) { return getPatch((PatchDefinition)patch, xrot, yrot, zrot, textureindex); } - public PatchDefinition getPatch(PatchDefinition patch, int xrot, int yrot, - int zrot, int textureindex) { + public PatchDefinition getPatch(PatchDefinition patch, double xrot, double yrot, + double zrot, int textureindex) { PatchDefinition pd = new PatchDefinition(patch, xrot, yrot, zrot, textureindex); if(pd.validate() == false) return null; diff --git a/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModelBlockModel.java b/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModelBlockModel.java index 41722ddb..fac5ad1f 100644 --- a/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModelBlockModel.java +++ b/DynmapCoreAPI/src/main/java/org/dynmap/modsupport/ModelBlockModel.java @@ -1,5 +1,7 @@ package org.dynmap.modsupport; +import org.dynmap.modsupport.ModelBlockModel.ModelBlock; + // Model for more direct translation of MC models // All coordinates are 0-16 range per block, and 0-16 range for UV @@ -26,7 +28,10 @@ public interface ModelBlockModel extends BlockModel { * * @param from - vector of lower left corner of box (0-16 range for coordinates - min x, y, z) * @param to - vector of upper right corner of box (0-16 range for coordinates max x, y, z) + * @param xrot - degrees of rotation of block around X + * @param yrot - degrees of rotation of block around Y + * @param zrot - degrees of rotation of block around Z * @return model block to add faces to */ - public ModelBlock addModelBlock(double[] from, double[] to); + public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot); } diff --git a/DynmapCoreAPI/src/main/java/org/dynmap/renderer/RenderPatchFactory.java b/DynmapCoreAPI/src/main/java/org/dynmap/renderer/RenderPatchFactory.java index 0db8915b..e3301f6b 100644 --- a/DynmapCoreAPI/src/main/java/org/dynmap/renderer/RenderPatchFactory.java +++ b/DynmapCoreAPI/src/main/java/org/dynmap/renderer/RenderPatchFactory.java @@ -85,6 +85,19 @@ public interface RenderPatchFactory { */ @Deprecated public RenderPatch getPatch(double x0, double y0, double z0, double xu, double yu, double zu, double xv, double yv, double zv, double uplusvmax, SideVisible sidevis, int textureidx); + /** + * Get/create patch with given attributes. + * + * Generate from existing patch, after rotating xrot degrees around the X axis then yrot degrees around the Y axis, and then zrot degrees arond Z. + * + * @param patch - original patch + * @param xrot - degrees to rotate around X + * @param yrot - degrees to rotate around Y + * @param zrot - degrees to rotate around Z + * @param textureidx - texture index to be used for rotated patch (-1 means same as original patch) + * @return patch requested + */ + public RenderPatch getRotatedPatch(RenderPatch patch, double xrot, double yrot, double zrot, int textureidx); /** * Get/create patch with given attributes. *