Просмотр исходного кода

[ts] Updated parser to new atlas format

Not quite working yet.
badlogic 4 лет назад
Родитель
Сommit
9087ed61ae
53 измененных файлов с 895 добавлено и 3106 удалено
  1. 1 1
      spine-ts/canvas/example/assets/spineboy-ess.json
  2. 59 245
      spine-ts/canvas/example/assets/spineboy.atlas
  3. BIN
      spine-ts/canvas/example/assets/spineboy.png
  4. 1 1
      spine-ts/core/src/Texture.ts
  5. 150 105
      spine-ts/core/src/TextureAtlas.ts
  6. 1 1
      spine-ts/core/src/attachments/RegionAttachment.ts
  7. 61 233
      spine-ts/player/example/assets/raptor-pma.atlas
  8. BIN
      spine-ts/player/example/assets/raptor-pma.png
  9. 1 1
      spine-ts/player/example/assets/raptor-pro.json
  10. 60 245
      spine-ts/player/example/assets/spineboy-pma.atlas
  11. BIN
      spine-ts/player/example/assets/spineboy-pma.png
  12. BIN
      spine-ts/player/example/assets/spineboy-pro.skel
  13. 1 1
      spine-ts/threejs/example/assets/raptor-pro.json
  14. 60 233
      spine-ts/threejs/example/assets/raptor.atlas
  15. BIN
      spine-ts/threejs/example/assets/raptor.png
  16. 11 47
      spine-ts/webgl/example/assets/coin-pma.atlas
  17. BIN
      spine-ts/webgl/example/assets/coin-pma.png
  18. 1 1
      spine-ts/webgl/example/assets/coin-pro.json
  19. BIN
      spine-ts/webgl/example/assets/coin-pro.skel
  20. 55 251
      spine-ts/webgl/example/assets/goblins-pma.atlas
  21. BIN
      spine-ts/webgl/example/assets/goblins-pma.png
  22. 1 1
      spine-ts/webgl/example/assets/goblins-pro.json
  23. BIN
      spine-ts/webgl/example/assets/goblins-pro.skel
  24. 213 893
      spine-ts/webgl/example/assets/mix-and-match-pma.atlas
  25. BIN
      spine-ts/webgl/example/assets/mix-and-match-pma.png
  26. 1 1
      spine-ts/webgl/example/assets/mix-and-match-pro.json
  27. BIN
      spine-ts/webgl/example/assets/mix-and-match-pro.skel
  28. 45 167
      spine-ts/webgl/example/assets/owl-pma.atlas
  29. BIN
      spine-ts/webgl/example/assets/owl-pma.png
  30. 1 1
      spine-ts/webgl/example/assets/owl-pro.json
  31. BIN
      spine-ts/webgl/example/assets/owl-pro.skel
  32. 61 233
      spine-ts/webgl/example/assets/raptor-pma.atlas
  33. BIN
      spine-ts/webgl/example/assets/raptor-pma.png
  34. 1 1
      spine-ts/webgl/example/assets/raptor-pro.json
  35. BIN
      spine-ts/webgl/example/assets/raptor-pro.skel
  36. 60 245
      spine-ts/webgl/example/assets/spineboy-pma.atlas
  37. BIN
      spine-ts/webgl/example/assets/spineboy-pma.png
  38. 1 1
      spine-ts/webgl/example/assets/spineboy-pro.json
  39. BIN
      spine-ts/webgl/example/assets/spineboy-pro.skel
  40. BIN
      spine-ts/webgl/example/assets/spineboy.png
  41. 10 35
      spine-ts/webgl/example/assets/stretchyman-pma.atlas
  42. BIN
      spine-ts/webgl/example/assets/stretchyman-pma.png
  43. 1 1
      spine-ts/webgl/example/assets/stretchyman-pro.json
  44. BIN
      spine-ts/webgl/example/assets/stretchyman-pro.skel
  45. 31 149
      spine-ts/webgl/example/assets/tank-pma.atlas
  46. BIN
      spine-ts/webgl/example/assets/tank-pma.png
  47. 1 1
      spine-ts/webgl/example/assets/tank-pro.json
  48. BIN
      spine-ts/webgl/example/assets/tank-pro.skel
  49. 4 11
      spine-ts/webgl/example/assets/vine-pma.atlas
  50. BIN
      spine-ts/webgl/example/assets/vine-pma.png
  51. 1 1
      spine-ts/webgl/example/assets/vine-pro.json
  52. BIN
      spine-ts/webgl/example/assets/vine-pro.skel
  53. 1 0
      spine-ts/webgl/tests/test-binary.html

+ 1 - 1
spine-ts/canvas/example/assets/spineboy-ess.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "lS/mQzJwi+I",
 	"hash": "lS/mQzJwi+I",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -221.27,
 	"x": -221.27,
 	"y": -8.57,
 	"y": -8.57,
 	"width": 470.72,
 	"width": 470.72,

+ 59 - 245
spine-ts/canvas/example/assets/spineboy.atlas

@@ -1,286 +1,100 @@
-
 spineboy.png
 spineboy.png
-size: 1024,256
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 256
+	filter: Linear, Linear
 crosshair
 crosshair
-  rotate: false
-  xy: 813, 160
-  size: 45, 45
-  orig: 45, 45
-  offset: 0, 0
-  index: -1
+	bounds: 813, 160, 45, 45
 eye-indifferent
 eye-indifferent
-  rotate: false
-  xy: 569, 2
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 569, 2, 47, 45
 eye-surprised
 eye-surprised
-  rotate: true
-  xy: 643, 7
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 643, 7, 47, 45
+	rotate: 90
 front-bracer
 front-bracer
-  rotate: false
-  xy: 811, 51
-  size: 29, 40
-  orig: 29, 40
-  offset: 0, 0
-  index: -1
+	bounds: 811, 51, 29, 40
 front-fist-closed
 front-fist-closed
-  rotate: false
-  xy: 807, 93
-  size: 38, 41
-  orig: 38, 41
-  offset: 0, 0
-  index: -1
+	bounds: 807, 93, 38, 41
 front-fist-open
 front-fist-open
-  rotate: false
-  xy: 815, 210
-  size: 43, 44
-  orig: 43, 44
-  offset: 0, 0
-  index: -1
+	bounds: 815, 210, 43, 44
 front-foot
 front-foot
-  rotate: true
-  xy: 706, 64
-  size: 63, 35
-  orig: 63, 35
-  offset: 0, 0
-  index: -1
+	bounds: 706, 64, 63, 35
+	rotate: 90
 front-shin
 front-shin
-  rotate: false
-  xy: 80, 11
-  size: 41, 92
-  orig: 41, 92
-  offset: 0, 0
-  index: -1
+	bounds: 80, 11, 41, 92
 front-thigh
 front-thigh
-  rotate: false
-  xy: 754, 12
-  size: 23, 56
-  orig: 23, 56
-  offset: 0, 0
-  index: -1
+	bounds: 754, 12, 23, 56
 front-upper-arm
 front-upper-arm
-  rotate: false
-  xy: 618, 5
-  size: 23, 49
-  orig: 23, 49
-  offset: 0, 0
-  index: -1
+	bounds: 618, 5, 23, 49
 goggles
 goggles
-  rotate: false
-  xy: 214, 20
-  size: 131, 83
-  orig: 131, 83
-  offset: 0, 0
-  index: -1
+	bounds: 214, 20, 131, 83
 gun
 gun
-  rotate: true
-  xy: 347, 14
-  size: 105, 102
-  orig: 105, 102
-  offset: 0, 0
-  index: -1
+	bounds: 347, 14, 105, 102
+	rotate: 90
 head
 head
-  rotate: false
-  xy: 80, 105
-  size: 136, 149
-  orig: 136, 149
-  offset: 0, 0
-  index: -1
+	bounds: 80, 105, 136, 149
 hoverboard-board
 hoverboard-board
-  rotate: true
-  xy: 2, 8
-  size: 246, 76
-  orig: 246, 76
-  offset: 0, 0
-  index: -1
+	bounds: 2, 8, 246, 76
+	rotate: 90
 hoverboard-thruster
 hoverboard-thruster
-  rotate: false
-  xy: 478, 2
-  size: 30, 32
-  orig: 30, 32
-  offset: 0, 0
-  index: -1
+	bounds: 478, 2, 30, 32
 hoverglow-small
 hoverglow-small
-  rotate: true
-  xy: 218, 117
-  size: 137, 38
-  orig: 137, 38
-  offset: 0, 0
-  index: -1
+	bounds: 218, 117, 137, 38
+	rotate: 90
 mouth-grind
 mouth-grind
-  rotate: true
-  xy: 775, 80
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 775, 80, 47, 30
+	rotate: 90
 mouth-oooo
 mouth-oooo
-  rotate: true
-  xy: 779, 31
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 779, 31, 47, 30
+	rotate: 90
 mouth-smile
 mouth-smile
-  rotate: true
-  xy: 783, 207
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 783, 207, 47, 30
+	rotate: 90
 muzzle-glow
 muzzle-glow
-  rotate: false
-  xy: 779, 4
-  size: 25, 25
-  orig: 25, 25
-  offset: 0, 0
-  index: -1
+	bounds: 779, 4, 25, 25
 muzzle-ring
 muzzle-ring
-  rotate: false
-  xy: 451, 14
-  size: 25, 105
-  orig: 25, 105
-  offset: 0, 0
-  index: -1
+	bounds: 451, 14, 25, 105
 muzzle01
 muzzle01
-  rotate: true
-  xy: 664, 60
-  size: 67, 40
-  orig: 67, 40
-  offset: 0, 0
-  index: -1
+	bounds: 664, 60, 67, 40
+	rotate: 90
 muzzle02
 muzzle02
-  rotate: true
-  xy: 580, 56
-  size: 68, 42
-  orig: 68, 42
-  offset: 0, 0
-  index: -1
+	bounds: 580, 56, 68, 42
+	rotate: 90
 muzzle03
 muzzle03
-  rotate: true
-  xy: 478, 36
-  size: 83, 53
-  orig: 83, 53
-  offset: 0, 0
-  index: -1
+	bounds: 478, 36, 83, 53
+	rotate: 90
 muzzle04
 muzzle04
-  rotate: true
-  xy: 533, 49
-  size: 75, 45
-  orig: 75, 45
-  offset: 0, 0
-  index: -1
+	bounds: 533, 49, 75, 45
+	rotate: 90
 muzzle05
 muzzle05
-  rotate: true
-  xy: 624, 56
-  size: 68, 38
-  orig: 68, 38
-  offset: 0, 0
-  index: -1
+	bounds: 624, 56, 68, 38
+	rotate: 90
 neck
 neck
-  rotate: false
-  xy: 806, 8
-  size: 18, 21
-  orig: 18, 21
-  offset: 0, 0
-  index: -1
+	bounds: 806, 8, 18, 21
 portal-bg
 portal-bg
-  rotate: false
-  xy: 258, 121
-  size: 133, 133
-  orig: 133, 133
-  offset: 0, 0
-  index: -1
+	bounds: 258, 121, 133, 133
 portal-flare1
 portal-flare1
-  rotate: true
-  xy: 690, 2
-  size: 56, 30
-  orig: 56, 30
-  offset: 0, 0
-  index: -1
+	bounds: 690, 2, 56, 30
+	rotate: 90
 portal-flare2
 portal-flare2
-  rotate: false
-  xy: 510, 3
-  size: 57, 31
-  orig: 57, 31
-  offset: 0, 0
-  index: -1
+	bounds: 510, 3, 57, 31
 portal-flare3
 portal-flare3
-  rotate: true
-  xy: 722, 4
-  size: 58, 30
-  orig: 58, 30
-  offset: 0, 0
-  index: -1
+	bounds: 722, 4, 58, 30
+	rotate: 90
 portal-shade
 portal-shade
-  rotate: false
-  xy: 393, 121
-  size: 133, 133
-  orig: 133, 133
-  offset: 0, 0
-  index: -1
+	bounds: 393, 121, 133, 133
 portal-streaks1
 portal-streaks1
-  rotate: false
-  xy: 528, 126
-  size: 126, 128
-  orig: 126, 128
-  offset: 0, 0
-  index: -1
+	bounds: 528, 126, 126, 128
 portal-streaks2
 portal-streaks2
-  rotate: false
-  xy: 656, 129
-  size: 125, 125
-  orig: 125, 125
-  offset: 0, 0
-  index: -1
+	bounds: 656, 129, 125, 125
 rear-bracer
 rear-bracer
-  rotate: false
-  xy: 826, 13
-  size: 28, 36
-  orig: 28, 36
-  offset: 0, 0
-  index: -1
+	bounds: 826, 13, 28, 36
 rear-foot
 rear-foot
-  rotate: true
-  xy: 743, 70
-  size: 57, 30
-  orig: 57, 30
-  offset: 0, 0
-  index: -1
+	bounds: 743, 70, 57, 30
+	rotate: 90
 rear-shin
 rear-shin
-  rotate: false
-  xy: 174, 14
-  size: 38, 89
-  orig: 38, 89
-  offset: 0, 0
-  index: -1
+	bounds: 174, 14, 38, 89
 rear-thigh
 rear-thigh
-  rotate: false
-  xy: 783, 158
-  size: 28, 47
-  orig: 28, 47
-  offset: 0, 0
-  index: -1
+	bounds: 783, 158, 28, 47
 rear-upper-arm
 rear-upper-arm
-  rotate: true
-  xy: 783, 136
-  size: 20, 44
-  orig: 20, 44
-  offset: 0, 0
-  index: -1
+	bounds: 783, 136, 20, 44
+	rotate: 90
 torso
 torso
-  rotate: false
-  xy: 123, 13
-  size: 49, 90
-  orig: 49, 90
-  offset: 0, 0
-  index: -1
+	bounds: 123, 13, 49, 90

BIN
spine-ts/canvas/example/assets/spineboy.png


+ 1 - 1
spine-ts/core/src/Texture.ts

@@ -87,7 +87,7 @@ module spine {
 		u = 0; v = 0;
 		u = 0; v = 0;
 		u2 = 0; v2 = 0;
 		u2 = 0; v2 = 0;
 		width = 0; height = 0;
 		width = 0; height = 0;
-		rotate = false;
+		degrees = 90;
 		offsetX = 0; offsetY = 0;
 		offsetX = 0; offsetY = 0;
 		originalWidth = 0; originalHeight = 0;
 		originalWidth = 0; originalHeight = 0;
 	}
 	}

+ 150 - 105
spine-ts/core/src/TextureAtlas.ts

