Added shadow mapping to settings screen
parent
fce1539888
commit
f03734d17f
|
@ -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";
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue