cocos2dx CCClipCirCularNode源码
以下是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的源代码,请提供更多信息
原文地址: https://www.cveoy.top/t/topic/iQ0c 著作权归作者所有。请勿转载和采集!