diff --git a/src/core/sprites/webgl/SpriteRenderer.js b/src/core/sprites/webgl/SpriteRenderer.js index 2d5ca1b..6f92d16 100644 --- a/src/core/sprites/webgl/SpriteRenderer.js +++ b/src/core/sprites/webgl/SpriteRenderer.js @@ -455,22 +455,29 @@ { for (let i = 0; i < this.vaoMax; i++) { - this.vertexBuffers[i].destroy(); - this.vaos[i].destroy(); + if (this.vertexBuffers[i]) + { + this.vertexBuffers[i].destroy(); + } + if (this.vaos[i]) + { + this.vaos[i].destroy(); + } } - this.indexBuffer.destroy(); + if (this.indexBuffer) + { + this.indexBuffer.destroy(); + } this.renderer.off('prerender', this.onPrerender, this); super.destroy(); - for (let i = 0; i < this.shaders.length; i++) + if (this.shader) { - if (this.shaders[i]) - { - this.shaders[i].destroy(); - } + this.shader.destroy(); + this.shader = null; } this.vertexBuffers = null; diff --git a/src/core/sprites/webgl/SpriteRenderer.js b/src/core/sprites/webgl/SpriteRenderer.js index 2d5ca1b..6f92d16 100644 --- a/src/core/sprites/webgl/SpriteRenderer.js +++ b/src/core/sprites/webgl/SpriteRenderer.js @@ -455,22 +455,29 @@ { for (let i = 0; i < this.vaoMax; i++) { - this.vertexBuffers[i].destroy(); - this.vaos[i].destroy(); + if (this.vertexBuffers[i]) + { + this.vertexBuffers[i].destroy(); + } + if (this.vaos[i]) + { + this.vaos[i].destroy(); + } } - this.indexBuffer.destroy(); + if (this.indexBuffer) + { + this.indexBuffer.destroy(); + } this.renderer.off('prerender', this.onPrerender, this); super.destroy(); - for (let i = 0; i < this.shaders.length; i++) + if (this.shader) { - if (this.shaders[i]) - { - this.shaders[i].destroy(); - } + this.shader.destroy(); + this.shader = null; } this.vertexBuffers = null; diff --git a/test/core/SpriteRenderer.js b/test/core/SpriteRenderer.js new file mode 100644 index 0000000..01e1f81 --- /dev/null +++ b/test/core/SpriteRenderer.js @@ -0,0 +1,34 @@ +'use strict'; + +describe('SpriteRenderer', () => +{ + it('can be destroyed', () => + { + const destroyable = { destroy: sinon.stub() }; + const webgl = { + on: sinon.stub(), + off: sinon.stub(), + }; + const renderer = new PIXI.SpriteRenderer(webgl); + + // simulate onContextChange + renderer.vertexBuffers = [destroyable, destroyable]; + renderer.vaos = [destroyable, destroyable]; + renderer.indexBuffer = destroyable; + renderer.shader = destroyable; + + expect(() => renderer.destroy()).to.not.throw(); + }); + + it('can be destroyed immediately', () => + { + const webgl = { + on: sinon.stub(), + off: sinon.stub(), + }; + + const renderer = new PIXI.SpriteRenderer(webgl); + + expect(() => renderer.destroy()).to.not.throw(); + }); +}); diff --git a/src/core/sprites/webgl/SpriteRenderer.js b/src/core/sprites/webgl/SpriteRenderer.js index 2d5ca1b..6f92d16 100644 --- a/src/core/sprites/webgl/SpriteRenderer.js +++ b/src/core/sprites/webgl/SpriteRenderer.js @@ -455,22 +455,29 @@ { for (let i = 0; i < this.vaoMax; i++) { - this.vertexBuffers[i].destroy(); - this.vaos[i].destroy(); + if (this.vertexBuffers[i]) + { + this.vertexBuffers[i].destroy(); + } + if (this.vaos[i]) + { + this.vaos[i].destroy(); + } } - this.indexBuffer.destroy(); + if (this.indexBuffer) + { + this.indexBuffer.destroy(); + } this.renderer.off('prerender', this.onPrerender, this); super.destroy(); - for (let i = 0; i < this.shaders.length; i++) + if (this.shader) { - if (this.shaders[i]) - { - this.shaders[i].destroy(); - } + this.shader.destroy(); + this.shader = null; } this.vertexBuffers = null; diff --git a/test/core/SpriteRenderer.js b/test/core/SpriteRenderer.js new file mode 100644 index 0000000..01e1f81 --- /dev/null +++ b/test/core/SpriteRenderer.js @@ -0,0 +1,34 @@ +'use strict'; + +describe('SpriteRenderer', () => +{ + it('can be destroyed', () => + { + const destroyable = { destroy: sinon.stub() }; + const webgl = { + on: sinon.stub(), + off: sinon.stub(), + }; + const renderer = new PIXI.SpriteRenderer(webgl); + + // simulate onContextChange + renderer.vertexBuffers = [destroyable, destroyable]; + renderer.vaos = [destroyable, destroyable]; + renderer.indexBuffer = destroyable; + renderer.shader = destroyable; + + expect(() => renderer.destroy()).to.not.throw(); + }); + + it('can be destroyed immediately', () => + { + const webgl = { + on: sinon.stub(), + off: sinon.stub(), + }; + + const renderer = new PIXI.SpriteRenderer(webgl); + + expect(() => renderer.destroy()).to.not.throw(); + }); +}); diff --git a/test/core/index.js b/test/core/index.js index 9717ebb..a060dde 100755 --- a/test/core/index.js +++ b/test/core/index.js @@ -19,3 +19,4 @@ require('./RoundedRectangle'); require('./Circle'); require('./Graphics'); +require('./SpriteRenderer');