@@ -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