|
|
@ -423,9 +423,9 @@ void beginRenderMainScenePart()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Scene->beginPartRender();
|
|
|
|
Scene->beginPartRender();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void endRenderMainScenePart()
|
|
|
|
void endRenderMainScenePart(bool keepTraversals)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Scene->endPartRender(true);
|
|
|
|
Scene->endPartRender(!keepTraversals, true, keepTraversals);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void beginRenderSkyPart()
|
|
|
|
void beginRenderSkyPart()
|
|
|
@ -462,7 +462,7 @@ static void renderCanopyPart(UScene::TRenderPart renderPart)
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************************************************************
|
|
|
|
// ***************************************************************************************************************************
|
|
|
|
// Render a part of the main scene
|
|
|
|
// Render a part of the main scene
|
|
|
|
static void renderMainScenePart(UScene::TRenderPart renderPart)
|
|
|
|
static void renderMainScenePart(UScene::TRenderPart renderPart, bool wantTraversals, bool keepTraversals)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
H_AUTO_USE ( RZ_Client_Main_Loop_Render_Main )
|
|
|
|
H_AUTO_USE ( RZ_Client_Main_Loop_Render_Main )
|
|
|
|
Driver->setDepthRange(0.f, CANOPY_DEPTH_RANGE_START);
|
|
|
|
Driver->setDepthRange(0.f, CANOPY_DEPTH_RANGE_START);
|
|
|
@ -474,7 +474,7 @@ static void renderMainScenePart(UScene::TRenderPart renderPart)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
MainFogState.setupInDriver (*Driver);
|
|
|
|
MainFogState.setupInDriver (*Driver);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Scene->renderPart(renderPart);
|
|
|
|
Scene->renderPart(renderPart, true, wantTraversals, keepTraversals);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -580,7 +580,7 @@ void renderScene(bool forceFullDetail, bool bloom)
|
|
|
|
s_ForceFullDetail.set();
|
|
|
|
s_ForceFullDetail.set();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
clearBuffers();
|
|
|
|
clearBuffers();
|
|
|
|
renderScene();
|
|
|
|
doRenderScene(true, false);
|
|
|
|
if (forceFullDetail)
|
|
|
|
if (forceFullDetail)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
s_ForceFullDetail.restore();
|
|
|
|
s_ForceFullDetail.restore();
|
|
|
@ -719,9 +719,7 @@ void updateWeather()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************************************************************
|
|
|
|
void beginRenderScene()
|
|
|
|
// Render all scenes
|
|
|
|
|
|
|
|
void renderScene()
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Update Filter Flags
|
|
|
|
// Update Filter Flags
|
|
|
|
Scene->enableElementRender(UScene::FilterAllMeshNoVP, Filter3D[FilterMeshNoVP]);
|
|
|
|
Scene->enableElementRender(UScene::FilterAllMeshNoVP, Filter3D[FilterMeshNoVP]);
|
|
|
@ -743,28 +741,45 @@ void renderScene()
|
|
|
|
beginRenderCanopyPart();
|
|
|
|
beginRenderCanopyPart();
|
|
|
|
beginRenderMainScenePart();
|
|
|
|
beginRenderMainScenePart();
|
|
|
|
beginRenderSkyPart();
|
|
|
|
beginRenderSkyPart();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void drawRenderScene(bool wantTraversals, bool keepTraversals)
|
|
|
|
|
|
|
|
{
|
|
|
|
// Render part
|
|
|
|
// Render part
|
|
|
|
// WARNING: always must begin rendering with at least UScene::RenderOpaque,
|
|
|
|
// WARNING: always must begin rendering with at least UScene::RenderOpaque,
|
|
|
|
// else dynamic shadows won't work
|
|
|
|
// else dynamic shadows won't work
|
|
|
|
renderCanopyPart(UScene::RenderOpaque);
|
|
|
|
renderCanopyPart(UScene::RenderOpaque);
|
|
|
|
renderMainScenePart(UScene::RenderOpaque);
|
|
|
|
renderMainScenePart(UScene::RenderOpaque, wantTraversals, keepTraversals);
|
|
|
|
|
|
|
|
|
|
|
|
// render of polygons on landscape
|
|
|
|
// render of polygons on landscape
|
|
|
|
CLandscapePolyDrawer::getInstance().renderLandscapePolyPart();
|
|
|
|
CLandscapePolyDrawer::getInstance().renderLandscapePolyPart();
|
|
|
|
|
|
|
|
|
|
|
|
if (s_SkyMode != NoSky) renderSkyPart((UScene::TRenderPart) (UScene::RenderOpaque | UScene::RenderTransparent));
|
|
|
|
if (s_SkyMode != NoSky) renderSkyPart((UScene::TRenderPart) (UScene::RenderOpaque | UScene::RenderTransparent));
|
|
|
|
renderCanopyPart((UScene::TRenderPart) (UScene::RenderTransparent | UScene::RenderFlare));
|
|
|
|
renderCanopyPart((UScene::TRenderPart) (UScene::RenderTransparent | UScene::RenderFlare));
|
|
|
|
renderMainScenePart((UScene::TRenderPart) (UScene::RenderTransparent | UScene::RenderFlare));
|
|
|
|
renderMainScenePart((UScene::TRenderPart) (UScene::RenderTransparent | UScene::RenderFlare), wantTraversals, keepTraversals);
|
|
|
|
if (s_SkyMode == NewSky) renderSkyPart(UScene::RenderFlare);
|
|
|
|
if (s_SkyMode == NewSky) renderSkyPart(UScene::RenderFlare);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void endRenderScene(bool keepTraversals)
|
|
|
|
|
|
|
|
{
|
|
|
|
// End Part Rendering
|
|
|
|
// End Part Rendering
|
|
|
|
endRenderSkyPart();
|
|
|
|
endRenderSkyPart();
|
|
|
|
endRenderMainScenePart();
|
|
|
|
endRenderMainScenePart(keepTraversals);
|
|
|
|
endRenderCanopyPart();
|
|
|
|
endRenderCanopyPart();
|
|
|
|
|
|
|
|
|
|
|
|
// reset depth range
|
|
|
|
// reset depth range
|
|
|
|
Driver->setDepthRange(0.f, CANOPY_DEPTH_RANGE_START);
|
|
|
|
Driver->setDepthRange(0.f, CANOPY_DEPTH_RANGE_START);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************************************************************
|
|
|
|
|
|
|
|
// Render all scenes
|
|
|
|
|
|
|
|
void doRenderScene(bool wantTraversals, bool keepTraversals)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
beginRenderScene();
|
|
|
|
|
|
|
|
drawRenderScene(wantTraversals, keepTraversals);
|
|
|
|
|
|
|
|
endRenderScene(keepTraversals);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
// ***************************************************************************
|
|
|
|
class CMusicFader
|
|
|
|
class CMusicFader
|
|
|
@ -1628,7 +1643,6 @@ bool mainLoop()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint i = 0;
|
|
|
|
uint i = 0;
|
|
|
|
bool effectRender = false;
|
|
|
|
|
|
|
|
CTextureUser *effectRenderTarget = NULL;
|
|
|
|
CTextureUser *effectRenderTarget = NULL;
|
|
|
|
bool haveEffects = Render && Driver->getPolygonMode() == UDriver::Filled
|
|
|
|
bool haveEffects = Render && Driver->getPolygonMode() == UDriver::Filled
|
|
|
|
&& (ClientCfg.Bloom || FXAA);
|
|
|
|
&& (ClientCfg.Bloom || FXAA);
|
|
|
@ -1646,6 +1660,7 @@ bool mainLoop()
|
|
|
|
CBloomEffect::getInstance().setDensityBloom((uint8)ClientCfg.DensityBloom);
|
|
|
|
CBloomEffect::getInstance().setDensityBloom((uint8)ClientCfg.DensityBloom);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool fullDetail = false;
|
|
|
|
while ((!StereoDisplay && i == 0) || (StereoDisplay && StereoDisplay->nextPass()))
|
|
|
|
while ((!StereoDisplay && i == 0) || (StereoDisplay && StereoDisplay->nextPass()))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
++i;
|
|
|
|
++i;
|
|
|
@ -1686,42 +1701,59 @@ bool mainLoop()
|
|
|
|
|
|
|
|
|
|
|
|
if (!StereoDisplay || StereoDisplay->wantClear())
|
|
|
|
if (!StereoDisplay || StereoDisplay->wantClear())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (Render)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
effectRender = haveEffects;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Clear buffers
|
|
|
|
// Clear buffers
|
|
|
|
clearBuffers();
|
|
|
|
clearBuffers();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!StereoDisplay || StereoDisplay->wantScene())
|
|
|
|
if (!StereoDisplay || StereoDisplay->wantScene())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!ClientCfg.Light)
|
|
|
|
if (!ClientCfg.Light && Render)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Render
|
|
|
|
if (!StereoDisplay || StereoDisplay->isSceneFirst())
|
|
|
|
if(Render)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// 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;
|
|
|
|
if (!fullDetail)
|
|
|
|
if (fullDetail)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
s_ForceFullDetail.backup();
|
|
|
|
fullDetail = ScreenshotRequest != ScreenshotRequestNone && ClientCfg.ScreenShotFullDetail;
|
|
|
|
s_ForceFullDetail.set();
|
|
|
|
if (fullDetail)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
s_ForceFullDetail.backup();
|
|
|
|
|
|
|
|
s_ForceFullDetail.set();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Render scene
|
|
|
|
// Render scene
|
|
|
|
renderScene();
|
|
|
|
bool wantTraversals = !StereoDisplay || StereoDisplay->isSceneFirst();
|
|
|
|
|
|
|
|
bool keepTraversals = StereoDisplay && !StereoDisplay->isSceneLast();
|
|
|
|
|
|
|
|
doRenderScene(wantTraversals, keepTraversals);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!StereoDisplay || StereoDisplay->isSceneLast())
|
|
|
|
|
|
|
|
{
|
|
|
|
if (fullDetail)
|
|
|
|
if (fullDetail)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
s_ForceFullDetail.restore();
|
|
|
|
s_ForceFullDetail.restore();
|
|
|
|
|
|
|
|
fullDetail = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!StereoDisplay || StereoDisplay->wantSceneEffects())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!ClientCfg.Light && Render && haveEffects)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (StereoDisplay) Driver->setViewport(NL3D::CViewport());
|
|
|
|
|
|
|
|
UCamera pCam = Scene->getCam();
|
|
|
|
|
|
|
|
Driver->setMatrixMode2D11();
|
|
|
|
|
|
|
|
if (FXAA) FXAA->applyEffect();
|
|
|
|
|
|
|
|
if (ClientCfg.Bloom) CBloomEffect::instance().applyBloom();
|
|
|
|
|
|
|
|
Driver->setMatrixMode3D(pCam);
|
|
|
|
|
|
|
|
if (StereoDisplay) Driver->setViewport(StereoDisplay->getCurrentViewport());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!StereoDisplay || StereoDisplay->wantInterface3D())
|
|
|
|
if (!StereoDisplay || StereoDisplay->wantInterface3D())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!ClientCfg.Light)
|
|
|
|
if (!ClientCfg.Light)
|
|
|
@ -1729,18 +1761,6 @@ bool mainLoop()
|
|
|
|
// Render
|
|
|
|
// Render
|
|
|
|
if (Render)
|
|
|
|
if (Render)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (effectRender)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (StereoDisplay) Driver->setViewport(NL3D::CViewport());
|
|
|
|
|
|
|
|
UCamera pCam = Scene->getCam();
|
|
|
|
|
|
|
|
Driver->setMatrixMode2D11();
|
|
|
|
|
|
|
|
if (FXAA) FXAA->applyEffect();
|
|
|
|
|
|
|
|
if (ClientCfg.Bloom) CBloomEffect::instance().applyBloom();
|
|
|
|
|
|
|
|
Driver->setMatrixMode3D(pCam);
|
|
|
|
|
|
|
|
if (StereoDisplay) Driver->setViewport(StereoDisplay->getCurrentViewport());
|
|
|
|
|
|
|
|
effectRender = false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// for that frame and
|
|
|
|
// for that frame and
|
|
|
|
// tmp : display height grid
|
|
|
|
// tmp : display height grid
|
|
|
|
//static volatile bool displayHeightGrid = true;
|
|
|
|
//static volatile bool displayHeightGrid = true;
|
|
|
|