From d2c006dfd96797a1a4e777adbf6a16b2b5c6c267 Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Tue, 16 Apr 2019 19:04:33 +0200 Subject: [PATCH] [libgdx] Rotated mesh region UV loading. --- .../spine/attachments/MeshAttachment.java | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/attachments/MeshAttachment.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/attachments/MeshAttachment.java index 513a27ab1..d5decd23a 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/attachments/MeshAttachment.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/attachments/MeshAttachment.java @@ -74,35 +74,55 @@ public class MeshAttachment extends VertexAttachment { float[] regionUVs = this.regionUVs; if (this.uvs == null || this.uvs.length != regionUVs.length) this.uvs = new float[regionUVs.length]; float[] uvs = this.uvs; - float u, v, width, height; + int n = uvs.length; + float u = region.getU(), v = region.getV(), width, height; if (region instanceof AtlasRegion) { AtlasRegion region = (AtlasRegion)this.region; float textureWidth = region.getTexture().getWidth(), textureHeight = region.getTexture().getHeight(); - if (region.rotate) { - u = region.getU() - (region.originalHeight - region.offsetY - region.packedWidth) / textureWidth; - v = region.getV() - (region.originalWidth - region.offsetX - region.packedHeight) / textureHeight; + switch (region.degrees) { + case 90: + u -= (region.originalHeight - region.offsetY - region.packedWidth) / textureWidth; + v -= (region.originalWidth - region.offsetX - region.packedHeight) / textureHeight; width = region.originalHeight / textureWidth; height = region.originalWidth / textureHeight; - for (int i = 0, n = uvs.length; i < n; i += 2) { + for (int i = 0; i < n; i += 2) { uvs[i] = u + regionUVs[i + 1] * width; - uvs[i + 1] = v + height - regionUVs[i] * height; + uvs[i + 1] = v + (1 - regionUVs[i]) * height; + } + return; + case 180: + u -= (region.originalWidth - region.offsetX - region.packedWidth) / textureWidth; + v -= region.offsetY / textureHeight; + width = region.originalWidth / textureWidth; + height = region.originalHeight / textureHeight; + for (int i = 0; i < n; i += 2) { + uvs[i] = u + (1 - regionUVs[i]) * width; + uvs[i + 1] = v + (1 - regionUVs[i + 1]) * height; + } + return; + case 270: + u -= region.offsetY / textureWidth; + v -= region.offsetX / textureHeight; + width = region.originalHeight / textureWidth; + height = region.originalWidth / textureHeight; + for (int i = 0; i < n; i += 2) { + uvs[i] = u + (1 - regionUVs[i + 1]) * width; + uvs[i + 1] = v + regionUVs[i] * height; } return; } - u = region.getU() - region.offsetX / textureWidth; - v = region.getV() - (region.originalHeight - region.offsetY - region.packedHeight) / textureHeight; + u -= region.offsetX / textureWidth; + v -= (region.originalHeight - region.offsetY - region.packedHeight) / textureHeight; width = region.originalWidth / textureWidth; height = region.originalHeight / textureHeight; } else if (region == null) { u = v = 0; width = height = 1; } else { - u = region.getU(); - v = region.getV(); width = region.getU2() - u; height = region.getV2() - v; } - for (int i = 0, n = uvs.length; i < n; i += 2) { + for (int i = 0; i < n; i += 2) { uvs[i] = u + regionUVs[i] * width; uvs[i + 1] = v + regionUVs[i + 1] * height; }