Skip to content

Commit 902d04d

Browse files
committed
Move to functions so we can call from outside the class
1 parent 93dabaa commit 902d04d

1 file changed

Lines changed: 40 additions & 11 deletions

File tree

src/display/mask/GeometryMask.js

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ var GeometryMask = new Class({
5656
* @since 3.16.0
5757
*/
5858
this.invertAlpha = false;
59+
60+
this.isStencil = true;
61+
62+
this.level = 0;
5963
},
6064

6165
/**
@@ -108,7 +112,6 @@ var GeometryMask = new Class({
108112
preRenderWebGL: function (renderer, child, camera)
109113
{
110114
var gl = renderer.gl;
111-
var geometryMask = this.geometryMask;
112115

113116
// Force flushing before drawing to stencil buffer
114117
renderer.flush();
@@ -126,35 +129,50 @@ var GeometryMask = new Class({
126129
renderer.currentMask = this;
127130
}
128131

132+
renderer.maskCount++;
133+
134+
this.level = renderer.maskCount;
135+
129136
renderer.maskStack.push({ mask: this, camera: camera });
130137

131-
var level = renderer.maskCount;
138+
this.applyStencil(renderer, camera, true);
139+
},
140+
141+
applyStencil: function (renderer, camera, inc)
142+
{
143+
var gl = renderer.gl;
144+
var geometryMask = this.geometryMask;
145+
var level = this.level;
132146

133147
gl.colorMask(false, false, false, false);
134148

135-
gl.stencilFunc(gl.EQUAL, level, 0xFF);
136-
gl.stencilOp(gl.KEEP, gl.KEEP, gl.INCR);
149+
if (inc)
150+
{
151+
gl.stencilFunc(gl.EQUAL, level - 1, 0xFF);
152+
gl.stencilOp(gl.KEEP, gl.KEEP, gl.INCR);
153+
}
154+
else
155+
{
156+
gl.stencilFunc(gl.EQUAL, level + 1, 0xFF);
157+
gl.stencilOp(gl.KEEP, gl.KEEP, gl.DECR);
158+
}
137159

138160
// Write stencil buffer
139161
geometryMask.renderWebGL(renderer, geometryMask, 0, camera);
140162

141163
renderer.flush();
142164

143-
// Use stencil buffer to affect next rendering object
144-
gl.colorMask(true, true, true, true);
145-
146165
if (this.invertAlpha)
147166
{
148-
gl.stencilFunc(gl.NOTEQUAL, level + 1, 0xFF);
167+
gl.stencilFunc(gl.NOTEQUAL, level, 0xFF);
149168
}
150169
else
151170
{
152-
gl.stencilFunc(gl.EQUAL, level + 1, 0xFF);
171+
gl.stencilFunc(gl.EQUAL, level, 0xFF);
153172
}
154173

174+
gl.colorMask(true, true, true, true);
155175
gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
156-
157-
renderer.maskCount++;
158176
},
159177

160178
/**
@@ -187,6 +205,16 @@ var GeometryMask = new Class({
187205
// Force flush before disabling stencil test
188206
renderer.flush();
189207

208+
var prev = renderer.maskStack[renderer.maskStack.length - 1];
209+
210+
prev.mask.applyStencil(renderer, prev.camera, false);
211+
212+
if (renderer.currentCameraMask !== prev.mask)
213+
{
214+
renderer.currentMask = prev.mask;
215+
}
216+
217+
/*
190218
var level = renderer.maskCount;
191219
192220
gl.colorMask(false, false, false, false);
@@ -219,6 +247,7 @@ var GeometryMask = new Class({
219247
220248
gl.colorMask(true, true, true, true);
221249
gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
250+
*/
222251
}
223252
},
224253

0 commit comments

Comments
 (0)