Fix handling of flipped texture offsets

This commit is contained in:
Mike Primm 2022-02-15 22:39:01 -06:00
parent 53c4ebf233
commit dacd51aabb
6 changed files with 19 additions and 4 deletions

View File

@ -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;

View File

@ -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"))

View File

@ -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) {

View File

@ -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;

View File

@ -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]);
}
}

View File

@ -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.