[as3] Ported rotated mesh region UV loading. See #1327.

This commit is contained in:
badlogic 2019-04-18 17:06:10 +02:00
parent 0a3f6cc28c
commit 1ea001110e
7 changed files with 79 additions and 7 deletions

View File

@ -29,6 +29,7 @@
*****************************************************************************/
package spine.atlas {
import flash.trace.Trace;
import flash.utils.ByteArray;
public class Atlas {
@ -97,7 +98,15 @@ package spine.atlas {
region.name = line;
region.page = page;
region.rotate = reader.readValue() == "true";
var rotateValue : String = reader.readValue();
if (rotateValue == "true") {
region.degrees = 90;
} else if (rotateValue == "false") {
region.degrees = 0;
} else {
region.degrees = parseInt(rotateValue);
}
region.rotate = region.degrees == 90;
reader.readTuple(tuple);
var x : int = parseInt(tuple[0]);

View File

@ -46,6 +46,7 @@ package spine.atlas {
public var originalHeight : int;
public var index : int;
public var rotate : Boolean;
public var degrees : int;
public var splits : Vector.<int>;
public var pads : Vector.<int>;
public var rendererObject : Object;

View File

@ -48,8 +48,8 @@ package spine.attachments {
throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")");
var attachment : RegionAttachment = new RegionAttachment(name);
attachment.rendererObject = region;
var scaleX : Number = region.page.width / nextPOT(region.page.width);
var scaleY : Number = region.page.height / nextPOT(region.page.height);
var scaleX : Number = 1;
var scaleY : Number = 1;
attachment.setUVs(region.u * scaleX, region.v * scaleY, region.u2 * scaleX, region.v2 * scaleY, region.rotate);
attachment.regionOffsetX = region.offsetX;
attachment.regionOffsetY = region.offsetY;
@ -66,13 +66,14 @@ package spine.attachments {
throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")");
var attachment : MeshAttachment = new MeshAttachment(name);
attachment.rendererObject = region;
var scaleX : Number = region.page.width / nextPOT(region.page.width);
var scaleY : Number = region.page.height / nextPOT(region.page.height);
var scaleX : Number = 1;
var scaleY : Number = 1;
attachment.regionU = region.u * scaleX;
attachment.regionV = region.v * scaleY;
attachment.regionU2 = region.u2 * scaleX;
attachment.regionV2 = region.v2 * scaleY;
attachment.regionRotate = region.rotate;
attachment.regionDegrees = region.degrees;
attachment.regionOffsetX = region.offsetX;
attachment.regionOffsetY = region.offsetY;
attachment.regionWidth = region.width;

View File

@ -46,6 +46,7 @@ package spine.attachments {
public var regionU2 : Number;
public var regionV2 : Number;
public var regionRotate : Boolean;
public var regionDegrees : int;
public var regionOffsetX : Number; // Pixels stripped from the bottom left, unrotated.
public var regionOffsetY : Number;
public var regionWidth : Number; // Unrotated, stripped size.
@ -62,7 +63,67 @@ package spine.attachments {
}
public function updateUVs() : void {
var i : int, n : int = regionUVs.length;
var i : int = 0, n : int = regionUVs.length;
var u : Number = regionU, v : Number = regionV;
var width : Number = 0, height : Number = 0;
var textureWidth : Number, textureHeight : Number;
if (!uvs || uvs.length != n) uvs = new Vector.<Number>(n, true);
switch (regionDegrees) {
case 90: {
textureWidth = regionHeight / (regionU2 - regionU);
textureHeight = regionWidth / (regionV2 - regionV);
u -= (regionOriginalHeight - regionOffsetY - regionHeight) / textureWidth;
v -= (regionOriginalWidth - regionOffsetX - regionWidth) / textureHeight;
width = regionOriginalHeight / textureWidth;
height = regionOriginalWidth / textureHeight;
for (i = 0; i < n; i += 2) {
uvs[i] = u + regionUVs[i + 1] * width;
uvs[i + 1] = v + (1 - regionUVs[i]) * height;
}
return;
}
case 180: {
textureWidth = regionWidth / (regionU2 - regionU);
textureHeight = regionHeight / (regionV2 - regionV);
u -= (regionOriginalWidth - regionOffsetX - regionWidth) / textureWidth;
v -= regionOffsetY / textureHeight;
width = regionOriginalWidth / textureWidth;
height = regionOriginalHeight / textureHeight;
for (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: {
textureWidth = regionWidth / (regionU2 - regionU);
textureHeight = regionHeight / (regionV2 - regionV);
u -= regionOffsetY / textureWidth;
v -= regionOffsetX / textureHeight;
width = regionOriginalHeight / textureWidth;
height = regionOriginalWidth / textureHeight;
for (i = 0; i < n; i += 2) {
uvs[i] = u + (1 - regionUVs[i + 1]) * width;
uvs[i + 1] = v + regionUVs[i] * height;
}
return;
}
default: {
textureWidth = regionWidth / (regionU2 - regionU);
textureHeight = regionHeight / (regionV2 - regionV);
u -= regionOffsetX / textureWidth;
v -= (regionOriginalHeight - regionOffsetY - regionHeight) / textureHeight;
width = regionOriginalWidth / textureWidth;
height = regionOriginalHeight / textureHeight;
for (i = 0; i < n; i += 2) {
uvs[i] = u + regionUVs[i] * width;
uvs[i + 1] = v + regionUVs[i + 1] * height;
}
}
}
/*var i : int, n : int = regionUVs.length;
var u: Number, v: Number, width: Number, height: Number;
var textureWidth: Number, textureHeight: Number;
if (!uvs || uvs.length != n) uvs = new Vector.<Number>(n, true);
@ -88,7 +149,7 @@ package spine.attachments {
uvs[i] = u + regionUVs[i] * width;
uvs[int(i + 1)] = v + regionUVs[int(i + 1)] * height;
}
}
}*/
}
override public function applyDeform(sourceAttachment : VertexAttachment) : Boolean {