@@ -41,100 +41,146 @@ module spine {
 				throw new Error("textureLoader cannot be null.");
 				throw new Error("textureLoader cannot be null.");
 
 
 			let reader = new TextureAtlasReader(atlasText);
 			let reader = new TextureAtlasReader(atlasText);
-			let tuple = new Array<string>(4);
-			let page:TextureAtlasPage = null;
+			let entry = new Array<string>(4);
+			let page: TextureAtlasPage = null;
+			let region: TextureAtlasRegion = null;
+
+			let pageFields: Map<Function> = {};
+			pageFields["size"] = () => {
+				page.width = parseInt(entry[1]);
+				page.height = parseInt(entry[2]);
+			};
+			pageFields["format"] = () => {
+				// page.format = Format[tuple[0]]; we don't need format in WebGL
+			};
+			pageFields["filter"] = () => {
+				page.minFilter = Texture.filterFromString(entry[1]);
+				page.magFilter = Texture.filterFromString(entry[2]);
+			};
+			pageFields["repeat"] = () => {
+				if (entry[1].indexOf('x') != -1) page.uWrap = TextureWrap.Repeat;
+				if (entry[1].indexOf('y') != -1) page.vWrap = TextureWrap.Repeat;
+			};
+			pageFields["pma"] = () => {
+				page.pma = entry[1] == "true";
+			};
+
+			var regionFields: Map<Function> = {};
+			regionFields["xy"] = () => { // Deprecated, use bounds.
+				region.x = parseInt(entry[1]);
+				region.y = parseInt(entry[2]);
+			};
+			regionFields["size"] = () => { // Deprecated, use bounds.
+				region.width = parseInt(entry[1]);
+				region.height = parseInt(entry[2]);
+			};
+			regionFields["bounds"] = () => {
+				region.x = parseInt(entry[1]);
+				region.y = parseInt(entry[2]);
+				region.width = parseInt(entry[3]);
+				region.height = parseInt(entry[4]);
+			};
+			regionFields["offset"] = () => { // Deprecated, use offsets.
+				region.offsetX = parseInt(entry[1]);
+				region.offsetY = parseInt(entry[2]);
+			};
+			regionFields["orig"] = () => { // Deprecated, use offsets.
+				region.originalWidth = parseInt(entry[1]);
+				region.originalHeight = parseInt(entry[2]);
+			};
+			regionFields["offsets"] = () => {
+				region.offsetX = parseInt(entry[1]);
+				region.offsetY = parseInt(entry[2]);
+				region.originalWidth = parseInt(entry[3]);
+				region.originalHeight = parseInt(entry[4]);
+			};
+			regionFields["rotate"] = () => {
+				let value = entry[1];
+				if (value == "true")
+					region.degrees = 90;
+				else if (value != "false")
+					region.degrees = parseInt(value);
+			};
+			regionFields["index"] = () => {
+				region.index = parseInt(entry[1]);
+			};
+
+			let line = reader.readLine();
+			// Ignore empty lines before first entry.
+			while (line != null && line.trim().length == 0)
+				line = reader.readLine();
+			// Header entries.
 			while (true) {
 			while (true) {
-				let line = reader.readLine();
-				if (line == null)
-					break;
-				line = line.trim();
-				if (line.length == 0)
+				if (line == null || line.trim().length == 0) break;
+				if (reader.readEntry(entry, line) == 0) break; // Silently ignore all header fields.
+				line = reader.readLine();
+			}
+
+			// Page and region entries.
+			let names: string[] = null;
+			let values: number[][] = null;
+			while (true) {
+
+				if (line == null) break;
+				if (line.trim().length == 0) {
 					page = null;
 					page = null;
-				else if (!page) {
+					line = reader.readLine();
+				} else if (page == null) {
 					page = new TextureAtlasPage();
 					page = new TextureAtlasPage();
-					page.name = line;
-
-					if (reader.readTuple(tuple) == 2) { // size is only optional for an atlas packed with an old TexturePacker.
-						page.width = parseInt(tuple[0]);
-						page.height = parseInt(tuple[1]);
-						reader.readTuple(tuple);
+					page.name = line.trim();
+					while (true) {
+						if (reader.readEntry(entry, line = reader.readLine()) == 0) break;
+						let field: Function = pageFields[entry[0]];
+						if (field) field();
 					}
 					}
-					// page.format = Format[tuple[0]]; we don't need format in WebGL
-
-					reader.readTuple(tuple);
-					page.minFilter = Texture.filterFromString(tuple[0]);
-					page.magFilter = Texture.filterFromString(tuple[1]);
-
-					let direction= reader.readValue();
-					page.uWrap = TextureWrap.ClampToEdge;
-					page.vWrap = TextureWrap.ClampToEdge;
-					if (direction == "x")
-						page.uWrap = TextureWrap.Repeat;
-					else if (direction == "y")
-						page.vWrap = TextureWrap.Repeat;
-					else if (direction == "xy")
-						page.uWrap = page.vWrap = TextureWrap.Repeat;
-
-					page.texture = textureLoader(line);
+					page.texture = textureLoader(page.name);
 					page.texture.setFilters(page.minFilter, page.magFilter);
 					page.texture.setFilters(page.minFilter, page.magFilter);
 					page.texture.setWraps(page.uWrap, page.vWrap);
 					page.texture.setWraps(page.uWrap, page.vWrap);
-					page.width = page.texture.getImage().width;
-					page.height = page.texture.getImage().height;
+					// page.width = page.texture.getImage().width;
+					// page.height = page.texture.getImage().height;
 					this.pages.push(page);
 					this.pages.push(page);
 				} else {
 				} else {
-					let region:TextureAtlasRegion = new TextureAtlasRegion();
-					region.name = line;
-					region.page = page;
+					region = new TextureAtlasRegion();
 
 
-					let rotateValue = reader.readValue();
-					if (rotateValue.toLocaleLowerCase() == "true") {
-						region.degrees = 90;
-					} else if (rotateValue.toLocaleLowerCase() == "false") {
-						region.degrees = 0;
-					} else {
-						region.degrees = parseFloat(rotateValue);
+					region.page = page;
+					region.name = line;
+					while (true) {
+						let count = reader.readEntry(entry, line = reader.readLine());
+						if (count == 0) break;
+						let field: Function = regionFields[entry[0]];
+						if (field)
+							field();
+						else {
+							if (names == null) {
+								names = [];
+								values = []
+							}
+							names.push(entry[0]);
+							let entryValues: number[] = [];
+							for (let i = 0; i < count; i++)
+								entryValues.push(parseInt(entry[i + 1]));
+							values.push(entryValues);
+						}
 					}
 					}
-					region.rotate = region.degrees == 90;
-
-					reader.readTuple(tuple);
-					let x = parseInt(tuple[0]);
-					let y = parseInt(tuple[1]);
-
-					reader.readTuple(tuple);
-					let width = parseInt(tuple[0]);
-					let height = parseInt(tuple[1]);
-
-					region.u = x / page.width;
-					region.v = y / page.height;
-					if (region.rotate) {
-						region.u2 = (x + height) / page.width;
-						region.v2 = (y + width) / page.height;
-					} else {
-						region.u2 = (x + width) / page.width;
-						region.v2 = (y + height) / page.height;
+					if (region.originalWidth == 0 && region.originalHeight == 0) {
+						region.originalWidth = region.width;
+						region.originalHeight = region.height;
 					}
 					}
-					region.x = x;
-					region.y = y;
-					region.width = Math.abs(width);
-					region.height = Math.abs(height);
-
-					if (reader.readTuple(tuple) == 4) { // split is optional
-						// region.splits = new Vector.<int>(parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3]));
-						if (reader.readTuple(tuple) == 4) { // pad is optional, but only present with splits
-							//region.pads = Vector.<int>(parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3]));
-							reader.readTuple(tuple);
-						}
+					if (names != null && names.length > 0) {
+						region.names = names;
+						region.values = values;
+						names = null;
+						values = null;
+					}
+					region.u = region.x / page.width;
+					region.v = region.y / page.height;
+					if (region.degrees == 90) {
+						region.u2 = (region.x + region.height) / page.width;
+						region.v2 = (region.y + region.width) / page.height;
+					} else {
+						region.u2 = (region.x + region.width) / page.width;
+						region.v2 = (region.y + region.height) / page.height;
 					}
 					}
-
-					region.originalWidth = parseInt(tuple[0]);
-					region.originalHeight = parseInt(tuple[1]);
-
-					reader.readTuple(tuple);
-					region.offsetX = parseInt(tuple[0]);
-					region.offsetY = parseInt(tuple[1]);
-
-					region.index = parseInt(reader.readValue());
-
 					region.texture = page.texture;
 					region.texture = page.texture;
 					this.regions.push(region);
 					this.regions.push(region);
 				}
 				}
@@ -171,40 +217,37 @@ module spine {
 			return this.lines[this.index++];
 			return this.lines[this.index++];
 		}
 		}
 
 
-		readValue (): string {
-			let line = this.readLine();
-			let colon= line.indexOf(":");
-			if (colon == -1)
-				throw new Error("Invalid line: " + line);
-			return line.substring(colon + 1).trim();
-		}
+		readEntry (entry: string[], line: string): number {
+			if (line == null) return 0;
+			line = line.trim();
+			if (line.length == 0) return 0;
 
 
-		readTuple (tuple: Array<string>): number {
-			let line = this.readLine();
-			let colon = line.indexOf(":");
-			if (colon == -1)
-				throw new Error("Invalid line: " + line);
-			let i = 0, lastMatch = colon + 1;
-			for (; i < 3; i++) {
-				let comma = line.indexOf(",", lastMatch);
-				if (comma == -1) break;
-				tuple[i] = line.substr(lastMatch, comma - lastMatch).trim();
+			let colon = line.indexOf(':');
+			if (colon == -1) return 0;
+			entry[0] = line.substr(0, colon).trim();
+			for (let i = 1, lastMatch = colon + 1;; i++) {
+				let comma = line.indexOf(',', lastMatch);
+				if (comma == -1) {
+					entry[i] = line.substr(lastMatch).trim();
+					return i;
+				}
+				entry[i] = line.substr(lastMatch, comma - lastMatch).trim();
 				lastMatch = comma + 1;
 				lastMatch = comma + 1;
+				if (i == 4) return 4;
 			}
 			}
-			tuple[i] = line.substring(lastMatch).trim();
-			return i + 1;
 		}
 		}
 	}
 	}
 
 
 	export class TextureAtlasPage {
 	export class TextureAtlasPage {
 		name: string;
 		name: string;
-		minFilter: TextureFilter;
-		magFilter: TextureFilter;
-		uWrap: TextureWrap;
-		vWrap: TextureWrap;
+		minFilter: TextureFilter = TextureFilter.Nearest;
+		magFilter: TextureFilter = TextureFilter.Nearest;
+		uWrap: TextureWrap = TextureWrap.ClampToEdge;
+		vWrap: TextureWrap = TextureWrap.ClampToEdge;
 		texture: Texture;
 		texture: Texture;
 		width: number;
 		width: number;
 		height: number;
 		height: number;
+		pma: boolean;
 	}
 	}
 
 
 	export class TextureAtlasRegion extends TextureRegion {
 	export class TextureAtlasRegion extends TextureRegion {
@@ -216,5 +259,7 @@ module spine {
 		rotate: boolean;
 		rotate: boolean;
 		degrees: number;
 		degrees: number;
 		texture: Texture;
 		texture: Texture;
+		names: string[];
+		values: number[][];
 	}
 	}
 }
 }

+ 1 - 1
spine-ts/core/src/attachments/RegionAttachment.ts

