diff --git a/examples/16-shadowmaps/shadowmaps.cpp b/examples/16-shadowmaps/shadowmaps.cpp index d0b97e943..ed22a3f47 100644 --- a/examples/16-shadowmaps/shadowmaps.cpp +++ b/examples/16-shadowmaps/shadowmaps.cpp @@ -135,33 +135,6 @@ struct ShadowMapRenderTargets }; }; -void imguiEnum(SmImpl::Enum& _enum) -{ - _enum = (SmImpl::Enum)imguiChoose(_enum - , "Hard" - , "PCF" - , "VSM" - , "ESM" - ); -} - -void imguiEnum(DepthImpl::Enum& _enum) -{ - _enum = (DepthImpl::Enum)imguiChoose(_enum - , "InvZ" - , "Linear" - ); -} - -void imguiEnum(LightType::Enum& _enum) -{ - _enum = (LightType::Enum)imguiChoose(_enum - , "Spot light" - , "Point light" - , "Directional light" - ); -} - struct PosNormalTexcoordVertex { float m_x; @@ -1295,9 +1268,8 @@ struct SceneSettings float m_fovXAdjust; float m_fovYAdjust; float m_coverageSpotL; - float m_numSplitsf; float m_splitDistribution; - uint8_t m_numSplits; + int m_numSplits; bool m_updateLights; bool m_updateScene; bool m_drawDepthBuffer; @@ -1887,9 +1859,8 @@ class ExampleShadowmaps : public entry::AppI m_settings.m_fovXAdjust = 0.0f; m_settings.m_fovYAdjust = 0.0f; m_settings.m_coverageSpotL = 90.0f; - m_settings.m_numSplitsf = 4.0f; m_settings.m_splitDistribution = 0.6f; - m_settings.m_numSplits = uint8_t(m_settings.m_numSplitsf); + m_settings.m_numSplits = 4; m_settings.m_updateLights = true; m_settings.m_updateScene = true; m_settings.m_drawDepthBuffer = false; @@ -1999,136 +1970,163 @@ class ExampleShadowmaps : public entry::AppI , m_viewState.m_width , m_viewState.m_height ); - - static int32_t rightScrollArea = 0; - imguiBeginScrollArea("Settings", m_viewState.m_width - 256 - 10, 10, 256, 660, &rightScrollArea); - + + ImGui::SetNextWindowPos(ImVec2(m_viewState.m_width - 300 - 10, 10) ); + ImGui::Begin("Settings" + , NULL + , ImVec2(300, 660) + , ImGuiWindowFlags_AlwaysAutoResize + ); + #define IMGUI_FLOAT_SLIDER(_name, _val) \ -imguiSlider(_name \ -, _val \ +ImGui::SliderFloat(_name \ +, &_val \ , *( ((float*)&_val)+1) \ , *( ((float*)&_val)+2) \ -, *( ((float*)&_val)+3) \ ) - - imguiBool("Update lights", m_settings.m_updateLights); - imguiBool("Update scene", m_settings.m_updateScene); - - imguiSeparatorLine(); - imguiLabel("Shadow map depth:"); - imguiEnum(m_settings.m_depthImpl); +#define IMGUI_RADIO_BUTTON(_name, _var, _val) \ +if ( ImGui::RadioButton(_name, _var == _val )) _var = _val; + + ImGui::Checkbox("Update lights", &m_settings.m_updateLights); + ImGui::Checkbox("Update scene", &m_settings.m_updateScene); + + ImGui::Separator(); + ImGui::Text("Shadow map depth:"); + IMGUI_RADIO_BUTTON("InvZ", m_settings.m_depthImpl, DepthImpl::InvZ); + IMGUI_RADIO_BUTTON("Linear", m_settings.m_depthImpl, DepthImpl::Linear); + ShadowMapSettings* currentSmSettings = &m_smSettings[m_settings.m_lightType][m_settings.m_depthImpl][m_settings.m_smImpl]; - - imguiSeparator(); - imguiBool("Draw depth buffer.", m_settings.m_drawDepthBuffer); + + ImGui::Separator(); + ImGui::Checkbox("Draw depth buffer", &m_settings.m_drawDepthBuffer); if (m_settings.m_drawDepthBuffer) { - IMGUI_FLOAT_SLIDER("Depth value pow:", currentSmSettings->m_depthValuePow); + IMGUI_FLOAT_SLIDER("Depth value pow", currentSmSettings->m_depthValuePow); } - - imguiSeparatorLine(); - imguiLabel("Shadow Map implementation:"); - imguiEnum(m_settings.m_smImpl); + + ImGui::Separator(); + ImGui::Text("Shadow Map implementation"); + IMGUI_RADIO_BUTTON("Hard", m_settings.m_smImpl, SmImpl::Hard); + IMGUI_RADIO_BUTTON("PCF", m_settings.m_smImpl, SmImpl::PCF); + IMGUI_RADIO_BUTTON("VSM", m_settings.m_smImpl, SmImpl::VSM); + IMGUI_RADIO_BUTTON("ESM", m_settings.m_smImpl, SmImpl::ESM); currentSmSettings = &m_smSettings[m_settings.m_lightType][m_settings.m_depthImpl][m_settings.m_smImpl]; - - imguiSeparator(); - IMGUI_FLOAT_SLIDER("Bias:", currentSmSettings->m_bias); - IMGUI_FLOAT_SLIDER("Normal offset:", currentSmSettings->m_normalOffset); - imguiSeparator(); + + ImGui::Separator(); + IMGUI_FLOAT_SLIDER("Bias", currentSmSettings->m_bias); + IMGUI_FLOAT_SLIDER("Normal offset", currentSmSettings->m_normalOffset); + ImGui::Separator(); if (LightType::DirectionalLight != m_settings.m_lightType) { - IMGUI_FLOAT_SLIDER("Near plane:", currentSmSettings->m_near); + IMGUI_FLOAT_SLIDER("Near plane", currentSmSettings->m_near); } - IMGUI_FLOAT_SLIDER("Far plane:", currentSmSettings->m_far); - - imguiSeparator(); + IMGUI_FLOAT_SLIDER("Far plane", currentSmSettings->m_far); + + ImGui::Separator(); switch(m_settings.m_smImpl) { case SmImpl::Hard: - //imguiLabel("Hard"); + //ImGui::Text("Hard"); break; - + case SmImpl::PCF: - imguiLabel("PCF"); - IMGUI_FLOAT_SLIDER("X Offset:", currentSmSettings->m_xOffset); - IMGUI_FLOAT_SLIDER("Y Offset:", currentSmSettings->m_yOffset); + ImGui::Text("PCF"); + IMGUI_FLOAT_SLIDER("X Offset", currentSmSettings->m_xOffset); + IMGUI_FLOAT_SLIDER("Y Offset", currentSmSettings->m_yOffset); break; - + case SmImpl::VSM: - imguiLabel("VSM"); + ImGui::Text("VSM"); IMGUI_FLOAT_SLIDER("Min variance", currentSmSettings->m_customParam0); IMGUI_FLOAT_SLIDER("Depth multiplier", currentSmSettings->m_customParam1); - imguiBool("Blur shadow map", currentSmSettings->m_doBlur); + ImGui::Checkbox("Blur shadow map", ¤tSmSettings->m_doBlur); if (currentSmSettings->m_doBlur) { - IMGUI_FLOAT_SLIDER("Blur X Offset:", currentSmSettings->m_xOffset); - IMGUI_FLOAT_SLIDER("Blur Y Offset:", currentSmSettings->m_yOffset); + IMGUI_FLOAT_SLIDER("Blur X Offset", currentSmSettings->m_xOffset); + IMGUI_FLOAT_SLIDER("Blur Y Offset", currentSmSettings->m_yOffset); } break; - + case SmImpl::ESM: - imguiLabel("ESM"); + ImGui::Text("ESM"); IMGUI_FLOAT_SLIDER("ESM Hardness", currentSmSettings->m_customParam0); IMGUI_FLOAT_SLIDER("Depth multiplier", currentSmSettings->m_customParam1); - imguiBool("Blur shadow map", currentSmSettings->m_doBlur); + ImGui::Checkbox("Blur shadow map", ¤tSmSettings->m_doBlur); if (currentSmSettings->m_doBlur) { - IMGUI_FLOAT_SLIDER("Blur X Offset:", currentSmSettings->m_xOffset); - IMGUI_FLOAT_SLIDER("Blur Y Offset:", currentSmSettings->m_yOffset); + IMGUI_FLOAT_SLIDER("Blur X Offset", currentSmSettings->m_xOffset); + IMGUI_FLOAT_SLIDER("Blur Y Offset", currentSmSettings->m_yOffset); } break; - + default: break; }; + + ImGui::End(); +#undef IMGUI_RADIO_BUTTON - imguiEndScrollArea(); + ImGui::SetNextWindowPos(ImVec2(10,70) ); + ImGui::Begin("Light" + , NULL + , ImVec2(330, 334) + , ImGuiWindowFlags_AlwaysAutoResize + ); + ImGui::PushItemWidth(185.0f); - static int32_t leftScrollArea = 0; - imguiBeginScrollArea("Light", 10, 70, 256, 334, &leftScrollArea); + bool bLtChanged = false; + if ( ImGui::RadioButton("Spot light", m_settings.m_lightType == LightType::SpotLight )) + { + m_settings.m_lightType = LightType::SpotLight; bLtChanged = true; + } + if ( ImGui::RadioButton("Point light", m_settings.m_lightType == LightType::PointLight )) + { + m_settings.m_lightType = LightType::PointLight; bLtChanged = true; + } + if ( ImGui::RadioButton("Directional light", m_settings.m_lightType == LightType::DirectionalLight )) + { + m_settings.m_lightType = LightType::DirectionalLight; bLtChanged = true; + } + + ImGui::Separator(); + ImGui::Checkbox("Show shadow map coverage.", &m_settings.m_showSmCoverage); + + ImGui::Separator(); + ImGui::Text("Shadow map resolution: %ux%u", m_currentShadowMapSize, m_currentShadowMapSize); + ImGui::SliderFloat("##SizePwrTwo", ¤tSmSettings->m_sizePwrTwo, + currentSmSettings->m_sizePwrTwoMin, + currentSmSettings->m_sizePwrTwoMax, "%.0f"); - const LightType::Enum ltBefore = m_settings.m_lightType; - imguiEnum(m_settings.m_lightType); - const LightType::Enum ltAfter = m_settings.m_lightType; - const bool bLtChanged = (ltAfter != ltBefore); - - imguiSeparator(); - imguiBool("Show shadow map coverage.", m_settings.m_showSmCoverage); - - imguiSeparator(); - imguiLabel("Shadow map resolution: %ux%u", m_currentShadowMapSize, m_currentShadowMapSize); - IMGUI_FLOAT_SLIDER(" ", currentSmSettings->m_sizePwrTwo); - - imguiSeparatorLine(); + ImGui::Separator(); if (LightType::SpotLight == m_settings.m_lightType) { - imguiLabel("Spot light"); - imguiSlider("Shadow map area:", m_settings.m_coverageSpotL, 45.0f, 120.0f, 1.0f); - - imguiSeparator(); - imguiSlider("Spot outer cone:", m_settings.m_spotOuterAngle, 0.0f, 91.0f, 0.1f); - imguiSlider("Spot inner cone:", m_settings.m_spotInnerAngle, 0.0f, 90.0f, 0.1f); + ImGui::Text("Spot light"); + ImGui::SliderFloat("Shadow map area", &m_settings.m_coverageSpotL, 45.0f, 120.0f); + + ImGui::Separator(); + ImGui::SliderFloat("Spot outer cone", &m_settings.m_spotOuterAngle, 0.0f, 91.0f); + ImGui::SliderFloat("Spot inner cone", &m_settings.m_spotInnerAngle, 0.0f, 90.0f); } else if (LightType::PointLight == m_settings.m_lightType) { - imguiLabel("Point light"); - imguiBool("Stencil pack", m_settings.m_stencilPack); - - imguiSlider("Fov X adjust:", m_settings.m_fovXAdjust, -20.0f, 20.0f, 0.0001f); - imguiSlider("Fov Y adjust:", m_settings.m_fovYAdjust, -20.0f, 20.0f, 0.0001f); + ImGui::Text("Point light"); + ImGui::Checkbox("Stencil pack", &m_settings.m_stencilPack); + + ImGui::SliderFloat("Fov X adjust", &m_settings.m_fovXAdjust, -20.0f, 20.0f); + ImGui::SliderFloat("Fov Y adjust", &m_settings.m_fovYAdjust, -20.0f, 20.0f); } else if (LightType::DirectionalLight == m_settings.m_lightType) { - imguiLabel("Directional light"); - imguiBool("Stabilize cascades", m_settings.m_stabilize); - imguiSlider("Cascade splits:", m_settings.m_numSplitsf, 1.0f, 4.0f, 1.0f); - imguiSlider("Cascade distribution:", m_settings.m_splitDistribution, 0.0f, 1.0f, 0.001f); - m_settings.m_numSplits = uint8_t(m_settings.m_numSplitsf); + ImGui::Text("Directional light"); + ImGui::Checkbox("Stabilize cascades", &m_settings.m_stabilize); + ImGui::SliderInt("Cascade splits", &m_settings.m_numSplits, 1, 4); + ImGui::SliderFloat("Cascade distribution", &m_settings.m_splitDistribution, 0.0f, 1.0f); } - + #undef IMGUI_FLOAT_SLIDER - - imguiEndScrollArea(); + + ImGui::End(); + imguiEndFrame(); // Update uniforms.