Put stereo render loop inside ryzom client main loop, see #43

This commit is contained in:
kaetemi 2013-07-05 02:38:56 +02:00
parent 541f75920b
commit c3f6f5b8ff
2 changed files with 536 additions and 462 deletions

View file

@ -438,8 +438,17 @@ void CStereoOVR::getCurrentMatrix(uint cid, NL3D::UCamera *camera) const
CMatrix translate;
if (m_Stage % 2) translate.translate(CVector((m_DevicePtr->HMDInfo.InterpupillaryDistance * m_Scale) * -0.5f, 0.f, 0.f));
else translate.translate(CVector((m_DevicePtr->HMDInfo.InterpupillaryDistance * m_Scale) * 0.5f, 0.f, 0.f));
camera->setTransformMode(NL3D::UTransformable::DirectMatrix);
camera->setMatrix(m_CameraMatrix[cid] * translate);
CMatrix mat = m_CameraMatrix[cid] * translate;
if (camera->getTransformMode() == NL3D::UTransformable::RotQuat)
{
camera->setPos(mat.getPos());
camera->setRotQuat(mat.getRot());
}
else
{
// camera->setTransformMode(NL3D::UTransformable::DirectMatrix);
camera->setMatrix(mat);
}
}
bool CStereoOVR::wantClear()

View file

