diff --git a/packages/core/src/Renderer.js b/packages/core/src/Renderer.js index 96d673f..14ca433 100644 --- a/packages/core/src/Renderer.js +++ b/packages/core/src/Renderer.js @@ -325,6 +325,9 @@ this.runners.prerender.run(); this.emit('prerender'); + // apply a transform at a GPU level + this.projection.transform = transform; + // no point rendering if our context has been blown up! if (this.context.isLost) { @@ -367,6 +370,9 @@ this.runners.postrender.run(); + // reset transform after render + this.projection.transform = null; + this.emit('postrender'); } diff --git a/packages/core/src/Renderer.js b/packages/core/src/Renderer.js index 96d673f..14ca433 100644 --- a/packages/core/src/Renderer.js +++ b/packages/core/src/Renderer.js @@ -325,6 +325,9 @@ this.runners.prerender.run(); this.emit('prerender'); + // apply a transform at a GPU level + this.projection.transform = transform; + // no point rendering if our context has been blown up! if (this.context.isLost) { @@ -367,6 +370,9 @@ this.runners.postrender.run(); + // reset transform after render + this.projection.transform = null; + this.emit('postrender'); } diff --git a/packages/core/src/textures/BaseTexture.js b/packages/core/src/textures/BaseTexture.js index 98573ff..67e281b 100644 --- a/packages/core/src/textures/BaseTexture.js +++ b/packages/core/src/textures/BaseTexture.js @@ -645,6 +645,6 @@ * Global number of the texture batch, used by multi-texture renderers * * @static - * @member {number} new texture batch number + * @member {number} */ BaseTexture._globalBatch = 0; diff --git a/packages/core/src/Renderer.js b/packages/core/src/Renderer.js index 96d673f..14ca433 100644 --- a/packages/core/src/Renderer.js +++ b/packages/core/src/Renderer.js @@ -325,6 +325,9 @@ this.runners.prerender.run(); this.emit('prerender'); + // apply a transform at a GPU level + this.projection.transform = transform; + // no point rendering if our context has been blown up! if (this.context.isLost) { @@ -367,6 +370,9 @@ this.runners.postrender.run(); + // reset transform after render + this.projection.transform = null; + this.emit('postrender'); } diff --git a/packages/core/src/textures/BaseTexture.js b/packages/core/src/textures/BaseTexture.js index 98573ff..67e281b 100644 --- a/packages/core/src/textures/BaseTexture.js +++ b/packages/core/src/textures/BaseTexture.js @@ -645,6 +645,6 @@ * Global number of the texture batch, used by multi-texture renderers * * @static - * @member {number} new texture batch number + * @member {number} */ BaseTexture._globalBatch = 0; diff --git a/packages/interaction/src/InteractionManager.js b/packages/interaction/src/InteractionManager.js index fd76700..b908dde 100644 --- a/packages/interaction/src/InteractionManager.js +++ b/packages/interaction/src/InteractionManager.js @@ -1038,7 +1038,9 @@ } interactiveParent = false; } - // If there is a mask, no need to test against anything else if the pointer is not within the mask + // If there is a mask, no need to hitTest against anything else if the pointer is not within the mask. + // We still want to hitTestChildren, however, to ensure a mouseout can still be generated. + // https://github.com/pixijs/pixi.js/issues/5135 else if (displayObject._mask) { if (hitTest) @@ -1046,7 +1048,6 @@ if (!(displayObject._mask.containsPoint && displayObject._mask.containsPoint(point))) { hitTest = false; - hitTestChildren = false; } } } diff --git a/packages/core/src/Renderer.js b/packages/core/src/Renderer.js index 96d673f..14ca433 100644 --- a/packages/core/src/Renderer.js +++ b/packages/core/src/Renderer.js @@ -325,6 +325,9 @@ this.runners.prerender.run(); this.emit('prerender'); + // apply a transform at a GPU level + this.projection.transform = transform; + // no point rendering if our context has been blown up! if (this.context.isLost) { @@ -367,6 +370,9 @@ this.runners.postrender.run(); + // reset transform after render + this.projection.transform = null; + this.emit('postrender'); } diff --git a/packages/core/src/textures/BaseTexture.js b/packages/core/src/textures/BaseTexture.js index 98573ff..67e281b 100644 --- a/packages/core/src/textures/BaseTexture.js +++ b/packages/core/src/textures/BaseTexture.js @@ -645,6 +645,6 @@ * Global number of the texture batch, used by multi-texture renderers * * @static - * @member {number} new texture batch number + * @member {number} */ BaseTexture._globalBatch = 0; diff --git a/packages/interaction/src/InteractionManager.js b/packages/interaction/src/InteractionManager.js index fd76700..b908dde 100644 --- a/packages/interaction/src/InteractionManager.js +++ b/packages/interaction/src/InteractionManager.js @@ -1038,7 +1038,9 @@ } interactiveParent = false; } - // If there is a mask, no need to test against anything else if the pointer is not within the mask + // If there is a mask, no need to hitTest against anything else if the pointer is not within the mask. + // We still want to hitTestChildren, however, to ensure a mouseout can still be generated. + // https://github.com/pixijs/pixi.js/issues/5135 else if (displayObject._mask) { if (hitTest) @@ -1046,7 +1048,6 @@ if (!(displayObject._mask.containsPoint && displayObject._mask.containsPoint(point))) { hitTest = false; - hitTestChildren = false; } } } diff --git a/packages/mesh/src/Mesh.js b/packages/mesh/src/Mesh.js index fd46cdd..b8d98d1 100644 --- a/packages/mesh/src/Mesh.js +++ b/packages/mesh/src/Mesh.js @@ -144,7 +144,7 @@ */ get uvBuffer() { - return this.geometry.buffers[1].data; + return this.geometry.buffers[1]; } /** @@ -155,7 +155,7 @@ */ get verticesBuffer() { - return this.geometry.buffers[0].data; + return this.geometry.buffers[0]; } /** diff --git a/packages/core/src/Renderer.js b/packages/core/src/Renderer.js index 96d673f..14ca433 100644 --- a/packages/core/src/Renderer.js +++ b/packages/core/src/Renderer.js @@ -325,6 +325,9 @@ this.runners.prerender.run(); this.emit('prerender'); + // apply a transform at a GPU level + this.projection.transform = transform; + // no point rendering if our context has been blown up! if (this.context.isLost) { @@ -367,6 +370,9 @@ this.runners.postrender.run(); + // reset transform after render + this.projection.transform = null; + this.emit('postrender'); } diff --git a/packages/core/src/textures/BaseTexture.js b/packages/core/src/textures/BaseTexture.js index 98573ff..67e281b 100644 --- a/packages/core/src/textures/BaseTexture.js +++ b/packages/core/src/textures/BaseTexture.js @@ -645,6 +645,6 @@ * Global number of the texture batch, used by multi-texture renderers * * @static - * @member {number} new texture batch number + * @member {number} */ BaseTexture._globalBatch = 0; diff --git a/packages/interaction/src/InteractionManager.js b/packages/interaction/src/InteractionManager.js index fd76700..b908dde 100644 --- a/packages/interaction/src/InteractionManager.js +++ b/packages/interaction/src/InteractionManager.js @@ -1038,7 +1038,9 @@ } interactiveParent = false; } - // If there is a mask, no need to test against anything else if the pointer is not within the mask + // If there is a mask, no need to hitTest against anything else if the pointer is not within the mask. + // We still want to hitTestChildren, however, to ensure a mouseout can still be generated. + // https://github.com/pixijs/pixi.js/issues/5135 else if (displayObject._mask) { if (hitTest) @@ -1046,7 +1048,6 @@ if (!(displayObject._mask.containsPoint && displayObject._mask.containsPoint(point))) { hitTest = false; - hitTestChildren = false; } } } diff --git a/packages/mesh/src/Mesh.js b/packages/mesh/src/Mesh.js index fd46cdd..b8d98d1 100644 --- a/packages/mesh/src/Mesh.js +++ b/packages/mesh/src/Mesh.js @@ -144,7 +144,7 @@ */ get uvBuffer() { - return this.geometry.buffers[1].data; + return this.geometry.buffers[1]; } /** @@ -155,7 +155,7 @@ */ get verticesBuffer() { - return this.geometry.buffers[0].data; + return this.geometry.buffers[0]; } /** diff --git a/packages/utils/src/browser/isWebGLSupported.js b/packages/utils/src/browser/isWebGLSupported.js index 1a2b9e2..bc23866 100644 --- a/packages/utils/src/browser/isWebGLSupported.js +++ b/packages/utils/src/browser/isWebGLSupported.js @@ -1,3 +1,5 @@ +let supported; + /** * Helper for checking for WebGL support. * @@ -7,37 +9,45 @@ */ export function isWebGLSupported() { - const contextOptions = { stencil: true, failIfMajorPerformanceCaveat: true }; - - try + if (typeof supported === 'undefined') { - if (!window.WebGLRenderingContext) + supported = (function supported() { - return false; - } + const contextOptions = { stencil: true, failIfMajorPerformanceCaveat: true }; - const canvas = document.createElement('canvas'); - let gl = canvas.getContext('webgl', contextOptions) || canvas.getContext('experimental-webgl', contextOptions); - - const success = !!(gl && gl.getContextAttributes().stencil); - - if (gl) - { - const loseContext = gl.getExtension('WEBGL_lose_context'); - - if (loseContext) + try { - loseContext.loseContext(); + if (!window.WebGLRenderingContext) + { + return false; + } + + const canvas = document.createElement('canvas'); + let gl = canvas.getContext('webgl', contextOptions) + || canvas.getContext('experimental-webgl', contextOptions); + + const success = !!(gl && gl.getContextAttributes().stencil); + + if (gl) + { + const loseContext = gl.getExtension('WEBGL_lose_context'); + + if (loseContext) + { + loseContext.loseContext(); + } + } + + gl = null; + + return success; } - } - - gl = null; - - return success; + catch (e) + { + return false; + } + })(); } - catch (e) - { - return false; - } + + return supported; } -