diff --git a/data/gui/dialogs/custom_camera_settings.stkgui b/data/gui/dialogs/custom_camera_settings.stkgui new file mode 100644 index 000000000..5002f9d9c --- /dev/null +++ b/data/gui/dialogs/custom_camera_settings.stkgui @@ -0,0 +1,83 @@ + + +
+
+ +
+ +
+
+
diff --git a/data/gui/screens/options_ui.stkgui b/data/gui/screens/options_ui.stkgui index 598e845a4..6fc4d38de 100644 --- a/data/gui/screens/options_ui.stkgui +++ b/data/gui/screens/options_ui.stkgui @@ -75,6 +75,21 @@ + +
+
+ +
+
+
+
+
+
+ + +
@@ -91,7 +106,6 @@ -
diff --git a/src/config/user_config.hpp b/src/config/user_config.hpp index 47682c461..2b26819ef 100644 --- a/src/config/user_config.hpp +++ b/src/config/user_config.hpp @@ -937,6 +937,38 @@ namespace UserConfigParams PARAM_DEFAULT( BoolUserConfigParam(false, "crashed") ); // ---- Camera + PARAM_PREFIX GroupUserConfigParam m_camera_normal + PARAM_DEFAULT( GroupUserConfigParam( + "camera-normal", + "Camera settings for player.") ); + + PARAM_PREFIX FloatUserConfigParam m_camera_distance + PARAM_DEFAULT( FloatUserConfigParam(1.0, "distance", + &m_camera_normal, + "Distance between kart and camera")); + + PARAM_PREFIX FloatUserConfigParam m_camera_forward_up_angle + PARAM_DEFAULT( FloatUserConfigParam(0, "forward-up-angle", + &m_camera_normal, + "Angle between camera and plane of kart (pitch) when the camera is pointing forward")); + + PARAM_PREFIX BoolUserConfigParam m_camera_forward_smoothing + PARAM_DEFAULT( BoolUserConfigParam(true, "forward-smoothing", + &m_camera_normal, + "if true, use smoothing (forward-up-angle become relative to speed) when pointing forward")); + + PARAM_PREFIX FloatUserConfigParam m_camera_backward_up_angle + PARAM_DEFAULT( FloatUserConfigParam(5, "backward-up-angle", + &m_camera_normal, + "Angle between camera and plane of kart (pitch) when the camera is pointing backwards. This is usually larger than the forward-up-angle, since the kart itself otherwise obstricts too much of the view")); + + PARAM_PREFIX IntUserConfigParam m_camera_fov + PARAM_DEFAULT( IntUserConfigParam(80, "fov", + &m_camera_normal, + "Focal distance (single player)")); + + + // camera in artist mode PARAM_PREFIX GroupUserConfigParam m_camera PARAM_DEFAULT( GroupUserConfigParam("camera", "(Debug) camera settings.") ); diff --git a/src/graphics/camera.cpp b/src/graphics/camera.cpp index 020be8384..a4748d5e2 100644 --- a/src/graphics/camera.cpp +++ b/src/graphics/camera.cpp @@ -175,9 +175,15 @@ void Camera::setupCamera() float(irr_driver->getActualScreenSize().Width) / m_viewport.getWidth() , float(irr_driver->getActualScreenSize().Height) / m_viewport.getHeight()); - m_fov = DEGREE_TO_RAD * stk_config->m_camera_fov - [RaceManager::get()->getNumLocalPlayers() > 0 ? - RaceManager::get()->getNumLocalPlayers() - 1 : 0]; + if (RaceManager::get()->getNumLocalPlayers() > 0) + { + m_fov = DEGREE_TO_RAD * stk_config->m_camera_fov + [RaceManager::get()->getNumLocalPlayers() - 1]; + } + else + { + m_fov = DEGREE_TO_RAD * UserConfigParams::m_camera_fov; + } m_camera->setFOV(m_fov); m_camera->setAspectRatio(m_aspect); diff --git a/src/graphics/camera_debug.cpp b/src/graphics/camera_debug.cpp index d3215c57d..ba7fee994 100644 --- a/src/graphics/camera_debug.cpp +++ b/src/graphics/camera_debug.cpp @@ -20,6 +20,7 @@ #include "graphics/camera_debug.hpp" #include "config/stk_config.hpp" +#include "config/user_config.hpp" #include "karts/abstract_kart.hpp" #include "karts/explosion_animation.hpp" #include "karts/kart.hpp" @@ -55,8 +56,6 @@ CameraDebug::~CameraDebug() void CameraDebug::getCameraSettings(float *above_kart, float *cam_angle, float *sideway, float *distance ) { - const KartProperties *kp = getKart()->getKartProperties(); - // Set some default values float steering = m_kart->getSteerPercent() * (1.0f + (m_kart->getSkidding()->getSkidFactor() @@ -78,7 +77,7 @@ void CameraDebug::getCameraSettings(float *above_kart, float *cam_angle, case CM_DEBUG_SIDE_OF_KART: case CM_DEBUG_TOP_OF_KART: *above_kart = 0.75f; - *cam_angle = kp->getCameraForwardUpAngle() * DEGREE_TO_RAD; + *cam_angle = UserConfigParams::m_camera_forward_up_angle * DEGREE_TO_RAD; *distance = -m_distance; break; } // switch diff --git a/src/graphics/camera_end.cpp b/src/graphics/camera_end.cpp index 19c36e5de..bef041dc4 100644 --- a/src/graphics/camera_end.cpp +++ b/src/graphics/camera_end.cpp @@ -18,6 +18,7 @@ #include "graphics/camera_end.hpp" +#include "config/user_config.hpp" #include "karts/abstract_kart.hpp" #include "karts/kart_properties.hpp" #include "race/race_manager.hpp" @@ -133,7 +134,7 @@ void CameraEnd::update(float dt) } case EndCameraInformation::EC_AHEAD_OF_KART: { - float cam_angle = m_kart->getKartProperties()->getCameraBackwardUpAngle() + float cam_angle = UserConfigParams::m_camera_backward_up_angle * DEGREE_TO_RAD; positionCamera(dt, /*above_kart*/0.75f, diff --git a/src/graphics/camera_normal.cpp b/src/graphics/camera_normal.cpp index c5f21a2be..81284b63c 100644 --- a/src/graphics/camera_normal.cpp +++ b/src/graphics/camera_normal.cpp @@ -46,7 +46,7 @@ CameraNormal::CameraNormal(Camera::CameraType type, int camera_index, AbstractKart* kart) : Camera(type, camera_index, kart), m_camera_offset(0, 0, -15.0f) { - m_distance = kart ? kart->getKartProperties()->getCameraDistance() : 1000.0f; + m_distance = kart ? UserConfigParams::m_camera_distance : 1000.0f; m_ambient_light = Track::getCurrentTrack()->getDefaultAmbientColor(); // TODO: Put these values into a config file @@ -192,15 +192,13 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle, float *sideway, float *distance, bool *smoothing, float *cam_roll_angle) { - const KartProperties *kp = m_kart->getKartProperties(); - switch(getMode()) { case CM_NORMAL: case CM_FALLING: { *above_kart = 0.75f; - *cam_angle = kp->getCameraForwardUpAngle() * DEGREE_TO_RAD; + *cam_angle = UserConfigParams::m_camera_forward_up_angle * DEGREE_TO_RAD; *distance = -m_distance; float steering = m_kart->getSteerPercent() * (1.0f + (m_kart->getSkidding()->getSkidFactor() @@ -208,7 +206,7 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle, // quadratically to dampen small variations (but keep sign) float dampened_steer = fabsf(steering) * steering; *sideway = -m_rotation_range*dampened_steer*0.5f; - *smoothing = kp->getCameraForwardSmoothing(); + *smoothing = UserConfigParams::m_camera_forward_smoothing; *cam_roll_angle = 0.0f; if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE) { @@ -223,7 +221,7 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle, case CM_REVERSE: // Same as CM_NORMAL except it looks backwards { *above_kart = 0.75f; - *cam_angle = kp->getCameraBackwardUpAngle() * DEGREE_TO_RAD; + *cam_angle = UserConfigParams::m_camera_backward_up_angle * DEGREE_TO_RAD; *sideway = 0; *distance = 2.0f*m_distance; *smoothing = false; diff --git a/src/graphics/camera_normal.hpp b/src/graphics/camera_normal.hpp index ffa90a09c..b6b458db2 100644 --- a/src/graphics/camera_normal.hpp +++ b/src/graphics/camera_normal.hpp @@ -84,6 +84,8 @@ public: /** Sets the ambient light for this camera. */ void setAmbientLight(const video::SColor &color) { m_ambient_light=color; } // ------------------------------------------------------------------------ + void setDistanceToKart(float distance) { m_distance = distance; } + // ------------------------------------------------------------------------ float getDistanceToKart() const { return m_distance; } // ------------------------------------------------------------------------ /** Returns the current ambient light. */ diff --git a/src/guiengine/widgets/spinner_widget.cpp b/src/guiengine/widgets/spinner_widget.cpp index f96b0e2c3..b0f553178 100644 --- a/src/guiengine/widgets/spinner_widget.cpp +++ b/src/guiengine/widgets/spinner_widget.cpp @@ -98,10 +98,20 @@ SpinnerWidget::SpinnerWidget(const bool gauge) : Widget(WTYPE_SPINNER) m_spinner_widget_player_id=-1; m_min = 0; m_max = 999; + m_step = 1.0; m_left_selected = false; m_right_selected = false; } +// ----------------------------------------------------------------------------- +void SpinnerWidget::setRange(int min, int max, float step) +{ + clearLabels(); + setStep(step); + setMin(min/step); + setMax(max/step); +} + // ----------------------------------------------------------------------------- void SpinnerWidget::add() @@ -421,7 +431,17 @@ void SpinnerWidget::setValue(const int new_value) } else if (m_children.size() > 0) { - m_children[1].m_element->setText( stringw(m_value).c_str() ); + if (m_step == 1.0) + { + m_children[1].m_element->setText( stringw(m_value).c_str() ); + } + else + { + std::wstringstream ws; + ws << (m_value*m_step); + std::wstring text = ws.str(); + m_children[1].m_element->setText( text.c_str() ); + } } } diff --git a/src/guiengine/widgets/spinner_widget.hpp b/src/guiengine/widgets/spinner_widget.hpp index 74983d3ea..2649aad15 100644 --- a/src/guiengine/widgets/spinner_widget.hpp +++ b/src/guiengine/widgets/spinner_widget.hpp @@ -57,6 +57,7 @@ namespace GUIEngine ISpinnerConfirmListener* m_listener; int m_value, m_min, m_max; + float m_step; int m_spinner_widget_player_id; bool m_use_background_color; @@ -156,9 +157,6 @@ namespace GUIEngine return false; } - - - void setListener(ISpinnerConfirmListener* listener) { m_listener = listener; } /** \brief implement method from base class Widget */ @@ -169,6 +167,12 @@ namespace GUIEngine * \param new_value the new value that will be become the current value of this spinner. */ void setValue(const int new_value); + + /** + * \brief sets the float value of the spinner + * \param new_value the new value that will be become the current value of this spinner. + */ + void setFloatValue(const float new_value) { setValue(int(round(new_value/m_step))); } /** * \brief sets the current value of the spinner @@ -187,6 +191,12 @@ namespace GUIEngine * \return the current value of the spinner, in a int form */ int getValue() const { return m_value; } + + /** + * \brief retrieve the current value of the spinner + * \return the current value of the spinner, in a float form + */ + float getFloatValue() const { return m_value*m_step; } /** * \brief retrieve the current value of the spinner @@ -205,6 +215,18 @@ namespace GUIEngine return m_labels[id]; } + /** + * \return the step value of the spinner + */ + // -------------------------------------------------------------------- + /** Returns the step value. */ + float getStep() const { return m_step; } + // -------------------------------------------------------------------- + /** \brief Sets the maximum value for a spinner. + * If the current value is larger than the new maximum, the current + * value is set to the new maximum. */ + void setStep(float n) { m_step = n; } + // -------------------------------------------------------------------- /** * \return the maximum value the spinner can take */ @@ -242,6 +264,11 @@ namespace GUIEngine /** Display custom text in spinner */ void setCustomText(const core::stringw& text); const core::stringw& getCustomText() const { return m_custom_text; } + + /* Set a spinner with numeric values min <= i <= max, with a precision of defined by step */ + void setRange(int min, int max, float step); + void setRange(int min, int max) { setRange(min, max, 1.0); } + void onPressed(int x, int y); void doValueUpdatedCallback() { @@ -253,6 +280,7 @@ namespace GUIEngine { m_value_updated_callback = callback; } + }; } diff --git a/src/karts/abstract_characteristic.cpp b/src/karts/abstract_characteristic.cpp index 680e80074..bc5766dd7 100644 --- a/src/karts/abstract_characteristic.cpp +++ b/src/karts/abstract_characteristic.cpp @@ -107,14 +107,6 @@ AbstractCharacteristic::ValueType AbstractCharacteristic::getType( return TYPE_FLOAT; case WHEELS_DAMPING_COMPRESSION: return TYPE_FLOAT; - case CAMERA_DISTANCE: - return TYPE_FLOAT; - case CAMERA_FORWARD_UP_ANGLE: - return TYPE_FLOAT; - case CAMERA_FORWARD_SMOOTHING: - return TYPE_BOOL; - case CAMERA_BACKWARD_UP_ANGLE: - return TYPE_FLOAT; case JUMP_ANIMATION_TIME: return TYPE_FLOAT; case LEAN_MAX: @@ -349,14 +341,6 @@ std::string AbstractCharacteristic::getName(CharacteristicType type) return "WHEELS_DAMPING_RELAXATION"; case WHEELS_DAMPING_COMPRESSION: return "WHEELS_DAMPING_COMPRESSION"; - case CAMERA_DISTANCE: - return "CAMERA_DISTANCE"; - case CAMERA_FORWARD_UP_ANGLE: - return "CAMERA_FORWARD_UP_ANGLE"; - case CAMERA_FORWARD_SMOOTHING: - return "CAMERA_FORWARD_SMOOTHING"; - case CAMERA_BACKWARD_UP_ANGLE: - return "CAMERA_BACKWARD_UP_ANGLE"; case JUMP_ANIMATION_TIME: return "JUMP_ANIMATION_TIME"; case LEAN_MAX: @@ -843,53 +827,6 @@ float AbstractCharacteristic::getWheelsDampingCompression() const return result; } // getWheelsDampingCompression -// ---------------------------------------------------------------------------- -float AbstractCharacteristic::getCameraDistance() const -{ - float result; - bool is_set = false; - process(CAMERA_DISTANCE, &result, &is_set); - if (!is_set) - Log::fatal("AbstractCharacteristic", "Can't get characteristic %s", - getName(CAMERA_DISTANCE).c_str()); - return result; -} // getCameraDistance - -// ---------------------------------------------------------------------------- -float AbstractCharacteristic::getCameraForwardUpAngle() const -{ - float result; - bool is_set = false; - process(CAMERA_FORWARD_UP_ANGLE, &result, &is_set); - if (!is_set) - Log::fatal("AbstractCharacteristic", "Can't get characteristic %s", - getName(CAMERA_FORWARD_UP_ANGLE).c_str()); - return result; -} // getCameraForwardUpAngle - -// ---------------------------------------------------------------------------- -bool AbstractCharacteristic::getCameraForwardSmoothing() const -{ - bool result; - bool is_set = false; - process(CAMERA_FORWARD_SMOOTHING, &result, &is_set); - if (!is_set) - Log::fatal("AbstractCharacteristic", "Can't get characteristic %s", - getName(CAMERA_FORWARD_SMOOTHING).c_str()); - return result; -} // getCameraForwardSmoothing - -// ---------------------------------------------------------------------------- -float AbstractCharacteristic::getCameraBackwardUpAngle() const -{ - float result; - bool is_set = false; - process(CAMERA_BACKWARD_UP_ANGLE, &result, &is_set); - if (!is_set) - Log::fatal("AbstractCharacteristic", "Can't get characteristic %s", - getName(CAMERA_BACKWARD_UP_ANGLE).c_str()); - return result; -} // getCameraBackwardUpAngle // ---------------------------------------------------------------------------- float AbstractCharacteristic::getJumpAnimationTime() const diff --git a/src/karts/abstract_characteristic.hpp b/src/karts/abstract_characteristic.hpp index 7ce233c47..4fb50d7d9 100644 --- a/src/karts/abstract_characteristic.hpp +++ b/src/karts/abstract_characteristic.hpp @@ -111,12 +111,6 @@ public: WHEELS_DAMPING_RELAXATION, WHEELS_DAMPING_COMPRESSION, - // Camera - CAMERA_DISTANCE, - CAMERA_FORWARD_UP_ANGLE, - CAMERA_FORWARD_SMOOTHING, - CAMERA_BACKWARD_UP_ANGLE, - // Jump JUMP_ANIMATION_TIME, diff --git a/src/karts/kart_properties.cpp b/src/karts/kart_properties.cpp index 70cc0e5cb..1f727ea7a 100644 --- a/src/karts/kart_properties.cpp +++ b/src/karts/kart_properties.cpp @@ -21,6 +21,7 @@ #include "audio/sfx_manager.hpp" #include "addons/addon.hpp" #include "audio/sfx_manager.hpp" +#include "config/user_config.hpp" #include "config/stk_config.hpp" #include "config/player_manager.hpp" #include "graphics/central_settings.hpp" @@ -354,6 +355,7 @@ void KartProperties::combineCharacteristics(HandicapLevel handicap) m_combined_characteristic->addCharacteristic(kart_properties_manager-> getDifficultyCharacteristic(RaceManager::get()->getDifficultyAsString( RaceManager::get()->getDifficulty()))); + // FIXME add get user characteristics // Try to get the kart type const AbstractCharacteristic *characteristic = kart_properties_manager-> @@ -773,29 +775,6 @@ float KartProperties::getWheelsDampingCompression() const return m_cached_characteristic->getWheelsDampingCompression(); } // getWheelsDampingCompression -// ---------------------------------------------------------------------------- -float KartProperties::getCameraDistance() const -{ - return m_cached_characteristic->getCameraDistance(); -} // getCameraDistance - -// ---------------------------------------------------------------------------- -float KartProperties::getCameraForwardUpAngle() const -{ - return m_cached_characteristic->getCameraForwardUpAngle(); -} // getCameraForwardUpAngle - -// ---------------------------------------------------------------------------- -bool KartProperties::getCameraForwardSmoothing() const -{ - return m_cached_characteristic->getCameraForwardSmoothing(); -} // getCameraForwardSmoothing - -// ---------------------------------------------------------------------------- -float KartProperties::getCameraBackwardUpAngle() const -{ - return m_cached_characteristic->getCameraBackwardUpAngle(); -} // getCameraBackwardUpAngle // ---------------------------------------------------------------------------- float KartProperties::getJumpAnimationTime() const diff --git a/src/karts/kart_properties.hpp b/src/karts/kart_properties.hpp index a7d91b454..79364c123 100644 --- a/src/karts/kart_properties.hpp +++ b/src/karts/kart_properties.hpp @@ -407,11 +407,6 @@ public: float getWheelsDampingRelaxation() const; float getWheelsDampingCompression() const; - float getCameraDistance() const; - float getCameraForwardUpAngle() const; - bool getCameraForwardSmoothing() const; - float getCameraBackwardUpAngle() const; - float getJumpAnimationTime() const; float getLeanMax() const; diff --git a/src/karts/xml_characteristic.cpp b/src/karts/xml_characteristic.cpp index ae1a410ad..c4689af37 100644 --- a/src/karts/xml_characteristic.cpp +++ b/src/karts/xml_characteristic.cpp @@ -1,4 +1,4 @@ -// + // SuperTuxKart - a fun racing game with go-kart // Copyright (C) 2006-2015 SuperTuxKart-Team // @@ -397,18 +397,6 @@ void XmlCharacteristic::load(const XMLNode *node) &m_values[WHEELS_DAMPING_COMPRESSION]); } - if (const XMLNode *sub_node = node->getNode("camera")) - { - sub_node->get("distance", - &m_values[CAMERA_DISTANCE]); - sub_node->get("forward-up-angle", - &m_values[CAMERA_FORWARD_UP_ANGLE]); - sub_node->get("forward-smoothing", - &m_values[CAMERA_FORWARD_SMOOTHING]); - sub_node->get("backward-up-angle", - &m_values[CAMERA_BACKWARD_UP_ANGLE]); - } - if (const XMLNode *sub_node = node->getNode("jump")) { sub_node->get("animation-time", diff --git a/src/states_screens/dialogs/custom_camera_settings.cpp b/src/states_screens/dialogs/custom_camera_settings.cpp new file mode 100644 index 000000000..02820af80 --- /dev/null +++ b/src/states_screens/dialogs/custom_camera_settings.cpp @@ -0,0 +1,97 @@ +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2009-2015 Marianne Gagnon +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "states_screens/dialogs/custom_camera_settings.hpp" + +#include "config/user_config.hpp" +#include "guiengine/widgets/check_box_widget.hpp" +#include "guiengine/widgets/spinner_widget.hpp" +#include "states_screens/options/options_screen_ui.hpp" +#include "utils/translation.hpp" +#include "graphics/central_settings.hpp" +#include "graphics/irr_driver.hpp" +#include "utils/string_utils.hpp" +#include "utils/translation.hpp" + +#include + + +using namespace GUIEngine; +using namespace irr; +using namespace irr::core; +using namespace irr::gui; + +// ----------------------------------------------------------------------------- + +CustomCameraSettingsDialog::CustomCameraSettingsDialog(const float w, const float h) : + ModalDialog(w, h) +{ + m_self_destroy = false; + loadFromFile("custom_camera_settings.stkgui"); + getWidget("fov")->setValue(UserConfigParams::m_camera_fov); + getWidget("camera_distance")->setFloatValue(UserConfigParams::m_camera_distance); + getWidget("camera_angle")->setValue(UserConfigParams::m_camera_forward_up_angle); + getWidget("camera_smoothing")->setState(UserConfigParams::m_camera_forward_smoothing); + getWidget("backward_camera_angle")->setValue(UserConfigParams::m_camera_backward_up_angle); +// updateActivation(); +} + +// ----------------------------------------------------------------------------- + +CustomCameraSettingsDialog::~CustomCameraSettingsDialog() +{ +} + + +// ----------------------------------------------------------------------------- + +void CustomCameraSettingsDialog::beforeAddingWidgets() +{ +#ifndef SERVER_ONLY + getWidget("fov")->setRange(75, 115); + getWidget("fov")->setValue(UserConfigParams::m_camera_fov); + getWidget("camera_distance")->setRange(0 , 20, 0.1); + getWidget("camera_distance")->setFloatValue(UserConfigParams::m_camera_distance); + getWidget("camera_angle")->setRange(0 , 45); + getWidget("camera_angle")->setValue(UserConfigParams::m_camera_forward_up_angle); + getWidget("camera_smoothing")->setState(UserConfigParams::m_camera_forward_smoothing); + getWidget("backward_camera_angle")->setRange(0 , 45); + getWidget("backward_camera_angle")->setValue(UserConfigParams::m_camera_backward_up_angle); + getWidget("use_soccer_camera")->setState(UserConfigParams::m_reverse_look_use_soccer_cam); +#endif +} + +// ----------------------------------------------------------------------------- + +GUIEngine::EventPropagation CustomCameraSettingsDialog::processEvent(const std::string& eventSource) +{ +#ifndef SERVER_ONLY + if (eventSource == "close") + { + UserConfigParams::m_camera_fov = getWidget("fov")->getValue(); + UserConfigParams::m_camera_distance = getWidget("camera_distance")->getFloatValue(); + UserConfigParams::m_camera_forward_up_angle = getWidget("camera_angle")->getValue(); + UserConfigParams::m_camera_forward_smoothing = getWidget("camera_smoothing")->getState(); + UserConfigParams::m_camera_backward_up_angle = getWidget("backward_camera_angle")->getValue(); + UserConfigParams::m_reverse_look_use_soccer_cam = getWidget("use_soccer_camera")->getState(); + OptionsScreenUI::getInstance()->updateCameraPresetSpinner(); + m_self_destroy = true; + return GUIEngine::EVENT_BLOCK; + } +#endif + return GUIEngine::EVENT_LET; +} // processEvent diff --git a/src/states_screens/dialogs/custom_camera_settings.hpp b/src/states_screens/dialogs/custom_camera_settings.hpp new file mode 100644 index 000000000..cb9a084a4 --- /dev/null +++ b/src/states_screens/dialogs/custom_camera_settings.hpp @@ -0,0 +1,63 @@ +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2009-2015 Marianne Gagnon +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +#ifndef HEADER_CUSTOM_CAMERA_SETTINGS_HPP +#define HEADER_CUSTOM_CAMERA_SETTINGS_HPP + +#include "guiengine/modaldialog.hpp" + +/** + * \brief Dialog that allows the player to select custom video settings + * \ingroup states_screens + */ +class CustomCameraSettingsDialog : public GUIEngine::ModalDialog +{ +private: + bool m_self_destroy; +public: + /** + * Creates a modal dialog with given percentage of screen width and height + */ + CustomCameraSettingsDialog(const float percentWidth, const float percentHeight); + ~CustomCameraSettingsDialog(); + + virtual void beforeAddingWidgets(); + + void updateActivation(); + + GUIEngine::EventPropagation processEvent(const std::string& eventSource); + + virtual bool onEscapePressed() + { + m_self_destroy = true; + return false; + } + + virtual void onUpdate(float dt) + { + // It's unsafe to delete from inside the event handler so we do it here + if (m_self_destroy) + { + ModalDialog::dismiss(); + return; + } + } + +}; + +#endif diff --git a/src/states_screens/options/options_screen_ui.cpp b/src/states_screens/options/options_screen_ui.cpp index cb97a9de4..801bc18f3 100644 --- a/src/states_screens/options/options_screen_ui.cpp +++ b/src/states_screens/options/options_screen_ui.cpp @@ -20,10 +20,13 @@ #include "addons/news_manager.hpp" #include "audio/sfx_manager.hpp" #include "audio/sfx_base.hpp" +#include "graphics/camera.hpp" +#include "graphics/camera_normal.hpp" #include "challenges/story_mode_timer.hpp" #include "config/hardware_stats.hpp" #include "config/player_manager.hpp" #include "config/user_config.hpp" +#include "config/stk_config.hpp" #include "font/bold_face.hpp" #include "font/font_manager.hpp" #include "font/regular_face.hpp" @@ -41,6 +44,7 @@ #include "online/request_manager.hpp" #include "states_screens/dialogs/message_dialog.hpp" #include "states_screens/main_menu_screen.hpp" +#include "states_screens/dialogs/custom_camera_settings.hpp" #include "states_screens/options/options_screen_audio.hpp" #include "states_screens/options/options_screen_general.hpp" #include "states_screens/options/options_screen_input.hpp" @@ -143,6 +147,9 @@ void OptionsScreenUI::loadedFromFile() font_size->m_properties[GUIEngine::PROP_MIN_VALUE] = "1"; font_size->m_properties[GUIEngine::PROP_MAX_VALUE] = "5"; } + + updateCameraPresetSpinner(); + font_size->setValueUpdatedCallback([this](SpinnerWidget* spinner) { // Add a special value updated callback so font size is updated when @@ -155,6 +162,7 @@ void OptionsScreenUI::loadedFromFile() m_reload_option->m_focus_name = "font_size"; m_reload_option->m_focus_right = right; }); + } // loadedFromFile // ----------------------------------------------------------------------------- @@ -328,8 +336,81 @@ void OptionsScreenUI::init() GUIEngine::reloadSkin(); irr_driver->setMaxTextureSize(); } + + // Camera presets + m_camera_presets.push_back // Standard + ({ + 80 /* fov */, 1.0f /* distance */, 0.0f /* angle */, true /* smoothing */, 5.0f /* backward angle */, + }); + + m_camera_presets.push_back // Drone chase + ({ + 100 /* fov */, 2.6f /* distance */, 33.0f /* angle */, false /* smoothing */, 10.0f /* backward angle */, + }); + + GUIEngine::SpinnerWidget* camera_preset = getWidget("camera_preset"); + assert( camera_preset != NULL ); + + camera_preset->m_properties[PROP_WRAP_AROUND] = "true"; + camera_preset->clearLabels(); + //I18N: custom camera setting + camera_preset->addLabel( core::stringw(_("Custom"))); + //I18N: In the UI options,litscreen_method in the race UI + camera_preset->addLabel( core::stringw(_("Standard"))); + //I18N: In the UI options, splitscreen_method position in the race UI + camera_preset->addLabel( core::stringw(_("Drone chase"))); + camera_preset->m_properties[GUIEngine::PROP_MIN_VALUE] = "1"; + camera_preset->m_properties[GUIEngine::PROP_MAX_VALUE] = "2"; + + updateCameraPresetSpinner(); } // init +void updateCamera() +{ + bool in_game = StateManager::get()->getGameState() == GUIEngine::INGAME_MENU; + if (in_game) + { + (Camera::getActiveCamera()->getCameraSceneNode())->setFOV(DEGREE_TO_RAD * UserConfigParams::m_camera_fov); + CameraNormal *camera = dynamic_cast(Camera::getActiveCamera()); + if (camera) + { + camera->setDistanceToKart(UserConfigParams::m_camera_distance); + } + } +} + +void OptionsScreenUI::updateCameraPresetSpinner() +{ + GUIEngine::SpinnerWidget* camera_preset = getWidget("camera_preset"); + assert( camera_preset != NULL ); + +#define FLOAT_EPSILON 0.001 + + bool found = false; + unsigned int i = 0; + for (; i < m_camera_presets.size(); i++) + { + if (m_camera_presets[i].fov == UserConfigParams::m_camera_fov && + m_camera_presets[i].smoothing == UserConfigParams::m_camera_forward_smoothing && + fabs(m_camera_presets[i].distance - UserConfigParams::m_camera_distance) < FLOAT_EPSILON && + fabs(m_camera_presets[i].angle - UserConfigParams::m_camera_forward_up_angle) < FLOAT_EPSILON && + fabs(m_camera_presets[i].backward_angle - UserConfigParams::m_camera_backward_up_angle) < FLOAT_EPSILON) + { + camera_preset->setValue(i + 1); + found = true; + break; + } + } + + if (!found) + { + camera_preset->setValue(0); + camera_preset->m_properties[GUIEngine::PROP_MIN_VALUE] = std::to_string(0); + } + updateCamera(); + +} // updateCameraPresetSpinner + // ----------------------------------------------------------------------------- void OptionsScreenUI::eventCallback(Widget* widget, const std::string& name, const int playerID) @@ -456,6 +537,24 @@ void OptionsScreenUI::eventCallback(Widget* widget, const std::string& name, con } UserConfigParams::m_speedrun_mode = speedrun_timer->getState(); } + else if (name == "camera_preset") + { + GUIEngine::SpinnerWidget* camera_preset = getWidget("camera_preset"); + assert( camera_preset != NULL ); + unsigned int i = camera_preset->getValue(); + if (i != 0) { + UserConfigParams::m_camera_fov = m_camera_presets[i-1].fov; + UserConfigParams::m_camera_distance = m_camera_presets[i-1].distance; + UserConfigParams::m_camera_forward_up_angle = m_camera_presets[i-1].angle; + UserConfigParams::m_camera_forward_smoothing = m_camera_presets[i-1].smoothing; + UserConfigParams::m_camera_backward_up_angle = m_camera_presets[i-1].backward_angle; + } + updateCamera(); + } + else if(name == "custom_camera") + { + new CustomCameraSettingsDialog(0.8f, 0.9f); + } #endif } // eventCallback diff --git a/src/states_screens/options/options_screen_ui.hpp b/src/states_screens/options/options_screen_ui.hpp index c29650723..e3c916617 100644 --- a/src/states_screens/options/options_screen_ui.hpp +++ b/src/states_screens/options/options_screen_ui.hpp @@ -26,6 +26,15 @@ namespace GUIEngine { class Widget; } +struct CameraPreset +{ + int fov; + float distance; + float angle; + bool smoothing; + float backward_angle; +}; + struct Input; /** @@ -45,6 +54,8 @@ class OptionsScreenUI : public GUIEngine::Screen, public GUIEngine::ScreenSingle OptionsScreenUI(); bool m_inited; + std::vector m_camera_presets; + std::map m_skins; public: @@ -66,6 +77,8 @@ public: /** \brief implement optional callback from parent class GUIEngine::Screen */ virtual void unloaded() OVERRIDE; + void updateCameraPresetSpinner(); + virtual void onUpdate(float delta) OVERRIDE; void reloadGUIEngine();