@ -398,8 +398,8 @@ void commitCamera()
// Update Camera Position/Rotation.
//camRoot.setPos(View.currentViewPos());
//camRoot.setRotQuat(View.currentViewQuat());
camRoot.setTransformMode(UTransformable::DirectMatrix); // FIXME
camRoot.setMatrix(MainCam.getMatrix());
camRoot.setPos(MainCam.getPos());
camRoot.setRotQuat(MainCam.getRotQuat());
}
}
@ -533,6 +533,30 @@ private:
};
static CForceFullDetail s_ForceFullDetail;
void clearBuffers()
{
if (Render)
{
if (Driver->getPolygonMode() == UDriver::Filled)
{
Driver->clearZBuffer();
}
// Sky is used to clear the frame buffer now, but if in line or point polygon mode, we should draw it
if (Driver->getPolygonMode() != UDriver::Filled)
{
if (!Driver->isLost())
{
Driver->clearBuffers (CRGBA(127, 127, 127));
}
}
}
else
{
Driver->clearBuffers(ClientCfg.BGColor);
}
}
void renderScene(bool forceFullDetail, bool bloom)
{
if (bloom)
@ -548,6 +572,7 @@ void renderScene(bool forceFullDetail, bool bloom)
s_ForceFullDetail.backup();
s_ForceFullDetail.set();
}
clearBuffers();
renderScene();
if (forceFullDetail)
{
@ -688,20 +713,6 @@ void updateWeather()
// Render all scenes
void renderScene()
{
if (Driver->getPolygonMode() == UDriver::Filled)
{
Driver->clearZBuffer();
}
// Sky is used to clear the frame buffer now, but if in line or point polygon mode, we should draw it
if (Driver->getPolygonMode() != UDriver::Filled)
{
if (!Driver->isLost())
{
Driver->clearBuffers (CRGBA(127, 127, 127));
}
}
// Update Filter Flags
Scene->enableElementRender(UScene::FilterAllMeshNoVP, Filter3D[FilterMeshNoVP]);
Scene->enableElementRender(UScene::FilterAllMeshVP, Filter3D[FilterMeshVP]);
@ -1371,6 +1382,10 @@ bool mainLoop()
MainCam.setTransformMode(UTransformable::RotQuat);
MainCam.setPos(currViewPos);
MainCam.setRotQuat(View.currentViewQuat());
if (StereoHMD)
{
// ...
}
if (StereoDisplay)
{
StereoDisplay->updateCamera(0, &MainCam);
@ -1575,6 +1590,11 @@ bool mainLoop()
}
}
uint i = 0;
uint bloomStage = 0;
while ((!StereoDisplay && i == 0) || (StereoDisplay && StereoDisplay->nextPass()))
{
++i;
///////////////////
// SETUP CAMERAS //
///////////////////
@ -1590,7 +1610,7 @@ bool mainLoop()
{
SceneRoot->setViewport(vp);
}
MainCam.setTransformMode(UTransformable::DirectMatrix);
//MainCam.setTransformMode(UTransformable::DirectMatrix);
StereoDisplay->getCurrentMatrix(0, &MainCam);
StereoDisplay->getCurrentFrustum(0, &MainCam);
if (SceneRoot)
@ -1607,19 +1627,38 @@ bool mainLoop()
// RENDER THE FRAME 3D //
//////////////////////////
if (StereoDisplay)
{
StereoDisplay->beginRenderTarget();
}
if (!StereoDisplay || StereoDisplay->wantClear())
{
if(Render)
{
if (ClientCfg.Bloom)
{
nlassert(bloomStage == 0);
// set bloom parameters before applying bloom effect
CBloomEffect::getInstance().setSquareBloom(ClientCfg.SquareBloom);
CBloomEffect::getInstance().setDensityBloom((uint8)ClientCfg.DensityBloom);
// start bloom effect (just before the first scene element render)
CBloomEffect::instance().initBloom();
bloomStage = 1;
}
}
// Clear buffers
clearBuffers();
}
if (!StereoDisplay || StereoDisplay->wantScene())
{
if (!ClientCfg.Light)
{
// Render
if(Render)
{
if (ClientCfg.Bloom)
{
// set bloom parameters before applying bloom effect
CBloomEffect::getInstance().setSquareBloom(ClientCfg.SquareBloom);
CBloomEffect::getInstance().setDensityBloom((uint8)ClientCfg.DensityBloom);
// init bloom
CBloomEffect::getInstance().initBloom();
}
// nb : force full detail if a screenshot is asked
// todo : move outside render code
bool fullDetail = ScreenshotRequest != ScreenshotRequestNone && ClientCfg.ScreenShotFullDetail;
@ -1636,10 +1675,24 @@ bool mainLoop()
{
s_ForceFullDetail.restore();
}
if (ClientCfg.Bloom)
}
}
}
if (!StereoDisplay || StereoDisplay->wantInterface3D())
{
// apply bloom effect
CBloomEffect::getInstance().endBloom();
if (!ClientCfg.Light)
{
// Render
if (Render)
{
if (ClientCfg.Bloom && bloomStage == 1)
{
// End the actual bloom effect visible in the scene.
if (StereoDisplay) Driver->setViewport(NL3D::CViewport());
CBloomEffect::instance().endBloom();
if (StereoDisplay) Driver->setViewport(StereoDisplay->getCurrentViewport());
bloomStage = 2;
}
// for that frame and
@ -1660,11 +1713,7 @@ bool mainLoop()
H_AUTO_USE ( RZ_Client_Main_Loop_Debug )
PrimFiles.display (*Driver);
}
}
else
{
Driver->clearBuffers(ClientCfg.BGColor);
}
} /* if (Render) */
// Draw Extra 3D Objects
Driver->setMatrixMode3D(MainCam);
@ -1691,16 +1740,15 @@ bool mainLoop()
H_AUTO_USE ( RZ_Client_Main_Loop_Debug )
displayDebugClusters();
}
}
} /* if (!ClientCfg.Light) */
else
{
// static UTextureFile *backgroundBitmap = NULL;
// if (backgroundBitmap == NULL)
// backgroundBitmap = Driver->createTextureFile("temp_background.tga");
// Driver->setMatrixMode2D11();
// Driver->drawBitmap (0.f, 0.f, 1024.f/1024.f, 1024.f/768.f, (UTexture&)*backgroundBitmap);
// Driver->setMatrixMode3D(MainCam);
// static UTextureFile *backgroundBitmap = NULL;
// if (backgroundBitmap == NULL)
// backgroundBitmap = Driver->createTextureFile("temp_background.tga");
// Driver->setMatrixMode2D11();
// Driver->drawBitmap (0.f, 0.f, 1024.f/1024.f, 1024.f/768.f, (UTexture&)*backgroundBitmap);
// Driver->setMatrixMode3D(MainCam);
Driver->clearBuffers(CRGBA (0,0,0,0));
displayPACSBorders();
@ -1721,6 +1769,10 @@ bool mainLoop()
CGraph::render (ShowInfos);
}
} /* if (!StereoDisplay || StereoDisplay->wantInterface3D()) */
if (!StereoDisplay || StereoDisplay->wantInterface2D())
{
// Render in 2D Mode to display 2D Interfaces and 2D texts.
Driver->setMatrixMode2D11();
@ -1761,8 +1813,14 @@ bool mainLoop()
// special case in OpenGL : all scene has been display in render target,
// now, final texture is display with a quad
if(!ClientCfg.Light && ClientCfg.Bloom)
CBloomEffect::getInstance().endInterfacesDisplayBloom();
if (!ClientCfg.Light && ClientCfg.Bloom && Render && bloomStage == 2)
{
// End bloom effect system after drawing the 3d interface (z buffer related).
if (StereoDisplay) Driver->setViewport(NL3D::CViewport());
CBloomEffect::instance().endInterfacesDisplayBloom();
if (StereoDisplay) Driver->setViewport(StereoDisplay->getCurrentViewport());
bloomStage = 0;
}
}
{
@ -2013,7 +2071,7 @@ bool mainLoop()
}
}
#if !FINAL_VERSION
#if !FINAL_VERSION
CVector2f camPos(Scene->getCam().getPos().x, Scene->getCam().getPos().y);
if (!ClientCfg.Light)
{
@ -2052,9 +2110,9 @@ bool mainLoop()
static bool drawSound = false;
static float camHeigh = 150.0f;
#if FINAL_VERSION
#if FINAL_VERSION
if (ClientCfg.ExtendedCommands)
#endif
#endif
if (Actions.valide ("draw_sound"))
drawSound = !drawSound;
@ -2067,6 +2125,13 @@ bool mainLoop()
SoundMngr->drawSounds(camHeigh);
}
}
} /* if (!StereoDisplay || StereoDisplay->wantInterface2D()) */
if (StereoDisplay)
{
StereoDisplay->endRenderTarget();
}
} /* stereo pass */
// Draw to screen.
static CQuat MainCamOri;