@@ -155,7 +155,7 @@ module spine {
 		setRegion (region: TextureRegion) : void {
 		setRegion (region: TextureRegion) : void {
 			this.region = region;
 			this.region = region;
 			let uvs = this.uvs;
 			let uvs = this.uvs;
-			if (region.rotate) {
+			if (region.degrees == 90) {
 				uvs[2] = region.u;
 				uvs[2] = region.u;
 				uvs[3] = region.v2;
 				uvs[3] = region.v2;
 				uvs[4] = region.u;
 				uvs[4] = region.u;

+ 61 - 233
spine-ts/player/example/assets/raptor-pma.atlas

@@ -1,272 +1,100 @@
-
 raptor-pma.png
 raptor-pma.png
-size: 1024,512
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 512
+	filter: Linear, Linear
+	pma: true
 back-arm
 back-arm
-  rotate: true
-  xy: 829, 88
-  size: 46, 25
-  orig: 46, 25
-  offset: 0, 0
-  index: -1
+	bounds: 829, 88, 46, 25
+	rotate: 90
 back-bracer
 back-bracer
-  rotate: true
-  xy: 195, 238
-  size: 39, 28
-  orig: 39, 28
-  offset: 0, 0
-  index: -1
+	bounds: 195, 238, 39, 28
+	rotate: 90
 back-hand
 back-hand
-  rotate: true
-  xy: 724, 140
-  size: 36, 34
-  orig: 36, 34
-  offset: 0, 0
-  index: -1
+	bounds: 724, 140, 36, 34
+	rotate: 90
 back-knee
 back-knee
-  rotate: true
-  xy: 760, 131
-  size: 49, 67
-  orig: 49, 67
-  offset: 0, 0
-  index: -1
+	bounds: 760, 131, 49, 67
+	rotate: 90
 back-thigh
 back-thigh
-  rotate: true
-  xy: 225, 238
-  size: 39, 24
-  orig: 39, 24
-  offset: 0, 0
-  index: -1
+	bounds: 225, 238, 39, 24
+	rotate: 90
 eyes-open
 eyes-open
-  rotate: false
-  xy: 975, 204
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 975, 204, 47, 45
 front-arm
 front-arm
-  rotate: false
-  xy: 969, 112
-  size: 48, 26
-  orig: 48, 26
-  offset: 0, 0
-  index: -1
+	bounds: 969, 112, 48, 26
 front-bracer
 front-bracer
-  rotate: true
-  xy: 724, 97
-  size: 41, 29
-  orig: 41, 29
-  offset: 0, 0
-  index: -1
+	bounds: 724, 97, 41, 29
+	rotate: 90
 front-hand
 front-hand
-  rotate: false
-  xy: 251, 239
-  size: 41, 38
-  orig: 41, 38
-  offset: 0, 0
-  index: -1
+	bounds: 251, 239, 41, 38
 front-open-hand
 front-open-hand
-  rotate: true
-  xy: 856, 76
-  size: 43, 44
-  orig: 43, 44
-  offset: 0, 0
-  index: -1
+	bounds: 856, 76, 43, 44
+	rotate: 90
 front-thigh
 front-thigh
-  rotate: true
-  xy: 729, 178
-  size: 57, 29
-  orig: 57, 29
-  offset: 0, 0
-  index: -1
+	bounds: 729, 178, 57, 29
+	rotate: 90
 gun
 gun
-  rotate: false
-  xy: 894, 251
-  size: 107, 103
-  orig: 107, 103
-  offset: 0, 0
-  index: -1
+	bounds: 894, 251, 107, 103
 gun-nohand
 gun-nohand
-  rotate: false
-  xy: 764, 241
-  size: 105, 102
-  orig: 105, 102
-  offset: 0, 0
-  index: -1
+	bounds: 764, 241, 105, 102
 head
 head
-  rotate: false
-  xy: 756, 345
-  size: 136, 149
-  orig: 136, 149
-  offset: 0, 0
-  index: -1
+	bounds: 756, 345, 136, 149
 lower-leg
 lower-leg
-  rotate: true
-  xy: 475, 237
-  size: 73, 98
-  orig: 73, 98
-  offset: 0, 0
-  index: -1
+	bounds: 475, 237, 73, 98
+	rotate: 90
 mouth-grind
 mouth-grind
-  rotate: false
-  xy: 975, 172
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 975, 172, 47, 30
 mouth-smile
 mouth-smile
-  rotate: false
-  xy: 975, 140
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 975, 140, 47, 30
 neck
 neck
-  rotate: false
-  xy: 366, 282
-  size: 18, 21
-  orig: 18, 21
-  offset: 0, 0
-  index: -1
+	bounds: 366, 282, 18, 21
 raptor-back-arm
 raptor-back-arm
-  rotate: true
-  xy: 636, 97
-  size: 82, 86
-  orig: 82, 86
-  offset: 0, 0
-  index: -1
+	bounds: 636, 97, 82, 86
+	rotate: 90
 raptor-body
 raptor-body
-  rotate: false
-  xy: 2, 2
-  size: 632, 233
-  orig: 632, 233
-  offset: 0, 0
-  index: -1
+	bounds: 2, 2, 632, 233
 raptor-front-arm
 raptor-front-arm
-  rotate: true
-  xy: 871, 168
-  size: 81, 102
-  orig: 81, 102
-  offset: 0, 0
-  index: -1
+	bounds: 871, 168, 81, 102
+	rotate: 90
 raptor-front-leg
 raptor-front-leg
-  rotate: false
-  xy: 2, 237
-  size: 191, 257
-  orig: 191, 257
-  offset: 0, 0
-  index: -1
+	bounds: 2, 237, 191, 257
 raptor-hindleg-back
 raptor-hindleg-back
-  rotate: false
-  xy: 195, 279
-  size: 169, 215
-  orig: 169, 215
-  offset: 0, 0
-  index: -1
+	bounds: 195, 279, 169, 215
 raptor-horn
 raptor-horn
-  rotate: true
-  xy: 431, 312
-  size: 182, 80
-  orig: 182, 80
-  offset: 0, 0
-  index: -1
+	bounds: 431, 312, 182, 80
+	rotate: 90
 raptor-horn-back
 raptor-horn-back
-  rotate: true
-  xy: 513, 318
-  size: 176, 77
-  orig: 176, 77
-  offset: 0, 0
-  index: -1
+	bounds: 513, 318, 176, 77
+	rotate: 90
 raptor-jaw
 raptor-jaw
-  rotate: false
-  xy: 894, 356
-  size: 126, 138
-  orig: 126, 138
-  offset: 0, 0
-  index: -1
+	bounds: 894, 356, 126, 138
 raptor-jaw-tooth
 raptor-jaw-tooth
-  rotate: true
-  xy: 294, 240
-  size: 37, 48
-  orig: 37, 48
-  offset: 0, 0
-  index: -1
+	bounds: 294, 240, 37, 48
+	rotate: 90
 raptor-mouth-inside
 raptor-mouth-inside
-  rotate: true
-  xy: 344, 241
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
+	bounds: 344, 241, 36, 41
+	rotate: 90
 raptor-saddle-strap-back
 raptor-saddle-strap-back
-  rotate: false
-  xy: 575, 242
-  size: 54, 74
-  orig: 54, 74
-  offset: 0, 0
-  index: -1
+	bounds: 575, 242, 54, 74
 raptor-saddle-strap-front
 raptor-saddle-strap-front
-  rotate: true
-  xy: 764, 182
-  size: 57, 95
-  orig: 57, 95
-  offset: 0, 0
-  index: -1
+	bounds: 764, 182, 57, 95
+	rotate: 90
 raptor-saddle-w-shadow
 raptor-saddle-w-shadow
-  rotate: false
-  xy: 592, 323
-  size: 162, 171
-  orig: 162, 171
-  offset: 0, 0
-  index: -1
+	bounds: 592, 323, 162, 171
 raptor-tail-shadow
 raptor-tail-shadow
-  rotate: true
-  xy: 366, 305
-  size: 189, 63
-  orig: 189, 63
-  offset: 0, 0
-  index: -1
+	bounds: 366, 305, 189, 63
+	rotate: 90
 raptor-tongue
 raptor-tongue
-  rotate: false
-  xy: 387, 239
-  size: 86, 64
-  orig: 86, 64
-  offset: 0, 0
-  index: -1
+	bounds: 387, 239, 86, 64
 stirrup-back
 stirrup-back
-  rotate: true
-  xy: 829, 136
-  size: 44, 35
-  orig: 44, 35
-  offset: 0, 0
-  index: -1
+	bounds: 829, 136, 44, 35
+	rotate: 90
 stirrup-front
 stirrup-front
-  rotate: true
-  xy: 866, 121
-  size: 45, 50
-  orig: 45, 50
-  offset: 0, 0
-  index: -1
+	bounds: 866, 121, 45, 50
+	rotate: 90
 stirrup-strap
 stirrup-strap
-  rotate: false
-  xy: 918, 120
-  size: 49, 46
-  orig: 49, 46
-  offset: 0, 0
-  index: -1
+	bounds: 918, 120, 49, 46
 torso
 torso
-  rotate: true
-  xy: 636, 181
-  size: 54, 91
-  orig: 54, 91
-  offset: 0, 0
-  index: -1
+	bounds: 636, 181, 54, 91
+	rotate: 90
 visor
 visor
-  rotate: false
-  xy: 631, 237
-  size: 131, 84
-  orig: 131, 84
-  offset: 0, 0
-  index: -1
+	bounds: 631, 237, 131, 84

BIN
spine-ts/player/example/assets/raptor-pma.png


+ 1 - 1
spine-ts/player/example/assets/raptor-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "CtfBW3uZSDg",
 	"hash": "CtfBW3uZSDg",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -809.16,
 	"x": -809.16,
 	"y": -73.54,
 	"y": -73.54,
 	"width": 1287.65,
 	"width": 1287.65,

+ 60 - 245
spine-ts/player/example/assets/spineboy-pma.atlas

@@ -1,286 +1,101 @@
-
 spineboy-pma.png
 spineboy-pma.png
-size: 1024,256
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 256
+	filter: Linear, Linear
+	pma: true
 crosshair
 crosshair
-  rotate: false
-  xy: 813, 160
-  size: 45, 45
-  orig: 45, 45
-  offset: 0, 0
-  index: -1
+	bounds: 813, 160, 45, 45
 eye-indifferent
 eye-indifferent
-  rotate: false
-  xy: 569, 2
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 569, 2, 47, 45
 eye-surprised
 eye-surprised
-  rotate: true
-  xy: 643, 7
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 643, 7, 47, 45
+	rotate: 90
 front-bracer
 front-bracer
-  rotate: false
-  xy: 811, 51
-  size: 29, 40
-  orig: 29, 40
-  offset: 0, 0
-  index: -1
+	bounds: 811, 51, 29, 40
 front-fist-closed
 front-fist-closed
-  rotate: false
-  xy: 807, 93
-  size: 38, 41
-  orig: 38, 41
-  offset: 0, 0
-  index: -1
+	bounds: 807, 93, 38, 41
 front-fist-open
 front-fist-open
-  rotate: false
-  xy: 815, 210
-  size: 43, 44
-  orig: 43, 44
-  offset: 0, 0
-  index: -1
+	bounds: 815, 210, 43, 44
 front-foot
 front-foot
-  rotate: true
-  xy: 706, 64
-  size: 63, 35
-  orig: 63, 35
-  offset: 0, 0
-  index: -1
+	bounds: 706, 64, 63, 35
+	rotate: 90
 front-shin
 front-shin
-  rotate: false
-  xy: 80, 11
-  size: 41, 92
-  orig: 41, 92
-  offset: 0, 0
-  index: -1
+	bounds: 80, 11, 41, 92
 front-thigh
 front-thigh
-  rotate: false
-  xy: 754, 12
-  size: 23, 56
-  orig: 23, 56
-  offset: 0, 0
-  index: -1
+	bounds: 754, 12, 23, 56
 front-upper-arm
 front-upper-arm
-  rotate: false
-  xy: 618, 5
-  size: 23, 49
-  orig: 23, 49
-  offset: 0, 0
-  index: -1
+	bounds: 618, 5, 23, 49
 goggles
 goggles
-  rotate: false
-  xy: 214, 20
-  size: 131, 83
-  orig: 131, 83
-  offset: 0, 0
-  index: -1
+	bounds: 214, 20, 131, 83
 gun
 gun
-  rotate: true
-  xy: 347, 14
-  size: 105, 102
-  orig: 105, 102
-  offset: 0, 0
-  index: -1
+	bounds: 347, 14, 105, 102
+	rotate: 90
 head
 head
-  rotate: false
-  xy: 80, 105
-  size: 136, 149
-  orig: 136, 149
-  offset: 0, 0
-  index: -1
+	bounds: 80, 105, 136, 149
 hoverboard-board
 hoverboard-board
-  rotate: true
-  xy: 2, 8
-  size: 246, 76
-  orig: 246, 76
-  offset: 0, 0
-  index: -1
+	bounds: 2, 8, 246, 76
+	rotate: 90
 hoverboard-thruster
 hoverboard-thruster
-  rotate: false
-  xy: 478, 2
-  size: 30, 32
-  orig: 30, 32
-  offset: 0, 0
-  index: -1
+	bounds: 478, 2, 30, 32
 hoverglow-small
 hoverglow-small
-  rotate: true
-  xy: 218, 117
-  size: 137, 38
-  orig: 137, 38
-  offset: 0, 0
-  index: -1
+	bounds: 218, 117, 137, 38
+	rotate: 90
 mouth-grind
 mouth-grind
-  rotate: true
-  xy: 775, 80
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 775, 80, 47, 30
+	rotate: 90
 mouth-oooo
 mouth-oooo
-  rotate: true
-  xy: 779, 31
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 779, 31, 47, 30
+	rotate: 90
 mouth-smile
 mouth-smile
-  rotate: true
-  xy: 783, 207
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 783, 207, 47, 30
+	rotate: 90
 muzzle-glow
 muzzle-glow
-  rotate: false
-  xy: 779, 4
-  size: 25, 25
-  orig: 25, 25
-  offset: 0, 0
-  index: -1
+	bounds: 779, 4, 25, 25
 muzzle-ring
 muzzle-ring
-  rotate: false
-  xy: 451, 14
-  size: 25, 105
-  orig: 25, 105
-  offset: 0, 0
-  index: -1
+	bounds: 451, 14, 25, 105
 muzzle01
 muzzle01
-  rotate: true
-  xy: 664, 60
-  size: 67, 40
-  orig: 67, 40
-  offset: 0, 0
-  index: -1
+	bounds: 664, 60, 67, 40
+	rotate: 90
 muzzle02
 muzzle02
-  rotate: true
-  xy: 580, 56
-  size: 68, 42
-  orig: 68, 42
-  offset: 0, 0
-  index: -1
+	bounds: 580, 56, 68, 42
+	rotate: 90
 muzzle03
 muzzle03
-  rotate: true
-  xy: 478, 36
-  size: 83, 53
-  orig: 83, 53
-  offset: 0, 0
-  index: -1
+	bounds: 478, 36, 83, 53
+	rotate: 90
 muzzle04
 muzzle04
-  rotate: true
-  xy: 533, 49
-  size: 75, 45
-  orig: 75, 45
-  offset: 0, 0
-  index: -1
+	bounds: 533, 49, 75, 45
+	rotate: 90
 muzzle05
 muzzle05
-  rotate: true
-  xy: 624, 56
-  size: 68, 38
-  orig: 68, 38
-  offset: 0, 0
-  index: -1
+	bounds: 624, 56, 68, 38
+	rotate: 90
 neck
 neck
-  rotate: false
-  xy: 806, 8
-  size: 18, 21
-  orig: 18, 21
-  offset: 0, 0
-  index: -1
+	bounds: 806, 8, 18, 21
 portal-bg
 portal-bg
-  rotate: false
-  xy: 258, 121
-  size: 133, 133
-  orig: 133, 133
-  offset: 0, 0
-  index: -1
+	bounds: 258, 121, 133, 133
 portal-flare1
 portal-flare1
-  rotate: true
-  xy: 690, 2
-  size: 56, 30
-  orig: 56, 30
-  offset: 0, 0
-  index: -1
+	bounds: 690, 2, 56, 30
+	rotate: 90
 portal-flare2
 portal-flare2
-  rotate: false
-  xy: 510, 3
-  size: 57, 31
-  orig: 57, 31
-  offset: 0, 0
-  index: -1
+	bounds: 510, 3, 57, 31
 portal-flare3
 portal-flare3
-  rotate: true
-  xy: 722, 4
-  size: 58, 30
-  orig: 58, 30
-  offset: 0, 0
-  index: -1
+	bounds: 722, 4, 58, 30
+	rotate: 90
 portal-shade
 portal-shade
-  rotate: false
-  xy: 393, 121
-  size: 133, 133
-  orig: 133, 133
-  offset: 0, 0
-  index: -1
+	bounds: 393, 121, 133, 133
 portal-streaks1
 portal-streaks1
-  rotate: false
-  xy: 528, 126
-  size: 126, 128
-  orig: 126, 128
-  offset: 0, 0
-  index: -1
+	bounds: 528, 126, 126, 128
 portal-streaks2
 portal-streaks2
-  rotate: false
-  xy: 656, 129
-  size: 125, 125
-  orig: 125, 125
-  offset: 0, 0
-  index: -1
+	bounds: 656, 129, 125, 125
 rear-bracer
 rear-bracer
-  rotate: false
-  xy: 826, 13
-  size: 28, 36
-  orig: 28, 36
-  offset: 0, 0
-  index: -1
+	bounds: 826, 13, 28, 36
 rear-foot
 rear-foot
-  rotate: true
-  xy: 743, 70
-  size: 57, 30
-  orig: 57, 30
-  offset: 0, 0
-  index: -1
+	bounds: 743, 70, 57, 30
+	rotate: 90
 rear-shin
 rear-shin
-  rotate: false
-  xy: 174, 14
-  size: 38, 89
-  orig: 38, 89
-  offset: 0, 0
-  index: -1
+	bounds: 174, 14, 38, 89
 rear-thigh
 rear-thigh
-  rotate: false
-  xy: 783, 158
-  size: 28, 47
-  orig: 28, 47
-  offset: 0, 0
-  index: -1
+	bounds: 783, 158, 28, 47
 rear-upper-arm
 rear-upper-arm
-  rotate: true
-  xy: 783, 136
-  size: 20, 44
-  orig: 20, 44
-  offset: 0, 0
-  index: -1
+	bounds: 783, 136, 20, 44
+	rotate: 90
 torso
 torso
-  rotate: false
-  xy: 123, 13
-  size: 49, 90
-  orig: 49, 90
-  offset: 0, 0
-  index: -1
+	bounds: 123, 13, 49, 90

BIN
spine-ts/player/example/assets/spineboy-pma.png


BIN
spine-ts/player/example/assets/spineboy-pro.skel


+ 1 - 1
spine-ts/threejs/example/assets/raptor-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "CtfBW3uZSDg",
 	"hash": "CtfBW3uZSDg",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -809.16,
 	"x": -809.16,
 	"y": -73.54,
 	"y": -73.54,
 	"width": 1287.65,
 	"width": 1287.65,

+ 60 - 233
spine-ts/threejs/example/assets/raptor.atlas

@@ -1,272 +1,99 @@
-
 raptor.png
 raptor.png
-size: 1024,512
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 512
+	filter: Linear, Linear
 back-arm
 back-arm
-  rotate: true
-  xy: 829, 88
-  size: 46, 25
-  orig: 46, 25
-  offset: 0, 0
-  index: -1
+	bounds: 829, 88, 46, 25
+	rotate: 90
 back-bracer
 back-bracer
-  rotate: true
-  xy: 195, 238
-  size: 39, 28
-  orig: 39, 28
-  offset: 0, 0
-  index: -1
+	bounds: 195, 238, 39, 28
+	rotate: 90
 back-hand
 back-hand
-  rotate: true
-  xy: 724, 140
-  size: 36, 34
-  orig: 36, 34
-  offset: 0, 0
-  index: -1
+	bounds: 724, 140, 36, 34
+	rotate: 90
 back-knee
 back-knee
-  rotate: true
-  xy: 760, 131
-  size: 49, 67
-  orig: 49, 67
-  offset: 0, 0
-  index: -1
+	bounds: 760, 131, 49, 67
+	rotate: 90
 back-thigh
 back-thigh
-  rotate: true
-  xy: 225, 238
-  size: 39, 24
-  orig: 39, 24
-  offset: 0, 0
-  index: -1
+	bounds: 225, 238, 39, 24
+	rotate: 90
 eyes-open
 eyes-open
-  rotate: false
-  xy: 975, 204
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 975, 204, 47, 45
 front-arm
 front-arm
-  rotate: false
-  xy: 969, 112
-  size: 48, 26
-  orig: 48, 26
-  offset: 0, 0
-  index: -1
+	bounds: 969, 112, 48, 26
 front-bracer
 front-bracer
-  rotate: true
-  xy: 724, 97
-  size: 41, 29
-  orig: 41, 29
-  offset: 0, 0
-  index: -1
+	bounds: 724, 97, 41, 29
+	rotate: 90
 front-hand
 front-hand
-  rotate: false
-  xy: 251, 239
-  size: 41, 38
-  orig: 41, 38
-  offset: 0, 0
-  index: -1
+	bounds: 251, 239, 41, 38
 front-open-hand
 front-open-hand
-  rotate: true
-  xy: 856, 76
-  size: 43, 44
-  orig: 43, 44
-  offset: 0, 0
-  index: -1
+	bounds: 856, 76, 43, 44
+	rotate: 90
 front-thigh
 front-thigh
-  rotate: true
-  xy: 729, 178
-  size: 57, 29
-  orig: 57, 29
-  offset: 0, 0
-  index: -1
+	bounds: 729, 178, 57, 29
+	rotate: 90
 gun
 gun
-  rotate: false
-  xy: 894, 251
-  size: 107, 103
-  orig: 107, 103
-  offset: 0, 0
-  index: -1
+	bounds: 894, 251, 107, 103
 gun-nohand
 gun-nohand
-  rotate: false
-  xy: 764, 241
-  size: 105, 102
-  orig: 105, 102
-  offset: 0, 0
-  index: -1
+	bounds: 764, 241, 105, 102
 head
 head
-  rotate: false
-  xy: 756, 345
-  size: 136, 149
-  orig: 136, 149
-  offset: 0, 0
-  index: -1
+	bounds: 756, 345, 136, 149
 lower-leg
 lower-leg
-  rotate: true
-  xy: 475, 237
-  size: 73, 98
-  orig: 73, 98
-  offset: 0, 0
-  index: -1
+	bounds: 475, 237, 73, 98
+	rotate: 90
 mouth-grind
 mouth-grind
-  rotate: false
-  xy: 975, 172
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 975, 172, 47, 30
 mouth-smile
 mouth-smile
-  rotate: false
-  xy: 975, 140
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 975, 140, 47, 30
 neck
 neck
-  rotate: false
-  xy: 366, 282
-  size: 18, 21
-  orig: 18, 21
-  offset: 0, 0
-  index: -1
+	bounds: 366, 282, 18, 21
 raptor-back-arm
 raptor-back-arm
-  rotate: true
-  xy: 636, 97
-  size: 82, 86
-  orig: 82, 86
-  offset: 0, 0
-  index: -1
+	bounds: 636, 97, 82, 86
+	rotate: 90
 raptor-body
 raptor-body
-  rotate: false
-  xy: 2, 2
-  size: 632, 233
-  orig: 632, 233
-  offset: 0, 0
-  index: -1
+	bounds: 2, 2, 632, 233
 raptor-front-arm
 raptor-front-arm
-  rotate: true
-  xy: 871, 168
-  size: 81, 102
-  orig: 81, 102
-  offset: 0, 0
-  index: -1
+	bounds: 871, 168, 81, 102
+	rotate: 90
 raptor-front-leg
 raptor-front-leg
-  rotate: false
-  xy: 2, 237
-  size: 191, 257
-  orig: 191, 257
-  offset: 0, 0
-  index: -1
+	bounds: 2, 237, 191, 257
 raptor-hindleg-back
 raptor-hindleg-back
-  rotate: false
-  xy: 195, 279
-  size: 169, 215
-  orig: 169, 215
-  offset: 0, 0
-  index: -1
+	bounds: 195, 279, 169, 215
 raptor-horn
 raptor-horn
-  rotate: true
-  xy: 431, 312
-  size: 182, 80
-  orig: 182, 80
-  offset: 0, 0
-  index: -1
+	bounds: 431, 312, 182, 80
+	rotate: 90
 raptor-horn-back
 raptor-horn-back
-  rotate: true
-  xy: 513, 318
-  size: 176, 77
-  orig: 176, 77
-  offset: 0, 0
-  index: -1
+	bounds: 513, 318, 176, 77
+	rotate: 90
 raptor-jaw
 raptor-jaw
-  rotate: false
-  xy: 894, 356
-  size: 126, 138
-  orig: 126, 138
-  offset: 0, 0
-  index: -1
+	bounds: 894, 356, 126, 138
 raptor-jaw-tooth
 raptor-jaw-tooth
-  rotate: true
-  xy: 294, 240
-  size: 37, 48
-  orig: 37, 48
-  offset: 0, 0
-  index: -1
+	bounds: 294, 240, 37, 48
+	rotate: 90
 raptor-mouth-inside
 raptor-mouth-inside
-  rotate: true
-  xy: 344, 241
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
+	bounds: 344, 241, 36, 41
+	rotate: 90
 raptor-saddle-strap-back
 raptor-saddle-strap-back
-  rotate: false
-  xy: 575, 242
-  size: 54, 74
-  orig: 54, 74
-  offset: 0, 0
-  index: -1
+	bounds: 575, 242, 54, 74
 raptor-saddle-strap-front
 raptor-saddle-strap-front
-  rotate: true
-  xy: 764, 182
-  size: 57, 95
-  orig: 57, 95
-  offset: 0, 0
-  index: -1
+	bounds: 764, 182, 57, 95
+	rotate: 90
 raptor-saddle-w-shadow
 raptor-saddle-w-shadow
-  rotate: false
-  xy: 592, 323
-  size: 162, 171
-  orig: 162, 171
-  offset: 0, 0
-  index: -1
+	bounds: 592, 323, 162, 171
 raptor-tail-shadow
 raptor-tail-shadow
-  rotate: true
-  xy: 366, 305
-  size: 189, 63
-  orig: 189, 63
-  offset: 0, 0
-  index: -1
+	bounds: 366, 305, 189, 63
+	rotate: 90
 raptor-tongue
 raptor-tongue
-  rotate: false
-  xy: 387, 239
-  size: 86, 64
-  orig: 86, 64
-  offset: 0, 0
-  index: -1
+	bounds: 387, 239, 86, 64
 stirrup-back
 stirrup-back
-  rotate: true
-  xy: 829, 136
-  size: 44, 35
-  orig: 44, 35
-  offset: 0, 0
-  index: -1
+	bounds: 829, 136, 44, 35
+	rotate: 90
 stirrup-front
 stirrup-front
-  rotate: true
-  xy: 866, 121
-  size: 45, 50
-  orig: 45, 50
-  offset: 0, 0
-  index: -1
+	bounds: 866, 121, 45, 50
+	rotate: 90
 stirrup-strap
 stirrup-strap
-  rotate: false
-  xy: 918, 120
-  size: 49, 46
-  orig: 49, 46
-  offset: 0, 0
-  index: -1
+	bounds: 918, 120, 49, 46
 torso
 torso
-  rotate: true
-  xy: 636, 181
-  size: 54, 91
-  orig: 54, 91
-  offset: 0, 0
-  index: -1
+	bounds: 636, 181, 54, 91
+	rotate: 90
 visor
 visor
-  rotate: false
-  xy: 631, 237
-  size: 131, 84
-  orig: 131, 84
-  offset: 0, 0
-  index: -1
+	bounds: 631, 237, 131, 84

BIN
spine-ts/threejs/example/assets/raptor.png


+ 11 - 47
spine-ts/webgl/example/assets/coin-pma.atlas

@@ -1,55 +1,19 @@
-
 coin-pma.png
 coin-pma.png
-size: 1024,1024
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 1024
+	filter: Linear, Linear
+	pma: true
 coin-front-logo
 coin-front-logo
-  rotate: false
-  xy: 2, 570
-  size: 305, 302
-  orig: 305, 302
-  offset: 0, 0
-  index: -1
+	bounds: 2, 570, 305, 302
 coin-front-shine-logo
 coin-front-shine-logo
-  rotate: false
-  xy: 2, 286
-  size: 282, 282
-  orig: 282, 282
-  offset: 0, 0
-  index: -1
+	bounds: 2, 286, 282, 282
 coin-front-shine-spineboy
 coin-front-shine-spineboy
-  rotate: false
-  xy: 305, 283
-  size: 282, 282
-  orig: 282, 282
-  offset: 0, 0
-  index: -1
+	bounds: 305, 283, 282, 282
 coin-front-spineboy
 coin-front-spineboy
-  rotate: true
-  xy: 309, 567
-  size: 305, 302
-  orig: 305, 302
-  offset: 0, 0
-  index: -1
+	bounds: 309, 567, 305, 302
+	rotate: 90
 coin-side-round
 coin-side-round
-  rotate: false
-  xy: 2, 2
-  size: 144, 282
-  orig: 144, 282
-  offset: 0, 0
-  index: -1
+	bounds: 2, 2, 144, 282
 coin-side-straight
 coin-side-straight
-  rotate: false
-  xy: 286, 286
-  size: 17, 282
-  orig: 17, 282
-  offset: 0, 0
-  index: -1
+	bounds: 286, 286, 17, 282
 shine
 shine
-  rotate: false
-  xy: 148, 39
-  size: 72, 245
-  orig: 72, 245
-  offset: 0, 0
-  index: -1
+	bounds: 148, 39, 72, 245

BIN
spine-ts/webgl/example/assets/coin-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/coin-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "svidebPqqeg",
 	"hash": "svidebPqqeg",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -152.5,
 	"x": -152.5,
 	"y": -151,
 	"y": -151,
 	"width": 305,
 	"width": 305,

BIN
spine-ts/webgl/example/assets/coin-pro.skel


+ 55 - 251
spine-ts/webgl/example/assets/goblins-pma.atlas

@@ -1,293 +1,97 @@
-
 goblins-pma.png
 goblins-pma.png
-size: 1024,128
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 128
+	filter: Linear, Linear
+	pma: true
 dagger
 dagger
-  rotate: false
-  xy: 2, 18
-  size: 26, 108
-  orig: 26, 108
-  offset: 0, 0
-  index: -1
+	bounds: 2, 18, 26, 108
 goblin/eyes-closed
 goblin/eyes-closed
-  rotate: false
-  xy: 2, 4
-  size: 34, 12
-  orig: 34, 12
-  offset: 0, 0
-  index: -1
+	bounds: 2, 4, 34, 12
 goblin/head
 goblin/head
-  rotate: true
-  xy: 113, 23
-  size: 103, 66
-  orig: 103, 66
-  offset: 0, 0
-  index: -1
+	bounds: 113, 23, 103, 66
+	rotate: 90
 goblin/left-arm
 goblin/left-arm
-  rotate: true
-  xy: 937, 89
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
+	bounds: 937, 89, 37, 35
+	rotate: 90
 goblin/left-foot
 goblin/left-foot
-  rotate: true
-  xy: 609, 61
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
+	bounds: 609, 61, 65, 31
+	rotate: 90
 goblin/left-hand
 goblin/left-hand
-  rotate: false
-  xy: 840, 21
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
+	bounds: 840, 21, 36, 41
 goblin/left-lower-leg
 goblin/left-lower-leg
-  rotate: false
-  xy: 504, 56
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
+	bounds: 504, 56, 33, 70
 goblin/left-shoulder
 goblin/left-shoulder
-  rotate: false
-  xy: 745, 17
-  size: 29, 44
-  orig: 29, 44
-  offset: 0, 0
-  index: -1
+	bounds: 745, 17, 29, 44
 goblin/left-upper-leg
 goblin/left-upper-leg
-  rotate: false
-  xy: 397, 53
-  size: 33, 73
-  orig: 33, 73
-  offset: 0, 0
-  index: -1
+	bounds: 397, 53, 33, 73
 goblin/neck
 goblin/neck
-  rotate: false
-  xy: 862, 85
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
+	bounds: 862, 85, 36, 41
 goblin/pelvis
 goblin/pelvis
-  rotate: false
-  xy: 776, 18
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
+	bounds: 776, 18, 62, 43
 goblin/right-arm
 goblin/right-arm
-  rotate: true
-  xy: 181, 5
-  size: 23, 50
-  orig: 23, 50
-  offset: 0, 0
-  index: -1
+	bounds: 181, 5, 23, 50
+	rotate: 90
 goblin/right-foot
 goblin/right-foot
-  rotate: true
-  xy: 747, 63
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
+	bounds: 747, 63, 63, 33
+	rotate: 90
 goblin/right-hand
 goblin/right-hand
-  rotate: false
-  xy: 878, 3
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
+	bounds: 878, 3, 36, 37
 goblin/right-lower-leg
 goblin/right-lower-leg
-  rotate: false
-  xy: 321, 50
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
+	bounds: 321, 50, 36, 76
 goblin/right-shoulder
 goblin/right-shoulder
-  rotate: false
-  xy: 663, 14
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
+	bounds: 663, 14, 39, 45
 goblin/right-upper-leg
 goblin/right-upper-leg
-  rotate: false
-  xy: 675, 63
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
+	bounds: 675, 63, 34, 63
 goblin/torso
 goblin/torso
-  rotate: false
-  xy: 181, 30
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
+	bounds: 181, 30, 68, 96
 goblin/undie-straps
 goblin/undie-straps
-  rotate: false
-  xy: 38, 2
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
+	bounds: 38, 2, 55, 19
 goblin/undies
 goblin/undies
-  rotate: false
-  xy: 974, 97
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
+	bounds: 974, 97, 36, 29
 goblingirl/eyes-closed
 goblingirl/eyes-closed
-  rotate: false
-  xy: 397, 30
-  size: 37, 21
-  orig: 37, 21
-  offset: 0, 0
-  index: -1
+	bounds: 397, 30, 37, 21
 goblingirl/head
 goblingirl/head
-  rotate: true
-  xy: 30, 23
-  size: 103, 81
-  orig: 103, 81
-  offset: 0, 0
-  index: -1
+	bounds: 30, 23, 103, 81
+	rotate: 90
 goblingirl/left-arm
 goblingirl/left-arm
-  rotate: true
-  xy: 916, 8
-  size: 37, 35
-  orig: 37, 35
-  offset: 0, 0
-  index: -1
+	bounds: 916, 8, 37, 35
+	rotate: 90
 goblingirl/left-foot
 goblingirl/left-foot
-  rotate: true
-  xy: 642, 61
-  size: 65, 31
-  orig: 65, 31
-  offset: 0, 0
-  index: -1
+	bounds: 642, 61, 65, 31
+	rotate: 90
 goblingirl/left-hand
 goblingirl/left-hand
-  rotate: false
-  xy: 900, 86
-  size: 35, 40
-  orig: 35, 40
-  offset: 0, 0
-  index: -1
+	bounds: 900, 86, 35, 40
 goblingirl/left-lower-leg
 goblingirl/left-lower-leg
-  rotate: false
-  xy: 539, 56
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
+	bounds: 539, 56, 33, 70
 goblingirl/left-shoulder
 goblingirl/left-shoulder
-  rotate: false
-  xy: 633, 13
-  size: 28, 46
-  orig: 28, 46
-  offset: 0, 0
-  index: -1
+	bounds: 633, 13, 28, 46
 goblingirl/left-upper-leg
 goblingirl/left-upper-leg
-  rotate: false
-  xy: 574, 56
-  size: 33, 70
-  orig: 33, 70
-  offset: 0, 0
-  index: -1
+	bounds: 574, 56, 33, 70
 goblingirl/neck
 goblingirl/neck
-  rotate: false
-  xy: 878, 42
-  size: 35, 41
-  orig: 35, 41
-  offset: 0, 0
-  index: -1
+	bounds: 878, 42, 35, 41
 goblingirl/pelvis
 goblingirl/pelvis
-  rotate: true
-  xy: 817, 64
-  size: 62, 43
-  orig: 62, 43
-  offset: 0, 0
-  index: -1
+	bounds: 817, 64, 62, 43
+	rotate: 90
 goblingirl/right-arm
 goblingirl/right-arm
-  rotate: false
-  xy: 603, 4
-  size: 28, 50
-  orig: 28, 50
-  offset: 0, 0
-  index: -1
+	bounds: 603, 4, 28, 50
 goblingirl/right-foot
 goblingirl/right-foot
-  rotate: true
-  xy: 782, 63
-  size: 63, 33
-  orig: 63, 33
-  offset: 0, 0
-  index: -1
+	bounds: 782, 63, 63, 33
+	rotate: 90
 goblingirl/right-hand
 goblingirl/right-hand
-  rotate: false
-  xy: 915, 47
-  size: 36, 37
-  orig: 36, 37
-  offset: 0, 0
-  index: -1
+	bounds: 915, 47, 36, 37
 goblingirl/right-lower-leg
 goblingirl/right-lower-leg
-  rotate: false
-  xy: 359, 50
-  size: 36, 76
-  orig: 36, 76
-  offset: 0, 0
-  index: -1
+	bounds: 359, 50, 36, 76
 goblingirl/right-shoulder
 goblingirl/right-shoulder
-  rotate: false
-  xy: 704, 16
-  size: 39, 45
-  orig: 39, 45
-  offset: 0, 0
-  index: -1
+	bounds: 704, 16, 39, 45
 goblingirl/right-upper-leg
 goblingirl/right-upper-leg
-  rotate: false
-  xy: 711, 63
-  size: 34, 63
-  orig: 34, 63
-  offset: 0, 0
-  index: -1
+	bounds: 711, 63, 34, 63
 goblingirl/torso
 goblingirl/torso
-  rotate: false
-  xy: 251, 30
-  size: 68, 96
-  orig: 68, 96
-  offset: 0, 0
-  index: -1
+	bounds: 251, 30, 68, 96
 goblingirl/undie-straps
 goblingirl/undie-straps
-  rotate: false
-  xy: 95, 2
-  size: 55, 19
-  orig: 55, 19
-  offset: 0, 0
-  index: -1
+	bounds: 95, 2, 55, 19
 goblingirl/undies
 goblingirl/undies
-  rotate: false
-  xy: 974, 66
-  size: 36, 29
-  orig: 36, 29
-  offset: 0, 0
-  index: -1
+	bounds: 974, 66, 36, 29
 shield
 shield
-  rotate: false
-  xy: 432, 54
-  size: 70, 72
-  orig: 70, 72
-  offset: 0, 0
-  index: -1
+	bounds: 432, 54, 70, 72
 spear
 spear
-  rotate: true
-  xy: 233, 6
-  size: 22, 368
-  orig: 22, 368
-  offset: 0, 0
-  index: -1
+	bounds: 233, 6, 22, 368
+	rotate: 90

BIN
spine-ts/webgl/example/assets/goblins-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/goblins-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "PtTAK+zF95I",
 	"hash": "PtTAK+zF95I",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -134.12,
 	"x": -134.12,
 	"y": -3.28,
 	"y": -3.28,
 	"width": 266.94,
 	"width": 266.94,

BIN
spine-ts/webgl/example/assets/goblins-pro.skel


+ 213 - 893
spine-ts/webgl/example/assets/mix-and-match-pma.atlas

@@ -1,1042 +1,362 @@
-
 mix-and-match-pma.png
 mix-and-match-pma.png
-size: 1024,512
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 512
+	filter: Linear, Linear
+	pma: true
 base-head
 base-head
-  rotate: false
-  xy: 587, 2
-  size: 95, 73
-  orig: 95, 73
-  offset: 0, 0
-  index: -1
+	bounds: 587, 2, 95, 73
 boy/arm-front
 boy/arm-front
-  rotate: false
-  xy: 558, 271
-  size: 36, 115
-  orig: 36, 115
-  offset: 0, 0
-  index: -1
+	bounds: 558, 271, 36, 115
 boy/backpack
 boy/backpack
-  rotate: false
-  xy: 235, 109
-  size: 119, 153
-  orig: 119, 153
-  offset: 0, 0
-  index: -1
+	bounds: 235, 109, 119, 153
 boy/backpack-pocket
 boy/backpack-pocket
-  rotate: true
-  xy: 328, 73
-  size: 34, 62
-  orig: 34, 62
-  offset: 0, 0
-  index: -1
+	bounds: 328, 73, 34, 62
+	rotate: 90
 boy/backpack-strap-front
 boy/backpack-strap-front
-  rotate: false
-  xy: 665, 79
-  size: 38, 88
-  orig: 38, 88
-  offset: 0, 0
-  index: -1
+	bounds: 665, 79, 38, 88
 boy/backpack-up
 boy/backpack-up
-  rotate: true
-  xy: 395, 364
-  size: 21, 70
-  orig: 21, 70
-  offset: 0, 0
-  index: -1
+	bounds: 395, 364, 21, 70
+	rotate: 90
 boy/body
 boy/body
-  rotate: true
-  xy: 251, 264
-  size: 97, 132
-  orig: 97, 132
-  offset: 0, 0
-  index: -1
+	bounds: 251, 264, 97, 132
+	rotate: 90
 boy/boot-ribbon-front
 boy/boot-ribbon-front
-  rotate: false
-  xy: 648, 131
-  size: 9, 11
-  orig: 9, 11
-  offset: 0, 0
-  index: -1
+	bounds: 648, 131, 9, 11
 boy/collar
 boy/collar
-  rotate: true
-  xy: 744, 4
-  size: 73, 29
-  orig: 73, 29
-  offset: 0, 0
-  index: -1
+	bounds: 744, 4, 73, 29
+	rotate: 90
 boy/ear
 boy/ear
-  rotate: true
-  xy: 383, 109
-  size: 19, 23
-  orig: 19, 23
-  offset: 0, 0
-  index: -1
+	bounds: 383, 109, 19, 23
+	rotate: 90
 boy/eye-back-low-eyelid
 boy/eye-back-low-eyelid
-  rotate: true
-  xy: 739, 284
-  size: 17, 6
-  orig: 17, 6
-  offset: 0, 0
-  index: -1
+	bounds: 739, 284, 17, 6
+	rotate: 90
 boy/eye-back-pupil
 boy/eye-back-pupil
-  rotate: true
-  xy: 832, 443
-  size: 8, 9
-  orig: 8, 9
-  offset: 0, 0
-  index: -1
+	bounds: 832, 443, 8, 9
+	rotate: 90
 boy/eye-back-up-eyelid
 boy/eye-back-up-eyelid
-  rotate: false
-  xy: 558, 264
-  size: 23, 5
-  orig: 23, 5
-  offset: 0, 0
-  index: -1
+	bounds: 558, 264, 23, 5
 boy/eye-back-up-eyelid-back
 boy/eye-back-up-eyelid-back
-  rotate: true
-  xy: 802, 491
-  size: 19, 10
-  orig: 19, 10
-  offset: 0, 0
-  index: -1
+	bounds: 802, 491, 19, 10
+	rotate: 90
 boy/eye-front-low-eyelid
 boy/eye-front-low-eyelid
-  rotate: true
-  xy: 386, 363
-  size: 22, 7
-  orig: 22, 7
-  offset: 0, 0
-  index: -1
+	bounds: 386, 363, 22, 7
+	rotate: 90
 boy/eye-front-pupil
 boy/eye-front-pupil
-  rotate: false
-  xy: 816, 389
-  size: 9, 9
-  orig: 9, 9
-  offset: 0, 0
-  index: -1
+	bounds: 816, 389, 9, 9
 boy/eye-front-up-eyelid
 boy/eye-front-up-eyelid
-  rotate: true
-  xy: 160, 71
-  size: 31, 6
-  orig: 31, 6
-  offset: 0, 0
-  index: -1
+	bounds: 160, 71, 31, 6
+	rotate: 90
 boy/eye-front-up-eyelid-back
 boy/eye-front-up-eyelid-back
-  rotate: true
-  xy: 801, 434
-  size: 26, 9
-  orig: 26, 9
-  offset: 0, 0
-  index: -1
+	bounds: 801, 434, 26, 9
+	rotate: 90
 boy/eye-iris-back
 boy/eye-iris-back
-  rotate: false
-  xy: 618, 264
-  size: 17, 17
-  orig: 17, 17
-  offset: 0, 0
-  index: -1
+	bounds: 618, 264, 17, 17
 boy/eye-iris-front
 boy/eye-iris-front
-  rotate: false
-  xy: 727, 264
-  size: 18, 18
-  orig: 18, 18
-  offset: 0, 0
-  index: -1
+	bounds: 727, 264, 18, 18
 boy/eye-white-back
 boy/eye-white-back
-  rotate: false
-  xy: 580, 131
-  size: 20, 12
-  orig: 20, 12
-  offset: 0, 0
-  index: -1
+	bounds: 580, 131, 20, 12
 boy/eye-white-front
 boy/eye-white-front
-  rotate: false
-  xy: 510, 130
-  size: 27, 13
-  orig: 27, 13
-  offset: 0, 0
-  index: -1
+	bounds: 510, 130, 27, 13
 boy/eyebrow-back
 boy/eyebrow-back
-  rotate: true
-  xy: 751, 88
-  size: 20, 11
-  orig: 20, 11
-  offset: 0, 0
-  index: -1
+	bounds: 751, 88, 20, 11
+	rotate: 90
 boy/eyebrow-front
 boy/eyebrow-front
-  rotate: false
-  xy: 483, 130
-  size: 25, 11
-  orig: 25, 11
-  offset: 0, 0
-  index: -1
+	bounds: 483, 130, 25, 11
 boy/hair-back
 boy/hair-back
-  rotate: true
-  xy: 494, 388
-  size: 122, 81
-  orig: 122, 81
-  offset: 0, 0
-  index: -1
+	bounds: 494, 388, 122, 81
+	rotate: 90
 boy/hair-bangs
 boy/hair-bangs
-  rotate: false
-  xy: 667, 284
-  size: 70, 37
-  orig: 70, 37
-  offset: 0, 0
-  index: -1
+	bounds: 667, 284, 70, 37
 boy/hair-side
 boy/hair-side
-  rotate: false
-  xy: 789, 374
-  size: 25, 43
-  orig: 25, 43
-  offset: 0, 0
-  index: -1
+	bounds: 789, 374, 25, 43
 boy/hand-backfingers
 boy/hand-backfingers
-  rotate: false
-  xy: 467, 364
-  size: 19, 21
-  orig: 19, 21
-  offset: 0, 0
-  index: -1
+	bounds: 467, 364, 19, 21
 boy/hand-front-fingers
 boy/hand-front-fingers
-  rotate: false
-  xy: 488, 364
-  size: 19, 21
-  orig: 19, 21
-  offset: 0, 0
-  index: -1
+	bounds: 488, 364, 19, 21
 boy/hat
 boy/hat
-  rotate: true
-  xy: 615, 417
-  size: 93, 56
-  orig: 93, 56
-  offset: 0, 0
-  index: -1
+	bounds: 615, 417, 93, 56
+	rotate: 90
 boy/leg-front
 boy/leg-front
-  rotate: false
-  xy: 138, 104
-  size: 31, 158
-  orig: 31, 158
-  offset: 0, 0
-  index: -1
+	bounds: 138, 104, 31, 158
 boy/mouth-close
 boy/mouth-close
-  rotate: true
-  xy: 551, 365
-  size: 21, 5
-  orig: 21, 5
-  offset: 0, 0
-  index: -1
+	bounds: 551, 365, 21, 5
+	rotate: 90
 girl-blue-cape/mouth-close
 girl-blue-cape/mouth-close
-  rotate: true
-  xy: 551, 365
-  size: 21, 5
-  orig: 21, 5
-  offset: 0, 0
-  index: -1
+	bounds: 551, 365, 21, 5
+	rotate: 90
 girl-spring-dress/mouth-close
 girl-spring-dress/mouth-close
-  rotate: true
-  xy: 551, 365
-  size: 21, 5
-  orig: 21, 5
-  offset: 0, 0
-  index: -1
+	bounds: 551, 365, 21, 5
+	rotate: 90
 girl/mouth-close
 girl/mouth-close
-  rotate: true
-  xy: 551, 365
-  size: 21, 5
-  orig: 21, 5
-  offset: 0, 0
-  index: -1
+	bounds: 551, 365, 21, 5
+	rotate: 90
 boy/mouth-smile
 boy/mouth-smile
-  rotate: false
-  xy: 705, 79
-  size: 29, 7
-  orig: 29, 7
-  offset: 0, 0
-  index: -1
+	bounds: 705, 79, 29, 7
 boy/nose
 boy/nose
-  rotate: true
-  xy: 836, 473
-  size: 17, 10
-  orig: 17, 10
-  offset: 0, 0
-  index: -1
+	bounds: 836, 473, 17, 10
+	rotate: 90
 boy/pompom
 boy/pompom
-  rotate: true
-  xy: 747, 273
-  size: 48, 43
-  orig: 48, 43
-  offset: 0, 0
-  index: -1
+	bounds: 747, 273, 48, 43
+	rotate: 90
 boy/zip
 boy/zip
-  rotate: false
-  xy: 648, 144
-  size: 14, 23
-  orig: 14, 23
-  offset: 0, 0
-  index: -1
+	bounds: 648, 144, 14, 23
 girl-blue-cape/back-eyebrow
 girl-blue-cape/back-eyebrow
-  rotate: false
-  xy: 602, 131
-  size: 18, 12
-  orig: 18, 12
-  offset: 0, 0
-  index: -1
+	bounds: 602, 131, 18, 12
 girl-blue-cape/body-dress
 girl-blue-cape/body-dress
-  rotate: false
-  xy: 2, 264
-  size: 109, 246
-  orig: 109, 246
-  offset: 0, 0
-  index: -1
+	bounds: 2, 264, 109, 246
 girl-blue-cape/body-ribbon
 girl-blue-cape/body-ribbon
-  rotate: false
-  xy: 615, 283
-  size: 50, 38
-  orig: 50, 38
-  offset: 0, 0
-  index: -1
+	bounds: 615, 283, 50, 38
 girl-blue-cape/cape-back
 girl-blue-cape/cape-back
-  rotate: false
-  xy: 2, 69
-  size: 134, 193
-  orig: 134, 193
-  offset: 0, 0
-  index: -1
+	bounds: 2, 69, 134, 193
 girl-blue-cape/cape-back-up
 girl-blue-cape/cape-back-up
-  rotate: true
-  xy: 386, 387
-  size: 123, 106
-  orig: 123, 106
-  offset: 0, 0
-  index: -1
+	bounds: 386, 387, 123, 106
+	rotate: 90
 girl-blue-cape/cape-ribbon
 girl-blue-cape/cape-ribbon
-  rotate: false
-  xy: 675, 264
-  size: 50, 18
-  orig: 50, 18
-  offset: 0, 0
-  index: -1
+	bounds: 675, 264, 50, 18
 girl-blue-cape/cape-shoulder-back
 girl-blue-cape/cape-shoulder-back
-  rotate: false
-  xy: 751, 110
-  size: 49, 59
-  orig: 49, 59
-  offset: 0, 0
-  index: -1
+	bounds: 751, 110, 49, 59
 girl-blue-cape/cape-shoulder-front
 girl-blue-cape/cape-shoulder-front
-  rotate: true
-  xy: 113, 264
-  size: 62, 76
-  orig: 62, 76
-  offset: 0, 0
-  index: -1
+	bounds: 113, 264, 62, 76
+	rotate: 90
 girl-blue-cape/cape-up-front
 girl-blue-cape/cape-up-front
-  rotate: true
-  xy: 399, 264
-  size: 98, 117
-  orig: 98, 117
-  offset: 0, 0
-  index: -1
+	bounds: 399, 264, 98, 117
+	rotate: 90
 girl-blue-cape/ear
 girl-blue-cape/ear
-  rotate: false
-  xy: 775, 2
-  size: 19, 23
-  orig: 19, 23
-  offset: 0, 0
-  index: -1
+	bounds: 775, 2, 19, 23
 girl-spring-dress/ear
 girl-spring-dress/ear
-  rotate: false
-  xy: 775, 2
-  size: 19, 23
-  orig: 19, 23
-  offset: 0, 0
-  index: -1
+	bounds: 775, 2, 19, 23
 girl/ear
 girl/ear
-  rotate: false
-  xy: 775, 2
-  size: 19, 23
-  orig: 19, 23
-  offset: 0, 0
-  index: -1
+	bounds: 775, 2, 19, 23
 girl-blue-cape/eye-back-low-eyelid
 girl-blue-cape/eye-back-low-eyelid
-  rotate: false
-  xy: 802, 463
-  size: 17, 6
-  orig: 17, 6
-  offset: 0, 0
-  index: -1
+	bounds: 802, 463, 17, 6
 girl-spring-dress/eye-back-low-eyelid
 girl-spring-dress/eye-back-low-eyelid
-  rotate: false
-  xy: 802, 463
-  size: 17, 6
-  orig: 17, 6
-  offset: 0, 0
-  index: -1
+	bounds: 802, 463, 17, 6
 girl/eye-back-low-eyelid
 girl/eye-back-low-eyelid
-  rotate: false
-  xy: 802, 463
-  size: 17, 6
-  orig: 17, 6
-  offset: 0, 0
-  index: -1
+	bounds: 802, 463, 17, 6
 girl-blue-cape/eye-back-pupil
 girl-blue-cape/eye-back-pupil
-  rotate: false
-  xy: 816, 367
-  size: 8, 9
-  orig: 8, 9
-  offset: 0, 0
-  index: -1
+	bounds: 816, 367, 8, 9
 girl-spring-dress/eye-back-pupil
 girl-spring-dress/eye-back-pupil
-  rotate: false
-  xy: 816, 367
-  size: 8, 9
-  orig: 8, 9
-  offset: 0, 0
-  index: -1
+	bounds: 816, 367, 8, 9
 girl/eye-back-pupil
 girl/eye-back-pupil
-  rotate: false
-  xy: 816, 367
-  size: 8, 9
-  orig: 8, 9
-  offset: 0, 0
-  index: -1
+	bounds: 816, 367, 8, 9
 girl-blue-cape/eye-back-up-eyelid
 girl-blue-cape/eye-back-up-eyelid
-  rotate: false
-  xy: 554, 131
-  size: 24, 12
-  orig: 24, 12
-  offset: 0, 0
-  index: -1
+	bounds: 554, 131, 24, 12
 girl-spring-dress/eye-back-up-eyelid
 girl-spring-dress/eye-back-up-eyelid
-  rotate: false
-  xy: 554, 131
-  size: 24, 12
-  orig: 24, 12
-  offset: 0, 0
-  index: -1
+	bounds: 554, 131, 24, 12
 girl/eye-back-up-eyelid
 girl/eye-back-up-eyelid
-  rotate: false
-  xy: 554, 131
-  size: 24, 12
-  orig: 24, 12
-  offset: 0, 0
-  index: -1
+	bounds: 554, 131, 24, 12
 girl-blue-cape/eye-back-up-eyelid-back
 girl-blue-cape/eye-back-up-eyelid-back
-  rotate: true
-  xy: 832, 453
-  size: 17, 11
-  orig: 17, 11
-  offset: 0, 0
-  index: -1
+	bounds: 832, 453, 17, 11
+	rotate: 90
 girl-spring-dress/eye-back-up-eyelid-back
 girl-spring-dress/eye-back-up-eyelid-back
-  rotate: true
-  xy: 832, 453
-  size: 17, 11
-  orig: 17, 11
-  offset: 0, 0
-  index: -1
+	bounds: 832, 453, 17, 11
+	rotate: 90
 girl/eye-back-up-eyelid-back
 girl/eye-back-up-eyelid-back
-  rotate: true
-  xy: 832, 453
-  size: 17, 11
-  orig: 17, 11
-  offset: 0, 0
-  index: -1
+	bounds: 832, 453, 17, 11
+	rotate: 90
 girl-blue-cape/eye-front-low-eyelid
 girl-blue-cape/eye-front-low-eyelid
-  rotate: true
-  xy: 739, 303
-  size: 18, 6
-  orig: 18, 6
-  offset: 0, 0
-  index: -1
+	bounds: 739, 303, 18, 6
+	rotate: 90
 girl-spring-dress/eye-front-low-eyelid
 girl-spring-dress/eye-front-low-eyelid
-  rotate: true
-  xy: 739, 303
-  size: 18, 6
-  orig: 18, 6
-  offset: 0, 0
-  index: -1
+	bounds: 739, 303, 18, 6
+	rotate: 90
 girl/eye-front-low-eyelid
 girl/eye-front-low-eyelid
-  rotate: true
-  xy: 739, 303
-  size: 18, 6
-  orig: 18, 6
-  offset: 0, 0
-  index: -1
+	bounds: 739, 303, 18, 6
+	rotate: 90
 girl-blue-cape/eye-front-pupil
 girl-blue-cape/eye-front-pupil
-  rotate: false
-  xy: 816, 378
-  size: 9, 9
-  orig: 9, 9
-  offset: 0, 0
-  index: -1
+	bounds: 816, 378, 9, 9
 girl-spring-dress/eye-front-pupil
 girl-spring-dress/eye-front-pupil
-  rotate: false
-  xy: 816, 378
-  size: 9, 9
-  orig: 9, 9
-  offset: 0, 0
-  index: -1
+	bounds: 816, 378, 9, 9
 girl/eye-front-pupil
 girl/eye-front-pupil
-  rotate: false
-  xy: 816, 378
-  size: 9, 9
-  orig: 9, 9
-  offset: 0, 0
-  index: -1
+	bounds: 816, 378, 9, 9
 girl-blue-cape/eye-front-up-eyelid
 girl-blue-cape/eye-front-up-eyelid
-  rotate: true
-  xy: 392, 77
-  size: 30, 14
-  orig: 30, 14
-  offset: 0, 0
-  index: -1
+	bounds: 392, 77, 30, 14
+	rotate: 90
 girl-spring-dress/eye-front-up-eyelid
 girl-spring-dress/eye-front-up-eyelid
-  rotate: true
-  xy: 392, 77
-  size: 30, 14
-  orig: 30, 14
-  offset: 0, 0
-  index: -1
+	bounds: 392, 77, 30, 14
+	rotate: 90
 girl/eye-front-up-eyelid
 girl/eye-front-up-eyelid
-  rotate: true
-  xy: 392, 77
-  size: 30, 14
-  orig: 30, 14
-  offset: 0, 0
-  index: -1
+	bounds: 392, 77, 30, 14
+	rotate: 90
 girl-blue-cape/eye-front-up-eyelid-back
 girl-blue-cape/eye-front-up-eyelid-back
-  rotate: false
-  xy: 455, 130
-  size: 26, 11
-  orig: 26, 11
-  offset: 0, 0
-  index: -1
+	bounds: 455, 130, 26, 11
 girl-spring-dress/eye-front-up-eyelid-back
 girl-spring-dress/eye-front-up-eyelid-back
-  rotate: false
-  xy: 455, 130
-  size: 26, 11
-  orig: 26, 11
-  offset: 0, 0
-  index: -1
+	bounds: 455, 130, 26, 11
 girl/eye-front-up-eyelid-back
 girl/eye-front-up-eyelid-back
-  rotate: false
-  xy: 455, 130
-  size: 26, 11
-  orig: 26, 11
-  offset: 0, 0
-  index: -1
+	bounds: 455, 130, 26, 11
 girl-blue-cape/eye-iris-back
 girl-blue-cape/eye-iris-back
-  rotate: false
-  xy: 637, 264
-  size: 17, 17
-  orig: 17, 17
-  offset: 0, 0
-  index: -1
+	bounds: 637, 264, 17, 17
 girl-blue-cape/eye-iris-front
 girl-blue-cape/eye-iris-front
-  rotate: false
-  xy: 802, 471
-  size: 18, 18
-  orig: 18, 18
-  offset: 0, 0
-  index: -1
+	bounds: 802, 471, 18, 18
 girl-blue-cape/eye-white-back
 girl-blue-cape/eye-white-back
-  rotate: false
-  xy: 596, 264
-  size: 20, 16
-  orig: 20, 16
-  offset: 0, 0
-  index: -1
+	bounds: 596, 264, 20, 16
 girl-spring-dress/eye-white-back
 girl-spring-dress/eye-white-back
-  rotate: false
-  xy: 596, 264
-  size: 20, 16
-  orig: 20, 16
-  offset: 0, 0
-  index: -1
+	bounds: 596, 264, 20, 16
 girl-blue-cape/eye-white-front
 girl-blue-cape/eye-white-front
-  rotate: true
-  xy: 796, 5
-  size: 20, 16
-  orig: 20, 16
-  offset: 0, 0
-  index: -1
+	bounds: 796, 5, 20, 16
+	rotate: 90
 girl-spring-dress/eye-white-front
 girl-spring-dress/eye-white-front
-  rotate: true
-  xy: 796, 5
-  size: 20, 16
-  orig: 20, 16
-  offset: 0, 0
-  index: -1
+	bounds: 796, 5, 20, 16
+	rotate: 90
 girl/eye-white-front
 girl/eye-white-front
-  rotate: true
-  xy: 796, 5
-  size: 20, 16
-  orig: 20, 16
-  offset: 0, 0
-  index: -1
+	bounds: 796, 5, 20, 16
+	rotate: 90
 girl-blue-cape/front-eyebrow
 girl-blue-cape/front-eyebrow
-  rotate: true
-  xy: 608, 149
-  size: 18, 12
-  orig: 18, 12
-  offset: 0, 0
-  index: -1
+	bounds: 608, 149, 18, 12
+	rotate: 90
 girl-blue-cape/hair-back
 girl-blue-cape/hair-back
-  rotate: true
-  xy: 508, 145
-  size: 117, 98
-  orig: 117, 98
-  offset: 0, 0
-  index: -1
+	bounds: 508, 145, 117, 98
+	rotate: 90
 girl-blue-cape/hair-bangs
 girl-blue-cape/hair-bangs
-  rotate: true
-  xy: 673, 419
-  size: 91, 40
-  orig: 91, 40
-  offset: 0, 0
-  index: -1
+	bounds: 673, 419, 91, 40
+	rotate: 90
 girl-blue-cape/hair-head-side-back
 girl-blue-cape/hair-head-side-back
-  rotate: true
-  xy: 196, 331
-  size: 30, 52
-  orig: 30, 52
-  offset: 0, 0
-  index: -1
+	bounds: 196, 331, 30, 52
+	rotate: 90
 girl-blue-cape/hair-head-side-front
 girl-blue-cape/hair-head-side-front
-  rotate: false
-  xy: 738, 323
-  size: 41, 42
-  orig: 41, 42
-  offset: 0, 0
-  index: -1
+	bounds: 738, 323, 41, 42
 girl-blue-cape/hair-side
 girl-blue-cape/hair-side
-  rotate: false
-  xy: 473, 3
-  size: 36, 71
-  orig: 36, 71
-  offset: 0, 0
-  index: -1
+	bounds: 473, 3, 36, 71
 girl-blue-cape/hand-front-fingers
 girl-blue-cape/hand-front-fingers
-  rotate: false
-  xy: 509, 365
-  size: 19, 21
-  orig: 19, 21
-  offset: 0, 0
-  index: -1
+	bounds: 509, 365, 19, 21
 girl-spring-dress/hand-front-fingers
 girl-spring-dress/hand-front-fingers
-  rotate: false
-  xy: 509, 365
-  size: 19, 21
-  orig: 19, 21
-  offset: 0, 0
-  index: -1
+	bounds: 509, 365, 19, 21
 girl-blue-cape/leg-front
 girl-blue-cape/leg-front
-  rotate: true
-  xy: 168, 72
-  size: 30, 158
-  orig: 30, 158
-  offset: 0, 0
-  index: -1
+	bounds: 168, 72, 30, 158
+	rotate: 90
 girl-blue-cape/mouth-smile
 girl-blue-cape/mouth-smile
-  rotate: false
-  xy: 736, 79
-  size: 29, 7
-  orig: 29, 7
-  offset: 0, 0
-  index: -1
+	bounds: 736, 79, 29, 7
 girl-spring-dress/mouth-smile
 girl-spring-dress/mouth-smile
-  rotate: false
-  xy: 736, 79
-  size: 29, 7
-  orig: 29, 7
-  offset: 0, 0
-  index: -1
+	bounds: 736, 79, 29, 7
 girl/mouth-smile
 girl/mouth-smile
-  rotate: false
-  xy: 736, 79
-  size: 29, 7
-  orig: 29, 7
-  offset: 0, 0
-  index: -1
+	bounds: 736, 79, 29, 7
 girl-blue-cape/nose
 girl-blue-cape/nose
-  rotate: false
-  xy: 747, 264
-  size: 11, 7
-  orig: 11, 7
-  offset: 0, 0
-  index: -1
+	bounds: 747, 264, 11, 7
 girl-spring-dress/nose
 girl-spring-dress/nose
-  rotate: false
-  xy: 747, 264
-  size: 11, 7
-  orig: 11, 7
-  offset: 0, 0
-  index: -1
+	bounds: 747, 264, 11, 7
 girl/nose
 girl/nose
-  rotate: false
-  xy: 747, 264
-  size: 11, 7
-  orig: 11, 7
-  offset: 0, 0
-  index: -1
+	bounds: 747, 264, 11, 7
 girl-blue-cape/sleeve-back
 girl-blue-cape/sleeve-back
-  rotate: false
-  xy: 767, 79
-  size: 42, 29
-  orig: 42, 29
-  offset: 0, 0
-  index: -1
+	bounds: 767, 79, 42, 29
 girl-blue-cape/sleeve-front
 girl-blue-cape/sleeve-front
-  rotate: true
-  xy: 408, 76
-  size: 52, 119
-  orig: 52, 119
-  offset: 0, 0
-  index: -1
+	bounds: 408, 76, 52, 119
+	rotate: 90
 girl-spring-dress/arm-front
 girl-spring-dress/arm-front
-  rotate: false
-  xy: 596, 282
-  size: 17, 111
-  orig: 17, 111
-  offset: 0, 0
-  index: -1
+	bounds: 596, 282, 17, 111
 girl-spring-dress/back-eyebrow
 girl-spring-dress/back-eyebrow
-  rotate: false
-  xy: 801, 420
-  size: 18, 12
-  orig: 18, 12
-  offset: 0, 0
-  index: -1
+	bounds: 801, 420, 18, 12
 girl-spring-dress/body-up
 girl-spring-dress/body-up
-  rotate: false
-  xy: 179, 4
-  size: 64, 66
-  orig: 64, 66
-  offset: 0, 0
-  index: -1
+	bounds: 179, 4, 64, 66
 girl-spring-dress/cloak-down
 girl-spring-dress/cloak-down
-  rotate: false
-  xy: 775, 27
-  size: 50, 50
-  orig: 50, 50
-  offset: 0, 0
-  index: -1
+	bounds: 775, 27, 50, 50
 girl-spring-dress/cloak-up
 girl-spring-dress/cloak-up
-  rotate: true
-  xy: 360, 7
-  size: 64, 58
-  orig: 64, 58
-  offset: 0, 0
-  index: -1
+	bounds: 360, 7, 64, 58
+	rotate: 90
 girl-spring-dress/eye-iris-back
 girl-spring-dress/eye-iris-back
-  rotate: false
-  xy: 656, 264
-  size: 17, 17
-  orig: 17, 17
-  offset: 0, 0
-  index: -1
+	bounds: 656, 264, 17, 17
 girl-spring-dress/eye-iris-front
 girl-spring-dress/eye-iris-front
-  rotate: false
-  xy: 814, 492
-  size: 18, 18
-  orig: 18, 18
-  offset: 0, 0
-  index: -1
+	bounds: 814, 492, 18, 18
 girl-spring-dress/front-eyebrow
 girl-spring-dress/front-eyebrow
-  rotate: true
-  xy: 822, 472
-  size: 18, 12
-  orig: 18, 12
-  offset: 0, 0
-  index: -1
+	bounds: 822, 472, 18, 12
+	rotate: 90
 girl-spring-dress/hair-back
 girl-spring-dress/hair-back
-  rotate: true
-  xy: 196, 363
-  size: 147, 93
-  orig: 147, 93
-  offset: 0, 0
-  index: -1
+	bounds: 196, 363, 147, 93
+	rotate: 90
 girl-spring-dress/hair-bangs
 girl-spring-dress/hair-bangs
-  rotate: true
-  xy: 696, 326
-  size: 91, 40
-  orig: 91, 40
-  offset: 0, 0
-  index: -1
+	bounds: 696, 326, 91, 40
+	rotate: 90
 girl-spring-dress/hair-head-side-back
 girl-spring-dress/hair-head-side-back
-  rotate: false
-  xy: 529, 76
-  size: 30, 52
-  orig: 30, 52
-  offset: 0, 0
-  index: -1
+	bounds: 529, 76, 30, 52
 girl-spring-dress/hair-head-side-front
 girl-spring-dress/hair-head-side-front
-  rotate: false
-  xy: 781, 323
-  size: 41, 42
-  orig: 41, 42
-  offset: 0, 0
-  index: -1
+	bounds: 781, 323, 41, 42
 girl-spring-dress/hair-side
 girl-spring-dress/hair-side
-  rotate: false
-  xy: 511, 3
-  size: 36, 71
-  orig: 36, 71
-  offset: 0, 0
-  index: -1
+	bounds: 511, 3, 36, 71
 girl-spring-dress/leg-front
 girl-spring-dress/leg-front
-  rotate: false
-  xy: 171, 104
-  size: 30, 158
-  orig: 30, 158
-  offset: 0, 0
-  index: -1
+	bounds: 171, 104, 30, 158
 girl-spring-dress/neck
 girl-spring-dress/neck
-  rotate: false
-  xy: 138, 70
-  size: 20, 32
-  orig: 20, 32
-  offset: 0, 0
-  index: -1
+	bounds: 138, 70, 20, 32
 girl-spring-dress/shoulder-ribbon
 girl-spring-dress/shoulder-ribbon
-  rotate: true
-  xy: 622, 131
-  size: 36, 24
-  orig: 36, 24
-  offset: 0, 0
-  index: -1
+	bounds: 622, 131, 36, 24
+	rotate: 90
 girl-spring-dress/skirt
 girl-spring-dress/skirt
-  rotate: true
-  xy: 113, 328
-  size: 182, 81
-  orig: 182, 81
-  offset: 0, 0
-  index: -1
+	bounds: 113, 328, 182, 81
+	rotate: 90
 girl-spring-dress/underskirt
 girl-spring-dress/underskirt
-  rotate: false
-  xy: 2, 2
-  size: 175, 65
-  orig: 175, 65
-  offset: 0, 0
-  index: -1
+	bounds: 2, 2, 175, 65
 girl/arm-front
 girl/arm-front
-  rotate: false
-  xy: 577, 395
-  size: 36, 115
-  orig: 36, 115
-  offset: 0, 0
-  index: -1
+	bounds: 577, 395, 36, 115
 girl/back-eyebrow
 girl/back-eyebrow
-  rotate: true
-  xy: 834, 492
-  size: 18, 12
-  orig: 18, 12
-  offset: 0, 0
-  index: -1
+	bounds: 834, 492, 18, 12
+	rotate: 90
 girl/bag-base
 girl/bag-base
-  rotate: true
-  xy: 191, 264
-  size: 62, 58
-  orig: 62, 58
-  offset: 0, 0
-  index: -1
+	bounds: 191, 264, 62, 58
+	rotate: 90
 girl/bag-strap-front
 girl/bag-strap-front
-  rotate: false
-  xy: 385, 265
-  size: 12, 96
-  orig: 12, 96
-  offset: 0, 0
-  index: -1
+	bounds: 385, 265, 12, 96
 girl/bag-top
 girl/bag-top
-  rotate: false
-  xy: 738, 367
-  size: 49, 50
-  orig: 49, 50
-  offset: 0, 0
-  index: -1
+	bounds: 738, 367, 49, 50
 girl/body
 girl/body
-  rotate: false
-  xy: 356, 130
-  size: 97, 132
-  orig: 97, 132
-  offset: 0, 0
-  index: -1
+	bounds: 356, 130, 97, 132
 girl/boot-ribbon-front
 girl/boot-ribbon-front
-  rotate: false
-  xy: 539, 130
-  size: 13, 13
-  orig: 13, 13
-  offset: 0, 0
-  index: -1
+	bounds: 539, 130, 13, 13
 girl/eye-iris-back
 girl/eye-iris-back
-  rotate: false
-  xy: 821, 424
-  size: 17, 17
-  orig: 17, 17
-  offset: 0, 0
-  index: -1
+	bounds: 821, 424, 17, 17
 girl/eye-iris-front
 girl/eye-iris-front
-  rotate: false
-  xy: 812, 443
-  size: 18, 18
-  orig: 18, 18
-  offset: 0, 0
-  index: -1
+	bounds: 812, 443, 18, 18
 girl/eye-white-back
 girl/eye-white-back
-  rotate: true
-  xy: 814, 5
-  size: 20, 16
-  orig: 20, 16
-  offset: 0, 0
-  index: -1
+	bounds: 814, 5, 20, 16
+	rotate: 90
 girl/front-eyebrow
 girl/front-eyebrow
-  rotate: true
-  xy: 816, 400
-  size: 18, 12
-  orig: 18, 12
-  offset: 0, 0
-  index: -1
+	bounds: 816, 400, 18, 12
+	rotate: 90
 girl/hair-back
 girl/hair-back
-  rotate: true
-  xy: 291, 363
-  size: 147, 93
-  orig: 147, 93
-  offset: 0, 0
-  index: -1
+	bounds: 291, 363, 147, 93
+	rotate: 90
 girl/hair-bangs
 girl/hair-bangs
-  rotate: true
-  xy: 715, 419
-  size: 91, 40
-  orig: 91, 40
-  offset: 0, 0
-  index: -1
+	bounds: 715, 419, 91, 40
+	rotate: 90
 girl/hair-flap-down-front
 girl/hair-flap-down-front
-  rotate: false
-  xy: 288, 5
-  size: 70, 65
-  orig: 70, 65
-  offset: 0, 0
-  index: -1
+	bounds: 288, 5, 70, 65
 girl/hair-head-side-back
 girl/hair-head-side-back
-  rotate: false
-  xy: 561, 77
-  size: 30, 52
-  orig: 30, 52
-  offset: 0, 0
-  index: -1
+	bounds: 561, 77, 30, 52
 girl/hair-head-side-front
 girl/hair-head-side-front
-  rotate: true
-  xy: 757, 419
-  size: 41, 42
-  orig: 41, 42
-  offset: 0, 0
-  index: -1
+	bounds: 757, 419, 41, 42
+	rotate: 90
 girl/hair-patch
 girl/hair-patch
-  rotate: true
-  xy: 245, 4
-  size: 66, 41
-  orig: 66, 41
-  offset: 0, 0
-  index: -1
+	bounds: 245, 4, 66, 41
+	rotate: 90
 girl/hair-side
 girl/hair-side
-  rotate: false
-  xy: 549, 3
-  size: 36, 71
-  orig: 36, 71
-  offset: 0, 0
-  index: -1
+	bounds: 549, 3, 36, 71
 girl/hair-strand-back-1
 girl/hair-strand-back-1
-  rotate: false
-  xy: 684, 3
-  size: 58, 74
-  orig: 58, 74
-  offset: 0, 0
-  index: -1
+	bounds: 684, 3, 58, 74
 girl/hair-strand-back-2
 girl/hair-strand-back-2
-  rotate: true
-  xy: 692, 171
-  size: 91, 58
-  orig: 91, 58
-  offset: 0, 0
-  index: -1
+	bounds: 692, 171, 91, 58
+	rotate: 90
 girl/hair-strand-back-3
 girl/hair-strand-back-3
-  rotate: true
-  xy: 615, 323
-  size: 92, 79
-  orig: 92, 79
-  offset: 0, 0
-  index: -1
+	bounds: 615, 323, 92, 79
+	rotate: 90
 girl/hair-strand-front-1
 girl/hair-strand-front-1
-  rotate: false
-  xy: 518, 269
-  size: 38, 94
-  orig: 38, 94
-  offset: 0, 0
-  index: -1
+	bounds: 518, 269, 38, 94
 girl/hair-strand-front-2
 girl/hair-strand-front-2
-  rotate: false
-  xy: 593, 79
-  size: 70, 50
-  orig: 70, 50
-  offset: 0, 0
-  index: -1
+	bounds: 593, 79, 70, 50
 girl/hair-strand-front-3
 girl/hair-strand-front-3
-  rotate: false
-  xy: 705, 88
-  size: 44, 81
-  orig: 44, 81
-  offset: 0, 0
-  index: -1
+	bounds: 705, 88, 44, 81
 girl/hand-front-fingers
 girl/hand-front-fingers
-  rotate: false
-  xy: 530, 365
-  size: 19, 21
-  orig: 19, 21
-  offset: 0, 0
-  index: -1
+	bounds: 530, 365, 19, 21
 girl/hat
 girl/hat
-  rotate: true
-  xy: 608, 169
-  size: 93, 82
-  orig: 93, 82
-  offset: 0, 0
-  index: -1
+	bounds: 608, 169, 93, 82
+	rotate: 90
 girl/leg-front
 girl/leg-front
-  rotate: false
-  xy: 203, 104
-  size: 30, 158
-  orig: 30, 158
-  offset: 0, 0
-  index: -1
+	bounds: 203, 104, 30, 158
 girl/pompom
 girl/pompom
-  rotate: true
-  xy: 757, 462
-  size: 48, 43
-  orig: 48, 43
-  offset: 0, 0
-  index: -1
+	bounds: 757, 462, 48, 43
+	rotate: 90
 girl/scarf
 girl/scarf
-  rotate: true
-  xy: 455, 143
-  size: 119, 51
-  orig: 119, 51
-  offset: 0, 0
-  index: -1
+	bounds: 455, 143, 119, 51
+	rotate: 90
 girl/scarf-back
 girl/scarf-back
-  rotate: true
-  xy: 420, 2
-  size: 72, 51
-  orig: 72, 51
-  offset: 0, 0
-  index: -1
+	bounds: 420, 2, 72, 51
+	rotate: 90
 girl/zip
 girl/zip
-  rotate: true
-  xy: 356, 109
-  size: 19, 25
-  orig: 19, 25
-  offset: 0, 0
-  index: -1
+	bounds: 356, 109, 19, 25
+	rotate: 90

BIN
spine-ts/webgl/example/assets/mix-and-match-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/mix-and-match-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "EedJfu7UJ/I",
 	"hash": "EedJfu7UJ/I",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -240.58,
 	"x": -240.58,
 	"y": -3.38,
 	"y": -3.38,
 	"width": 410.36,
 	"width": 410.36,

BIN
spine-ts/webgl/example/assets/mix-and-match-pro.skel


+ 45 - 167
spine-ts/webgl/example/assets/owl-pma.atlas

@@ -1,195 +1,73 @@
-
 owl-pma.png
 owl-pma.png
-size: 1024,512
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 512
+	filter: Linear, Linear
+	pma: true
 L_eye-closed
 L_eye-closed
-  rotate: true
-  xy: 512, 5
-  size: 90, 86
-  orig: 90, 86
-  offset: 0, 0
-  index: -1
+	bounds: 512, 5, 90, 86
+	rotate: 90
 L_eye-iris
 L_eye-iris
-  rotate: true
-  xy: 600, 10
-  size: 90, 86
-  orig: 90, 86
-  offset: 0, 0
-  index: -1
+	bounds: 600, 10, 90, 86
+	rotate: 90
 L_eye-light
 L_eye-light
-  rotate: true
-  xy: 688, 4
-  size: 21, 20
-  orig: 21, 20
-  offset: 0, 0
-  index: -1
+	bounds: 688, 4, 21, 20
+	rotate: 90
 L_eye-pupil
 L_eye-pupil
-  rotate: true
-  xy: 856, 13
-  size: 63, 60
-  orig: 63, 60
-  offset: 0, 0
-  index: -1
+	bounds: 856, 13, 63, 60
+	rotate: 90
 L_foot
 L_foot
-  rotate: true
-  xy: 834, 78
-  size: 64, 48
-  orig: 64, 48
-  offset: 0, 0
-  index: -1
+	bounds: 834, 78, 64, 48
+	rotate: 90
 L_wing
 L_wing
-  rotate: true
-  xy: 349, 4
-  size: 81, 110
-  orig: 81, 110
-  offset: 0, 0
-  index: -1
+	bounds: 349, 4, 81, 110
+	rotate: 90
 R_eye-closed
 R_eye-closed
-  rotate: true
-  xy: 637, 119
-  size: 90, 86
-  orig: 90, 86
-  offset: 0, 0
-  index: -1
+	bounds: 637, 119, 90, 86
+	rotate: 90
 R_eye-iris
 R_eye-iris
-  rotate: true
-  xy: 688, 27
-  size: 90, 86
-  orig: 90, 86
-  offset: 0, 0
-  index: -1
+	bounds: 688, 27, 90, 86
+	rotate: 90
 R_eye-light
 R_eye-light
-  rotate: true
-  xy: 710, 4
-  size: 21, 20
-  orig: 21, 20
-  offset: 0, 0
-  index: -1
+	bounds: 710, 4, 21, 20
+	rotate: 90
 R_eye-pupil
 R_eye-pupil
-  rotate: true
-  xy: 884, 80
-  size: 63, 60
-  orig: 63, 60
-  offset: 0, 0
-  index: -1
+	bounds: 884, 80, 63, 60
+	rotate: 90
 R_foot
 R_foot
-  rotate: true
-  xy: 845, 145
-  size: 64, 48
-  orig: 64, 48
-  offset: 0, 0
-  index: -1
+	bounds: 845, 145, 64, 48
+	rotate: 90
 R_wing
 R_wing
-  rotate: false
-  xy: 421, 93
-  size: 81, 110
-  orig: 81, 110
-  offset: 0, 0
-  index: -1
+	bounds: 421, 93, 81, 110
 beak
 beak
-  rotate: false
-  xy: 776, 2
-  size: 39, 41
-  orig: 39, 41
-  offset: 0, 0
-  index: -1
+	bounds: 776, 2, 39, 41
 beak-down
 beak-down
-  rotate: false
-  xy: 817, 3
-  size: 37, 40
-  orig: 37, 40
-  offset: 0, 0
-  index: -1
+	bounds: 817, 3, 37, 40
 body
 body
-  rotate: false
-  xy: 2, 7
-  size: 248, 196
-  orig: 248, 196
-  offset: 0, 0
-  index: -1
+	bounds: 2, 7, 248, 196
 feather-1
 feather-1
-  rotate: false
-  xy: 918, 18
-  size: 59, 60
-  orig: 59, 60
-  offset: 0, 0
-  index: -1
+	bounds: 918, 18, 59, 60
 feather-2
 feather-2
-  rotate: false
-  xy: 781, 144
-  size: 62, 65
-  orig: 62, 65
-  offset: 0, 0
-  index: -1
+	bounds: 781, 144, 62, 65
 feather-3
 feather-3
-  rotate: false
-  xy: 776, 45
-  size: 56, 76
-  orig: 56, 76
-  offset: 0, 0
-  index: -1
+	bounds: 776, 45, 56, 76
 head-base
 head-base
-  rotate: true
-  xy: 621, 211
-  size: 299, 237
-  orig: 299, 237
-  offset: 0, 0
-  index: -1
+	bounds: 621, 211, 299, 237
+	rotate: 90
 leaf-1
 leaf-1
-  rotate: false
-  xy: 559, 102
-  size: 76, 101
-  orig: 76, 101
-  offset: 0, 0
-  index: -1
+	bounds: 559, 102, 76, 101
 leaf-2
 leaf-2
-  rotate: true
-  xy: 252, 4
-  size: 65, 95
-  orig: 65, 95
-  offset: 0, 0
-  index: -1
+	bounds: 252, 4, 65, 95
+	rotate: 90
 leaf-3
 leaf-3
-  rotate: true
-  xy: 252, 71
-  size: 132, 77
-  orig: 132, 77
-  offset: 0, 0
-  index: -1
+	bounds: 252, 71, 132, 77
+	rotate: 90
 leaf-4
 leaf-4
-  rotate: true
-  xy: 461, 2
-  size: 89, 49
-  orig: 89, 49
-  offset: 0, 0
-  index: -1
+	bounds: 461, 2, 89, 49
+	rotate: 90
 leaf-5
 leaf-5
-  rotate: false
-  xy: 504, 97
-  size: 53, 106
-  orig: 53, 106
-  offset: 0, 0
-  index: -1
+	bounds: 504, 97, 53, 106
 leaf-6
 leaf-6
-  rotate: false
-  xy: 331, 87
-  size: 88, 116
-  orig: 88, 116
-  offset: 0, 0
-  index: -1
+	bounds: 331, 87, 88, 116
 leaf-7
 leaf-7
-  rotate: false
-  xy: 725, 123
-  size: 54, 86
-  orig: 54, 86
-  offset: 0, 0
-  index: -1
+	bounds: 725, 123, 54, 86
 wood
 wood
-  rotate: false
-  xy: 2, 205
-  size: 617, 305
-  orig: 617, 305
-  offset: 0, 0
-  index: -1
+	bounds: 2, 205, 617, 305

BIN
spine-ts/webgl/example/assets/owl-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/owl-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "HV648sya8jg",
 	"hash": "HV648sya8jg",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -644,
 	"x": -644,
 	"y": -274,
 	"y": -274,
 	"width": 1350.84,
 	"width": 1350.84,

BIN
spine-ts/webgl/example/assets/owl-pro.skel


+ 61 - 233
spine-ts/webgl/example/assets/raptor-pma.atlas

@@ -1,272 +1,100 @@
-
 raptor-pma.png
 raptor-pma.png
-size: 1024,512
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 512
+	filter: Linear, Linear
+	pma: true
 back-arm
 back-arm
-  rotate: true
-  xy: 829, 88
-  size: 46, 25
-  orig: 46, 25
-  offset: 0, 0
-  index: -1
+	bounds: 829, 88, 46, 25
+	rotate: 90
 back-bracer
 back-bracer
-  rotate: true
-  xy: 195, 238
-  size: 39, 28
-  orig: 39, 28
-  offset: 0, 0
-  index: -1
+	bounds: 195, 238, 39, 28
+	rotate: 90
 back-hand
 back-hand
-  rotate: true
-  xy: 724, 140
-  size: 36, 34
-  orig: 36, 34
-  offset: 0, 0
-  index: -1
+	bounds: 724, 140, 36, 34
+	rotate: 90
 back-knee
 back-knee
-  rotate: true
-  xy: 760, 131
-  size: 49, 67
-  orig: 49, 67
-  offset: 0, 0
-  index: -1
+	bounds: 760, 131, 49, 67
+	rotate: 90
 back-thigh
 back-thigh
-  rotate: true
-  xy: 225, 238
-  size: 39, 24
-  orig: 39, 24
-  offset: 0, 0
-  index: -1
+	bounds: 225, 238, 39, 24
+	rotate: 90
 eyes-open
 eyes-open
-  rotate: false
-  xy: 975, 204
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 975, 204, 47, 45
 front-arm
 front-arm
-  rotate: false
-  xy: 969, 112
-  size: 48, 26
-  orig: 48, 26
-  offset: 0, 0
-  index: -1
+	bounds: 969, 112, 48, 26
 front-bracer
 front-bracer
-  rotate: true
-  xy: 724, 97
-  size: 41, 29
-  orig: 41, 29
-  offset: 0, 0
-  index: -1
+	bounds: 724, 97, 41, 29
+	rotate: 90
 front-hand
 front-hand
-  rotate: false
-  xy: 251, 239
-  size: 41, 38
-  orig: 41, 38
-  offset: 0, 0
-  index: -1
+	bounds: 251, 239, 41, 38
 front-open-hand
 front-open-hand
-  rotate: true
-  xy: 856, 76
-  size: 43, 44
-  orig: 43, 44
-  offset: 0, 0
-  index: -1
+	bounds: 856, 76, 43, 44
+	rotate: 90
 front-thigh
 front-thigh
-  rotate: true
-  xy: 729, 178
-  size: 57, 29
-  orig: 57, 29
-  offset: 0, 0
-  index: -1
+	bounds: 729, 178, 57, 29
+	rotate: 90
 gun
 gun
-  rotate: false
-  xy: 894, 251
-  size: 107, 103
-  orig: 107, 103
-  offset: 0, 0
-  index: -1
+	bounds: 894, 251, 107, 103
 gun-nohand
 gun-nohand
-  rotate: false
-  xy: 764, 241
-  size: 105, 102
-  orig: 105, 102
-  offset: 0, 0
-  index: -1
+	bounds: 764, 241, 105, 102
 head
 head
-  rotate: false
-  xy: 756, 345
-  size: 136, 149
-  orig: 136, 149
-  offset: 0, 0
-  index: -1
+	bounds: 756, 345, 136, 149
 lower-leg
 lower-leg
-  rotate: true
-  xy: 475, 237
-  size: 73, 98
-  orig: 73, 98
-  offset: 0, 0
-  index: -1
+	bounds: 475, 237, 73, 98
+	rotate: 90
 mouth-grind
 mouth-grind
-  rotate: false
-  xy: 975, 172
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 975, 172, 47, 30
 mouth-smile
 mouth-smile
-  rotate: false
-  xy: 975, 140
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 975, 140, 47, 30
 neck
 neck
-  rotate: false
-  xy: 366, 282
-  size: 18, 21
-  orig: 18, 21
-  offset: 0, 0
-  index: -1
+	bounds: 366, 282, 18, 21
 raptor-back-arm
 raptor-back-arm
-  rotate: true
-  xy: 636, 97
-  size: 82, 86
-  orig: 82, 86
-  offset: 0, 0
-  index: -1
+	bounds: 636, 97, 82, 86
+	rotate: 90
 raptor-body
 raptor-body
-  rotate: false
-  xy: 2, 2
-  size: 632, 233
-  orig: 632, 233
-  offset: 0, 0
-  index: -1
+	bounds: 2, 2, 632, 233
 raptor-front-arm
 raptor-front-arm
-  rotate: true
-  xy: 871, 168
-  size: 81, 102
-  orig: 81, 102
-  offset: 0, 0
-  index: -1
+	bounds: 871, 168, 81, 102
+	rotate: 90
 raptor-front-leg
 raptor-front-leg
-  rotate: false
-  xy: 2, 237
-  size: 191, 257
-  orig: 191, 257
-  offset: 0, 0
-  index: -1
+	bounds: 2, 237, 191, 257
 raptor-hindleg-back
 raptor-hindleg-back
-  rotate: false
-  xy: 195, 279
-  size: 169, 215
-  orig: 169, 215
-  offset: 0, 0
-  index: -1
+	bounds: 195, 279, 169, 215
 raptor-horn
 raptor-horn
-  rotate: true
-  xy: 431, 312
-  size: 182, 80
-  orig: 182, 80
-  offset: 0, 0
-  index: -1
+	bounds: 431, 312, 182, 80
+	rotate: 90
 raptor-horn-back
 raptor-horn-back
-  rotate: true
-  xy: 513, 318
-  size: 176, 77
-  orig: 176, 77
-  offset: 0, 0
-  index: -1
+	bounds: 513, 318, 176, 77
+	rotate: 90
 raptor-jaw
 raptor-jaw
-  rotate: false
-  xy: 894, 356
-  size: 126, 138
-  orig: 126, 138
-  offset: 0, 0
-  index: -1
+	bounds: 894, 356, 126, 138
 raptor-jaw-tooth
 raptor-jaw-tooth
-  rotate: true
-  xy: 294, 240
-  size: 37, 48
-  orig: 37, 48
-  offset: 0, 0
-  index: -1
+	bounds: 294, 240, 37, 48
+	rotate: 90
 raptor-mouth-inside
 raptor-mouth-inside
-  rotate: true
-  xy: 344, 241
-  size: 36, 41
-  orig: 36, 41
-  offset: 0, 0
-  index: -1
+	bounds: 344, 241, 36, 41
+	rotate: 90
 raptor-saddle-strap-back
 raptor-saddle-strap-back
-  rotate: false
-  xy: 575, 242
-  size: 54, 74
-  orig: 54, 74
-  offset: 0, 0
-  index: -1
+	bounds: 575, 242, 54, 74
 raptor-saddle-strap-front
 raptor-saddle-strap-front
-  rotate: true
-  xy: 764, 182
-  size: 57, 95
-  orig: 57, 95
-  offset: 0, 0
-  index: -1
+	bounds: 764, 182, 57, 95
+	rotate: 90
 raptor-saddle-w-shadow
 raptor-saddle-w-shadow
-  rotate: false
-  xy: 592, 323
-  size: 162, 171
-  orig: 162, 171
-  offset: 0, 0
-  index: -1
+	bounds: 592, 323, 162, 171
 raptor-tail-shadow
 raptor-tail-shadow
-  rotate: true
-  xy: 366, 305
-  size: 189, 63
-  orig: 189, 63
-  offset: 0, 0
-  index: -1
+	bounds: 366, 305, 189, 63
+	rotate: 90
 raptor-tongue
 raptor-tongue
-  rotate: false
-  xy: 387, 239
-  size: 86, 64
-  orig: 86, 64
-  offset: 0, 0
-  index: -1
+	bounds: 387, 239, 86, 64
 stirrup-back
 stirrup-back
-  rotate: true
-  xy: 829, 136
-  size: 44, 35
-  orig: 44, 35
-  offset: 0, 0
-  index: -1
+	bounds: 829, 136, 44, 35
+	rotate: 90
 stirrup-front
 stirrup-front
-  rotate: true
-  xy: 866, 121
-  size: 45, 50
-  orig: 45, 50
-  offset: 0, 0
-  index: -1
+	bounds: 866, 121, 45, 50
+	rotate: 90
 stirrup-strap
 stirrup-strap
-  rotate: false
-  xy: 918, 120
-  size: 49, 46
-  orig: 49, 46
-  offset: 0, 0
-  index: -1
+	bounds: 918, 120, 49, 46
 torso
 torso
-  rotate: true
-  xy: 636, 181
-  size: 54, 91
-  orig: 54, 91
-  offset: 0, 0
-  index: -1
+	bounds: 636, 181, 54, 91
+	rotate: 90
 visor
 visor
-  rotate: false
-  xy: 631, 237
-  size: 131, 84
-  orig: 131, 84
-  offset: 0, 0
-  index: -1
+	bounds: 631, 237, 131, 84

BIN
spine-ts/webgl/example/assets/raptor-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/raptor-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "CtfBW3uZSDg",
 	"hash": "CtfBW3uZSDg",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -809.16,
 	"x": -809.16,
 	"y": -73.54,
 	"y": -73.54,
 	"width": 1287.65,
 	"width": 1287.65,

BIN
spine-ts/webgl/example/assets/raptor-pro.skel


+ 60 - 245
spine-ts/webgl/example/assets/spineboy-pma.atlas

@@ -1,286 +1,101 @@
-
 spineboy-pma.png
 spineboy-pma.png
-size: 1024,256
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 256
+	filter: Linear, Linear
+	pma: true
 crosshair
 crosshair
-  rotate: false
-  xy: 813, 160
-  size: 45, 45
-  orig: 45, 45
-  offset: 0, 0
-  index: -1
+	bounds: 813, 160, 45, 45
 eye-indifferent
 eye-indifferent
-  rotate: false
-  xy: 569, 2
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 569, 2, 47, 45
 eye-surprised
 eye-surprised
-  rotate: true
-  xy: 643, 7
-  size: 47, 45
-  orig: 47, 45
-  offset: 0, 0
-  index: -1
+	bounds: 643, 7, 47, 45
+	rotate: 90
 front-bracer
 front-bracer
-  rotate: false
-  xy: 811, 51
-  size: 29, 40
-  orig: 29, 40
-  offset: 0, 0
-  index: -1
+	bounds: 811, 51, 29, 40
 front-fist-closed
 front-fist-closed
-  rotate: false
-  xy: 807, 93
-  size: 38, 41
-  orig: 38, 41
-  offset: 0, 0
-  index: -1
+	bounds: 807, 93, 38, 41
 front-fist-open
 front-fist-open
-  rotate: false
-  xy: 815, 210
-  size: 43, 44
-  orig: 43, 44
-  offset: 0, 0
-  index: -1
+	bounds: 815, 210, 43, 44
 front-foot
 front-foot
-  rotate: true
-  xy: 706, 64
-  size: 63, 35
-  orig: 63, 35
-  offset: 0, 0
-  index: -1
+	bounds: 706, 64, 63, 35
+	rotate: 90
 front-shin
 front-shin
-  rotate: false
-  xy: 80, 11
-  size: 41, 92
-  orig: 41, 92
-  offset: 0, 0
-  index: -1
+	bounds: 80, 11, 41, 92
 front-thigh
 front-thigh
-  rotate: false
-  xy: 754, 12
-  size: 23, 56
-  orig: 23, 56
-  offset: 0, 0
-  index: -1
+	bounds: 754, 12, 23, 56
 front-upper-arm
 front-upper-arm
-  rotate: false
-  xy: 618, 5
-  size: 23, 49
-  orig: 23, 49
-  offset: 0, 0
-  index: -1
+	bounds: 618, 5, 23, 49
 goggles
 goggles
-  rotate: false
-  xy: 214, 20
-  size: 131, 83
-  orig: 131, 83
-  offset: 0, 0
-  index: -1
+	bounds: 214, 20, 131, 83
 gun
 gun
-  rotate: true
-  xy: 347, 14
-  size: 105, 102
-  orig: 105, 102
-  offset: 0, 0
-  index: -1
+	bounds: 347, 14, 105, 102
+	rotate: 90
 head
 head
-  rotate: false
-  xy: 80, 105
-  size: 136, 149
-  orig: 136, 149
-  offset: 0, 0
-  index: -1
+	bounds: 80, 105, 136, 149
 hoverboard-board
 hoverboard-board
-  rotate: true
-  xy: 2, 8
-  size: 246, 76
-  orig: 246, 76
-  offset: 0, 0
-  index: -1
+	bounds: 2, 8, 246, 76
+	rotate: 90
 hoverboard-thruster
 hoverboard-thruster
-  rotate: false
-  xy: 478, 2
-  size: 30, 32
-  orig: 30, 32
-  offset: 0, 0
-  index: -1
+	bounds: 478, 2, 30, 32
 hoverglow-small
 hoverglow-small
-  rotate: true
-  xy: 218, 117
-  size: 137, 38
-  orig: 137, 38
-  offset: 0, 0
-  index: -1
+	bounds: 218, 117, 137, 38
+	rotate: 90
 mouth-grind
 mouth-grind
-  rotate: true
-  xy: 775, 80
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 775, 80, 47, 30
+	rotate: 90
 mouth-oooo
 mouth-oooo
-  rotate: true
-  xy: 779, 31
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 779, 31, 47, 30
+	rotate: 90
 mouth-smile
 mouth-smile
-  rotate: true
-  xy: 783, 207
-  size: 47, 30
-  orig: 47, 30
-  offset: 0, 0
-  index: -1
+	bounds: 783, 207, 47, 30
+	rotate: 90
 muzzle-glow
 muzzle-glow
-  rotate: false
-  xy: 779, 4
-  size: 25, 25
-  orig: 25, 25
-  offset: 0, 0
-  index: -1
+	bounds: 779, 4, 25, 25
 muzzle-ring
 muzzle-ring
-  rotate: false
-  xy: 451, 14
-  size: 25, 105
-  orig: 25, 105
-  offset: 0, 0
-  index: -1
+	bounds: 451, 14, 25, 105
 muzzle01
 muzzle01
-  rotate: true
-  xy: 664, 60
-  size: 67, 40
-  orig: 67, 40
-  offset: 0, 0
-  index: -1
+	bounds: 664, 60, 67, 40
+	rotate: 90
 muzzle02
 muzzle02
-  rotate: true
-  xy: 580, 56
-  size: 68, 42
-  orig: 68, 42
-  offset: 0, 0
-  index: -1
+	bounds: 580, 56, 68, 42
+	rotate: 90
 muzzle03
 muzzle03
-  rotate: true
-  xy: 478, 36
-  size: 83, 53
-  orig: 83, 53
-  offset: 0, 0
-  index: -1
+	bounds: 478, 36, 83, 53
+	rotate: 90
 muzzle04
 muzzle04
-  rotate: true
-  xy: 533, 49
-  size: 75, 45
-  orig: 75, 45
-  offset: 0, 0
-  index: -1
+	bounds: 533, 49, 75, 45
+	rotate: 90
 muzzle05
 muzzle05
-  rotate: true
-  xy: 624, 56
-  size: 68, 38
-  orig: 68, 38
-  offset: 0, 0
-  index: -1
+	bounds: 624, 56, 68, 38
+	rotate: 90
 neck
 neck
-  rotate: false
-  xy: 806, 8
-  size: 18, 21
-  orig: 18, 21
-  offset: 0, 0
-  index: -1
+	bounds: 806, 8, 18, 21
 portal-bg
 portal-bg
-  rotate: false
-  xy: 258, 121
-  size: 133, 133
-  orig: 133, 133
-  offset: 0, 0
-  index: -1
+	bounds: 258, 121, 133, 133
 portal-flare1
 portal-flare1
-  rotate: true
-  xy: 690, 2
-  size: 56, 30
-  orig: 56, 30
-  offset: 0, 0
-  index: -1
+	bounds: 690, 2, 56, 30
+	rotate: 90
 portal-flare2
 portal-flare2
-  rotate: false
-  xy: 510, 3
-  size: 57, 31
-  orig: 57, 31
-  offset: 0, 0
-  index: -1
+	bounds: 510, 3, 57, 31
 portal-flare3
 portal-flare3
-  rotate: true
-  xy: 722, 4
-  size: 58, 30
-  orig: 58, 30
-  offset: 0, 0
-  index: -1
+	bounds: 722, 4, 58, 30
+	rotate: 90
 portal-shade
 portal-shade
-  rotate: false
-  xy: 393, 121
-  size: 133, 133
-  orig: 133, 133
-  offset: 0, 0
-  index: -1
+	bounds: 393, 121, 133, 133
 portal-streaks1
 portal-streaks1
-  rotate: false
-  xy: 528, 126
-  size: 126, 128
-  orig: 126, 128
-  offset: 0, 0
-  index: -1
+	bounds: 528, 126, 126, 128
 portal-streaks2
 portal-streaks2
-  rotate: false
-  xy: 656, 129
-  size: 125, 125
-  orig: 125, 125
-  offset: 0, 0
-  index: -1
+	bounds: 656, 129, 125, 125
 rear-bracer
 rear-bracer
-  rotate: false
-  xy: 826, 13
-  size: 28, 36
-  orig: 28, 36
-  offset: 0, 0
-  index: -1
+	bounds: 826, 13, 28, 36
 rear-foot
 rear-foot
-  rotate: true
-  xy: 743, 70
-  size: 57, 30
-  orig: 57, 30
-  offset: 0, 0
-  index: -1
+	bounds: 743, 70, 57, 30
+	rotate: 90
 rear-shin
 rear-shin
-  rotate: false
-  xy: 174, 14
-  size: 38, 89
-  orig: 38, 89
-  offset: 0, 0
-  index: -1
+	bounds: 174, 14, 38, 89
 rear-thigh
 rear-thigh
-  rotate: false
-  xy: 783, 158
-  size: 28, 47
-  orig: 28, 47
-  offset: 0, 0
-  index: -1
+	bounds: 783, 158, 28, 47
 rear-upper-arm
 rear-upper-arm
-  rotate: true
-  xy: 783, 136
-  size: 20, 44
-  orig: 20, 44
-  offset: 0, 0
-  index: -1
+	bounds: 783, 136, 20, 44
+	rotate: 90
 torso
 torso
-  rotate: false
-  xy: 123, 13
-  size: 49, 90
-  orig: 49, 90
-  offset: 0, 0
-  index: -1
+	bounds: 123, 13, 49, 90

BIN
spine-ts/webgl/example/assets/spineboy-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/spineboy-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "xw6BotWLkgU",
 	"hash": "xw6BotWLkgU",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -188.63,
 	"x": -188.63,
 	"y": -7.94,
 	"y": -7.94,
 	"width": 418.45,
 	"width": 418.45,

BIN
spine-ts/webgl/example/assets/spineboy-pro.skel


BIN
spine-ts/webgl/example/assets/spineboy.png


+ 10 - 35
spine-ts/webgl/example/assets/stretchyman-pma.atlas

@@ -1,41 +1,16 @@
-
 stretchyman-pma.png
 stretchyman-pma.png
-size: 1024,256
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 256
+	filter: Linear, Linear
+	pma: true
 back-arm
 back-arm
-  rotate: false
-  xy: 149, 45
-  size: 72, 202
-  orig: 72, 202
-  offset: 0, 0
-  index: -1
+	bounds: 149, 45, 72, 202
 back-leg
 back-leg
-  rotate: true
-  xy: 312, 4
-  size: 100, 318
-  orig: 100, 318
-  offset: 0, 0
-  index: -1
+	bounds: 312, 4, 100, 318
+	rotate: 90
 body
 body
-  rotate: true
-  xy: 223, 106
-  size: 141, 452
-  orig: 141, 452
-  offset: 0, 0
-  index: -1
+	bounds: 223, 106, 141, 452
+	rotate: 90
 front-arm
 front-arm
-  rotate: false
-  xy: 2, 26
-  size: 145, 221
-  orig: 145, 221
-  offset: 0, 0
-  index: -1
+	bounds: 2, 26, 145, 221
 head
 head
-  rotate: false
-  xy: 223, 2
-  size: 87, 102
-  orig: 87, 102
-  offset: 0, 0
-  index: -1
+	bounds: 223, 2, 87, 102

BIN
spine-ts/webgl/example/assets/stretchyman-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/stretchyman-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "F+EPhClYhR8",
 	"hash": "F+EPhClYhR8",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -100.47,
 	"x": -100.47,
 	"y": -9.21,
 	"y": -9.21,
 	"width": 260.65,
 	"width": 260.65,

BIN
spine-ts/webgl/example/assets/stretchyman-pro.skel


+ 31 - 149
spine-ts/webgl/example/assets/tank-pma.atlas

@@ -1,174 +1,56 @@
-
 tank-pma.png
 tank-pma.png
-size: 1024,1024
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 1024, 1024
+	filter: Linear, Linear
+	pma: true
 antenna
 antenna
-  rotate: true
-  xy: 2, 712
-  size: 11, 152
-  orig: 11, 152
-  offset: 0, 0
-  index: -1
+	bounds: 2, 712, 11, 152
+	rotate: 90
 cannon
 cannon
-  rotate: false
-  xy: 222, 694
-  size: 466, 29
-  orig: 466, 29
-  offset: 0, 0
-  index: -1
+	bounds: 222, 694, 466, 29
 cannon-connector
 cannon-connector
-  rotate: true
-  xy: 82, 654
-  size: 56, 68
-  orig: 56, 68
-  offset: 0, 0
-  index: -1
+	bounds: 82, 654, 56, 68
+	rotate: 90
 ground
 ground
-  rotate: false
-  xy: 2, 175
-  size: 512, 177
-  orig: 512, 177
-  offset: 0, 0
-  index: -1
+	bounds: 2, 175, 512, 177
 guntower
 guntower
-  rotate: false
-  xy: 647, 347
-  size: 365, 145
-  orig: 365, 145
-  offset: 0, 0
-  index: -1
+	bounds: 647, 347, 365, 145
 machinegun
 machinegun
-  rotate: false
-  xy: 690, 694
-  size: 166, 29
-  orig: 166, 29
-  offset: 0, 0
-  index: -1
+	bounds: 690, 694, 166, 29
 machinegun-mount
 machinegun-mount
-  rotate: true
-  xy: 858, 687
-  size: 36, 48
-  orig: 36, 48
-  offset: 0, 0
-  index: -1
+	bounds: 858, 687, 36, 48
+	rotate: 90
 rock
 rock
-  rotate: false
-  xy: 664, 607
-  size: 290, 64
-  orig: 290, 64
-  offset: 0, 0
-  index: -1
+	bounds: 664, 607, 290, 64
 smoke-glow
 smoke-glow
-  rotate: false
-  xy: 946, 673
-  size: 50, 50
-  orig: 50, 50
-  offset: 0, 0
-  index: -1
+	bounds: 946, 673, 50, 50
 smoke-puff01-bg
 smoke-puff01-bg
-  rotate: false
-  xy: 312, 630
-  size: 92, 62
-  orig: 92, 62
-  offset: 0, 0
-  index: -1
+	bounds: 312, 630, 92, 62
 smoke-puff01-fg
 smoke-puff01-fg
-  rotate: false
-  xy: 222, 633
-  size: 88, 59
-  orig: 88, 59
-  offset: 0, 0
-  index: -1
+	bounds: 222, 633, 88, 59
 smoke-puff02-fg
 smoke-puff02-fg
-  rotate: false
-  xy: 406, 630
-  size: 92, 62
-  orig: 92, 62
-  offset: 0, 0
-  index: -1
+	bounds: 406, 630, 92, 62
 smoke-puff03-fg
 smoke-puff03-fg
-  rotate: false
-  xy: 500, 630
-  size: 92, 62
-  orig: 92, 62
-  offset: 0, 0
-  index: -1
+	bounds: 500, 630, 92, 62
 smoke-puff04-fg
 smoke-puff04-fg
-  rotate: false
-  xy: 2, 662
-  size: 78, 48
-  orig: 78, 48
-  offset: 0, 0
-  index: -1
+	bounds: 2, 662, 78, 48
 tank-bottom
 tank-bottom
-  rotate: false
-  xy: 2, 354
-  size: 643, 138
-  orig: 643, 138
-  offset: 0, 0
-  index: -1
+	bounds: 2, 354, 643, 138
 tank-bottom-shadow
 tank-bottom-shadow
-  rotate: false
-  xy: 2, 2
-  size: 646, 171
-  orig: 646, 171
-  offset: 0, 0
-  index: -1
+	bounds: 2, 2, 646, 171
 tank-top
 tank-top
-  rotate: false
-  xy: 195, 494
-  size: 704, 111
-  orig: 704, 111
-  offset: 0, 0
-  index: -1
+	bounds: 195, 494, 704, 111
 tread
 tread
-  rotate: false
-  xy: 172, 708
-  size: 48, 15
-  orig: 48, 15
-  offset: 0, 0
-  index: -1
+	bounds: 172, 708, 48, 15
 tread-inside
 tread-inside
-  rotate: true
-  xy: 156, 710
-  size: 13, 14
-  orig: 13, 14
-  offset: 0, 0
-  index: -1
+	bounds: 156, 710, 13, 14
+	rotate: 90
 wheel-big
 wheel-big
-  rotate: false
-  xy: 97, 540
-  size: 96, 96
-  orig: 96, 96
-  offset: 0, 0
-  index: -1
+	bounds: 97, 540, 96, 96
 wheel-big-overlay
 wheel-big-overlay
-  rotate: false
-  xy: 2, 559
-  size: 93, 93
-  orig: 93, 93
-  offset: 0, 0
-  index: -1
+	bounds: 2, 559, 93, 93
 wheel-mid
 wheel-mid
-  rotate: false
-  xy: 594, 624
-  size: 68, 68
-  orig: 68, 68
-  offset: 0, 0
-  index: -1
+	bounds: 594, 624, 68, 68
 wheel-mid-overlay
 wheel-mid-overlay
-  rotate: false
-  xy: 152, 638
-  size: 68, 68
-  orig: 68, 68
-  offset: 0, 0
-  index: -1
+	bounds: 152, 638, 68, 68
 wheel-small
 wheel-small
-  rotate: false
-  xy: 908, 687
-  size: 36, 36
-  orig: 36, 36
-  offset: 0, 0
-  index: -1
+	bounds: 908, 687, 36, 36

BIN
spine-ts/webgl/example/assets/tank-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/tank-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "3P3VgYJ8Bxk",
 	"hash": "3P3VgYJ8Bxk",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -5852.65,
 	"x": -5852.65,
 	"y": -348.5,
 	"y": -348.5,
 	"width": 7202.61,
 	"width": 7202.61,

BIN
spine-ts/webgl/example/assets/tank-pro.skel


+ 4 - 11
spine-ts/webgl/example/assets/vine-pma.atlas

@@ -1,13 +1,6 @@
-
 vine-pma.png
 vine-pma.png
-size: 128,1024
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
+	size: 128, 1024
+	filter: Linear, Linear
+	pma: true
 vine
 vine
-  rotate: false
-  xy: 2, 2
-  size: 68, 962
-  orig: 68, 962
-  offset: 0, 0
-  index: -1
+	bounds: 2, 2, 68, 962

BIN
spine-ts/webgl/example/assets/vine-pma.png


+ 1 - 1
spine-ts/webgl/example/assets/vine-pro.json

@@ -1,7 +1,7 @@
 {
 {
 "skeleton": {
 "skeleton": {
 	"hash": "mROo4Xkf3Fs",
 	"hash": "mROo4Xkf3Fs",
-	"spine": "4.0.34-beta",
+	"spine": "4.0.46-beta",
 	"x": -87.7,
 	"x": -87.7,
 	"y": -1.71,
 	"y": -1.71,
 	"width": 227.65,
 	"width": 227.65,

BIN
spine-ts/webgl/example/assets/vine-pro.skel


+ 1 - 0
spine-ts/webgl/tests/test-binary.html

@@ -68,6 +68,7 @@ function load() {
 		console.log("Json: " + time.totalTime);*/
 		console.log("Json: " + time.totalTime);*/
 
 
 		skeleton = new spine.Skeleton(skeletonData);
 		skeleton = new spine.Skeleton(skeletonData);
+		skeleton.y = -150;
 		var stateData = new spine.AnimationStateData(skeleton.data);
 		var stateData = new spine.AnimationStateData(skeleton.data);
 		state = new spine.AnimationState(stateData);
 		state = new spine.AnimationState(stateData);
 		stateData.defaultMix = 0;
 		stateData.defaultMix = 0;