Skip to content

Commit cc6e7a8

Browse files
committed
Support for Spine objects inside a container and no skeletons
1 parent 618f514 commit cc6e7a8

1 file changed

Lines changed: 44 additions & 20 deletions

File tree

plugins/spine/src/gameobject/SpineGameObjectWebGLRenderer.js

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

7+
var CounterClockwise = require('../../../../src/math/angle/CounterClockwise');
8+
79
/**
810
* Renders this Game Object with the Canvas Renderer to the given Camera.
911
* The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
@@ -22,51 +24,73 @@
2224
var SpineGameObjectWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
2325
{
2426
var pipeline = renderer.currentPipeline;
27+
var plugin = src.plugin;
28+
var mvp = plugin.mvp;
29+
30+
var shader = plugin.shader;
31+
var batcher = plugin.batcher;
32+
var runtime = src.runtime;
33+
var skeleton = src.skeleton;
34+
var skeletonRenderer = plugin.skeletonRenderer;
35+
36+
if (!skeleton)
37+
{
38+
return;
39+
}
2540

2641
renderer.clearPipeline();
2742

2843
var camMatrix = renderer._tempMatrix1;
2944
var spriteMatrix = renderer._tempMatrix2;
3045
var calcMatrix = renderer._tempMatrix3;
3146

32-
spriteMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
47+
// - 90 degrees to account for the difference in Spine vs. Phaser rotation
48+
spriteMatrix.applyITRS(src.x, src.y, src.rotation - 1.5707963267948966, src.scaleX, src.scaleY);
3349

3450
camMatrix.copyFrom(camera.matrix);
3551

36-
spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
37-
spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
52+
if (parentMatrix)
53+
{
54+
// Multiply the camera by the parent matrix
55+
camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
3856

39-
// Multiply by the Sprite matrix, store result in calcMatrix
40-
camMatrix.multiply(spriteMatrix, calcMatrix);
57+
// Undo the camera scroll
58+
spriteMatrix.e = src.x;
59+
spriteMatrix.f = src.y;
4160

42-
var plugin = src.plugin;
43-
var mvp = plugin.mvp;
44-
45-
var shader = plugin.shader;
46-
var batcher = plugin.batcher;
47-
var runtime = src.runtime;
48-
var skeleton = src.skeleton;
49-
var skeletonRenderer = plugin.skeletonRenderer;
61+
// Multiply by the Sprite matrix, store result in calcMatrix
62+
camMatrix.multiply(spriteMatrix, calcMatrix);
63+
}
64+
else
65+
{
66+
spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
67+
spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
5068

51-
// skeleton.flipX = src.flipX;
52-
// skeleton.flipY = src.flipY;
69+
// Multiply by the Sprite matrix, store result in calcMatrix
70+
camMatrix.multiply(spriteMatrix, calcMatrix);
71+
}
5372

54-
mvp.ortho(0, renderer.width, 0, renderer.height, 0, 1);
73+
var width = renderer.width;
74+
var height = renderer.height;
5575

5676
var data = calcMatrix.decomposeMatrix();
5777

58-
mvp.translateXYZ(data.translateX, renderer.height - data.translateY, 0);
59-
mvp.rotateZ(data.rotation * -1);
78+
mvp.ortho(0, width, 0, height, 0, 1);
79+
mvp.translateXYZ(data.translateX, height - data.translateY, 0);
80+
mvp.rotateZ(CounterClockwise(data.rotation));
6081
mvp.scaleXYZ(data.scaleX, data.scaleY, 1);
6182

62-
// skeleton.updateWorldTransform();
63-
83+
// For a Stage 1 release we'll handle it like this:
6484
shader.bind();
6585
shader.setUniformi(runtime.webgl.Shader.SAMPLER, 0);
6686
shader.setUniform4x4f(runtime.webgl.Shader.MVP_MATRIX, mvp.val);
6787

88+
// For Stage 2, we'll move to using a custom pipeline, so Spine objects are batched
89+
6890
batcher.begin(shader);
6991

92+
skeletonRenderer.premultipliedAlpha = true;
93+
7094
skeletonRenderer.draw(batcher, skeleton);
7195

7296
batcher.end();

0 commit comments

Comments
 (0)