diff --git a/src/RenderWebGL.js b/src/RenderWebGL.js index b425dec..79442d3 100644 --- a/src/RenderWebGL.js +++ b/src/RenderWebGL.js @@ -424,6 +424,7 @@ class RenderWebGL extends EventEmitter { /** * Check if a particular Drawable is touching a particular color. + * Unlike touching drawable, touching color tests invisible sprites. * @param {int} drawableID The ID of the Drawable to check. * @param {Array} color3b Test if the Drawable is touching this color. * @param {Array} [mask3b] Optionally mask the check to this part of Drawable. @@ -435,11 +436,11 @@ class RenderWebGL extends EventEmitter { const bounds = this._touchingBounds(drawableID); if (!bounds) { - return; + return false; } const candidateIDs = this._filterCandidatesTouching(drawableID, this._drawList, bounds); if (!candidateIDs) { - return; + return false; } // Limit size of viewport to the bounds around the target Drawable, @@ -477,7 +478,10 @@ class RenderWebGL extends EventEmitter { ShaderManager.DRAW_MODE.colorMask : ShaderManager.DRAW_MODE.silhouette, projection, - {extraUniforms}); + { + extraUniforms, + ignoreVisibility: true // Touching color ignores sprite visibility + }); gl.stencilFunc(gl.EQUAL, 1, 1); gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); @@ -533,11 +537,11 @@ class RenderWebGL extends EventEmitter { const bounds = this._touchingBounds(drawableID); if (!bounds) { - return; + return false; } candidateIDs = this._filterCandidatesTouching(drawableID, candidateIDs, bounds); if (!candidateIDs) { - return; + return false; } // Limit size of viewport to the bounds around the target Drawable, @@ -1003,7 +1007,7 @@ class RenderWebGL extends EventEmitter { try { gl.disable(gl.BLEND); - this._drawThese([stampID], ShaderManager.DRAW_MODE.default, projection, {isStamping: true}); + this._drawThese([stampID], ShaderManager.DRAW_MODE.default, projection, {ignoreVisibility: true}); } finally { gl.enable(gl.BLEND); } @@ -1097,7 +1101,7 @@ class RenderWebGL extends EventEmitter { * @param {idFilterFunc} opts.filter An optional filter function. * @param {object.} opts.extraUniforms Extra uniforms for the shaders. * @param {int} opts.effectMask Bitmask for effects to allow - * @param {boolean} opts.isStamping Stamp mode ignores sprite visibility, always drawing. + * @param {boolean} opts.ignoreVisibility Draw all, despite visibility (e.g. stamping, touching color) * @private */ _drawThese (drawables, drawMode, projection, opts = {}) { @@ -1114,8 +1118,9 @@ class RenderWebGL extends EventEmitter { const drawable = this._allDrawables[drawableID]; /** @todo check if drawable is inside the viewport before anything else */ - // Hidden drawables (e.g., by a "hide" block) are not drawn unless stamping - if (!drawable.getVisible() && !opts.isStamping) continue; + // Hidden drawables (e.g., by a "hide" block) are not drawn unless + // the ignoreVisibility flag is used (e.g. for stamping or touchingColor). + if (!drawable.getVisible() && !opts.ignoreVisibility) continue; const drawableScale = drawable.scale;