From dacd51aabb60c745d9f32c7aac74637cda7712fa Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Tue, 15 Feb 2022 22:39:01 -0600 Subject: [PATCH] Fix handling of flipped texture offsets --- .../src/main/java/org/dynmap/exporter/OBJExport.java | 3 +++ .../src/main/java/org/dynmap/hdmap/HDBlockModels.java | 2 ++ .../src/main/java/org/dynmap/hdmap/IsoHDPerspective.java | 5 +++++ .../dynmap/modsupport/impl/ModModelDefinitionImpl.java | 3 +++ .../src/main/java/org/dynmap/utils/PatchDefinition.java | 8 +++++--- .../main/java/org/dynmap/renderer/RenderPatchFactory.java | 2 +- 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/DynmapCore/src/main/java/org/dynmap/exporter/OBJExport.java b/DynmapCore/src/main/java/org/dynmap/exporter/OBJExport.java index 46afafdc..237c4b74 100644 --- a/DynmapCore/src/main/java/org/dynmap/exporter/OBJExport.java +++ b/DynmapCore/src/main/java/org/dynmap/exporter/OBJExport.java @@ -529,6 +529,9 @@ public class OBJExport { case TOPFLIPV: f.faceLine = String.format("f %d/%d %d/%d %d/%d %d/%d\n", v[0], uv[0], v[1], uv[1], v[2], uv[2], v[3], uv[3]); break; + case TOPFLIPHV: + f.faceLine = String.format("f %d/%d %d/%d %d/%d %d/%d\n", v[0], uv[0], v[1], uv[1], v[2], uv[2], v[3], uv[3]); + break; case BOTTOM: f.faceLine = String.format("f %d/%d %d/%d %d/%d %d/%d\n", v[3], uv[3], v[2], uv[2], v[1], uv[1], v[0], uv[0]); break; diff --git a/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java b/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java index e3156227..6b7b1ef3 100644 --- a/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java +++ b/DynmapCore/src/main/java/org/dynmap/hdmap/HDBlockModels.java @@ -683,6 +683,8 @@ public class HDBlockModels { p_sidevis = SideVisible.TOPFLIP; else if(av[1].equals("topflipv")) p_sidevis = SideVisible.TOPFLIPV; + else if(av[1].equals("topfliphv")) + p_sidevis = SideVisible.TOPFLIPHV; else if(av[1].equals("bottom")) p_sidevis = SideVisible.BOTTOM; else if(av[1].equals("flip")) diff --git a/DynmapCore/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java b/DynmapCore/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java index f9ff2d71..006d77b8 100644 --- a/DynmapCore/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java +++ b/DynmapCore/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java @@ -411,6 +411,7 @@ public class IsoHDPerspective implements HDPerspective { case TOP: case TOPFLIP: case TOPFLIPV: + case TOPFLIPHV: if (det < 0.000001) { return hitcnt; } @@ -464,6 +465,10 @@ public class IsoHDPerspective implements HDPerspective { else if (pd.sidevis == SideVisible.TOPFLIPV) { patch_v[hitcnt] = 1 - v; } + else if (pd.sidevis == SideVisible.TOPFLIPHV) { + patch_u[hitcnt] = 1 - u; + patch_v[hitcnt] = 1 - v; + } } else { if (pd.sidevis == SideVisible.FLIP) { 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 6739b46b..53b88718 100644 --- a/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModModelDefinitionImpl.java +++ b/DynmapCore/src/main/java/org/dynmap/modsupport/impl/ModModelDefinitionImpl.java @@ -299,6 +299,9 @@ public class ModModelDefinitionImpl implements ModModelDefinition { case TOPFLIPV: line += ",visibility=topflipv"; break; + case TOPFLIPHV: + line += ",visibility=topfliphv"; + break; case FLIP: line += ",visibility=flip"; break; diff --git a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java index a75b1d52..7a3c3374 100644 --- a/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java +++ b/DynmapCore/src/main/java/org/dynmap/utils/PatchDefinition.java @@ -312,8 +312,10 @@ public class PatchDefinition implements RenderPatch { boolean flipU = false, flipV = false; if (uv != null) { // MC V is top down, so flip patchuv = new double[] { uv[0] / 16.0, 1 - uv[3] / 16.0, uv[2] / 16.0, 1 - uv[1] / 16.0 }; - 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; } +// 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; } + if (patchuv[0] > patchuv[2]) { flipU = true; patchuv[0] = 1.0 - patchuv[0]; patchuv[2] = 1.0 - patchuv[2]; } + if (patchuv[1] > patchuv[3]) { flipV = true; patchuv[1] = 1.0 - patchuv[1]; patchuv[3] = 1.0 - patchuv[3]; } } switch (face) { @@ -450,6 +452,6 @@ public class PatchDefinition implements RenderPatch { txtV.add(txtorig); // And add it to compute full V } 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 ? (flipV ? SideVisible.TOP : SideVisible.TOPFLIP) : (flipV ? SideVisible.TOPFLIPV : SideVisible.TOP), textureid, patchuv[1], patchuv[3]); + patchuv[0], patchuv[2], patchuv[1], patchuv[3], flipU ? (flipV ? SideVisible.TOPFLIPHV : SideVisible.TOPFLIP) : (flipV ? SideVisible.TOPFLIPV : SideVisible.TOP), textureid, patchuv[1], patchuv[3]); } } diff --git a/DynmapCoreAPI/src/main/java/org/dynmap/renderer/RenderPatchFactory.java b/DynmapCoreAPI/src/main/java/org/dynmap/renderer/RenderPatchFactory.java index cee67cc3..34ed3401 100644 --- a/DynmapCoreAPI/src/main/java/org/dynmap/renderer/RenderPatchFactory.java +++ b/DynmapCoreAPI/src/main/java/org/dynmap/renderer/RenderPatchFactory.java @@ -1,7 +1,7 @@ package org.dynmap.renderer; public interface RenderPatchFactory { - public enum SideVisible { TOP, BOTTOM, BOTH, FLIP, TOPFLIP, TOPFLIPV }; + public enum SideVisible { TOP, BOTTOM, BOTH, FLIP, TOPFLIP, TOPFLIPV, TOPFLIPHV }; /** * Get/create patch with given attributes.