diff --git a/data/gui/screens/options_video.stkgui b/data/gui/screens/options_video.stkgui
index fc41c216a..9f46582e8 100644
--- a/data/gui/screens/options_video.stkgui
+++ b/data/gui/screens/options_video.stkgui
@@ -45,6 +45,18 @@
+
+
+
+
diff --git a/src/guiengine/widgets/bubble_widget.cpp b/src/guiengine/widgets/bubble_widget.cpp
index 5c347d566..bf89f2cda 100644
--- a/src/guiengine/widgets/bubble_widget.cpp
+++ b/src/guiengine/widgets/bubble_widget.cpp
@@ -89,6 +89,7 @@ void BubbleWidget::replaceText()
m_expanded_size.LowerRightCorner.Y += additionalNeededSize/2 + 10;
// reduce text to fit in the available space if it's too long
+ // FIXME : this loop is ugly
while (text_height > m_shrinked_size.getHeight() && message.size() > 10)
{
message = message.subString(0, message.size() - 10) + "...";
@@ -127,13 +128,9 @@ void BubbleWidget::updateSize()
m_element->setRelativePosition(currsize);
if (m_zoom > 0.5f)
- {
getIrrlichtElement()->setText(getText().c_str());
- }
else
- {
getIrrlichtElement()->setText(m_shrinked_text.c_str());
- }
}
// ----------------------------------------------------------------------------
diff --git a/src/states_screens/dialogs/custom_video_settings.cpp b/src/states_screens/dialogs/custom_video_settings.cpp
index dbee5c488..49ca4621c 100644
--- a/src/states_screens/dialogs/custom_video_settings.cpp
+++ b/src/states_screens/dialogs/custom_video_settings.cpp
@@ -178,6 +178,7 @@ GUIEngine::EventPropagation CustomVideoSettingsDialog::processEvent(const std::s
ModalDialog::dismiss();
OptionsScreenVideo::getInstance()->updateGfxSlider();
+ OptionsScreenVideo::getInstance()->updateBlurSlider();
return GUIEngine::EVENT_BLOCK;
}
else if (eventSource == "dynamiclight")
diff --git a/src/states_screens/options/options_screen_video.cpp b/src/states_screens/options/options_screen_video.cpp
index efad1fde7..24029e287 100644
--- a/src/states_screens/options/options_screen_video.cpp
+++ b/src/states_screens/options/options_screen_video.cpp
@@ -46,60 +46,75 @@
using namespace GUIEngine;
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::initPresets()
{
- m_presets.push_back
+ m_presets.push_back // Level 1
({
- false /* light */, 0 /* shadow */, false /* bloom */, false /* motionblur */,
- false /* lightshaft */, false /* glow */, false /* mlaa */, false /* ssao */,
- false /* light scatter */, false /* animatedCharacters */, 1 /* particles */,
- 0 /* image_quality */, false /* depth of field */, true /* degraded IBL */
+ false /* light */, 0 /* shadow */, false /* bloom */, false /* lightshaft */,
+ false /* glow */, false /* mlaa */, false /* ssao */, false /* light scatter */,
+ false /* animatedCharacters */, 1 /* particles */, 0 /* image_quality */,
+ true /* degraded IBL */
});
- m_presets.push_back
+ m_presets.push_back // Level 2
({
- false /* light */, 0 /* shadow */, false /* bloom */, false /* motionblur */,
- false /* lightshaft */, false /* glow */, false /* mlaa */, false /* ssao */,
- false /* light scatter */, true /* animatedCharacters */, 2 /* particles */,
- 0 /* image_quality */, false /* depth of field */, true /* degraded IBL */
+ false /* light */, 0 /* shadow */, false /* bloom */, false /* lightshaft */,
+ false /* glow */, false /* mlaa */, false /* ssao */, false /* light scatter */,
+ true /* animatedCharacters */, 2 /* particles */, 0 /* image_quality */,
+ true /* degraded IBL */
});
- m_presets.push_back
+ m_presets.push_back // Level 3
({
- true /* light */, 0 /* shadow */, false /* bloom */, false /* motionblur */,
- false /* lightshaft */, false /* glow */, false /* mlaa */, false /* ssao */,
- false /* light scatter */, true /* animatedCharacters */, 2 /* particles */,
- 1 /* image_quality */, false /* depth of field */, true /* degraded IBL */
+ true /* light */, 0 /* shadow */, false /* bloom */, false /* lightshaft */,
+ false /* glow */, false /* mlaa */, false /* ssao */, false /* light scatter */,
+ true /* animatedCharacters */, 2 /* particles */, 1 /* image_quality */,
+ true /* degraded IBL */
});
- m_presets.push_back
+ m_presets.push_back // Level 4
({
- true /* light */, 0 /* shadow */, false /* bloom */, true /* motionblur */,
- true /* lightshaft */, true /* glow */, true /* mlaa */, false /* ssao */,
- true /* light scatter */, true /* animatedCharacters */, 2 /* particles */,
- 1 /* image_quality */, false /* depth of field */, false /* degraded IBL */
+ true /* light */, 0 /* shadow */, false /* bloom */, true /* lightshaft */,
+ true /* glow */, true /* mlaa */, false /* ssao */, true /* light scatter */,
+ true /* animatedCharacters */, 2 /* particles */, 1 /* image_quality */,
+ false /* degraded IBL */
});
- m_presets.push_back
+ m_presets.push_back // Level 5
({
- true /* light */, 512 /* shadow */, true /* bloom */, true /* motionblur */,
- true /* lightshaft */, true /* glow */, true /* mlaa */, false /* ssao */,
- true /* light scatter */, true /* animatedCharacters */, 2 /* particles */,
- 2 /* image_quality */, true /* depth of field */, false /* degraded IBL */
+ true /* light */, 512 /* shadow */, true /* bloom */, true /* lightshaft */,
+ true /* glow */, true /* mlaa */, false /* ssao */, true /* light scatter */,
+ true /* animatedCharacters */, 2 /* particles */, 2 /* image_quality */,
+ false /* degraded IBL */
});
- m_presets.push_back
+ m_presets.push_back // Level 6
({
- true /* light */, 1024 /* shadow */, true /* bloom */, true /* motionblur */,
- true /* lightshaft */, true /* glow */, true /* mlaa */, true /* ssao */,
- true /* light scatter */, true /* animatedCharacters */, 2 /* particles */,
- 2 /* image_quality */, true /* depth of field */, false /* degraded IBL */
+ true /* light */, 1024 /* shadow */, true /* bloom */, true /* lightshaft */,
+ true /* glow */, true /* mlaa */, true /* ssao */, true /* light scatter */,
+ true /* animatedCharacters */, 2 /* particles */, 2 /* image_quality */,
+ false /* degraded IBL */
+ });
+
+ m_blur_presets.push_back
+ ({
+ false /* motionblur */, false /* depth of field */
+ });
+
+ m_blur_presets.push_back
+ ({
+ true /* motionblur */, false /* depth of field */
+ });
+
+ m_blur_presets.push_back
+ ({
+ true /* motionblur */, true /* depth of field */
});
} // initPresets
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
int OptionsScreenVideo::getImageQuality()
{
if (UserConfigParams::m_anisotropic == 2 &&
@@ -117,7 +132,7 @@ int OptionsScreenVideo::getImageQuality()
return 1;
} // getImageQuality
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::setImageQuality(int quality)
{
switch (quality)
@@ -142,7 +157,7 @@ void OptionsScreenVideo::setImageQuality(int quality)
}
} // setImageQuality
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
OptionsScreenVideo::OptionsScreenVideo() : Screen("options_video.stkgui"),
m_prev_adv_pipline(false),
@@ -152,21 +167,28 @@ OptionsScreenVideo::OptionsScreenVideo() : Screen("options_video.stkgui"),
initPresets();
} // OptionsScreenVideo
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::loadedFromFile()
{
m_inited = false;
assert(m_presets.size() == 6);
+ assert(m_blur_presets.size() == 3);
GUIEngine::SpinnerWidget* gfx =
getWidget("gfx_level");
gfx->m_properties[GUIEngine::PROP_MAX_VALUE] =
StringUtils::toString(m_presets.size());
+ GUIEngine::SpinnerWidget* blur =
+ getWidget("blur_level");
+ blur->m_properties[GUIEngine::PROP_MAX_VALUE] =
+ StringUtils::toString(m_blur_presets.size() - 1);
+ blur->m_properties[GUIEngine::PROP_MIN_VALUE] =
+ StringUtils::toString(0);
} // loadedFromFile
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::init()
{
@@ -350,6 +372,7 @@ void OptionsScreenVideo::init()
// --- set gfx settings values
updateGfxSlider();
+ updateBlurSlider();
// ---- forbid changing resolution or animation settings from in-game
// (we need to disable them last because some items can't be edited when
@@ -374,7 +397,7 @@ void OptionsScreenVideo::init()
} // init
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::updateResolutionsList()
{
@@ -401,7 +424,7 @@ void OptionsScreenVideo::updateResolutionsList()
}
}
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::onScrollResolutionsList(void* data)
{
@@ -409,12 +432,11 @@ void OptionsScreenVideo::onScrollResolutionsList(void* data)
screen->updateResolutionsList();
}
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::updateGfxSlider()
{
- GUIEngine::SpinnerWidget* gfx =
- getWidget("gfx_level");
+ GUIEngine::SpinnerWidget* gfx = getWidget("gfx_level");
assert( gfx != NULL );
bool found = false;
@@ -428,11 +450,9 @@ void OptionsScreenVideo::updateGfxSlider()
m_presets[l].lights == UserConfigParams::m_dynamic_lights &&
m_presets[l].lightshaft == UserConfigParams::m_light_shaft &&
m_presets[l].mlaa == UserConfigParams::m_mlaa &&
- m_presets[l].motionblur == UserConfigParams::m_motionblur &&
m_presets[l].shadows == UserConfigParams::m_shadows_resolution &&
m_presets[l].ssao == UserConfigParams::m_ssao &&
m_presets[l].light_scatter == UserConfigParams::m_light_scatter &&
- m_presets[l].dof == UserConfigParams::m_dof &&
m_presets[l].degraded_ibl == UserConfigParams::m_degraded_IBL)
{
gfx->setValue(l + 1);
@@ -445,17 +465,48 @@ void OptionsScreenVideo::updateGfxSlider()
{
//I18N: custom video settings
gfx->setCustomText( _("Custom") );
+
+ // Enable the blur slider if the modern renderer is used
+ getWidget("blur_level")->
+ setActive(UserConfigParams::m_dynamic_lights);
}
updateTooltip();
-}
+} // updateGfxSlider
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
+
+void OptionsScreenVideo::updateBlurSlider()
+{
+ GUIEngine::SpinnerWidget* blur = getWidget("blur_level");
+ assert( blur != NULL );
+
+ bool found = false;
+ for (unsigned int l = 0; l < m_blur_presets.size(); l++)
+ {
+ if (m_blur_presets[l].motionblur == UserConfigParams::m_motionblur &&
+ m_blur_presets[l].dof == UserConfigParams::m_dof)
+ {
+ blur->setValue(l);
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ //I18N: custom video settings
+ blur->setCustomText( _("Custom") );
+ }
+
+ updateBlurTooltip();
+} // updateBlurSlider
+
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::updateTooltip()
{
- GUIEngine::SpinnerWidget* gfx =
- getWidget("gfx_level");
+ GUIEngine::SpinnerWidget* gfx = getWidget("gfx_level");
assert( gfx != NULL );
core::stringw tooltip;
@@ -495,9 +546,6 @@ void OptionsScreenVideo::updateTooltip()
tooltip = tooltip + L"\n" + _("Light scattering: %s",
UserConfigParams::m_light_scatter ? enabled : disabled);
//I18N: in graphical options
- tooltip = tooltip + L"\n" + _("Motion blur: %s",
- UserConfigParams::m_motionblur ? enabled : disabled);
- //I18N: in graphical options
tooltip = tooltip + L"\n" + _("Anti-aliasing: %s",
UserConfigParams::m_mlaa ? enabled : disabled);
//I18N: in graphical options
@@ -521,10 +569,6 @@ void OptionsScreenVideo::updateTooltip()
tooltip = tooltip + L"\n" + _("Light shaft (God rays): %s",
UserConfigParams::m_light_shaft ? enabled : disabled);
- //I18N: in graphical options
- tooltip = tooltip + L"\n" + _("Depth of field: %s",
- UserConfigParams::m_dof ? enabled : disabled);
-
//I18N: in graphical options
int quality = getImageQuality();
tooltip = tooltip + L"\n" + _("Rendered image quality: %s",
@@ -533,7 +577,30 @@ void OptionsScreenVideo::updateTooltip()
gfx->setTooltip(tooltip);
} // updateTooltip
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
+
+void OptionsScreenVideo::updateBlurTooltip()
+{
+ GUIEngine::SpinnerWidget* blur = getWidget("blur_level");
+ assert( blur != NULL );
+
+ core::stringw tooltip;
+
+ const core::stringw enabled = _("Enabled");
+ const core::stringw disabled = _("Disabled");
+
+ //I18N: in graphical options
+ tooltip = tooltip + _("Motion blur: %s",
+ UserConfigParams::m_motionblur ? enabled : disabled);
+
+ //I18N: in graphical options
+ tooltip = tooltip + L"\n" + _("Depth of field: %s",
+ UserConfigParams::m_dof ? enabled : disabled);
+
+ blur->setTooltip(tooltip);
+} // updateBlurTooltip
+
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::eventCallback(Widget* widget, const std::string& name,
const int playerID)
@@ -606,6 +673,9 @@ void OptionsScreenVideo::eventCallback(Widget* widget, const std::string& name,
const int level = gfx_level->getValue() - 1;
+ // Enable the blur spinner only if the new renderer is on
+ getWidget("blur_level")->setActive(level >= 2);
+
UserConfigParams::m_animated_characters = m_presets[level].animatedCharacters;
UserConfigParams::m_particles_effects = m_presets[level].particles;
setImageQuality(m_presets[level].image_quality);
@@ -614,15 +684,29 @@ void OptionsScreenVideo::eventCallback(Widget* widget, const std::string& name,
UserConfigParams::m_dynamic_lights = m_presets[level].lights;
UserConfigParams::m_light_shaft = m_presets[level].lightshaft;
UserConfigParams::m_mlaa = m_presets[level].mlaa;
- UserConfigParams::m_motionblur = m_presets[level].motionblur;
UserConfigParams::m_shadows_resolution = m_presets[level].shadows;
UserConfigParams::m_ssao = m_presets[level].ssao;
UserConfigParams::m_light_scatter = m_presets[level].light_scatter;
- UserConfigParams::m_dof = m_presets[level].dof;
UserConfigParams::m_degraded_IBL = m_presets[level].degraded_ibl;
updateGfxSlider();
}
+ else if (name == "blur_level")
+ {
+ GUIEngine::SpinnerWidget* blur_level =
+ getWidget("blur_level");
+ assert( blur_level != NULL );
+
+ const int level = blur_level->getValue();
+
+ if (UserConfigParams::m_dynamic_lights)
+ {
+ UserConfigParams::m_motionblur = m_blur_presets[level].motionblur;
+ UserConfigParams::m_dof = m_blur_presets[level].dof;
+ }
+
+ updateBlurSlider();
+ }
else if (name == "vsync")
{
GUIEngine::SpinnerWidget* vsync = getWidget("vsync");
@@ -645,7 +729,7 @@ void OptionsScreenVideo::eventCallback(Widget* widget, const std::string& name,
}
} // eventCallback
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::tearDown()
{
@@ -665,11 +749,11 @@ void OptionsScreenVideo::tearDown()
#endif
} // tearDown
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
void OptionsScreenVideo::unloaded()
{
m_inited = false;
} // unloaded
-// ----------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
diff --git a/src/states_screens/options/options_screen_video.hpp b/src/states_screens/options/options_screen_video.hpp
index eee79b146..f1948d9f6 100644
--- a/src/states_screens/options/options_screen_video.hpp
+++ b/src/states_screens/options/options_screen_video.hpp
@@ -30,7 +30,6 @@ struct GFXPreset
bool lights;
int shadows;
bool bloom;
- bool motionblur;
bool lightshaft;
bool glow;
bool mlaa;
@@ -39,9 +38,14 @@ struct GFXPreset
bool animatedCharacters;
int particles;
int image_quality;
+ bool degraded_ibl;
+};
+
+struct BlurPreset
+{
+ bool motionblur;
/** Depth of field */
bool dof;
- bool degraded_ibl;
};
struct Resolution
@@ -85,9 +89,11 @@ private:
OptionsScreenVideo();
bool m_inited;
std::vector m_presets;
+ std::vector m_blur_presets;
std::vector m_resolutions;
void updateTooltip();
+ void updateBlurTooltip();
void updateResolutionsList();
void initPresets();
static void onScrollResolutionsList(void* data);
@@ -111,6 +117,7 @@ public:
virtual void unloaded() OVERRIDE;
void updateGfxSlider();
+ void updateBlurSlider();
static int getImageQuality();
static void setImageQuality(int quality);
};
diff --git a/src/utils/string_utils.cpp b/src/utils/string_utils.cpp
index 8edf800ee..39a650a5c 100644
--- a/src/utils/string_utils.cpp
+++ b/src/utils/string_utils.cpp
@@ -1247,7 +1247,7 @@ namespace StringUtils
} // breakText
/* This function checks if a char is suitable to break lines.
- * Currently a copy of the function found at irrlicht/include/utfwrapping.h */
+ * Based on the function found at irrlicht/include/utfwrapping.h */
bool breakable (wchar_t c)
{
if ((c > 12287 && c < 40960) || //Common CJK words