Added shadow mapping to settings screen

master
krzys-h 2015-07-20 18:42:09 +02:00
parent fce1539888
commit f03734d17f
8 changed files with 185 additions and 30 deletions

View File

@ -226,6 +226,8 @@ void InitializeEventTypeTexts()
EVENT_TYPE_TEXT[EVENT_INTERFACE_TEXTURE_MIPMAP] = "EVENT_INTERFACE_TEXTURE_MIPMAP";
EVENT_TYPE_TEXT[EVENT_INTERFACE_TEXTURE_ANISOTROPY] = "EVENT_INTERFACE_TEXTURE_ANISOTROPY";
EVENT_TYPE_TEXT[EVENT_INTERFACE_MSAA] = "EVENT_INTERFACE_MSAA";
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING] = "EVENT_INTERFACE_SHADOW_MAPPING";
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY] = "EVENT_INTERFACE_SHADOW_MAPPING_QUALITY";
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO1] = "EVENT_INTERFACE_KINFO1";
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO2] = "EVENT_INTERFACE_KINFO2";

View File

@ -247,6 +247,8 @@ enum EventType
EVENT_INTERFACE_TEXTURE_MIPMAP = 784,
EVENT_INTERFACE_TEXTURE_ANISOTROPY = 785,
EVENT_INTERFACE_MSAA = 786,
EVENT_INTERFACE_SHADOW_MAPPING = 787,
EVENT_INTERFACE_SHADOW_MAPPING_QUALITY = 788,
EVENT_INTERFACE_KINFO1 = 500,
EVENT_INTERFACE_KINFO2 = 501,

View File

@ -217,6 +217,8 @@ void InitializeRestext()
stringsEvent[EVENT_INTERFACE_TEXTURE_MIPMAP] = TR("Mipmap level\\Mipmap level");
stringsEvent[EVENT_INTERFACE_TEXTURE_ANISOTROPY]= TR("Anisotropy level\\Anisotropy level");
stringsEvent[EVENT_INTERFACE_MSAA] = TR("MSAA\\Multisample anti-aliasing");
stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING] = TR("Shadow mapping\\Shadow buffer resolution, higher is bigger range but slower");
stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY]= TR("Better shadow maps\\Shadow transparency and self shadowing");
stringsEvent[EVENT_INTERFACE_KDEF] = TR("Standard controls\\Standard key functions");
assert(INPUT_SLOT_MAX < EVENT_INTERFACE_KEY_END-EVENT_INTERFACE_KEY);

View File

