Skip to content

Commit 954cfff

Browse files
authored
Merge pull request #674 from LLK/revert-673-revert-660-revert-489
Revert "Revert "Revert "Merge pull request #489 from adroitwhiz/touching-white-fixes"""
2 parents 46274c7 + 70fae96 commit 954cfff

File tree

5 files changed

+20
-98
lines changed

5 files changed

+20
-98
lines changed

src/RenderWebGL.js

Lines changed: 16 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -188,23 +188,9 @@ class RenderWebGL extends EventEmitter {
188188
/** @type {function} */
189189
this._exitRegion = null;
190190

191-
/** @type {object} */
192-
this._backgroundDrawRegionId = {
193-
enter: () => this._enterDrawBackground(),
194-
exit: () => this._exitDrawBackground()
195-
};
196-
197191
/** @type {Array.<snapshotCallback>} */
198192
this._snapshotCallbacks = [];
199193

200-
/** @type {Array<number>} */
201-
// Don't set this directly-- use setBackgroundColor so it stays in sync with _backgroundColor3b
202-
this._backgroundColor4f = [0, 0, 0, 1];
203-
204-
/** @type {Uint8ClampedArray} */
205-
// Don't set this directly-- use setBackgroundColor so it stays in sync with _backgroundColor4f
206-
this._backgroundColor3b = new Uint8ClampedArray(3);
207-
208194
this._createGeometry();
209195

210196
this.on(RenderConstants.Events.NativeSizeChanged, this.onNativeSizeChanged);
@@ -264,14 +250,7 @@ class RenderWebGL extends EventEmitter {
264250
* @param {number} blue The blue component for the background.
265251
*/
266252
setBackgroundColor (red, green, blue) {
267-
this._backgroundColor4f[0] = red;
268-
this._backgroundColor4f[1] = green;
269-
this._backgroundColor4f[2] = blue;
270-
271-
this._backgroundColor3b[0] = red * 255;
272-
this._backgroundColor3b[1] = green * 255;
273-
this._backgroundColor3b[2] = blue * 255;
274-
253+
this._backgroundColor = [red, green, blue, 1];
275254
}
276255

277256
/**
@@ -650,7 +629,7 @@ class RenderWebGL extends EventEmitter {
650629

651630
twgl.bindFramebufferInfo(gl, null);
652631
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
653-
gl.clearColor.apply(gl, this._backgroundColor4f);
632+
gl.clearColor.apply(gl, this._backgroundColor);
654633
gl.clear(gl.COLOR_BUFFER_BIT);
655634

656635
this._drawThese(this._drawList, ShaderManager.DRAW_MODE.default, this._projection);
@@ -766,20 +745,12 @@ class RenderWebGL extends EventEmitter {
766745
*/
767746
isTouchingColor (drawableID, color3b, mask3b) {
768747
const candidates = this._candidatesTouching(drawableID, this._visibleDrawList);
769-
770-
let bounds;
771-
if (colorMatches(color3b, this._backgroundColor3b, 0)) {
772-
// If the color we're checking for is the background color, don't confine the check to
773-
// candidate drawables' bounds--since the background spans the entire stage, we must check
774-
// everything that lies inside the drawable.
775-
bounds = this._touchingBounds(drawableID);
776-
} else if (candidates.length === 0) {
777-
// If not checking for the background color, we can return early if there are no candidate drawables.
748+
if (candidates.length === 0) {
778749
return false;
779-
} else {
780-
bounds = this._candidatesBounds(candidates);
781750
}
782751

752+
const bounds = this._candidatesBounds(candidates);
753+
783754
const maxPixelsForCPU = this._getMaxPixelsForCPU();
784755

785756
const debugCanvasContext = this._debugCanvas && this._debugCanvas.getContext('2d');
@@ -840,19 +811,6 @@ class RenderWebGL extends EventEmitter {
840811
}
841812
}
842813

843-
_enterDrawBackground () {
844-
const gl = this.gl;
845-
const currentShader = this._shaderManager.getShader(ShaderManager.DRAW_MODE.background, 0);
846-
gl.disable(gl.BLEND);
847-
gl.useProgram(currentShader.program);
848-
twgl.setBuffersAndAttributes(gl, currentShader, this._bufferInfo);
849-
}
850-
851-
_exitDrawBackground () {
852-
const gl = this.gl;
853-
gl.enable(gl.BLEND);
854-
}
855-
856814
_isTouchingColorGpuStart (drawableID, candidateIDs, bounds, color3b, mask3b) {
857815
this._doExitDrawRegion();
858816

@@ -864,8 +822,15 @@ class RenderWebGL extends EventEmitter {
864822
gl.viewport(0, 0, bounds.width, bounds.height);
865823
const projection = twgl.m4.ortho(bounds.left, bounds.right, bounds.top, bounds.bottom, -1, 1);
866824

867-
// Clear the query buffer to fully transparent. This will be the color of pixels that fail the stencil test.
868-
gl.clearColor(0, 0, 0, 0);
825+
let fillBackgroundColor = this._backgroundColor;
826+
827+
// When using masking such that the background fill color will showing through, ensure we don't
828+
// fill using the same color that we are trying to detect!
829+
if (color3b[0] > 196 && color3b[1] > 196 && color3b[2] > 196) {
830+
fillBackgroundColor = [0, 0, 0, 255];
831+
}
832+
833+
gl.clearColor.apply(gl, fillBackgroundColor);
869834
gl.clear(gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
870835

871836
let extraUniforms;
@@ -877,9 +842,6 @@ class RenderWebGL extends EventEmitter {
877842
}
878843

879844
try {
880-
// Using the stencil buffer, mask out the drawing to either the drawable's alpha channel
881-
// or pixels of the drawable which match the mask color, depending on whether a mask color is given.
882-
// Masked-out pixels will not be checked.
883845
gl.enable(gl.STENCIL_TEST);
884846
gl.stencilFunc(gl.ALWAYS, 1, 1);
885847
gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);
@@ -900,25 +862,12 @@ class RenderWebGL extends EventEmitter {
900862
gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
901863
gl.colorMask(true, true, true, true);
902864

903-
// Draw the background as a quad. Drawing a background with gl.clear will not mask to the stenciled area.
904-
this.enterDrawRegion(this._backgroundDrawRegionId);
905-
906-
const uniforms = {
907-
u_backgroundColor: this._backgroundColor4f
908-
};
909-
910-
const currentShader = this._shaderManager.getShader(ShaderManager.DRAW_MODE.background, 0);
911-
twgl.setUniforms(currentShader, uniforms);
912-
twgl.drawBufferInfo(gl, this._bufferInfo, gl.TRIANGLES);
913-
914-
// Draw the candidate drawables on top of the background.
915865
this._drawThese(candidateIDs, ShaderManager.DRAW_MODE.default, projection,
916866
{idFilterFunc: testID => testID !== drawableID}
917867
);
918868
} finally {
919869
gl.colorMask(true, true, true, true);
920870
gl.disable(gl.STENCIL_TEST);
921-
this._doExitDrawRegion();
922871
}
923872
}
924873

@@ -937,8 +886,7 @@ class RenderWebGL extends EventEmitter {
937886
}
938887

939888
for (let pixelBase = 0; pixelBase < pixels.length; pixelBase += 4) {
940-
// Transparent pixels are masked (either by the drawable's alpha channel or color mask).
941-
if (pixels[pixelBase + 3] !== 0 && colorMatches(color3b, pixels, pixelBase)) {
889+
if (colorMatches(color3b, pixels, pixelBase)) {
942890
return true;
943891
}
944892
}
@@ -1373,7 +1321,7 @@ class RenderWebGL extends EventEmitter {
13731321
gl.viewport(0, 0, bounds.width, bounds.height);
13741322
const projection = twgl.m4.ortho(bounds.left, bounds.right, bounds.top, bounds.bottom, -1, 1);
13751323

1376-
gl.clearColor.apply(gl, this._backgroundColor4f);
1324+
gl.clearColor.apply(gl, this._backgroundColor);
13771325
gl.clear(gl.COLOR_BUFFER_BIT);
13781326
this._drawThese(this._drawList, ShaderManager.DRAW_MODE.default, projection);
13791327

@@ -1461,13 +1409,6 @@ class RenderWebGL extends EventEmitter {
14611409
// Update the CPU position data
14621410
drawable.updateCPURenderAttributes();
14631411
const candidateBounds = drawable.getFastBounds();
1464-
1465-
// Push bounds out to integers. If a drawable extends out into half a pixel, that half-pixel still
1466-
// needs to be tested. Plus, in some areas we construct another rectangle from the union of these,
1467-
// and iterate over its pixels (width * height). Turns out that doesn't work so well when the
1468-
// width/height aren't integers.
1469-
candidateBounds.snapToInt();
1470-
14711412
if (bounds.intersects(candidateBounds)) {
14721413
result.push({
14731414
id,

src/ShaderManager.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,7 @@ ShaderManager.DRAW_MODE = {
176176
/**
177177
* Draw a line with caps.
178178
*/
179-
line: 'line',
180-
181-
/**
182-
* Draw the background in a certain color. Must sometimes be used instead of gl.clear.
183-
*/
184-
background: 'background'
179+
line: 'line'
185180
};
186181

187182
module.exports = ShaderManager;

src/shaders/sprite.frag

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,9 @@ uniform float u_lineThickness;
3939
uniform float u_lineLength;
4040
#endif // DRAW_MODE_line
4141

42-
#ifdef DRAW_MODE_background
43-
uniform vec4 u_backgroundColor;
44-
#endif // DRAW_MODE_background
45-
4642
uniform sampler2D u_skin;
4743

48-
#ifndef DRAW_MODE_background
4944
varying vec2 v_texCoord;
50-
#endif
5145

5246
// Add this to divisors to prevent division by 0, which results in NaNs propagating through calculations.
5347
// Smaller values can cause problems on some mobile devices.
@@ -115,7 +109,7 @@ const vec2 kCenter = vec2(0.5, 0.5);
115109

116110
void main()
117111
{
118-
#if !(defined(DRAW_MODE_line) || defined(DRAW_MODE_background))
112+
#ifndef DRAW_MODE_line
119113
vec2 texcoord0 = v_texCoord;
120114

121115
#ifdef ENABLE_mosaic
@@ -221,9 +215,7 @@ void main()
221215
gl_FragColor.rgb /= gl_FragColor.a + epsilon;
222216
#endif
223217

224-
#endif // !(defined(DRAW_MODE_line) || defined(DRAW_MODE_background))
225-
226-
#ifdef DRAW_MODE_line
218+
#else // DRAW_MODE_line
227219
// Maaaaagic antialiased-line-with-round-caps shader.
228220

229221
// "along-the-lineness". This increases parallel to the line.
@@ -242,8 +234,4 @@ void main()
242234
// the closer we are to the line, invert it.
243235
gl_FragColor = u_lineColor * clamp(1.0 - line, 0.0, 1.0);
244236
#endif // DRAW_MODE_line
245-
246-
#ifdef DRAW_MODE_background
247-
gl_FragColor = u_backgroundColor;
248-
#endif
249237
}

src/shaders/sprite.vert

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ uniform vec4 u_penPoints;
1414
const float epsilon = 1e-3;
1515
#endif
1616

17-
#if !(defined(DRAW_MODE_line) || defined(DRAW_MODE_background))
17+
#ifndef DRAW_MODE_line
1818
uniform mat4 u_projectionMatrix;
1919
uniform mat4 u_modelMatrix;
2020
attribute vec2 a_texCoord;
@@ -66,8 +66,6 @@ void main() {
6666
// 4. Apply view transform
6767
position *= 2.0 / u_stageSize;
6868
gl_Position = vec4(position, 0, 1);
69-
#elif defined(DRAW_MODE_background)
70-
gl_Position = vec4(a_position * 2.0, 0, 1);
7169
#else
7270
gl_Position = u_projectionMatrix * u_modelMatrix * vec4(a_position, 0, 1);
7371
v_texCoord = a_texCoord;
-54.6 KB
Binary file not shown.

0 commit comments

Comments
 (0)