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; CMatrix translate;
if (m_Stage % 2) translate.translate(CVector((m_DevicePtr->HMDInfo.InterpupillaryDistance * m_Scale) * -0.5f, 0.f, 0.f)); 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)); else translate.translate(CVector((m_DevicePtr->HMDInfo.InterpupillaryDistance * m_Scale) * 0.5f, 0.f, 0.f));
camera->setTransformMode(NL3D::UTransformable::DirectMatrix); CMatrix mat = m_CameraMatrix[cid] * translate;
camera->setMatrix(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() bool CStereoOVR::wantClear()

View file

@ -398,8 +398,8 @@ void commitCamera()
// Update Camera Position/Rotation. // Update Camera Position/Rotation.
//camRoot.setPos(View.currentViewPos()); //camRoot.setPos(View.currentViewPos());
//camRoot.setRotQuat(View.currentViewQuat()); //camRoot.setRotQuat(View.currentViewQuat());
camRoot.setTransformMode(UTransformable::DirectMatrix); // FIXME camRoot.setPos(MainCam.getPos());
camRoot.setMatrix(MainCam.getMatrix()); camRoot.setRotQuat(MainCam.getRotQuat());
} }
} }
@ -533,6 +533,30 @@ private:
}; };
static CForceFullDetail s_ForceFullDetail; 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) void renderScene(bool forceFullDetail, bool bloom)
{ {
if (bloom) if (bloom)
@ -548,6 +572,7 @@ void renderScene(bool forceFullDetail, bool bloom)
s_ForceFullDetail.backup(); s_ForceFullDetail.backup();
s_ForceFullDetail.set(); s_ForceFullDetail.set();
} }
clearBuffers();
renderScene(); renderScene();
if (forceFullDetail) if (forceFullDetail)
{ {
@ -688,20 +713,6 @@ void updateWeather()
// Render all scenes // Render all scenes
void renderScene() 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 // Update Filter Flags
Scene->enableElementRender(UScene::FilterAllMeshNoVP, Filter3D[FilterMeshNoVP]); Scene->enableElementRender(UScene::FilterAllMeshNoVP, Filter3D[FilterMeshNoVP]);
Scene->enableElementRender(UScene::FilterAllMeshVP, Filter3D[FilterMeshVP]); Scene->enableElementRender(UScene::FilterAllMeshVP, Filter3D[FilterMeshVP]);
@ -1371,6 +1382,10 @@ bool mainLoop()
MainCam.setTransformMode(UTransformable::RotQuat); MainCam.setTransformMode(UTransformable::RotQuat);
MainCam.setPos(currViewPos); MainCam.setPos(currViewPos);
MainCam.setRotQuat(View.currentViewQuat()); MainCam.setRotQuat(View.currentViewQuat());
if (StereoHMD)
{
// ...
}
if (StereoDisplay) if (StereoDisplay)
{ {
StereoDisplay->updateCamera(0, &MainCam); 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 // // SETUP CAMERAS //
/////////////////// ///////////////////
@ -1590,7 +1610,7 @@ bool mainLoop()
{ {
SceneRoot->setViewport(vp); SceneRoot->setViewport(vp);
} }
MainCam.setTransformMode(UTransformable::DirectMatrix); //MainCam.setTransformMode(UTransformable::DirectMatrix);
StereoDisplay->getCurrentMatrix(0, &MainCam); StereoDisplay->getCurrentMatrix(0, &MainCam);
StereoDisplay->getCurrentFrustum(0, &MainCam); StereoDisplay->getCurrentFrustum(0, &MainCam);
if (SceneRoot) if (SceneRoot)
@ -1607,19 +1627,38 @@ bool mainLoop()
// RENDER THE FRAME 3D // // 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) if (!ClientCfg.Light)
{ {
// Render // Render
if(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 // nb : force full detail if a screenshot is asked
// todo : move outside render code // todo : move outside render code
bool fullDetail = ScreenshotRequest != ScreenshotRequestNone && ClientCfg.ScreenShotFullDetail; bool fullDetail = ScreenshotRequest != ScreenshotRequestNone && ClientCfg.ScreenShotFullDetail;
@ -1636,10 +1675,24 @@ bool mainLoop()
{ {
s_ForceFullDetail.restore(); s_ForceFullDetail.restore();
} }
if (ClientCfg.Bloom) }
}
}
if (!StereoDisplay || StereoDisplay->wantInterface3D())
{ {
// apply bloom effect if (!ClientCfg.Light)
CBloomEffect::getInstance().endBloom(); {
// 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 // for that frame and
@ -1660,11 +1713,7 @@ bool mainLoop()
H_AUTO_USE ( RZ_Client_Main_Loop_Debug ) H_AUTO_USE ( RZ_Client_Main_Loop_Debug )
PrimFiles.display (*Driver); PrimFiles.display (*Driver);
} }
} } /* if (Render) */
else
{
Driver->clearBuffers(ClientCfg.BGColor);
}
// Draw Extra 3D Objects // Draw Extra 3D Objects
Driver->setMatrixMode3D(MainCam); Driver->setMatrixMode3D(MainCam);
@ -1691,16 +1740,15 @@ bool mainLoop()
H_AUTO_USE ( RZ_Client_Main_Loop_Debug ) H_AUTO_USE ( RZ_Client_Main_Loop_Debug )
displayDebugClusters(); displayDebugClusters();
} }
} /* if (!ClientCfg.Light) */
}
else else
{ {
// static UTextureFile *backgroundBitmap = NULL; // static UTextureFile *backgroundBitmap = NULL;
// if (backgroundBitmap == NULL) // if (backgroundBitmap == NULL)
// backgroundBitmap = Driver->createTextureFile("temp_background.tga"); // backgroundBitmap = Driver->createTextureFile("temp_background.tga");
// Driver->setMatrixMode2D11(); // Driver->setMatrixMode2D11();
// Driver->drawBitmap (0.f, 0.f, 1024.f/1024.f, 1024.f/768.f, (UTexture&)*backgroundBitmap); // Driver->drawBitmap (0.f, 0.f, 1024.f/1024.f, 1024.f/768.f, (UTexture&)*backgroundBitmap);
// Driver->setMatrixMode3D(MainCam); // Driver->setMatrixMode3D(MainCam);
Driver->clearBuffers(CRGBA (0,0,0,0)); Driver->clearBuffers(CRGBA (0,0,0,0));
displayPACSBorders(); displayPACSBorders();
@ -1721,6 +1769,10 @@ bool mainLoop()
CGraph::render (ShowInfos); CGraph::render (ShowInfos);
} }
} /* if (!StereoDisplay || StereoDisplay->wantInterface3D()) */
if (!StereoDisplay || StereoDisplay->wantInterface2D())
{
// Render in 2D Mode to display 2D Interfaces and 2D texts. // Render in 2D Mode to display 2D Interfaces and 2D texts.
Driver->setMatrixMode2D11(); Driver->setMatrixMode2D11();
@ -1761,8 +1813,14 @@ bool mainLoop()
// special case in OpenGL : all scene has been display in render target, // special case in OpenGL : all scene has been display in render target,
// now, final texture is display with a quad // now, final texture is display with a quad
if(!ClientCfg.Light && ClientCfg.Bloom) if (!ClientCfg.Light && ClientCfg.Bloom && Render && bloomStage == 2)
CBloomEffect::getInstance().endInterfacesDisplayBloom(); {
// 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); CVector2f camPos(Scene->getCam().getPos().x, Scene->getCam().getPos().y);
if (!ClientCfg.Light) if (!ClientCfg.Light)
{ {
@ -2052,9 +2110,9 @@ bool mainLoop()
static bool drawSound = false; static bool drawSound = false;
static float camHeigh = 150.0f; static float camHeigh = 150.0f;
#if FINAL_VERSION #if FINAL_VERSION
if (ClientCfg.ExtendedCommands) if (ClientCfg.ExtendedCommands)
#endif #endif
if (Actions.valide ("draw_sound")) if (Actions.valide ("draw_sound"))
drawSound = !drawSound; drawSound = !drawSound;
@ -2067,6 +2125,13 @@ bool mainLoop()
SoundMngr->drawSounds(camHeigh); SoundMngr->drawSounds(camHeigh);
} }
} }
} /* if (!StereoDisplay || StereoDisplay->wantInterface2D()) */
if (StereoDisplay)
{
StereoDisplay->endRenderTarget();
}
} /* stereo pass */
// Draw to screen. // Draw to screen.
static CQuat MainCamOri; static CQuat MainCamOri;