From ff2e1b3b50b6c65b77f122fef1daceddccef7a2e Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Thu, 10 Feb 2022 22:18:19 -0600 Subject: [PATCH] Fix scaled textures in ModelBlockModel patches --- .../java/org/dynmap/hdmap/HDBlockModels.java | 1 + .../impl/ModModelDefinitionImpl.java | 1 + .../modsupport/impl/ModelBlockModelImpl.java | 6 ++-- .../org/dynmap/utils/PatchDefinition.java | 32 +++++++++---------- .../dynmap/utils/PatchDefinitionFactory.java | 15 +++++---- 5 files changed, 28 insertions(+), 27 deletions(-) diff --git a/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java b/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java index 1a961157..c5fd9570 100644 --- a/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java +++ b/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java @@ -1033,6 +1033,7 @@ public class HDBlockModels { } else { Log.severe(String.format("Invalid modellist patch for box %f/%f/%f:%f/%f/%f side %s at line %d", bl.from[0], bl.from[1], bl.from[2], bl.to[0], bl.to[1], bl.to[2], side.side, lineNum)); + Log.severe(String.format("line = %s:%s", typeid, line)); } } } 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 9d584b9d..6739b46b 100644 --- a/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModModelDefinitionImpl.java +++ b/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModModelDefinitionImpl.java @@ -26,6 +26,7 @@ import org.dynmap.renderer.RenderPatchFactory.SideVisible; import org.dynmap.utils.PatchDefinition; import org.dynmap.utils.PatchDefinitionFactory; +@SuppressWarnings("deprecation") public class ModModelDefinitionImpl implements ModModelDefinition { private final ModTextureDefinitionImpl txtDef; private boolean published = false; 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 39d8eee7..aebee9b1 100644 --- a/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModelBlockModelImpl.java +++ b/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModelBlockModelImpl.java @@ -3,8 +3,6 @@ package org.dynmap.modsupport.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; import org.dynmap.modsupport.BlockSide; import org.dynmap.modsupport.ModelBlockModel; @@ -60,8 +58,8 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod fromBlockSide.put(BlockSide.BOTTOM, "d"); fromBlockSide.put(BlockSide.NORTH, "n"); fromBlockSide.put(BlockSide.SOUTH, "s"); - fromBlockSide.put(BlockSide.WEST, "e"); - fromBlockSide.put(BlockSide.EAST, "w"); + fromBlockSide.put(BlockSide.WEST, "w"); + fromBlockSide.put(BlockSide.EAST, "e"); }; @Override diff --git a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java index 54415c8e..868e89f2 100644 --- a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java +++ b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java @@ -221,26 +221,26 @@ public class PatchDefinition implements RenderPatch { public boolean validate() { boolean good = true; // 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; + double xx0 = x0 + (xu - x0) * umin + (xv - x0) * vmin; + double xx1 = x0 + (xu - x0) * vmin + (xv - x0) * vmax; + double xx2 = x0 + (xu - x0) * umax + (xv - x0) * vmin; + double xx3 = x0 + (xu - x0) * vmax + (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; } - double yy0 = y0 + (yu - y0) * umin; - double yy1 = y0 + (yv - y0) * vmin; - double yy2 = y0 + (yu - y0) * umax; - double yy3 = y0 + (yv - y0) * vmax; + double yy0 = y0 + (yu - y0) * umin + (yv - y0) * vmin; + double yy1 = y0 + (yu - y0) * vmin + (yv - y0) * vmax; + double yy2 = y0 + (yu - y0) * umax + (yv - y0) * vmin; + double yy3 = y0 + (yu - y0) * vmax + (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; } - double zz0 = z0 + (zu - z0) * umin; - double zz1 = z0 + (zv - z0) * vmin; - double zz2 = z0 + (zu - z0) * umax; - double zz3 = z0 + (zv - z0) * vmax; + double zz0 = z0 + (zu - z0) * umin + (zv - z0) * vmin; + double zz1 = z0 + (zu - z0) * vmin + (zv - z0) * vmax; + double zz2 = z0 + (zu - z0) * umax + (zv - z0) * vmin; + double zz3 = z0 + (zu - z0) * vmax + (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; @@ -315,6 +315,7 @@ public class PatchDefinition implements RenderPatch { if (patchuv[0] > patchuv[2]) { flipU = true; double save = patchuv[0]; patchuv[0] = patchuv[2]; patchuv[2] = save; } if (patchuv[1] > patchuv[3]) { flipV = true; double save = patchuv[1]; patchuv[1] = patchuv[3]; patchuv[3] = save; } } + switch (face) { case BOTTOM: case FACE_0: @@ -423,7 +424,6 @@ public class PatchDefinition implements RenderPatch { upleft = upright; upright = save; } - //System.out.println(String.format("ll=%s, lr=%s, ul=%s, ur=%s", lowleft, lowright, upleft, upright)); // Compute texture origin, based on corners and patchuv Vector3D txtorig = new Vector3D(); Vector3D txtU = new Vector3D(); @@ -435,12 +435,12 @@ public class PatchDefinition implements RenderPatch { double du = patchuv[2] - patchuv[0]; txtU.set(lowright).subtract(lowleft); // vector along U double uScale = txtU.length() / du; - txtU.scale(uScale / du); // Compute full U vect + txtU.scale(uScale / txtU.length()); // Compute full U vect // Compute V axis double dv = patchuv[3] - patchuv[1]; txtV.set(upleft).subtract(lowleft); // vector along V double vScale = txtV.length() / dv; - txtV.scale(vScale / dv); // Compute full V vect + txtV.scale(vScale / txtV.length()); // Compute full V vect // Compute texture origin txtorig.set(txtU).scale(-patchuv[0]).add(lowleft); wrk.set(txtV).scale(-patchuv[1]); @@ -449,8 +449,6 @@ public class PatchDefinition implements RenderPatch { txtU.add(txtorig); // And add it for full U txtV.add(txtorig); // And add it to compute full V } -// System.out.println(String.format("txtO=%s, txtU=%s, txtV=%s, uv=%f/%f/%f/%f", txtorig, txtU, txtV, patchuv[0], patchuv[1], patchuv[2], -// patchuv[3])); update(txtorig.x, txtorig.y, txtorig.z, txtU.x, txtU.y, txtU.z, txtV.x, txtV.y, txtV.z, patchuv[0], patchuv[2], patchuv[1], patchuv[3], flipU ? SideVisible.TOPFLIP : (flipV ? SideVisible.TOPFLIPV : SideVisible.TOP), textureid, patchuv[1], patchuv[3]); } diff --git a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinitionFactory.java b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinitionFactory.java index a9174044..b4359514 100644 --- a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinitionFactory.java +++ b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinitionFactory.java @@ -198,18 +198,21 @@ public class PatchDefinitionFactory implements RenderPatchFactory { // public static void main(String[] args) { // PatchDefinition pd; -// BlockSide[] faces = { BlockSide.NORTH, BlockSide.EAST, BlockSide.SOUTH, BlockSide.WEST, BlockSide.TOP, BlockSide.BOTTOM }; +// +// // box=0.000000/3.000000/9.000000:2.000000/6.000000/13.000000: +// // w/0/13.000000/7.000000/15.000000/10.000000:d/0/0.000000/9.000000/2.000000/13.000000:e/0/13.000000/7.000000/15.000000/10.000000:u/0/0.000000/9.000000/2.000000/13.000000:R/0/180/0 +// BlockSide[] faces = { BlockSide.WEST, BlockSide.BOTTOM, BlockSide.EAST, BlockSide.TOP }; // // campfire log:box=1/0/0:5/4/16:n/0/0/4/4/8:e/0/0/1/16/5:s/0/0/4/4/8:w/0/16/0/0/4:u90/0/0/0/16/4:d90/0/0/0/16/4 -// double[][] uvs = { { 0, 4, 4, 8 }, { 0, 1, 16, 5 }, { 0, 4, 4, 8 }, { 16, 0, 0, 4 }, { 0, 0, 16, 4 }, { 0, 0, 16, 4 } }; +// double[][] uvs = { { 13, 7, 15, 10 }, { 0, 9, 2, 13 }, { 13, 7, 15, 10 }, { 0, 9, 2, 13 } }; // ModelBlockModel.SideRotation[] rots = { ModelBlockModel.SideRotation.DEG0, ModelBlockModel.SideRotation.DEG0, ModelBlockModel.SideRotation.DEG0, -// ModelBlockModel.SideRotation.DEG0, ModelBlockModel.SideRotation.DEG90, ModelBlockModel.SideRotation.DEG90 }; -// double[] from = { 1, 0, 0 }; -// double[] to = { 5, 4, 16 }; +// ModelBlockModel.SideRotation.DEG0 }; +// double[] from = { 0, 3, 9 }; +// double[] to = { 2, 6, 13 }; // // // Do normal faces, default limits // pd = new PatchDefinition(); // for (int i = 0; i < faces.length; i++) { -// pd.updateModelFace(from, to, faces[i], uvs[i], rots[i], 0); +// pd.updateModelFace(from, to, faces[i], uvs[i], rots[i], true, 0); // System.out.println("Log " + faces[i] + ": " + pd); // } //