Changeset View
Changeset View
Standalone View
Standalone View
source/renderer/SceneRenderer.cpp
Show First 20 Lines • Show All 751 Lines • ▼ Show 20 Lines | void CSceneRenderer::RenderParticles( | ||||
if (m_ModelRenderMode == EDGED_FACES) | if (m_ModelRenderMode == EDGED_FACES) | ||||
{ | { | ||||
m->particleRenderer.RenderParticles( | m->particleRenderer.RenderParticles( | ||||
deviceCommandContext, cullGroup, true); | deviceCommandContext, cullGroup, true); | ||||
m->particleRenderer.RenderBounds(cullGroup); | m->particleRenderer.RenderBounds(cullGroup); | ||||
} | } | ||||
} | } | ||||
// RenderSubmissions: force rendering of any batched objects | void CSceneRenderer::PrepareSubmissions( | ||||
void CSceneRenderer::RenderSubmissions( | |||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext, | Renderer::Backend::IDeviceCommandContext* deviceCommandContext, | ||||
const CBoundingBoxAligned& waterScissor) | const CBoundingBoxAligned& waterScissor) | ||||
{ | { | ||||
PROFILE3("render submissions"); | PROFILE3("prepare submissions"); | ||||
GPU_SCOPED_LABEL(deviceCommandContext, "Render submissions"); | GPU_SCOPED_LABEL(deviceCommandContext, "Prepare submissions"); | ||||
m->skyManager.LoadAndUploadSkyTexturesIfNeeded(deviceCommandContext); | m->skyManager.LoadAndUploadSkyTexturesIfNeeded(deviceCommandContext); | ||||
GetScene().GetLOSTexture().InterpolateLOS(deviceCommandContext); | GetScene().GetLOSTexture().InterpolateLOS(deviceCommandContext); | ||||
GetScene().GetTerritoryTexture().UpdateIfNeeded(deviceCommandContext); | GetScene().GetTerritoryTexture().UpdateIfNeeded(deviceCommandContext); | ||||
GetScene().GetMiniMapTexture().Render( | GetScene().GetMiniMapTexture().Render( | ||||
deviceCommandContext, GetScene().GetLOSTexture(), GetScene().GetTerritoryTexture()); | deviceCommandContext, GetScene().GetLOSTexture(), GetScene().GetTerritoryTexture()); | ||||
CShaderDefines context = m->globalContext; | CShaderDefines context = m->globalContext; | ||||
int cullGroup = CULL_DEFAULT; | int cullGroup = CULL_DEFAULT; | ||||
phabadmin: unused | |||||
StanUnsubmitted Done Inline ActionsStill :) Stan: Still :) | |||||
// Set the camera | // Set the camera | ||||
g_Renderer.SetViewport(m_ViewCamera.GetViewPort()); | g_Renderer.SetViewport(m_ViewCamera.GetViewPort()); | ||||
// Prepare model renderers | // Prepare model renderers | ||||
{ | { | ||||
PROFILE3("prepare models"); | PROFILE3("prepare models"); | ||||
m->Model.NormalSkinned->PrepareModels(); | m->Model.NormalSkinned->PrepareModels(); | ||||
Show All 38 Lines | if (waterScissor.GetVolume() > 0 && m->waterManager.WillRenderFancyWater()) | ||||
PROFILE3_GPU("water scissor"); | PROFILE3_GPU("water scissor"); | ||||
if (g_RenderingOptions.GetWaterReflection()) | if (g_RenderingOptions.GetWaterReflection()) | ||||
RenderReflections(deviceCommandContext, context, waterScissor); | RenderReflections(deviceCommandContext, context, waterScissor); | ||||
if (g_RenderingOptions.GetWaterRefraction()) | if (g_RenderingOptions.GetWaterRefraction()) | ||||
RenderRefractions(deviceCommandContext, context, waterScissor); | RenderRefractions(deviceCommandContext, context, waterScissor); | ||||
if (g_RenderingOptions.GetWaterFancyEffects()) | if (g_RenderingOptions.GetWaterFancyEffects()) | ||||
m->terrainRenderer.RenderWaterFoamOccluders(deviceCommandContext, cullGroup); | m->terrainRenderer.RenderWaterFoamOccluders(deviceCommandContext, CULL_DEFAULT); | ||||
} | } | ||||
} | } | ||||
deviceCommandContext->SetGraphicsPipelineState( | |||||
Renderer::Backend::MakeDefaultGraphicsPipelineStateDesc()); | |||||
CPostprocManager& postprocManager = g_Renderer.GetPostprocManager(); | |||||
if (postprocManager.IsEnabled()) | |||||
{ | |||||
// We have to update the post process manager with real near/far planes | |||||
// that we use for the scene rendering. | |||||
postprocManager.SetDepthBufferClipPlanes( | |||||
m_ViewCamera.GetNearPlane(), m_ViewCamera.GetFarPlane() | |||||
); | |||||
postprocManager.Initialize(); | |||||
postprocManager.CaptureRenderOutput(deviceCommandContext); | |||||
} | } | ||||
else | |||||
void CSceneRenderer::RenderSubmissions( | |||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext, | |||||
const CBoundingBoxAligned& waterScissor) | |||||
{ | { | ||||
deviceCommandContext->BeginFramebufferPass( | PROFILE3("render submissions"); | ||||
deviceCommandContext->GetDevice()->GetCurrentBackbuffer()); | GPU_SCOPED_LABEL(deviceCommandContext, "Render submissions"); | ||||
} | |||||
CShaderDefines context = m->globalContext; | |||||
int cullGroup = CULL_DEFAULT; | |||||
Done Inline Actionsconst and constexpr phosit: `const` and `constexpr` | |||||
{ | { | ||||
PROFILE3_GPU("clear buffers"); | PROFILE3_GPU("clear buffers"); | ||||
// We don't need to clear the color attachment of the framebuffer if the sky | // We don't need to clear the color attachment of the framebuffer if the sky | ||||
// is going to be rendered. Because it covers the whole view. | // is going to be rendered. Because it covers the whole view. | ||||
deviceCommandContext->ClearFramebuffer(!m->skyManager.IsSkyVisible(), true, true); | deviceCommandContext->ClearFramebuffer(!m->skyManager.IsSkyVisible(), true, true); | ||||
} | } | ||||
m->skyManager.RenderSky(deviceCommandContext); | m->skyManager.RenderSky(deviceCommandContext); | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | void CSceneRenderer::RenderSubmissions( | ||||
m->overlayRenderer.RenderOverlaysAfterWater(deviceCommandContext); | m->overlayRenderer.RenderOverlaysAfterWater(deviceCommandContext); | ||||
// particles are transparent so render after water | // particles are transparent so render after water | ||||
if (g_RenderingOptions.GetParticles()) | if (g_RenderingOptions.GetParticles()) | ||||
{ | { | ||||
RenderParticles(deviceCommandContext, cullGroup); | RenderParticles(deviceCommandContext, cullGroup); | ||||
} | } | ||||
if (postprocManager.IsEnabled()) | |||||
{ | |||||
deviceCommandContext->EndFramebufferPass(); | |||||
if (g_Renderer.GetPostprocManager().IsMultisampleEnabled()) | |||||
g_Renderer.GetPostprocManager().ResolveMultisampleFramebuffer(deviceCommandContext); | |||||
postprocManager.ApplyPostproc(deviceCommandContext); | |||||
postprocManager.ReleaseRenderOutput(deviceCommandContext); | |||||
deviceCommandContext->BeginFramebufferPass( | |||||
deviceCommandContext->GetDevice()->GetCurrentBackbuffer()); | |||||
} | |||||
if (g_RenderingOptions.GetSilhouettes()) | |||||
{ | |||||
RenderSilhouettes(deviceCommandContext, context); | |||||
} | |||||
// render debug lines | // render debug lines | ||||
if (g_RenderingOptions.GetDisplayFrustum()) | if (g_RenderingOptions.GetDisplayFrustum()) | ||||
DisplayFrustum(); | DisplayFrustum(); | ||||
if (g_RenderingOptions.GetDisplayShadowsFrustum()) | if (g_RenderingOptions.GetDisplayShadowsFrustum()) | ||||
m->shadow.RenderDebugBounds(); | m->shadow.RenderDebugBounds(); | ||||
m->silhouetteRenderer.RenderDebugBounds(deviceCommandContext); | m->silhouetteRenderer.RenderDebugBounds(deviceCommandContext); | ||||
m->silhouetteRenderer.RenderDebugOverlays(deviceCommandContext); | |||||
// render overlays that should appear on top of all other objects | |||||
m->overlayRenderer.RenderForegroundOverlays(deviceCommandContext, m_ViewCamera); | |||||
deviceCommandContext->EndFramebufferPass(); | |||||
} | } | ||||
void CSceneRenderer::EndFrame() | void CSceneRenderer::EndFrame() | ||||
{ | { | ||||
// empty lists | // empty lists | ||||
m->terrainRenderer.EndFrame(); | m->terrainRenderer.EndFrame(); | ||||
m->overlayRenderer.EndFrame(); | m->overlayRenderer.EndFrame(); | ||||
m->particleRenderer.EndFrame(); | m->particleRenderer.EndFrame(); | ||||
▲ Show 20 Lines • Show All 133 Lines • ▼ Show 20 Lines | void CSceneRenderer::SubmitNonRecursive(CModel* model) | ||||
{ | { | ||||
if (requiresSkinning) | if (requiresSkinning) | ||||
m->Model.NormalSkinned->Submit(m_CurrentCullGroup, model); | m->Model.NormalSkinned->Submit(m_CurrentCullGroup, model); | ||||
else | else | ||||
m->Model.NormalUnskinned->Submit(m_CurrentCullGroup, model); | m->Model.NormalUnskinned->Submit(m_CurrentCullGroup, model); | ||||
} | } | ||||
} | } | ||||
// Render the given scene | void CSceneRenderer::PrepareScene( | ||||
void CSceneRenderer::RenderScene( | |||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext, Scene& scene) | Renderer::Backend::IDeviceCommandContext* deviceCommandContext, Scene& scene) | ||||
{ | { | ||||
m_CurrentScene = &scene; | m_CurrentScene = &scene; | ||||
CFrustum frustum = m_CullCamera.GetFrustum(); | CFrustum frustum = m_CullCamera.GetFrustum(); | ||||
m_CurrentCullGroup = CULL_DEFAULT; | m_CurrentCullGroup = CULL_DEFAULT; | ||||
Show All 20 Lines | if (g_RenderingOptions.GetShadows()) | ||||
for (int cascade = 0; cascade <= m->shadow.GetCascadeCount(); ++cascade) | for (int cascade = 0; cascade <= m->shadow.GetCascadeCount(); ++cascade) | ||||
{ | { | ||||
m_CurrentCullGroup = CULL_SHADOWS_CASCADE_0 + cascade; | m_CurrentCullGroup = CULL_SHADOWS_CASCADE_0 + cascade; | ||||
const CFrustum shadowFrustum = m->shadow.GetShadowCasterCullFrustum(cascade); | const CFrustum shadowFrustum = m->shadow.GetShadowCasterCullFrustum(cascade); | ||||
scene.EnumerateObjects(shadowFrustum, this); | scene.EnumerateObjects(shadowFrustum, this); | ||||
} | } | ||||
} | } | ||||
CBoundingBoxAligned waterScissor; | |||||
if (m->waterManager.m_RenderWater) | if (m->waterManager.m_RenderWater) | ||||
{ | { | ||||
waterScissor = m->terrainRenderer.ScissorWater(CULL_DEFAULT, m_ViewCamera); | m_WaterScissor = m->terrainRenderer.ScissorWater(CULL_DEFAULT, m_ViewCamera); | ||||
if (waterScissor.GetVolume() > 0 && m->waterManager.WillRenderFancyWater()) | if (m_WaterScissor.GetVolume() > 0 && m->waterManager.WillRenderFancyWater()) | ||||
{ | { | ||||
if (g_RenderingOptions.GetWaterReflection()) | if (g_RenderingOptions.GetWaterReflection()) | ||||
{ | { | ||||
m_CurrentCullGroup = CULL_REFLECTIONS; | m_CurrentCullGroup = CULL_REFLECTIONS; | ||||
CCamera reflectionCamera; | CCamera reflectionCamera; | ||||
ComputeReflectionCamera(reflectionCamera, waterScissor); | ComputeReflectionCamera(reflectionCamera, m_WaterScissor); | ||||
scene.EnumerateObjects(reflectionCamera.GetFrustum(), this); | scene.EnumerateObjects(reflectionCamera.GetFrustum(), this); | ||||
} | } | ||||
if (g_RenderingOptions.GetWaterRefraction()) | if (g_RenderingOptions.GetWaterRefraction()) | ||||
{ | { | ||||
m_CurrentCullGroup = CULL_REFRACTIONS; | m_CurrentCullGroup = CULL_REFRACTIONS; | ||||
CCamera refractionCamera; | CCamera refractionCamera; | ||||
ComputeRefractionCamera(refractionCamera, waterScissor); | ComputeRefractionCamera(refractionCamera, m_WaterScissor); | ||||
scene.EnumerateObjects(refractionCamera.GetFrustum(), this); | scene.EnumerateObjects(refractionCamera.GetFrustum(), this); | ||||
} | } | ||||
// Render the waves to the Fancy effects texture | // Render the waves to the Fancy effects texture | ||||
m->waterManager.RenderWaves(deviceCommandContext, frustum); | m->waterManager.RenderWaves(deviceCommandContext, frustum); | ||||
} | } | ||||
} | } | ||||
else | |||||
m_WaterScissor = CBoundingBoxAligned{}; | |||||
m_CurrentCullGroup = -1; | m_CurrentCullGroup = -1; | ||||
RenderSubmissions(deviceCommandContext, waterScissor); | PrepareSubmissions(deviceCommandContext, m_WaterScissor); | ||||
} | |||||
void CSceneRenderer::RenderScene( | |||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext) | |||||
{ | |||||
Done Inline Actionsmaybe ensure(m_PrepareHasBeenCalled) phosit: maybe `ensure(m_PrepareHasBeenCalled)` | |||||
Done Inline ActionsMight be ENSURE(m_CurrentScene);. vladislavbelov: Might be `ENSURE(m_CurrentScene);`. | |||||
RenderSubmissions(deviceCommandContext, m_WaterScissor); | |||||
} | |||||
void CSceneRenderer::RenderSceneOverlays( | |||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext) | |||||
{ | |||||
if (g_RenderingOptions.GetSilhouettes()) | |||||
{ | |||||
RenderSilhouettes(deviceCommandContext, m->globalContext); | |||||
} | |||||
m->silhouetteRenderer.RenderDebugOverlays(deviceCommandContext); | |||||
// render overlays that should appear on top of all other objects | |||||
m->overlayRenderer.RenderForegroundOverlays(deviceCommandContext, m_ViewCamera); | |||||
m_CurrentScene = NULL; | m_CurrentScene = NULL; | ||||
} | } | ||||
Scene& CSceneRenderer::GetScene() | Scene& CSceneRenderer::GetScene() | ||||
{ | { | ||||
ENSURE(m_CurrentScene); | ENSURE(m_CurrentScene); | ||||
return *m_CurrentScene; | return *m_CurrentScene; | ||||
▲ Show 20 Lines • Show All 42 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator
unused