@@ -199,9 +199,10 @@ void ClippingNode::visit(Renderer *renderer, const Mat4 &parentTransform, uint32
199
199
if (alphaThreshold < 1 )
200
200
{
201
201
auto programState = new (std::nothrow) backend::ProgramState (positionTextureColor_vert, positionTextureColorAlphaTest_frag);
202
- _stencil->setProgramState (programState);
203
202
auto alphaLocation = programState->getUniformLocation (" u_alpha_value" );
204
203
programState->setUniform (alphaLocation, &alphaThreshold, sizeof (alphaThreshold));
204
+ setProgramStateRecursively (_stencil, programState);
205
+
205
206
CC_SAFE_RELEASE_NULL (programState);
206
207
}
207
208
_stencil->visit (renderer, _modelViewTransform, flags);
@@ -309,7 +310,13 @@ void ClippingNode::setStencil(Node *stencil)
309
310
}
310
311
311
312
if (_stencil != nullptr )
312
- _originalStencilProgramState = _stencil->getProgramState ();
313
+ {
314
+ _originalStencilProgramState[_stencil] = _stencil->getProgramState ();
315
+ auto & children = _stencil->getChildren ();
316
+ for (const auto &child : children) {
317
+ _originalStencilProgramState[child] = child->getProgramState ();
318
+ }
319
+ }
313
320
}
314
321
315
322
bool ClippingNode::hasContent () const
@@ -328,7 +335,7 @@ void ClippingNode::setAlphaThreshold(float alphaThreshold)
328
335
{
329
336
// should reset program used by _stencil
330
337
if (_stencil)
331
- _stencil-> setProgramState (_originalStencilProgramState );
338
+ restoreAllProgramStates ( );
332
339
}
333
340
_stencilStateManager->setAlphaThreshold (alphaThreshold);
334
341
}
@@ -343,5 +350,26 @@ void ClippingNode::setInverted(bool inverted)
343
350
_stencilStateManager->setInverted (inverted);
344
351
}
345
352
353
+ void ClippingNode::setProgramStateRecursively (Node* node, backend::ProgramState* programState)
354
+ {
355
+ _originalStencilProgramState[node] = node->getProgramState ();
356
+ node->setProgramState (programState);
357
+
358
+ auto & children = node->getChildren ();
359
+ for (const auto &child : children) {
360
+ setProgramStateRecursively (child, programState);
361
+ }
362
+ }
363
+
364
+ void ClippingNode::restoreAllProgramStates ()
365
+ {
366
+ for (auto item : _originalStencilProgramState)
367
+ {
368
+ auto node = item.first ;
369
+ auto programState = item.second ;
370
+ node->setProgramState (programState);
371
+ }
372
+ }
373
+
346
374
347
375
NS_CC_END
0 commit comments