mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
Merged with master, resolved conflicts
This commit is contained in:
commit
1ad8e6b63c
@ -719,7 +719,7 @@ public class SkeletonJson {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static private function toColor (hexString:String, colorIndex:int) : Number {
|
static private function toColor (hexString:String, colorIndex:int) : Number {
|
||||||
if (hexString.length != 8) throw new ArgumentError("Color hexidecimal length must be 8, recieved: " + hexString);
|
if (hexString.length != 8) throw new ArgumentError("Color hexidecimal length must be 8, received: " + hexString);
|
||||||
return parseInt(hexString.substring(colorIndex * 2, colorIndex * 2 + 2), 16) / 255;
|
return parseInt(hexString.substring(colorIndex * 2, colorIndex * 2 + 2), 16) / 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -262,7 +262,7 @@ namespace Spine {
|
|||||||
a = -a;
|
a = -a;
|
||||||
b = -b;
|
b = -b;
|
||||||
}
|
}
|
||||||
if (skeleton.flipY) {
|
if (skeleton.flipY != Bone.yDown) {
|
||||||
c = -c;
|
c = -c;
|
||||||
d = -d;
|
d = -d;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,9 +22,9 @@ spine-ts works with data exported from Spine 3.6.xx
|
|||||||
|
|
||||||
spine-ts WebGL & Widget backends supports all Spine features.
|
spine-ts WebGL & Widget backends supports all Spine features.
|
||||||
|
|
||||||
The spine-ts Canvas backend does not support color tinting, mesh attachments or shearing. Mesh attachments are supported by setting `spine.canvas.SkeletonRenderer.useTriangleRendering` to true. Note that this method is slow and may lead to artifacts on some browsers.
|
spine-ts Canvas does not support color tinting and mesh attachments. Only the alpha channel from tint colors is applied. Experimental support for mesh attachments can be enabled by setting `spine.canvas.SkeletonRenderer.useTriangleRendering` to true. Note that this method is slow and may lead to artifacts on some browsers.
|
||||||
|
|
||||||
The spine-ts THREE.JS backend does not support color tinting and blend modes. The THREE.JS backend provides `SkeletonMesh.zOffset` to avoid z-fighting. Adjust to your near/far plane settings.
|
spine-ts THREE.JS does not support color tinting and blend modes. The THREE.JS backend provides `SkeletonMesh.zOffset` to avoid z-fighting. Adjust to your near/far plane settings.
|
||||||
|
|
||||||
spine-ts does not yet support loading the binary format.
|
spine-ts does not yet support loading the binary format.
|
||||||
|
|
||||||
|
|||||||
@ -228,45 +228,48 @@ var spine;
|
|||||||
var drawOrder = skeleton.drawOrder;
|
var drawOrder = skeleton.drawOrder;
|
||||||
if (this.debugRendering)
|
if (this.debugRendering)
|
||||||
ctx.strokeStyle = "green";
|
ctx.strokeStyle = "green";
|
||||||
|
ctx.save();
|
||||||
for (var i = 0, n = drawOrder.length; i < n; i++) {
|
for (var i = 0, n = drawOrder.length; i < n; i++) {
|
||||||
var slot = drawOrder[i];
|
var slot = drawOrder[i];
|
||||||
var attachment = slot.getAttachment();
|
var attachment = slot.getAttachment();
|
||||||
|
var regionAttachment = null;
|
||||||
var region = null;
|
var region = null;
|
||||||
var image = null;
|
var image = null;
|
||||||
var vertices = this.vertices;
|
|
||||||
if (attachment instanceof spine.RegionAttachment) {
|
if (attachment instanceof spine.RegionAttachment) {
|
||||||
var regionAttachment = attachment;
|
regionAttachment = attachment;
|
||||||
vertices = this.computeRegionVertices(slot, regionAttachment, false);
|
|
||||||
region = regionAttachment.region;
|
region = regionAttachment.region;
|
||||||
image = (region).texture.getImage();
|
image = region.texture.getImage();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
var skeleton_1 = slot.bone.skeleton;
|
||||||
|
var skeletonColor = skeleton_1.color;
|
||||||
|
var slotColor = slot.color;
|
||||||
|
var regionColor = regionAttachment.color;
|
||||||
|
var alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||||
|
var color = this.tempColor;
|
||||||
|
color.set(skeletonColor.r * slotColor.r * regionColor.r, skeletonColor.g * slotColor.g * regionColor.g, skeletonColor.b * slotColor.b * regionColor.b, alpha);
|
||||||
var att = attachment;
|
var att = attachment;
|
||||||
var bone = slot.bone;
|
var bone = slot.bone;
|
||||||
var x = vertices[0];
|
var w = region.width;
|
||||||
var y = vertices[1];
|
var h = region.height;
|
||||||
var rotation = (bone.getWorldRotationX() - att.rotation) * Math.PI / 180;
|
ctx.save();
|
||||||
var xx = vertices[24] - vertices[0];
|
ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);
|
||||||
var xy = vertices[25] - vertices[1];
|
ctx.translate(attachment.offset[0], attachment.offset[1]);
|
||||||
var yx = vertices[8] - vertices[0];
|
ctx.rotate(attachment.rotation * Math.PI / 180);
|
||||||
var yy = vertices[9] - vertices[1];
|
ctx.scale(attachment.scaleX, attachment.scaleY);
|
||||||
var w = Math.sqrt(xx * xx + xy * xy), h = -Math.sqrt(yx * yx + yy * yy);
|
ctx.translate(w / 2, h / 2);
|
||||||
ctx.translate(x, y);
|
ctx.scale(1, -1);
|
||||||
ctx.rotate(rotation);
|
ctx.translate(-w / 2, -h / 2);
|
||||||
if (region.rotate) {
|
if (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) {
|
||||||
ctx.rotate(Math.PI / 2);
|
ctx.globalAlpha = color.a;
|
||||||
ctx.drawImage(image, region.x, region.y, region.height, region.width, 0, 0, h, -w);
|
|
||||||
ctx.rotate(-Math.PI / 2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ctx.drawImage(image, region.x, region.y, region.width, region.height, 0, 0, w, h);
|
|
||||||
}
|
}
|
||||||
|
ctx.drawImage(image, region.x, region.y, w, h, 0, 0, w, h);
|
||||||
if (this.debugRendering)
|
if (this.debugRendering)
|
||||||
ctx.strokeRect(0, 0, w, h);
|
ctx.strokeRect(0, 0, w, h);
|
||||||
ctx.rotate(-rotation);
|
ctx.restore();
|
||||||
ctx.translate(-x, -y);
|
|
||||||
}
|
}
|
||||||
|
ctx.restore();
|
||||||
};
|
};
|
||||||
SkeletonRenderer.prototype.drawTriangles = function (skeleton) {
|
SkeletonRenderer.prototype.drawTriangles = function (skeleton) {
|
||||||
var blendMode = null;
|
var blendMode = null;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -228,45 +228,48 @@ var spine;
|
|||||||
var drawOrder = skeleton.drawOrder;
|
var drawOrder = skeleton.drawOrder;
|
||||||
if (this.debugRendering)
|
if (this.debugRendering)
|
||||||
ctx.strokeStyle = "green";
|
ctx.strokeStyle = "green";
|
||||||
|
ctx.save();
|
||||||
for (var i = 0, n = drawOrder.length; i < n; i++) {
|
for (var i = 0, n = drawOrder.length; i < n; i++) {
|
||||||
var slot = drawOrder[i];
|
var slot = drawOrder[i];
|
||||||
var attachment = slot.getAttachment();
|
var attachment = slot.getAttachment();
|
||||||
|
var regionAttachment = null;
|
||||||
var region = null;
|
var region = null;
|
||||||
var image = null;
|
var image = null;
|
||||||
var vertices = this.vertices;
|
|
||||||
if (attachment instanceof spine.RegionAttachment) {
|
if (attachment instanceof spine.RegionAttachment) {
|
||||||
var regionAttachment = attachment;
|
regionAttachment = attachment;
|
||||||
vertices = this.computeRegionVertices(slot, regionAttachment, false);
|
|
||||||
region = regionAttachment.region;
|
region = regionAttachment.region;
|
||||||
image = (region).texture.getImage();
|
image = region.texture.getImage();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
var skeleton_1 = slot.bone.skeleton;
|
||||||
|
var skeletonColor = skeleton_1.color;
|
||||||
|
var slotColor = slot.color;
|
||||||
|
var regionColor = regionAttachment.color;
|
||||||
|
var alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||||
|
var color = this.tempColor;
|
||||||
|
color.set(skeletonColor.r * slotColor.r * regionColor.r, skeletonColor.g * slotColor.g * regionColor.g, skeletonColor.b * slotColor.b * regionColor.b, alpha);
|
||||||
var att = attachment;
|
var att = attachment;
|
||||||
var bone = slot.bone;
|
var bone = slot.bone;
|
||||||
var x = vertices[0];
|
var w = region.width;
|
||||||
var y = vertices[1];
|
var h = region.height;
|
||||||
var rotation = (bone.getWorldRotationX() - att.rotation) * Math.PI / 180;
|
ctx.save();
|
||||||
var xx = vertices[24] - vertices[0];
|
ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);
|
||||||
var xy = vertices[25] - vertices[1];
|
ctx.translate(attachment.offset[0], attachment.offset[1]);
|
||||||
var yx = vertices[8] - vertices[0];
|
ctx.rotate(attachment.rotation * Math.PI / 180);
|
||||||
var yy = vertices[9] - vertices[1];
|
ctx.scale(attachment.scaleX, attachment.scaleY);
|
||||||
var w = Math.sqrt(xx * xx + xy * xy), h = -Math.sqrt(yx * yx + yy * yy);
|
ctx.translate(w / 2, h / 2);
|
||||||
ctx.translate(x, y);
|
ctx.scale(1, -1);
|
||||||
ctx.rotate(rotation);
|
ctx.translate(-w / 2, -h / 2);
|
||||||
if (region.rotate) {
|
if (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) {
|
||||||
ctx.rotate(Math.PI / 2);
|
ctx.globalAlpha = color.a;
|
||||||
ctx.drawImage(image, region.x, region.y, region.height, region.width, 0, 0, h, -w);
|
|
||||||
ctx.rotate(-Math.PI / 2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ctx.drawImage(image, region.x, region.y, region.width, region.height, 0, 0, w, h);
|
|
||||||
}
|
}
|
||||||
|
ctx.drawImage(image, region.x, region.y, w, h, 0, 0, w, h);
|
||||||
if (this.debugRendering)
|
if (this.debugRendering)
|
||||||
ctx.strokeRect(0, 0, w, h);
|
ctx.strokeRect(0, 0, w, h);
|
||||||
ctx.rotate(-rotation);
|
ctx.restore();
|
||||||
ctx.translate(-x, -y);
|
|
||||||
}
|
}
|
||||||
|
ctx.restore();
|
||||||
};
|
};
|
||||||
SkeletonRenderer.prototype.drawTriangles = function (skeleton) {
|
SkeletonRenderer.prototype.drawTriangles = function (skeleton) {
|
||||||
var blendMode = null;
|
var blendMode = null;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -5,141 +5,120 @@ format: RGBA8888
|
|||||||
filter: Linear,Linear
|
filter: Linear,Linear
|
||||||
repeat: none
|
repeat: none
|
||||||
eye_indifferent
|
eye_indifferent
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 648, 629
|
xy: 275, 349
|
||||||
size: 93, 89
|
size: 93, 89
|
||||||
orig: 93, 89
|
orig: 93, 89
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
eye_surprised
|
eye_surprised
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 233, 179
|
xy: 214, 125
|
||||||
size: 93, 89
|
size: 93, 89
|
||||||
orig: 93, 89
|
orig: 93, 89
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_bracer
|
front_bracer
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 245, 2
|
xy: 678, 774
|
||||||
size: 58, 80
|
size: 58, 80
|
||||||
orig: 58, 80
|
orig: 58, 80
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_fist_closed
|
front_fist_closed
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 168, 45
|
xy: 944, 940
|
||||||
size: 75, 82
|
size: 75, 82
|
||||||
orig: 75, 82
|
orig: 75, 82
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_fist_open
|
front_fist_open
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 844, 646
|
xy: 132, 28
|
||||||
size: 86, 87
|
size: 86, 87
|
||||||
orig: 86, 87
|
orig: 86, 87
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_foot
|
front_foot
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 310, 326
|
xy: 550, 785
|
||||||
size: 126, 69
|
size: 126, 69
|
||||||
orig: 126, 69
|
orig: 126, 69
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_foot_bend1
|
front_foot_bend1
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 951, 894
|
xy: 2, 45
|
||||||
size: 128, 70
|
size: 128, 70
|
||||||
orig: 128, 70
|
orig: 128, 70
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_foot_bend2
|
front_foot_bend2
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 2, 33
|
xy: 729, 929
|
||||||
size: 108, 93
|
size: 108, 93
|
||||||
orig: 108, 93
|
orig: 108, 93
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_shin
|
front_shin
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 739, 735
|
xy: 466, 670
|
||||||
size: 82, 184
|
size: 82, 184
|
||||||
orig: 82, 184
|
orig: 82, 184
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_thigh
|
front_thigh
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 381, 340
|
xy: 281, 235
|
||||||
size: 48, 112
|
size: 48, 112
|
||||||
orig: 48, 112
|
orig: 48, 112
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
front_upper_arm
|
front_upper_arm
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 112, 29
|
xy: 220, 26
|
||||||
size: 54, 97
|
size: 54, 97
|
||||||
orig: 54, 97
|
orig: 54, 97
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
goggles
|
goggles
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 156, 454
|
xy: 466, 856
|
||||||
size: 261, 166
|
size: 261, 166
|
||||||
orig: 261, 166
|
orig: 261, 166
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
gun
|
gun
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 739, 819
|
xy: 2, 117
|
||||||
size: 210, 203
|
size: 210, 203
|
||||||
orig: 210, 203
|
orig: 210, 203
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
head
|
head
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 466, 724
|
xy: 2, 322
|
||||||
size: 271, 298
|
size: 271, 298
|
||||||
orig: 271, 298
|
orig: 271, 298
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
hoverboard_board
|
|
||||||
rotate: true
|
|
||||||
xy: 2, 128
|
|
||||||
size: 492, 152
|
|
||||||
orig: 492, 152
|
|
||||||
offset: 0, 0
|
|
||||||
index: -1
|
|
||||||
hoverboard_thruster
|
|
||||||
rotate: false
|
|
||||||
xy: 602, 558
|
|
||||||
size: 60, 64
|
|
||||||
orig: 60, 64
|
|
||||||
offset: 0, 0
|
|
||||||
index: -1
|
|
||||||
hoverglow_small
|
|
||||||
rotate: true
|
|
||||||
xy: 156, 178
|
|
||||||
size: 274, 75
|
|
||||||
orig: 274, 75
|
|
||||||
offset: 0, 0
|
|
||||||
index: -1
|
|
||||||
mouth_grind
|
mouth_grind
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 951, 799
|
xy: 844, 878
|
||||||
size: 93, 59
|
size: 93, 59
|
||||||
orig: 93, 59
|
orig: 93, 59
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
mouth_oooo
|
mouth_oooo
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 245, 84
|
xy: 550, 656
|
||||||
size: 93, 59
|
size: 93, 59
|
||||||
orig: 93, 59
|
orig: 93, 59
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
mouth_smile
|
mouth_smile
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 925, 738
|
xy: 738, 806
|
||||||
size: 93, 59
|
size: 93, 59
|
||||||
orig: 93, 59
|
orig: 93, 59
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
@ -153,63 +132,63 @@ muzzle
|
|||||||
index: -1
|
index: -1
|
||||||
neck
|
neck
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 168, 2
|
xy: 2, 2
|
||||||
size: 36, 41
|
size: 36, 41
|
||||||
orig: 36, 41
|
orig: 36, 41
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
rear_bracer
|
rear_bracer
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 932, 664
|
xy: 276, 51
|
||||||
size: 56, 72
|
size: 56, 72
|
||||||
orig: 56, 72
|
orig: 56, 72
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
rear_foot
|
rear_foot
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 487, 562
|
xy: 729, 867
|
||||||
size: 113, 60
|
size: 113, 60
|
||||||
orig: 113, 60
|
orig: 113, 60
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
rear_foot_bend1
|
rear_foot_bend1
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 419, 503
|
xy: 550, 717
|
||||||
size: 117, 66
|
size: 117, 66
|
||||||
orig: 117, 66
|
orig: 117, 66
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
rear_foot_bend2
|
rear_foot_bend2
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 739, 650
|
xy: 839, 939
|
||||||
size: 103, 83
|
size: 103, 83
|
||||||
orig: 103, 83
|
orig: 103, 83
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
rear_shin
|
rear_shin
|
||||||
rotate: false
|
rotate: false
|
||||||
xy: 233, 274
|
xy: 375, 442
|
||||||
size: 75, 178
|
size: 75, 178
|
||||||
orig: 75, 178
|
orig: 75, 178
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
rear_thigh
|
rear_thigh
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 487, 495
|
xy: 214, 216
|
||||||
size: 65, 104
|
size: 65, 104
|
||||||
orig: 65, 104
|
orig: 65, 104
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
rear_upper_arm
|
rear_upper_arm
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 156, 129
|
xy: 331, 260
|
||||||
size: 47, 87
|
size: 47, 87
|
||||||
orig: 47, 87
|
orig: 47, 87
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
index: -1
|
index: -1
|
||||||
torso
|
torso
|
||||||
rotate: true
|
rotate: false
|
||||||
xy: 466, 624
|
xy: 275, 440
|
||||||
size: 98, 180
|
size: 98, 180
|
||||||
orig: 98, 180
|
orig: 98, 180
|
||||||
offset: 0, 0
|
offset: 0, 0
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
Before Width: | Height: | Size: 678 KiB After Width: | Height: | Size: 595 KiB |
@ -17,6 +17,9 @@ var assetManager;
|
|||||||
var skeleton, state, bounds;
|
var skeleton, state, bounds;
|
||||||
var skeletonRenderer;
|
var skeletonRenderer;
|
||||||
|
|
||||||
|
var skelName = "spineboy";
|
||||||
|
var animName = "test";
|
||||||
|
|
||||||
function init () {
|
function init () {
|
||||||
canvas = document.getElementById("canvas");
|
canvas = document.getElementById("canvas");
|
||||||
canvas.width = window.innerWidth;
|
canvas.width = window.innerWidth;
|
||||||
@ -31,16 +34,16 @@ function init () {
|
|||||||
|
|
||||||
assetManager = new spine.canvas.AssetManager();
|
assetManager = new spine.canvas.AssetManager();
|
||||||
|
|
||||||
assetManager.loadText("assets/spineboy.json");
|
assetManager.loadText("assets/" + skelName + ".json");
|
||||||
assetManager.loadText("assets/spineboy.atlas");
|
assetManager.loadText("assets/" + skelName + ".atlas");
|
||||||
assetManager.loadTexture("assets/spineboy.png");
|
assetManager.loadTexture("assets/" + skelName + ".png");
|
||||||
|
|
||||||
requestAnimationFrame(load);
|
requestAnimationFrame(load);
|
||||||
}
|
}
|
||||||
|
|
||||||
function load () {
|
function load () {
|
||||||
if (assetManager.isLoadingComplete()) {
|
if (assetManager.isLoadingComplete()) {
|
||||||
var data = loadSkeleton("spineboy", "walk", "default");
|
var data = loadSkeleton(skelName, animName, "default");
|
||||||
skeleton = data.skeleton;
|
skeleton = data.skeleton;
|
||||||
state = data.state;
|
state = data.state;
|
||||||
bounds = data.bounds;
|
bounds = data.bounds;
|
||||||
@ -122,6 +125,14 @@ function render () {
|
|||||||
skeleton.updateWorldTransform();
|
skeleton.updateWorldTransform();
|
||||||
skeletonRenderer.draw(skeleton);
|
skeletonRenderer.draw(skeleton);
|
||||||
|
|
||||||
|
context.strokeStyle = "green";
|
||||||
|
context.beginPath();
|
||||||
|
context.moveTo(-1000, 0);
|
||||||
|
context.lineTo(1000, 0);
|
||||||
|
context.moveTo(0, -1000);
|
||||||
|
context.lineTo(0, 1000);
|
||||||
|
context.stroke();
|
||||||
|
|
||||||
requestAnimationFrame(render);
|
requestAnimationFrame(render);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,43 +55,56 @@ module spine.canvas {
|
|||||||
|
|
||||||
if (this.debugRendering) ctx.strokeStyle = "green";
|
if (this.debugRendering) ctx.strokeStyle = "green";
|
||||||
|
|
||||||
|
ctx.save();
|
||||||
for (let i = 0, n = drawOrder.length; i < n; i++) {
|
for (let i = 0, n = drawOrder.length; i < n; i++) {
|
||||||
let slot = drawOrder[i];
|
let slot = drawOrder[i];
|
||||||
let attachment = slot.getAttachment();
|
let attachment = slot.getAttachment();
|
||||||
|
let regionAttachment: RegionAttachment = null;
|
||||||
let region: TextureAtlasRegion = null;
|
let region: TextureAtlasRegion = null;
|
||||||
let image: HTMLImageElement = null;
|
let image: HTMLImageElement = null;
|
||||||
let vertices: ArrayLike<number> = this.vertices;
|
|
||||||
if (attachment instanceof RegionAttachment) {
|
|
||||||
let regionAttachment = <RegionAttachment>attachment;
|
|
||||||
vertices = this.computeRegionVertices(slot, regionAttachment, false);
|
|
||||||
region = <TextureAtlasRegion>regionAttachment.region;
|
|
||||||
image = (<CanvasTexture>(region).texture).getImage();
|
|
||||||
|
|
||||||
|
if (attachment instanceof RegionAttachment) {
|
||||||
|
regionAttachment = <RegionAttachment>attachment;
|
||||||
|
region = <TextureAtlasRegion>regionAttachment.region;
|
||||||
|
image = (<CanvasTexture>region.texture).getImage();
|
||||||
} else continue;
|
} else continue;
|
||||||
|
|
||||||
|
let skeleton = slot.bone.skeleton;
|
||||||
|
let skeletonColor = skeleton.color;
|
||||||
|
let slotColor = slot.color;
|
||||||
|
let regionColor = regionAttachment.color;
|
||||||
|
let alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||||
|
let color = this.tempColor;
|
||||||
|
color.set(skeletonColor.r * slotColor.r * regionColor.r,
|
||||||
|
skeletonColor.g * slotColor.g * regionColor.g,
|
||||||
|
skeletonColor.b * slotColor.b * regionColor.b,
|
||||||
|
alpha);
|
||||||
|
|
||||||
let att = <RegionAttachment>attachment;
|
let att = <RegionAttachment>attachment;
|
||||||
let bone = slot.bone;
|
let bone = slot.bone;
|
||||||
let x = vertices[0];
|
let w = region.width;
|
||||||
let y = vertices[1];
|
let h = region.height;
|
||||||
let rotation = (bone.getWorldRotationX() - att.rotation) * Math.PI / 180;
|
ctx.save();
|
||||||
let xx = vertices[24] - vertices[0];
|
ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);
|
||||||
let xy = vertices[25] - vertices[1];
|
ctx.translate(attachment.offset[0], attachment.offset[1]);
|
||||||
let yx = vertices[8] - vertices[0];
|
ctx.rotate(attachment.rotation * Math.PI / 180);
|
||||||
let yy = vertices[9] - vertices[1];
|
ctx.scale(attachment.scaleX, attachment.scaleY);
|
||||||
let w = Math.sqrt(xx * xx + xy * xy), h = -Math.sqrt(yx * yx + yy * yy);
|
ctx.translate(w / 2, h / 2);
|
||||||
ctx.translate(x, y);
|
ctx.scale(1, -1);
|
||||||
ctx.rotate(rotation);
|
ctx.translate(-w / 2, -h / 2);
|
||||||
if (region.rotate) {
|
if (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) {
|
||||||
ctx.rotate(Math.PI / 2);
|
ctx.globalAlpha = color.a;
|
||||||
ctx.drawImage(image, region.x, region.y, region.height, region.width, 0, 0, h, -w);
|
// experimental tinting via compositing, doesn't work
|
||||||
ctx.rotate(-Math.PI / 2);
|
// ctx.globalCompositeOperation = "source-atop";
|
||||||
} else {
|
// ctx.fillStyle = "rgba(" + (color.r * 255 | 0) + ", " + (color.g * 255 | 0) + ", " + (color.b * 255 | 0) + ", " + color.a + ")";
|
||||||
ctx.drawImage(image, region.x, region.y, region.width, region.height, 0, 0, w, h);
|
// ctx.fillRect(0, 0, w, h);
|
||||||
}
|
}
|
||||||
|
ctx.drawImage(image, region.x, region.y, w, h, 0, 0, w, h);
|
||||||
if (this.debugRendering) ctx.strokeRect(0, 0, w, h);
|
if (this.debugRendering) ctx.strokeRect(0, 0, w, h);
|
||||||
ctx.rotate(-rotation);
|
ctx.restore();
|
||||||
ctx.translate(-x, -y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
private drawTriangles (skeleton: Skeleton) {
|
private drawTriangles (skeleton: Skeleton) {
|
||||||
|
|||||||
@ -28,6 +28,8 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#define SPINE_OPTIONAL_MATERIALOVERRIDE
|
||||||
|
|
||||||
// Contributed by: Lost Polygon
|
// Contributed by: Lost Polygon
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -136,7 +138,9 @@ namespace Spine.Unity.Editor {
|
|||||||
|
|
||||||
if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Clear and Reapply Changes", "Removes all non-serialized overrides in the SkeletonRenderer and reapplies the overrides on this component."))) {
|
if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Clear and Reapply Changes", "Removes all non-serialized overrides in the SkeletonRenderer and reapplies the overrides on this component."))) {
|
||||||
if (skeletonRenderer != null) {
|
if (skeletonRenderer != null) {
|
||||||
|
#if SPINE_OPTIONAL_MATERIALOVERRIDE
|
||||||
skeletonRenderer.CustomMaterialOverride.Clear();
|
skeletonRenderer.CustomMaterialOverride.Clear();
|
||||||
|
#endif
|
||||||
skeletonRenderer.CustomSlotMaterials.Clear();
|
skeletonRenderer.CustomSlotMaterials.Clear();
|
||||||
RemoveCustomMaterials();
|
RemoveCustomMaterials();
|
||||||
SetCustomMaterials();
|
SetCustomMaterials();
|
||||||
|
|||||||
@ -28,6 +28,8 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#define SPINE_OPTIONAL_MATERIALOVERRIDE
|
||||||
|
|
||||||
// Contributed by: Lost Polygon
|
// Contributed by: Lost Polygon
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -40,8 +42,8 @@ namespace Spine.Unity.Modules {
|
|||||||
|
|
||||||
#region Inspector
|
#region Inspector
|
||||||
public SkeletonRenderer skeletonRenderer;
|
public SkeletonRenderer skeletonRenderer;
|
||||||
[SerializeField] List<SlotMaterialOverride> customSlotMaterials = new List<SlotMaterialOverride>();
|
[SerializeField] protected List<SlotMaterialOverride> customSlotMaterials = new List<SlotMaterialOverride>();
|
||||||
[SerializeField] List<AtlasMaterialOverride> customMaterialOverrides = new List<AtlasMaterialOverride>();
|
[SerializeField] protected List<AtlasMaterialOverride> customMaterialOverrides = new List<AtlasMaterialOverride>();
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
void Reset () {
|
void Reset () {
|
||||||
@ -115,6 +117,7 @@ namespace Spine.Unity.Modules {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if SPINE_OPTIONAL_MATERIALOVERRIDE
|
||||||
for (int i = 0; i < customMaterialOverrides.Count; i++) {
|
for (int i = 0; i < customMaterialOverrides.Count; i++) {
|
||||||
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
|
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
|
||||||
if (atlasMaterialOverride.overrideDisabled)
|
if (atlasMaterialOverride.overrideDisabled)
|
||||||
@ -122,6 +125,7 @@ namespace Spine.Unity.Modules {
|
|||||||
|
|
||||||
skeletonRenderer.CustomMaterialOverride[atlasMaterialOverride.originalMaterial] = atlasMaterialOverride.replacementMaterial;
|
skeletonRenderer.CustomMaterialOverride[atlasMaterialOverride.originalMaterial] = atlasMaterialOverride.replacementMaterial;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoveCustomMaterialOverrides () {
|
void RemoveCustomMaterialOverrides () {
|
||||||
@ -130,18 +134,21 @@ namespace Spine.Unity.Modules {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if SPINE_OPTIONAL_MATERIALOVERRIDE
|
||||||
for (int i = 0; i < customMaterialOverrides.Count; i++) {
|
for (int i = 0; i < customMaterialOverrides.Count; i++) {
|
||||||
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
|
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
|
||||||
Material currentMaterial;
|
Material currentMaterial;
|
||||||
|
|
||||||
if (!skeletonRenderer.CustomMaterialOverride.TryGetValue(atlasMaterialOverride.originalMaterial, out currentMaterial))
|
if (!skeletonRenderer.CustomMaterialOverride.TryGetValue(atlasMaterialOverride.originalMaterial, out currentMaterial))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Do not revert the material if it was changed by something else
|
// Do not revert the material if it was changed by something else
|
||||||
if (currentMaterial != atlasMaterialOverride.replacementMaterial)
|
if (currentMaterial != atlasMaterialOverride.replacementMaterial)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
skeletonRenderer.CustomMaterialOverride.Remove(atlasMaterialOverride.originalMaterial);
|
skeletonRenderer.CustomMaterialOverride.Remove(atlasMaterialOverride.originalMaterial);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnEnable applies the overrides at runtime, and when the editor loads.
|
// OnEnable applies the overrides at runtime, and when the editor loads.
|
||||||
|
|||||||
@ -28,6 +28,8 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#define SPINE_OPTIONAL_RENDEROVERRIDE
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Spine.Unity;
|
using Spine.Unity;
|
||||||
@ -45,8 +47,10 @@ namespace Spine.Unity.Modules {
|
|||||||
public SkeletonRenderer SkeletonRenderer {
|
public SkeletonRenderer SkeletonRenderer {
|
||||||
get { return skeletonRenderer; }
|
get { return skeletonRenderer; }
|
||||||
set {
|
set {
|
||||||
|
#if SPINE_OPTIONAL_RENDEROVERRIDE
|
||||||
if (skeletonRenderer != null)
|
if (skeletonRenderer != null)
|
||||||
skeletonRenderer.GenerateMeshOverride -= HandleRender;
|
skeletonRenderer.GenerateMeshOverride -= HandleRender;
|
||||||
|
#endif
|
||||||
|
|
||||||
skeletonRenderer = value;
|
skeletonRenderer = value;
|
||||||
this.enabled = false; // Disable if nulled.
|
this.enabled = false; // Disable if nulled.
|
||||||
@ -72,8 +76,11 @@ namespace Spine.Unity.Modules {
|
|||||||
if (copiedBlock == null) copiedBlock = new MaterialPropertyBlock();
|
if (copiedBlock == null) copiedBlock = new MaterialPropertyBlock();
|
||||||
mainMeshRenderer = skeletonRenderer.GetComponent<MeshRenderer>();
|
mainMeshRenderer = skeletonRenderer.GetComponent<MeshRenderer>();
|
||||||
|
|
||||||
|
#if SPINE_OPTIONAL_RENDEROVERRIDE
|
||||||
skeletonRenderer.GenerateMeshOverride -= HandleRender;
|
skeletonRenderer.GenerateMeshOverride -= HandleRender;
|
||||||
skeletonRenderer.GenerateMeshOverride += HandleRender;
|
skeletonRenderer.GenerateMeshOverride += HandleRender;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if UNITY_5_4_OR_NEWER
|
#if UNITY_5_4_OR_NEWER
|
||||||
if (copyMeshRendererFlags) {
|
if (copyMeshRendererFlags) {
|
||||||
@ -109,7 +116,9 @@ namespace Spine.Unity.Modules {
|
|||||||
|
|
||||||
void OnDisable () {
|
void OnDisable () {
|
||||||
if (skeletonRenderer == null) return;
|
if (skeletonRenderer == null) return;
|
||||||
|
#if SPINE_OPTIONAL_RENDEROVERRIDE
|
||||||
skeletonRenderer.GenerateMeshOverride -= HandleRender;
|
skeletonRenderer.GenerateMeshOverride -= HandleRender;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
skeletonRenderer.LateUpdate();
|
skeletonRenderer.LateUpdate();
|
||||||
@ -132,9 +141,14 @@ namespace Spine.Unity.Modules {
|
|||||||
var submeshInstructionsItems = submeshInstructions.Items;
|
var submeshInstructionsItems = submeshInstructions.Items;
|
||||||
int lastSubmeshInstruction = submeshInstructions.Count - 1;
|
int lastSubmeshInstruction = submeshInstructions.Count - 1;
|
||||||
|
|
||||||
|
#if SPINE_OPTIONAL_NORMALS
|
||||||
bool addNormals = skeletonRenderer.calculateNormals;
|
bool addNormals = skeletonRenderer.calculateNormals;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SPINE_OPTIONAL_SOLVETANGENTS
|
||||||
bool addTangents = skeletonRenderer.calculateTangents;
|
bool addTangents = skeletonRenderer.calculateTangents;
|
||||||
|
#endif
|
||||||
|
|
||||||
bool pmaVertexColors = skeletonRenderer.pmaVertexColors;
|
bool pmaVertexColors = skeletonRenderer.pmaVertexColors;
|
||||||
|
|
||||||
int rendererIndex = 0;
|
int rendererIndex = 0;
|
||||||
@ -143,8 +157,12 @@ namespace Spine.Unity.Modules {
|
|||||||
if (submeshInstructionsItems[si].forceSeparate || si == lastSubmeshInstruction) {
|
if (submeshInstructionsItems[si].forceSeparate || si == lastSubmeshInstruction) {
|
||||||
// Apply properties
|
// Apply properties
|
||||||
var meshGenerator = currentRenderer.MeshGenerator;
|
var meshGenerator = currentRenderer.MeshGenerator;
|
||||||
|
#if SPINE_OPTIONAL_NORMALS
|
||||||
meshGenerator.AddNormals = addNormals;
|
meshGenerator.AddNormals = addNormals;
|
||||||
|
#endif
|
||||||
|
#if SPINE_OPTIONAL_SOLVETANGENTS
|
||||||
meshGenerator.AddTangents = addTangents;
|
meshGenerator.AddTangents = addTangents;
|
||||||
|
#endif
|
||||||
meshGenerator.PremultiplyVertexColors = pmaVertexColors;
|
meshGenerator.PremultiplyVertexColors = pmaVertexColors;
|
||||||
if (copyPropertyBlock)
|
if (copyPropertyBlock)
|
||||||
currentRenderer.SetPropertyBlock(copiedBlock);
|
currentRenderer.SetPropertyBlock(copiedBlock);
|
||||||
|
|||||||
@ -303,7 +303,11 @@ namespace Spine.Unity {
|
|||||||
// Slot with a separator/new material will become the starting slot of the next new instruction.
|
// Slot with a separator/new material will become the starting slot of the next new instruction.
|
||||||
bool forceSeparate = (hasSeparators && separatorSlots.Contains(slot));
|
bool forceSeparate = (hasSeparators && separatorSlots.Contains(slot));
|
||||||
if (noRender) {
|
if (noRender) {
|
||||||
if (forceSeparate && vertexCount > 0 && this.generateMeshOverride != null) {
|
if (forceSeparate && vertexCount > 0
|
||||||
|
#if SPINE_OPTIONAL_RENDEROVERRIDE
|
||||||
|
&& this.generateMeshOverride != null
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
workingSubmeshInstructions.Add(
|
workingSubmeshInstructions.Add(
|
||||||
new Spine.Unity.MeshGeneration.SubmeshInstruction {
|
new Spine.Unity.MeshGeneration.SubmeshInstruction {
|
||||||
skeleton = this.skeleton,
|
skeleton = this.skeleton,
|
||||||
@ -411,13 +415,17 @@ namespace Spine.Unity {
|
|||||||
ArraysMeshGenerator.EnsureSize(vertexCount, ref this.uv2);
|
ArraysMeshGenerator.EnsureSize(vertexCount, ref this.uv2);
|
||||||
ArraysMeshGenerator.EnsureSize(vertexCount, ref this.uv3);
|
ArraysMeshGenerator.EnsureSize(vertexCount, ref this.uv3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SPINE_OPTIONAL_NORMALS
|
#if SPINE_OPTIONAL_NORMALS
|
||||||
|
bool vertexCountIncreased = ArraysMeshGenerator.EnsureSize(vertexCount, ref this.vertices, ref this.uvs, ref this.colors);
|
||||||
if (vertexCountIncreased && calculateNormals) {
|
if (vertexCountIncreased && calculateNormals) {
|
||||||
Vector3[] localNormals = this.normals = new Vector3[vertexCount];
|
Vector3[] localNormals = this.normals = new Vector3[vertexCount];
|
||||||
Vector3 normal = new Vector3(0, 0, -1);
|
Vector3 normal = new Vector3(0, 0, -1);
|
||||||
for (int i = 0; i < vertexCount; i++)
|
for (int i = 0; i < vertexCount; i++)
|
||||||
localNormals[i] = normal;
|
localNormals[i] = normal;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
ArraysMeshGenerator.EnsureSize(vertexCount, ref this.vertices, ref this.uvs, ref this.colors);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Vector3 meshBoundsMin;
|
Vector3 meshBoundsMin;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user