123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include "2d/CCClippingRectangleNode.h"
- #include "base/CCDirector.h"
- #include "renderer/CCRenderer.h"
- #include "math/Vec2.h"
- #include "platform/CCGLView.h"
- NS_CC_BEGIN
- ClippingRectangleNode* ClippingRectangleNode::create(const Rect& clippingRegion)
- {
- ClippingRectangleNode* node = new (std::nothrow) ClippingRectangleNode();
- if (node && node->init()) {
- node->setClippingRegion(clippingRegion);
- node->autorelease();
- } else {
- CC_SAFE_DELETE(node);
- }
-
- return node;
- }
- ClippingRectangleNode* ClippingRectangleNode::create()
- {
- ClippingRectangleNode* node = new (std::nothrow) 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
|