axmol/cocos/2d/CCClippingRectangleNode.cpp

85 lines
2.3 KiB
C++

#include "CCClippingRectangleNode.h"
#include "base/CCDirector.h"
#include "renderer/CCRenderer.h"
#include "math/Vec2.h"
#include "CCGLView.h"
NS_CC_BEGIN
ClippingRectangleNode* ClippingRectangleNode::create(const Rect& clippingRegion)
{
ClippingRectangleNode* node = new ClippingRectangleNode();
if (node && node->init()) {
node->setClippingRegion(clippingRegion);
node->autorelease();
} else {
CC_SAFE_DELETE(node);
}
return node;
}
ClippingRectangleNode* ClippingRectangleNode::create()
{
ClippingRectangleNode* node = new ClippingRectangleNode();
if (node && node->init()) {
node->autorelease();
} else {
CC_SAFE_DELETE(node);
}
return node;
}
void ClippingRectangleNode::setClippingRegion(const Rect &clippingRegion)
{
_clippingRegion = clippingRegion;
}
void ClippingRectangleNode::onBeforeVisitScissor()
{
if (_clippingEnabled) {
glEnable(GL_SCISSOR_TEST);
float scaleX = _scaleX;
float scaleY = _scaleY;
Node *parent = this->getParent();
while (parent) {
scaleX *= parent->getScaleX();
scaleY *= parent->getScaleY();
parent = parent->getParent();
}
const Point pos = convertToWorldSpace(Point(_clippingRegion.origin.x, _clippingRegion.origin.y));
GLView* glView = Director::getInstance()->getOpenGLView();
glView->setScissorInPoints(pos.x,
pos.y,
_clippingRegion.size.width * scaleX,
_clippingRegion.size.height * scaleY);
}
}
void ClippingRectangleNode::onAfterVisitScissor()
{
if (_clippingEnabled)
{
glDisable(GL_SCISSOR_TEST);
}
}
void ClippingRectangleNode::visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags)
{
_beforeVisitCmdScissor.init(_globalZOrder);
_beforeVisitCmdScissor.func = CC_CALLBACK_0(ClippingRectangleNode::onBeforeVisitScissor, this);
renderer->addCommand(&_beforeVisitCmdScissor);
Node::visit(renderer, parentTransform, parentFlags);
_afterVisitCmdScissor.init(_globalZOrder);
_afterVisitCmdScissor.func = CC_CALLBACK_0(ClippingRectangleNode::onAfterVisitScissor, this);
renderer->addCommand(&_afterVisitCmdScissor);
}
NS_CC_END