123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- #include "2d/CCNodeGrid.h"
- #include "2d/CCGrid.h"
- #include "renderer/CCRenderer.h"
- NS_CC_BEGIN
- NodeGrid* NodeGrid::create()
- {
- NodeGrid * ret = new (std::nothrow) NodeGrid();
- if (ret && ret->init())
- {
- ret->autorelease();
- }
- else
- {
- CC_SAFE_DELETE(ret);
- }
- return ret;
- }
- NodeGrid* NodeGrid::create(const cocos2d::Rect &rect)
- {
- NodeGrid* ret = NodeGrid::create();
- if (ret) {
- ret->setGridRect(rect);
- }
- return ret;
- }
- NodeGrid::NodeGrid()
- : _gridTarget(nullptr)
- , _nodeGrid(nullptr)
- , _gridRect(Rect::ZERO)
- {
- }
- void NodeGrid::setTarget(Node* target)
- {
- #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
- auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
- if (sEngine)
- {
- if (_gridTarget)
- sEngine->releaseScriptObject(this, _gridTarget);
- if (target)
- sEngine->retainScriptObject(this, target);
- }
- #endif
- CC_SAFE_RELEASE(_gridTarget);
- CC_SAFE_RETAIN(target);
- _gridTarget = target;
- }
- NodeGrid::~NodeGrid()
- {
- CC_SAFE_RELEASE(_nodeGrid);
- CC_SAFE_RELEASE(_gridTarget);
- }
- void NodeGrid::onGridBeginDraw()
- {
- if (_nodeGrid && _nodeGrid->isActive())
- {
- _nodeGrid->beforeDraw();
- }
- }
- void NodeGrid::onGridEndDraw()
- {
- if(_nodeGrid && _nodeGrid->isActive())
- {
- _nodeGrid->afterDraw(this);
- }
- }
- void NodeGrid::visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags)
- {
-
- if (!_visible)
- {
- return;
- }
- bool dirty = (parentFlags & FLAGS_TRANSFORM_DIRTY) || _transformUpdated;
- if(dirty)
- _modelViewTransform = this->transform(parentTransform);
- _transformUpdated = false;
-
- _groupCommand.init(_globalZOrder);
- renderer->addCommand(&_groupCommand);
- renderer->pushGroup(_groupCommand.getRenderQueueID());
-
-
-
- Director* director = Director::getInstance();
- CCASSERT(nullptr != director, "Director is null when setting matrix stack");
-
- director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
- director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform);
- Director::Projection beforeProjectionType = Director::Projection::DEFAULT;
- if(_nodeGrid && _nodeGrid->isActive())
- {
- beforeProjectionType = Director::getInstance()->getProjection();
- _nodeGrid->set2DProjection();
- }
- _gridBeginCommand.init(_globalZOrder);
- _gridBeginCommand.func = CC_CALLBACK_0(NodeGrid::onGridBeginDraw, this);
- renderer->addCommand(&_gridBeginCommand);
- if(_gridTarget)
- {
- _gridTarget->visit(renderer, _modelViewTransform, dirty);
- }
-
- int i = 0;
- bool visibleByCamera = isVisitableByVisitingCamera();
- if(!_children.empty())
- {
- sortAllChildren();
-
- for(auto size = _children.size(); i < size; ++i)
- {
- auto node = _children.at(i);
- if ( node && node->getLocalZOrder() < 0 )
- node->visit(renderer, _modelViewTransform, dirty);
- else
- break;
- }
-
- if (visibleByCamera)
- this->draw(renderer, _modelViewTransform, dirty);
- for(auto it=_children.cbegin()+i, itCend = _children.cend(); it != itCend; ++it) {
- (*it)->visit(renderer, _modelViewTransform, dirty);
- }
- }
- else if (visibleByCamera)
- {
- this->draw(renderer, _modelViewTransform, dirty);
- }
-
-
-
-
-
- if(_nodeGrid && _nodeGrid->isActive())
- {
-
- director->setProjection(beforeProjectionType);
- }
- _gridEndCommand.init(_globalZOrder);
- _gridEndCommand.func = CC_CALLBACK_0(NodeGrid::onGridEndDraw, this);
- renderer->addCommand(&_gridEndCommand);
- renderer->popGroup();
-
- director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
- }
- void NodeGrid::setGrid(GridBase *grid)
- {
- CC_SAFE_RELEASE(_nodeGrid);
- CC_SAFE_RETAIN(grid);
- _nodeGrid = grid;
- }
- NS_CC_END
|