|
4 | 4 | * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} |
5 | 5 | */ |
6 | 6 |
|
| 7 | +var CounterClockwise = require('../../../../src/math/angle/CounterClockwise'); |
| 8 | + |
7 | 9 | /** |
8 | 10 | * Renders this Game Object with the Canvas Renderer to the given Camera. |
9 | 11 | * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera. |
|
22 | 24 | var SpineGameObjectWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix) |
23 | 25 | { |
24 | 26 | 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 | + } |
25 | 40 |
|
26 | 41 | renderer.clearPipeline(); |
27 | 42 |
|
28 | 43 | var camMatrix = renderer._tempMatrix1; |
29 | 44 | var spriteMatrix = renderer._tempMatrix2; |
30 | 45 | var calcMatrix = renderer._tempMatrix3; |
31 | 46 |
|
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); |
33 | 49 |
|
34 | 50 | camMatrix.copyFrom(camera.matrix); |
35 | 51 |
|
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); |
38 | 56 |
|
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; |
41 | 60 |
|
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; |
50 | 68 |
|
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 | + } |
53 | 72 |
|
54 | | - mvp.ortho(0, renderer.width, 0, renderer.height, 0, 1); |
| 73 | + var width = renderer.width; |
| 74 | + var height = renderer.height; |
55 | 75 |
|
56 | 76 | var data = calcMatrix.decomposeMatrix(); |
57 | 77 |
|
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)); |
60 | 81 | mvp.scaleXYZ(data.scaleX, data.scaleY, 1); |
61 | 82 |
|
62 | | - // skeleton.updateWorldTransform(); |
63 | | - |
| 83 | + // For a Stage 1 release we'll handle it like this: |
64 | 84 | shader.bind(); |
65 | 85 | shader.setUniformi(runtime.webgl.Shader.SAMPLER, 0); |
66 | 86 | shader.setUniform4x4f(runtime.webgl.Shader.MVP_MATRIX, mvp.val); |
67 | 87 |
|
| 88 | + // For Stage 2, we'll move to using a custom pipeline, so Spine objects are batched |
| 89 | + |
68 | 90 | batcher.begin(shader); |
69 | 91 |
|
| 92 | + skeletonRenderer.premultipliedAlpha = true; |
| 93 | + |
70 | 94 | skeletonRenderer.draw(batcher, skeleton); |
71 | 95 |
|
72 | 96 | batcher.end(); |
|
0 commit comments