cocos2dx 3.13.1show_all适配时DEBUG_FPS位置与之前版本不同

----问题:

新建cocos2dx3.10和3.13.1将setDesignResolutionSize(1366, 768, ResolutionPolicy::SHOW_ALL);并设置

glview = GLViewImpl::createWithRect("战斗吧原始人", Rect(0, 0, 960 , 640));

结果3.10的DEBUG_FPS位置在适配后的 0,0点,而3.13.1的DEBUG_FPS位置确在屏幕的0,0点,跟没适配时一样。

----原因:

两个版本的Scene::render()方法实现不同。

----解决

将3.13.1的Scene::render()改为3.10版的。由于两个方法参数不同,之后要将所有涉及scene::render()的方法都改为只有render一个参数的。

--1.更改CCScene.cpprender方法。

void Scene::render(Renderer* renderer)

{

    auto director = Director::getInstance();

    Camera* defaultCamera = nullptr;

    const auto& transform = getNodeToParentTransform();

    

    for (const auto& camera : getCameras())

    {

        if (!camera->isVisible())

            continue;

        

        Camera::_visitingCamera = camera;

        if (Camera::_visitingCamera->getCameraFlag() == CameraFlag::DEFAULT)

        {

            defaultCamera = Camera::_visitingCamera;

        }

        

        director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

        director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());

        camera->apply();

        //clear background with max depth

        camera->clearBackground();

        //visit the scene

        visit(renderer, transform, 0);

#if CC_USE_NAVMESH

        if (_navMesh && _navMeshDebugCamera == camera)

        {

            _navMesh->debugDraw(renderer);

        }

#endif

        

        renderer->render();

        

        director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

    }

    

#if CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION

    if (_physics3DWorld && _physics3DWorld->isDebugDrawEnabled())

    {

        director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

        director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, _physics3dDebugCamera != nullptr ? _physics3dDebugCamera->getViewProjectionMatrix() : defaultCamera->getViewProjectionMatrix());

        _physics3DWorld->debugDraw(renderer);

        renderer->render();

        director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

    }

#endif

    

    Camera::_visitingCamera = nullptr;

    experimental::FrameBuffer::applyDefaultFBO();

}

--2.CCScene.h中的render方法

//    virtual void render(Renderer* renderer, const Mat4& eyeTransform, const Mat4* eyeProjection = nullptr);

    virtual void render(Renderer* renderer);

--3.CCDirector.cppdrawScene方法。

void Director::drawScene()

{

    // calculate "global" dt

    calculateDeltaTime();

    

    if (_openGLView)

    {

        _openGLView->pollEvents();

    }


    //tick before glClear: issue #533

    if (! _paused)

    {

        _eventDispatcher->dispatchEvent(_eventBeforeUpdate);

        _scheduler->update(_deltaTime);

        _eventDispatcher->dispatchEvent(_eventAfterUpdate);

    }


    _renderer->clear();

    experimental::FrameBuffer::clearAllFBOs();

    /* to avoid flickr, nextScene MUST be here: after tick and before draw.

     * FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9

     */

    if (_nextScene)

    {

        setNextScene();

    }


    pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

    

    if (_runningScene)

    {

#if (CC_USE_PHYSICS || (CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION) || CC_USE_NAVMESH)

        _runningScene->stepPhysicsAndNavigation(_deltaTime);

#endif

        //clear draw stats

        _renderer->clearDrawStats();

        

        //render the scene

//        _openGLView->renderScene(_runningScene, _renderer);

        _runningScene->render(_renderer);

        

        _eventDispatcher->dispatchEvent(_eventAfterVisit);

    }


    // draw the notifications node

    if (_notificationNode)

    {

        _notificationNode->visit(_renderer, Mat4::IDENTITY, 0);

    }


    if (_displayStats)

    {

        showStats();

    }

    _renderer->render();


    _eventDispatcher->dispatchEvent(_eventAfterDraw);


    popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);


    _totalFrames++;


    // swap buffers

    if (_openGLView)

    {

        _openGLView->swapBuffers();

    }


    if (_displayStats)

    {

        calculateMPF();

    }

}


--4.VRGenericRenderer.cpp中的render方法。

void VRGenericRenderer::render(Scene* scene, Renderer* renderer)

{

    // FIXME: Use correct eye displacement

    const float eyeOffset = 0.5;


    auto headRotation = _headTracker->getLocalRotation();

    Mat4 leftTransform;

    Mat4::createTranslation(eyeOffset, 0, 0, &leftTransform);

    leftTransform *= headRotation;


    Mat4 rightTransform;

    Mat4::createTranslation(-eyeOffset, 0, 0, &rightTransform);

    rightTransform *= headRotation;


    _fb->applyFBO();

    auto defaultVP = Camera::getDefaultViewport();

    Camera::setDefaultViewport(_leftEye.viewport);

//    scene->render(renderer, leftTransform, nullptr);

    scene->render(renderer);

    Camera::setDefaultViewport(_rightEye.viewport);

//    scene->render(renderer, rightTransform, nullptr);

    scene->render(renderer);

    Camera::setDefaultViewport(defaultVP);

    _fb->restoreFBO();


    auto texture = _fb->getRenderTarget()->getTexture();

    GL::bindTexture2D(texture->getName());

    _glProgramState->apply(Mat4::IDENTITY);


    GLint origViewport[4];

    glGetIntegerv(GL_VIEWPORT, origViewport);

    glViewport(0, 0, _texSize.width, _texSize.height);


    renderDistortionMesh(_leftDistortionMesh, texture->getName());

    renderDistortionMesh(_rightDistortionMesh, texture->getName());

    glViewport(origViewport[0], origViewport[1], origViewport[2], origViewport[3]);

    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    CHECK_GL_ERROR_DEBUG();

}

--5.CCGLVIew.cpp中的renderScene方法

void GLView::renderScene(Scene* scene, Renderer* renderer)

{

    CCASSERT(scene, "Invalid Scene");

    CCASSERT(renderer, "Invalid Renderer");


    if (_vrImpl)

    {

        _vrImpl->render(scene, renderer);

    }

    else

    {

//        scene->render(renderer, Mat4::IDENTITY, nullptr);

        scene->render(renderer);

    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值