Scene::render

void Scene::render(Renderer* renderer, const Mat4& eyeTransform, const Mat4* eyeProjection)
{
    auto director = Director::getInstance();
    const auto& transform = getNodeToParentTransform();
    //这个和opengl 矩阵有关 opengl还不是很懂略过 后面opengl熟悉了补上
    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

    //这个重要了 当前场景下所有节点的 visit之后调用draw把Command命令加入当前render的渲染队列中
    visit(renderer, transform, 0);
    //调用渲染引擎 去渲染
    renderer->render();

    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

    // we shouldn't restore the transform matrix since it could be used
    // from "update" or other parts of the game to calculate culling or something else.
    //        camera->setNodeToParentTransform(eyeCopy);
}

scene 集成node


void Node::visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags)
{
    // quick return if not visible. children won't be drawn.
    if (!_visible)
    {
        return;
    }

    if (_beforeVisitCallback) {
        _beforeVisitCallback(renderer);
    }

    uint32_t flags = processParentFlags(parentTransform, parentFlags);

    // IMPORTANT:
    // To ease the migration to v3.0, we still support the Mat4 stack,
    // but it is deprecated and your code should not rely on it
    _director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    _director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform);

    auto camera = creator::CameraNode::getInstance();
    if (camera) {
        if (camera->visitingIndex <= 0) {
            if (camera->containsNode(this)) {
                camera->visitingIndex ++;
            }
        }
        else {
            camera->visitingIndex ++;
        }

    }

    if(!_children.empty())
    {
        sortAllChildren();//当前节点排序

        int i = 0;
        // 递归当前_localZOrder小于0的子节点
        for( ; i < _children.size(); i++ )
        {
            auto node = _children.at(i);

            if (node && node->_localZOrder < 0)
                node->visit(renderer, _modelViewTransform, flags);
            else
                break;
        }
        // 渲染命令添加到当前渲染队列
        this->draw(renderer, _modelViewTransform, flags);
        //递归 其他子节点的visit
        for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)
            (*it)->visit(renderer, _modelViewTransform, flags);
    }
    else
    {
        this->draw(renderer, _modelViewTransform, flags);
    }

    if (camera && camera->visitingIndex > 0) {
        camera->visitingIndex --;
    }

    _director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

    if (_afterVisitCallback) {
        _afterVisitCallback(renderer);
    }
}

draw 在node下面是个虚函数 可以参考 sprite


void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
    if (_texture == nullptr)
    {
        return;
    }

#if CC_USE_CULLING
    // Don't calculate the culling if the transform was not updated
    _insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;
    if(_insideBounds)
#endif
    {
        _trianglesCommand.init(_globalZOrder, 
            _texture, 
            getGLProgramState(), 
            _blendFunc, 
            _polyInfo.triangles, 
            transform, 
            flags);

        renderer->addCommand(&_trianglesCommand);

#if CC_SPRITE_DEBUG_DRAW
        _debugDrawNode->clear();
        auto count = _polyInfo.triangles.indexCount/3;
        auto indices = _polyInfo.triangles.indices;
        auto verts = _polyInfo.triangles.verts;
        for(ssize_t i = 0; i < count; i++)
        {
            //draw 3 lines
            Vec3 from =verts[indices[i*3]].vertices;
            Vec3 to = verts[indices[i*3+1]].vertices;
            _debugDrawNode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::WHITE);

            from =verts[indices[i*3+1]].vertices;
            to = verts[indices[i*3+2]].vertices;
            _debugDrawNode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::WHITE);

            from =verts[indices[i*3+2]].vertices;
            to = verts[indices[i*3]].vertices;
            _debugDrawNode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::WHITE);
        }
#endif //CC_SPRITE_DEBUG_DRAW
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值