diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 9965161c..5661e2e2 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -188,12 +188,6 @@ CEngine::CEngine(CApplication *app) m_qualityShadows = (value > 2); } - int samples; - if (GetProfile().GetIntProperty("Setup", "MSAA", samples)) - { - m_multisample = samples; - } - m_shadowColor = 0.5f; m_defaultTexParams.format = TEX_IMG_AUTO; @@ -352,6 +346,16 @@ void CEngine::Destroy() { m_text->Destroy(); + if (m_shadowMap.id != 0) + { + if (m_offscreenShadowRendering) + m_device->DeleteFramebuffer("shadow"); + else + m_device->DestroyTexture(m_shadowMap); + + m_shadowMap = Texture(); + } + delete m_pause; m_pause = nullptr; @@ -382,6 +386,16 @@ void CEngine::ResetAfterDeviceChanged() m_size = m_app->GetVideoConfig().size; m_mouseSize = Math::Point(0.04f, 0.04f * (m_size.x / m_size.y)); + if (m_shadowMap.id != 0) + { + if (m_offscreenShadowRendering) + m_device->DeleteFramebuffer("shadow"); + else + m_device->DestroyTexture(m_shadowMap); + + m_shadowMap = Texture(); + } + m_text->FlushCache(); FlushTextureCache(); @@ -2566,7 +2580,7 @@ void CEngine::SetShadowColor(float value) m_shadowColor = value; } -bool CEngine::GetShadowColor() +float CEngine::GetShadowColor() { return m_shadowColor; } @@ -2576,7 +2590,7 @@ void CEngine::SetShadowRange(float value) m_shadowRange = value; } -bool CEngine::GetShadowRange() +float CEngine::GetShadowRange() { return m_shadowRange; } @@ -2586,7 +2600,7 @@ void CEngine::SetMultiSample(int value) m_multisample = value; } -bool CEngine::GetMultiSample() +int CEngine::GetMultiSample() { return m_multisample; } @@ -3370,8 +3384,7 @@ void CEngine::RenderShadowMap() if (m_shadowMap.id == 0) { int width = 256, height = 256; - - int depth = m_app->GetInstance().GetVideoConfig().depthSize; + int depth; if (m_offscreenShadowRendering) { @@ -3388,7 +3401,7 @@ void CEngine::RenderShadowMap() FramebufferParams params; params.width = params.height = width; - params.depth = depth; + params.depth = depth = 32; params.depthTexture = true; CFramebuffer *framebuffer = m_device->CreateFramebuffer("shadow", params); @@ -3415,6 +3428,8 @@ void CEngine::RenderShadowMap() width = height = 1 << i; } + depth = m_app->GetInstance().GetVideoConfig().depthSize; + m_shadowMap = m_device->CreateDepthTexture(width, height, depth); } @@ -3440,7 +3455,7 @@ void CEngine::RenderShadowMap() m_device->SetRenderState(RENDER_STATE_DEPTH_BIAS, false); m_device->SetAlphaTestFunc(COMP_FUNC_GREATER, 0.5f); m_device->SetRenderState(RENDER_STATE_DEPTH_BIAS, true); - m_device->SetDepthBias(1.5f, 16.0f); + m_device->SetDepthBias(1.5f, 8.0f); m_device->SetViewport(0, 0, m_shadowMap.size.x, m_shadowMap.size.y); @@ -3452,7 +3467,7 @@ void CEngine::RenderShadowMap() dir.Normalize(); float dist = m_shadowRange; - float depth = 400.0f; + float depth = 200.0f; if (dist < 0.5f) { @@ -3548,6 +3563,7 @@ void CEngine::RenderShadowMap() void CEngine::UseShadowMapping(bool enable) { if (!m_shadowMapping) return; + if (m_shadowMap.id == 0) return; if (enable) // Enable shadow mapping { diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h index 375ecaa4..26d376c4 100644 --- a/src/graphics/engine/engine.h +++ b/src/graphics/engine/engine.h @@ -1147,19 +1147,19 @@ public: //@{ //! Management of shadow color void SetShadowColor(float value); - bool GetShadowColor(); + float GetShadowColor(); //@} //@{ //! Management of shadow range void SetShadowRange(float value); - bool GetShadowRange(); + float GetShadowRange(); //@} //@{ //! Management of shadow range void SetMultiSample(int value); - bool GetMultiSample(); + int GetMultiSample(); //@} //@{ diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp index 2d7fa0f9..5cf6cf02 100644 --- a/src/ui/maindialog.cpp +++ b/src/ui/maindialog.cpp @@ -4904,6 +4904,7 @@ void CMainDialog::SetupMemorize() GetProfile().SetIntProperty("Setup", "Anisotropy", m_engine->GetTextureAnisotropyLevel()); GetProfile().SetFloatProperty("Setup", "ShadowColor", m_engine->GetShadowColor()); GetProfile().SetFloatProperty("Setup", "ShadowRange", m_engine->GetShadowRange()); + GetProfile().SetIntProperty("Setup", "MSAA", m_engine->GetMultiSample()); /* screen setup */ GetProfile().SetIntProperty("Setup", "Fullscreen", m_setupFull ? 1 : 0); @@ -5203,6 +5204,11 @@ void CMainDialog::SetupRecall() { m_engine->SetShadowRange(fValue); } + + if (GetProfile().GetIntProperty("Setup", "MSAA", iValue)) + { + m_engine->SetMultiSample(iValue); + } }