Skip to content

Commit 03da666

Browse files
committed
Fixed Spine Canvas rendering
1 parent 5a255ec commit 03da666

2 files changed

Lines changed: 91 additions & 22 deletions

File tree

plugins/spine/src/SpinePlugin.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ var SpinePlugin = new Class({
5353
this.gl;
5454
this.renderer;
5555
this.sceneRenderer;
56+
this.skeletonRenderer;
5657
this.skeletonDebugRenderer;
5758

5859
this.plugin = Spine;
@@ -88,16 +89,14 @@ var SpinePlugin = new Class({
8889
if (this.isWebGL)
8990
{
9091
this.bootWebGL();
92+
this.onResize();
93+
this.game.scale.on(ResizeEvent, this.onResize, this);
9194
}
9295
else
9396
{
9497
this.bootCanvas();
9598
}
9699

97-
this.onResize();
98-
99-
this.game.scale.on(ResizeEvent, this.onResize, this);
100-
101100
var eventEmitter = this.systems.events;
102101

103102
eventEmitter.once('shutdown', this.shutdown, this);
@@ -106,14 +105,14 @@ var SpinePlugin = new Class({
106105

107106
bootCanvas: function ()
108107
{
109-
this.skeletonRenderer = new this.runtime.SkeletonRenderer(this.scene.sys.context);
108+
this.skeletonRenderer = new Spine.canvas.SkeletonRenderer(this.scene.sys.context);
110109
},
111110

112111
getAtlasCanvas: function (key)
113112
{
114-
var atlasData = this.cache.get(key);
113+
var atlasEntry = this.cache.get(key);
115114

116-
if (!atlasData)
115+
if (!atlasEntry)
117116
{
118117
console.warn('No atlas data for: ' + key);
119118
return;
@@ -124,7 +123,7 @@ var SpinePlugin = new Class({
124123

125124
if (spineTextures.has(key))
126125
{
127-
atlas = new Spine.TextureAtlas(atlasData, function ()
126+
atlas = new Spine.TextureAtlas(atlasEntry.data, function ()
128127
{
129128
return spineTextures.get(key);
130129
});
@@ -133,7 +132,7 @@ var SpinePlugin = new Class({
133132
{
134133
var textures = this.textures;
135134

136-
atlas = new Spine.TextureAtlas(atlasData, function (path)
135+
atlas = new Spine.TextureAtlas(atlasEntry.data, function (path)
137136
{
138137
var canvasTexture = new Spine.canvas.CanvasTexture(textures.get(path).getSourceImage());
139138

@@ -172,6 +171,7 @@ var SpinePlugin = new Class({
172171
this.sceneRenderer.batcher.setBlendMode = setBlendMode;
173172
this.sceneRenderer.shapes.setBlendMode = setBlendMode;
174173

174+
this.skeletonRenderer = this.sceneRenderer.skeletonRenderer;
175175
this.skeletonDebugRenderer = this.sceneRenderer.skeletonDebugRenderer;
176176

177177
this.temp1 = new Spine.webgl.Vector3(0, 0, 0);
@@ -567,6 +567,7 @@ var SpinePlugin = new Class({
567567
this.json = null;
568568
this.textures = null;
569569
this.sceneRenderer = null;
570+
this.skeletonRenderer = null;
570571
this.gl = null;
571572
}
572573

plugins/spine/src/gameobject/SpineGameObjectCanvasRenderer.js

Lines changed: 81 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
55
*/
66

7-
var SetTransform = require('../../../../src/renderer/canvas/utils/SetTransform');
7+
var CounterClockwise = require('../../../../src/math/angle/CounterClockwise');
8+
var RadToDeg = require('../../../../src/math/RadToDeg');
9+
var Wrap = require('../../../../src/math/Wrap');
810

911
/**
1012
* Renders this Game Object with the Canvas Renderer to the given Camera.
@@ -29,27 +31,93 @@ var SpineGameObjectCanvasRenderer = function (renderer, src, interpolationPercen
2931
var skeleton = src.skeleton;
3032
var skeletonRenderer = plugin.skeletonRenderer;
3133

32-
if (!skeleton || !SetTransform(renderer, context, src, camera, parentMatrix))
34+
var GameObjectRenderMask = 15;
35+
36+
var willRender = !(GameObjectRenderMask !== src.renderFlags || (src.cameraFilter !== 0 && (src.cameraFilter & camera.id)));
37+
38+
if (!skeleton || !willRender)
3339
{
3440
return;
3541
}
3642

37-
skeletonRenderer.ctx = context;
43+
var camMatrix = renderer._tempMatrix1;
44+
var spriteMatrix = renderer._tempMatrix2;
45+
var calcMatrix = renderer._tempMatrix3;
3846

39-
context.save();
47+
spriteMatrix.applyITRS(src.x, src.y, src.rotation, Math.abs(src.scaleX), Math.abs(src.scaleY));
4048

41-
skeletonRenderer.draw(skeleton);
49+
camMatrix.copyFrom(camera.matrix);
4250

43-
if (plugin.drawDebug || src.drawDebug)
51+
if (parentMatrix)
52+
{
53+
// Multiply the camera by the parent matrix
54+
camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
55+
56+
// Undo the camera scroll
57+
spriteMatrix.e = src.x;
58+
spriteMatrix.f = src.y;
59+
60+
// Multiply by the Sprite matrix, store result in calcMatrix
61+
camMatrix.multiply(spriteMatrix, calcMatrix);
62+
}
63+
else
4464
{
45-
context.strokeStyle = '#00ff00';
46-
context.beginPath();
47-
context.moveTo(-1000, 0);
48-
context.lineTo(1000, 0);
49-
context.moveTo(0, -1000);
50-
context.lineTo(0, 1000);
51-
context.stroke();
65+
spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
66+
spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
67+
68+
// Multiply by the Sprite matrix, store result in calcMatrix
69+
camMatrix.multiply(spriteMatrix, calcMatrix);
70+
}
71+
72+
skeleton.x = calcMatrix.tx;
73+
skeleton.y = calcMatrix.ty;
74+
75+
skeleton.scaleX = calcMatrix.scaleX;
76+
77+
// Inverse or we get upside-down skeletons
78+
skeleton.scaleY = calcMatrix.scaleY * -1;
79+
80+
if (src.scaleX < 0)
81+
{
82+
skeleton.scaleX *= -1;
83+
84+
src.root.rotation = RadToDeg(calcMatrix.rotationNormalized);
5285
}
86+
else
87+
{
88+
// +90 degrees to account for the difference in Spine vs. Phaser rotation
89+
src.root.rotation = Wrap(RadToDeg(CounterClockwise(calcMatrix.rotationNormalized)) + 90, 0, 360);
90+
}
91+
92+
if (src.scaleY < 0)
93+
{
94+
skeleton.scaleY *= -1;
95+
96+
if (src.scaleX < 0)
97+
{
98+
src.root.rotation -= (RadToDeg(calcMatrix.rotationNormalized) * 2);
99+
}
100+
else
101+
{
102+
src.root.rotation += (RadToDeg(calcMatrix.rotationNormalized) * 2);
103+
}
104+
}
105+
106+
if (camera.renderToTexture)
107+
{
108+
skeleton.y = calcMatrix.ty;
109+
skeleton.scaleY *= -1;
110+
}
111+
112+
// Add autoUpdate option
113+
skeleton.updateWorldTransform();
114+
115+
skeletonRenderer.ctx = context;
116+
skeletonRenderer.debugRendering = (plugin.drawDebug || src.drawDebug);
117+
118+
context.save();
119+
120+
skeletonRenderer.draw(skeleton);
53121

54122
context.restore();
55123
};

0 commit comments

Comments
 (0)