@ -119,9 +119,10 @@ CEngine::CEngine(CApplication *app)
m_gadgetQuantity = 1.0f;
m_textureMipmapLevel = 1;
m_textureAnisotropy = 1;
m_shadowMapping = false;
m_offscreenShadowRendering = false;
m_qualityShadows = false;
m_shadowMapping = true;
m_offscreenShadowRendering = true;
m_offscreenShadowRenderingResolution = 1024;
m_qualityShadows = true;
m_shadowRange = 0.0f;
m_multisample = 1;
@ -169,14 +170,6 @@ CEngine::CEngine(CApplication *app)
m_lastFrameTime = GetSystemUtils()->CreateTimeStamp();
m_currentFrameTime = GetSystemUtils()->CreateTimeStamp();
int value;
if (GetConfigFile().GetIntProperty("Setup", "ShadowMapping", value))
{
m_shadowMapping = (value > 0);
m_offscreenShadowRendering = (value > 1);
m_qualityShadows = (value > 2);
}
m_shadowColor = 0.5f;
m_defaultTexParams.format = TEX_IMG_AUTO;
@ -2886,7 +2879,14 @@ int CEngine::GetTextureAnisotropyLevel()
void CEngine::SetShadowMapping(bool value)
{
if(value == m_shadowMapping) return;
m_shadowMapping = value;
if(!value)
{
m_device->DeleteFramebuffer("shadow");
m_device->DestroyTexture(m_shadowMap);
m_shadowMap.id = 0;
}
}
bool CEngine::GetShadowMapping()
@ -2894,6 +2894,50 @@ bool CEngine::GetShadowMapping()
return m_shadowMapping;
}
void CEngine::SetShadowMappingOffscreen(bool value)
{
if(value == m_offscreenShadowRendering) return;
m_offscreenShadowRendering = value;
if(value)
{
m_device->DestroyTexture(m_shadowMap);
m_shadowMap.id = 0;
}
else
{
m_device->DeleteFramebuffer("shadow");
m_shadowMap.id = 0;
}
}
bool CEngine::GetShadowMappingOffscreen()
{
return m_offscreenShadowRendering;
}
void CEngine::SetShadowMappingOffscreenResolution(int resolution)
{
if(resolution == m_offscreenShadowRenderingResolution) return;
m_offscreenShadowRenderingResolution = resolution;
m_device->DeleteFramebuffer("shadow");
m_shadowMap.id = 0;
}
int CEngine::GetShadowMappingOffscreenResolution()
{
return m_offscreenShadowRenderingResolution;
}
void CEngine::SetShadowMappingQuality(bool value)
{
m_qualityShadows = value;
}
bool CEngine::GetShadowMappingQuality()
{
return m_qualityShadows;
}
void CEngine::SetTotoMode(bool present)
{
m_totoMode = present;
@ -3381,16 +3425,7 @@ void CEngine::RenderShadowMap()
if (m_offscreenShadowRendering)
{
int size;
if (CConfigFile::GetInstance().GetIntProperty("Setup", "OffscreenBuffer", size))
{
width = height = size;
}
else
{
width = height = 1024;
}
width = height = m_offscreenShadowRenderingResolution;
FramebufferParams params;
params.width = params.height = width;

View File

@ -1136,6 +1136,12 @@ public:
//! Management of shadow mapping
void SetShadowMapping(bool value);
bool GetShadowMapping();
void SetShadowMappingOffscreen(bool value);
bool GetShadowMappingOffscreen();
void SetShadowMappingOffscreenResolution(int resolution);
int GetShadowMappingOffscreenResolution();
void SetShadowMappingQuality(bool value);
bool GetShadowMappingQuality();
//@}
//@{
@ -1480,6 +1486,8 @@ protected:
bool m_shadowMapping;
//! true enables offscreen shadow rendering
bool m_offscreenShadowRendering;
//! Offscreen shadow rendering resolution
int m_offscreenShadowRenderingResolution;
//! true enables higher quality shadows
bool m_qualityShadows;
//! Shadow color

View File

@ -34,24 +34,25 @@ void CEnumSlider::SetPossibleValues(const std::vector<float>& values)
void CEnumSlider::SetPossibleValues(const std::map<float, std::string>& values)
{
m_values.clear();
for(auto it = values.begin(); it != values.end(); ++it) {
m_labels.clear();
for (auto it = values.begin(); it != values.end(); ++it) {
m_values.push_back(it->first);
m_labels.push_back(it->second);
}
m_labels = values;
}
void CEnumSlider::SetVisibleValue(float value)
{
for(unsigned int i = 0; i < m_values.size(); i++)
for (unsigned int i = 0; i < m_values.size(); i++)
{
if(value == m_values[i])
if (value == m_values[i])
{
m_visibleValue = static_cast<float>(i) / (m_values.size()-1);
}
}
}
int CEnumSlider::GetVisibleValueIndex()
unsigned int CEnumSlider::GetVisibleValueIndex()
{
return round(m_visibleValue * (m_values.size()-1));
}
@ -63,8 +64,8 @@ float CEnumSlider::GetVisibleValue()
std::string CEnumSlider::GetLabel()
{
float value = GetVisibleValueIndex();
if(m_labels.find(value) != m_labels.end())
unsigned int value = GetVisibleValueIndex();
if (value < m_labels.size())
{
return m_labels.at(value);
}

View File

@ -35,14 +35,14 @@ public:
void SetVisibleValue(float value);
float GetVisibleValue();
int GetVisibleValueIndex();
unsigned int GetVisibleValueIndex();
protected:
std::string GetLabel();
protected:
std::vector<float> m_values;
std::map<float, std::string> m_labels;
std::vector<std::string> m_labels;
};
}

View File

@ -1237,6 +1237,34 @@ void CMainDialog::ChangePhase(Phase phase)
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name);
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
pos.x = ox+sx*12.5;
pos.y = 0.385f;
ddim.x = dim.x*2.2f;
ddim.y = 18.0f/480.0f;
pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_SHADOW_MAPPING);
pes->SetState(STATE_SHADOW);
std::map<float, std::string> shadowOptions = {
{ -1, "Disabled" },
//{ 0, "Screen buffer" }, //TODO: Is this needed? Maybe enable only if offscreen rendering not available?
};
for(int i = 128; i <= 4096; i *= 2)
shadowOptions[i] = StrUtils::ToString<int>(i)+"x"+StrUtils::ToString<int>(i);
pes->SetPossibleValues(shadowOptions);
pos.y += ddim.y/2;
pos.x += 0.005f;
ddim.x = 0.40f;
GetResource(RES_EVENT, EVENT_INTERFACE_SHADOW_MAPPING, name);
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name);
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
pos.x = ox+sx*12.5;
pos.y = 0.315f;
ddim.x = dim.x*6;
ddim.y = dim.y*0.5f;
pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SHADOW_MAPPING_QUALITY);
pc->SetState(STATE_SHADOW);
ddim.x = dim.x*2;
ddim.y = dim.y*1;
pos.x = ox+sx*10;
@ -2498,10 +2526,16 @@ bool CMainDialog::EventProcess(const Event &event)
case EVENT_INTERFACE_TEXTURE_MIPMAP:
case EVENT_INTERFACE_TEXTURE_ANISOTROPY:
case EVENT_INTERFACE_MSAA:
case EVENT_INTERFACE_SHADOW_MAPPING:
ChangeSetupButtons();
UpdateSetupButtons();
break;
case EVENT_INTERFACE_SHADOW_MAPPING_QUALITY:
m_engine->SetShadowMappingQuality(!m_engine->GetShadowMappingQuality());
UpdateSetupButtons();
break;
case EVENT_INTERFACE_MIN:
ChangeSetupQuality(-1);
UpdateSetupButtons();
@ -4707,6 +4741,30 @@ void CMainDialog::UpdateSetupButtons()
pes->SetVisibleValue(m_engine->GetMultiSample());
}
pes = static_cast<CEnumSlider*>(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING));
if ( pes != 0 )
{
if (!m_engine->GetShadowMapping())
{
pes->SetVisibleValue(-1);
}
else if (!m_engine->GetShadowMappingOffscreen())
{
pes->SetVisibleValue(0);
}
else
{
pes->SetVisibleValue(m_engine->GetShadowMappingOffscreenResolution());
}
}
pc = static_cast<CCheck*>(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING_QUALITY));
if ( pc != 0 )
{
pc->SetState(STATE_ENABLE, m_engine->GetShadowMapping());
pc->SetState(STATE_CHECK, m_engine->GetShadowMapping() && m_engine->GetShadowMappingQuality());
}
pc = static_cast<CCheck*>(pw->SearchControl(EVENT_INTERFACE_SHADOW));
if ( pc != 0 )
{
@ -4901,6 +4959,27 @@ void CMainDialog::ChangeSetupButtons()
value = pes->GetVisibleValue();
m_engine->SetMultiSample(static_cast<int>(value));
}
pes = static_cast<CEnumSlider*>(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING));
if ( pes != 0 )
{
value = pes->GetVisibleValue();
if(value == -1)
{
m_engine->SetShadowMapping(false);
}
else if(value == 0)
{
m_engine->SetShadowMapping(true);
m_engine->SetShadowMappingOffscreen(false);
}
else
{
m_engine->SetShadowMapping(true);
m_engine->SetShadowMappingOffscreen(true);
m_engine->SetShadowMappingOffscreenResolution(value);
}
}
}
@ -4949,6 +5028,9 @@ void CMainDialog::SetupMemorize()
GetConfigFile().SetFloatProperty("Setup", "ShadowRange", m_engine->GetShadowRange());
GetConfigFile().SetIntProperty("Setup", "MSAA", m_engine->GetMultiSample());
GetConfigFile().SetIntProperty("Setup", "FilterMode", m_engine->GetTextureFilterMode());
GetConfigFile().SetIntProperty("Setup", "ShadowMapping", m_engine->GetShadowMapping());
GetConfigFile().SetIntProperty("Setup", "ShadowMappingQuality", m_engine->GetShadowMappingQuality());
GetConfigFile().SetIntProperty("Setup", "ShadowMappingResolution", m_engine->GetShadowMappingOffscreen() ? m_engine->GetShadowMappingOffscreenResolution() : 0);
/* screen setup */
GetConfigFile().SetIntProperty("Setup", "Fullscreen", m_setupFull ? 1 : 0);
@ -5220,6 +5302,29 @@ void CMainDialog::SetupRecall()
m_engine->SetTextureAnisotropyLevel(iValue);
}
if (GetConfigFile().GetIntProperty("Setup", "ShadowMapping", iValue))
{
m_engine->SetShadowMapping(iValue);
}
if (GetConfigFile().GetIntProperty("Setup", "ShadowMappingQuality", iValue))
{
m_engine->SetShadowMappingQuality(iValue);
}
if (GetConfigFile().GetIntProperty("Setup", "ShadowMappingResolution", iValue))
{
if(iValue == 0)
{
m_engine->SetShadowMappingOffscreen(false);
}
else
{
m_engine->SetShadowMappingOffscreen(true);
m_engine->SetShadowMappingOffscreenResolution(iValue);
}
}
if (GetConfigFile().GetFloatProperty("Setup", "ShadowColor", fValue))
{
m_engine->SetShadowColor(fValue);