cocos2dx 3.2 裁剪

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);

        }

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值