mirror of https://github.com/axmolengine/axmol.git
85 lines
2.3 KiB
C++
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
|