2.2 裁剪
visit()
{
glEnable(GL_SCISSOR_TEST);
Director::getInstance()->getOpenGLView()->setScissorInPoints(0, 0, 100, 150);
node::visit();glDisable(GL_SCISSOR_TEST);
2.2 的渲染是独立的 这样写可以实现裁剪效果 而3.2 visit函数只是把渲染信息加入渲染队列 在最后进行统一渲染(因为glEnable(GL_SCISSOR_TEST) glDisable(GL_SCISSOR_TEST)之间没有进行渲染 所以无法实现裁剪效果) 所以不能像上面那样写了
}
3.2 裁剪
方法1 自建render
visit
{
glEnable(GL_SCISSOR_TEST);
Director::getInstance()->getOpenGLView()->setScissorInPoints(0, 0, 100, 150);
Renderer* r = new Renderer;
r->initGLView();
Sprite::visit(r,parentTransform,parentFlags);
r->addCommand(&_quadCommand);
r->render();
glDisable(GL_SCISSOR_TEST);
delete r;
}
方法2
void Layer1::visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags)
{
if (!isVisible())
{
return;
}
uint32_t flags = processParentFlags(parentTransform, parentFlags);
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform);
//before draw
_beforeDrawCommand.init(_globalZOrder);
_beforeDrawCommand.func = CC_CALLBACK_0(Layer1::onBeforeDraw, this);
Director::getInstance()->getRenderer()->addCommand(&_beforeDrawCommand);
if (!_children.empty())
{
int i=0;
// draw children zOrder < 0
for( ; i < _children.size(); i++ )
{
Node *child = _children.at(i);
if ( child->getLocalZOrder() < 0 )
{
child->visit(renderer, _modelViewTransform, flags);
}
else
{
break;
}
}
// this draw
this->draw(renderer, _modelViewTransform, flags);
// draw children zOrder >= 0
for( ; i < _children.size(); i++ )
{
Node *child = _children.at(i);
child->visit(renderer, _modelViewTransform, flags);
}
}
else
{
this->draw(renderer, _modelViewTransform, flags);
}
//after draw
_afterDrawCommand.init(_globalZOrder);
_afterDrawCommand.func = CC_CALLBACK_0(Layer1::onAfterDraw, this);
Director::getInstance()->getRenderer()->addCommand(&_afterDrawCommand);
/*
关于_afterDrawCommand.func
render()\ visitRenderQueue
{
。。。。
else if(RenderCommand::Type::CUSTOM_COMMAND == commandType)
{
flush();
auto cmd = static_cast<CustomCommand*>(command);
cmd->execute();
}
。。。。
}
void CustomCommand::execute()
{
if(func)
{
func();
}
}
*/
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
void Layer1::onBeforeDraw()
{
_scissorRestored = false; //裁剪恢复
Rect frame(0,0,200,80); //裁剪 区域
auto glview = Director::getInstance()->getOpenGLView();
if (glview->isScissorEnabled()) //如果父开启裁剪状态 就走下面的 操作
{
_scissorRestored = true;
_parentScissorRect = glview->getScissorRect();
//set the intersection of _parentScissorRect and frame as the new scissor rect
if (frame.intersectsRect(_parentScissorRect)) {
float x = MAX(frame.origin.x, _parentScissorRect.origin.x);
float y = MAX(frame.origin.y, _parentScissorRect.origin.y);
float xx = MIN(frame.origin.x+frame.size.width, _parentScissorRect.origin.x+_parentScissorRect.size.width);
float yy = MIN(frame.origin.y+frame.size.height, _parentScissorRect.origin.y+_parentScissorRect.size.height);
glview->setScissorInPoints(x, y, xx-x, yy-y);
}
}
else {
glEnable(GL_SCISSOR_TEST);
glview->setScissorInPoints(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
}
}
void Layer1::onAfterDraw()
{
// glDisable(GL_SCISSOR_TEST);
if (_scissorRestored) {//restore the parent's scissor rect
//如果父裁剪就走下面的操作 不进行glDisable(GL_SCISSOR_TEST); 在父中进行此操作
auto glview = Director::getInstance()->getOpenGLView();
glview->setScissorInPoints(_parentScissorRect.origin.x, _parentScissorRect.origin.y, _parentScissorRect.size.width, _parentScissorRect.size.height);
}
else {
glDisable(GL_SCISSOR_TEST);
}
}