以下是CCCircularClipNode的源代码:

#include "CCClipCirCularNode.h"

USING_NS_CC;

CCCircularClipNode* CCCircularClipNode::create(float radius, bool invert)
{
    CCCircularClipNode* ret = new (std::nothrow) CCCircularClipNode();
    if (ret && ret->init(radius, invert))
    {
        ret->autorelease();
        return ret;
    }
    else
    {
        delete ret;
        return nullptr;
    }
}

bool CCCircularClipNode::init(float radius, bool invert)
{
    if (!CCNode::init())
    {
        return false;
    }
    
    _radius = radius;
    _invert = invert;
    
    setContentSize(Size(_radius * 2, _radius * 2));
    
    auto drawNode = DrawNode::create();
    drawNode->drawSolidCircle(Vec2(_radius, _radius), _radius, 0, 20, 1, 1, Color4F::WHITE);
    addChild(drawNode);
    
    setStencil(drawNode);
    setInverted(_invert);
    
    return true;
}

void CCCircularClipNode::visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags)
{
    if (!_visible)
    {
        return;
    }
    
    uint32_t flags = processParentFlags(parentTransform, parentFlags);
    
    Director* director = Director::getInstance();
    CCASSERT(nullptr != director, "Director is null when CCCircularClipNode::visit");
    
    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform);
    
    _beforeVisitCmdScissor.init(_globalZOrder);
    _beforeVisitCmdScissor.func = CC_CALLBACK_0(CCCircularClipNode::onBeforeVisitScissor, this);
    renderer->addCommand(&_beforeVisitCmdScissor);
    
    visitRenderer(renderer, _modelViewTransform, flags);
    
    _afterVisitCmdScissor.init(_globalZOrder);
    _afterVisitCmdScissor.func = CC_CALLBACK_0(CCCircularClipNode::onAfterVisitScissor, this);
    renderer->addCommand(&_afterVisitCmdScissor);
    
    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}

void CCCircularClipNode::onBeforeVisitScissor()
{
    glEnable(GL_SCISSOR_TEST);
    
    Node* parent = getParent();
    if (parent)
    {
        Rect clippingRect = RectApplyTransform(getBoundingBox(), parent->getWorldToNodeTransform());
        Point origin = Director::getInstance()->getWinSize().width - (clippingRect.origin.x + clippingRect.size.width);
        Point bottomLeft = clippingRect.origin + Point(0, clippingRect.size.height);
        
        glScissor((GLint)origin.x, (GLint)origin.y, (GLsizei)clippingRect.size.width, (GLsizei)clippingRect.size.height);
    }
}

void CCCircularClipNode::onAfterVisitScissor()
{
    glDisable(GL_SCISSOR_TEST);
}

请注意,这只是CCCircularClipNode的源代码,而不是CCClipCirCularNode。如果你需要CCClipCirCularNode的源代码,请提供更多信息

cocos2dx CCClipCirCularNode源码

原文地址: https://www.cveoy.top/t/topic/iQ0c 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录