Skip to content

Commit 923b135

Browse files
committed
The Spine Plugin now uses a single instance of the Scene Renderer when running under WebGL. All instances of the plugin (installed per Scene) share the same base Scene Renderer, avoiding duplicate allocations and resizing events under multi-Scene games. Fix phaserjs#5286
1 parent 8e9ae2b commit 923b135

1 file changed

Lines changed: 19 additions & 11 deletions

File tree

plugins/spine/src/SpinePlugin.js

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ var SpineGameObject = require('./gameobject/SpineGameObject');
1515
var SpineContainer = require('./container/SpineContainer');
1616
var NOOP = require('../../../src/utils/NOOP');
1717

18+
// Plugin specific instance of the Spine Scene Renderer
19+
var sceneRenderer;
20+
1821
/**
1922
* @classdesc
2023
* The Spine Plugin is a Scene based plugin that handles the creation and rendering of Spine Game Objects.
@@ -216,6 +219,8 @@ var SpinePlugin = new Class({
216219
/**
217220
* An instance of the Spine WebGL Scene Renderer.
218221
*
222+
* There is only one instance of the Scene Renderer shared across the whole plugin.
223+
*
219224
* Only set if running in WebGL mode.
220225
*
221226
* @name SpinePlugin#sceneRenderer
@@ -246,7 +251,7 @@ var SpinePlugin = new Class({
246251

247252
/**
248253
* A reference to the Spine runtime.
249-
* This is the runtime created by Esoteric Software
254+
* This is the runtime created by Esoteric Software.
250255
*
251256
* @name SpinePlugin#plugin
252257
* @type {spine}
@@ -436,8 +441,6 @@ var SpinePlugin = new Class({
436441
*/
437442
bootWebGL: function ()
438443
{
439-
this.sceneRenderer = new Spine.webgl.SceneRenderer(this.renderer.canvas, this.gl, true);
440-
441444
// Monkeypatch the Spine setBlendMode functions, or batching is destroyed!
442445

443446
var setBlendMode = function (srcBlend, dstBlend)
@@ -457,11 +460,17 @@ var SpinePlugin = new Class({
457460
}
458461
};
459462

460-
this.sceneRenderer.batcher.setBlendMode = setBlendMode;
461-
this.sceneRenderer.shapes.setBlendMode = setBlendMode;
463+
if (!sceneRenderer)
464+
{
465+
sceneRenderer = new Spine.webgl.SceneRenderer(this.renderer.canvas, this.gl, true);
466+
sceneRenderer.batcher.setBlendMode = setBlendMode;
467+
sceneRenderer.shapes.setBlendMode = setBlendMode;
468+
}
462469

463-
this.skeletonRenderer = this.sceneRenderer.skeletonRenderer;
464-
this.skeletonDebugRenderer = this.sceneRenderer.skeletonDebugRenderer;
470+
// All share the same instance
471+
this.sceneRenderer = sceneRenderer;
472+
this.skeletonRenderer = sceneRenderer.skeletonRenderer;
473+
this.skeletonDebugRenderer = sceneRenderer.skeletonDebugRenderer;
465474

466475
this.temp1 = new Spine.webgl.Vector3(0, 0, 0);
467476
this.temp2 = new Spine.webgl.Vector3(0, 0, 0);
@@ -1059,8 +1068,7 @@ var SpinePlugin = new Class({
10591068
sceneRenderer.camera.position.x = viewportWidth / 2;
10601069
sceneRenderer.camera.position.y = viewportHeight / 2;
10611070

1062-
sceneRenderer.camera.viewportWidth = viewportWidth;
1063-
sceneRenderer.camera.viewportHeight = viewportHeight;
1071+
sceneRenderer.camera.setViewport(viewportWidth, viewportHeight);
10641072
},
10651073

10661074
/**
@@ -1122,9 +1130,9 @@ var SpinePlugin = new Class({
11221130
{
11231131
this.destroy();
11241132

1125-
if (this.sceneRenderer)
1133+
if (sceneRenderer)
11261134
{
1127-
this.sceneRenderer.dispose();
1135+
sceneRenderer.dispose();
11281136
}
11291137

11301138
this.sceneRenderer = null;

0 commit comments

Comments
 (0)