diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 21:25:21 +0200 |
---|---|---|
committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-05-22 22:40:26 +0300 |
commit | e2e37cced861b98de8c1a7c9c0d3a50d2d90e433 (patch) | |
tree | 1bb897489ce524986f6196201c10ac0d8861aa5f /indra/newview/llfloatercamera.cpp | |
parent | 069ea06848f766466f1a281144c82a0f2bd79f3a (diff) |
Fix line endlings
Diffstat (limited to 'indra/newview/llfloatercamera.cpp')
-rw-r--r-- | indra/newview/llfloatercamera.cpp | 1476 |
1 files changed, 738 insertions, 738 deletions
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 63b97df969..4a5a755696 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -1,738 +1,738 @@ -/**
- * @file llfloatercamera.cpp
- * @brief Container for camera control buttons (zoom, pan, orbit)
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloatercamera.h"
-
-// Library includes
-#include "llfloaterreg.h"
-
-// Viewer includes
-#include "llagent.h"
-#include "llagentcamera.h"
-#include "llpresetsmanager.h"
-#include "lljoystickbutton.h"
-#include "llviewercontrol.h"
-#include "llviewercamera.h"
-#include "lltoolmgr.h"
-#include "lltoolfocus.h"
-#include "llslider.h"
-#include "llfirstuse.h"
-#include "llhints.h"
-#include "lltabcontainer.h"
-#include "llviewercamera.h"
-#include "llvoavatarself.h"
-
-static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item");
-
-const F32 NUDGE_TIME = 0.25f; // in seconds
-const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
-
-// constants
-#define ORBIT "cam_rotate_stick"
-#define PAN "cam_track_stick"
-#define ZOOM "zoom"
-#define CONTROLS "controls"
-
-bool LLFloaterCamera::sFreeCamera = false;
-bool LLFloaterCamera::sAppearanceEditing = false;
-
-// Zoom the camera in and out
-class LLPanelCameraZoom
-: public LLPanel
-{
- LOG_CLASS(LLPanelCameraZoom);
-
-public:
- struct Params : public LLInitParam::Block<Params, LLPanel::Params> {};
-
- LLPanelCameraZoom() { onCreate(); }
-
- /* virtual */ bool postBuild();
- /* virtual */ void draw();
-
-protected:
- LLPanelCameraZoom(const Params& p) { onCreate(); }
-
- void onCreate();
- void onZoomPlusHeldDown();
- void onZoomMinusHeldDown();
- void onSliderValueChanged();
- void onCameraTrack();
- void onCameraRotate();
- F32 getOrbitRate(F32 time);
-
-private:
- LLButton* mPlusBtn { nullptr };
- LLButton* mMinusBtn{ nullptr };
- LLSlider* mSlider{ nullptr };
-
- friend class LLUICtrlFactory;
-};
-
-LLPanelCameraItem::Params::Params()
-: icon_over("icon_over"),
- icon_selected("icon_selected"),
- picture("picture"),
- text("text"),
- selected_picture("selected_picture"),
- mousedown_callback("mousedown_callback")
-{
-}
-
-LLPanelCameraItem::LLPanelCameraItem(const LLPanelCameraItem::Params& p)
-: LLPanel(p)
-{
- LLIconCtrl::Params icon_params = p.picture;
- mPicture = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
- addChild(mPicture);
-
- icon_params = p.icon_over;
- mIconOver = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
- addChild(mIconOver);
-
- icon_params = p.icon_selected;
- mIconSelected = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
- addChild(mIconSelected);
-
- icon_params = p.selected_picture;
- mPictureSelected = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
- addChild(mPictureSelected);
-
- LLTextBox::Params text_params = p.text;
- mText = LLUICtrlFactory::create<LLTextBox>(text_params);
- addChild(mText);
-
- if (p.mousedown_callback.isProvided())
- {
- setCommitCallback(initCommitCallback(p.mousedown_callback));
- }
-}
-
-void set_view_visible(LLView* parent, const std::string& name, bool visible)
-{
- parent->getChildView(name)->setVisible(visible);
-}
-
-bool LLPanelCameraItem::postBuild()
-{
- setMouseEnterCallback(boost::bind(set_view_visible, this, "hovered_icon", true));
- setMouseLeaveCallback(boost::bind(set_view_visible, this, "hovered_icon", false));
- setMouseDownCallback(boost::bind(&LLPanelCameraItem::onAnyMouseClick, this));
- setRightMouseDownCallback(boost::bind(&LLPanelCameraItem::onAnyMouseClick, this));
- return true;
-}
-
-void LLPanelCameraItem::onAnyMouseClick()
-{
- if (mCommitSignal) (*mCommitSignal)(this, LLSD());
-}
-
-void LLPanelCameraItem::setValue(const LLSD& value)
-{
- if (!value.isMap()) return;;
- if (!value.has("selected")) return;
- getChildView("selected_icon")->setVisible( value["selected"]);
- getChildView("picture")->setVisible( !value["selected"]);
- getChildView("selected_picture")->setVisible( value["selected"]);
-}
-
-static LLPanelInjector<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel");
-
-//-------------------------------------------------------------------------------
-// LLPanelCameraZoom
-//-------------------------------------------------------------------------------
-
-void LLPanelCameraZoom::onCreate()
-{
- mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
- mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
- mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
- mCommitCallbackRegistrar.add("Camera.track", boost::bind(&LLPanelCameraZoom::onCameraTrack, this));
- mCommitCallbackRegistrar.add("Camera.rotate", boost::bind(&LLPanelCameraZoom::onCameraRotate, this));
-}
-
-bool LLPanelCameraZoom::postBuild()
-{
- mPlusBtn = getChild<LLButton>("zoom_plus_btn");
- mMinusBtn = getChild<LLButton>("zoom_minus_btn");
- mSlider = getChild<LLSlider>("zoom_slider");
- return LLPanel::postBuild();
-}
-
-void LLPanelCameraZoom::draw()
-{
- mSlider->setValue(gAgentCamera.getCameraZoomFraction());
- LLPanel::draw();
-}
-
-void LLPanelCameraZoom::onZoomPlusHeldDown()
-{
- F32 val = mSlider->getValueF32();
- F32 inc = mSlider->getIncrement();
- mSlider->setValue(val - inc);
- F32 time = mPlusBtn->getHeldDownTime();
- gAgentCamera.unlockView();
- gAgentCamera.setOrbitInKey(getOrbitRate(time));
-}
-
-void LLPanelCameraZoom::onZoomMinusHeldDown()
-{
- F32 val = mSlider->getValueF32();
- F32 inc = mSlider->getIncrement();
- mSlider->setValue(val + inc);
- F32 time = mMinusBtn->getHeldDownTime();
- gAgentCamera.unlockView();
- gAgentCamera.setOrbitOutKey(getOrbitRate(time));
-}
-
-void LLPanelCameraZoom::onCameraTrack()
-{
- // EXP-202 when camera panning activated, remove the hint
- LLFirstUse::viewPopup( false );
-}
-
-void LLPanelCameraZoom::onCameraRotate()
-{
- // EXP-202 when camera rotation activated, remove the hint
- LLFirstUse::viewPopup( false );
-}
-
-F32 LLPanelCameraZoom::getOrbitRate(F32 time)
-{
- if( time < NUDGE_TIME )
- {
- F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME;
- return rate;
- }
- else
- {
- return 1;
- }
-}
-
-void LLPanelCameraZoom::onSliderValueChanged()
-{
- F32 zoom_level = mSlider->getValueF32();
- gAgentCamera.setCameraZoomFraction(zoom_level);
-}
-
-void activate_camera_tool()
-{
- LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
-};
-
-class LLCameraInfoPanel : public LLPanel
-{
-public:
- typedef std::function<LLVector3()> get_vector_t;
-
- LLCameraInfoPanel(
- const LLView* parent,
- const char* title,
- const LLCoordFrame& camera,
- const get_vector_t get_focus
- )
- : LLPanel([&]() -> LLPanel::Params
- {
- LLPanel::Params params;
- params.rect = LLRect(parent->getLocalRect());
- return params;
- }())
- , mTitle(title)
- , mCamera(camera)
- , mGetFocus(get_focus)
- , mFont(LLFontGL::getFontSansSerifBig())
- {
- }
-
- virtual void draw() override
- {
- LLPanel::draw();
-
- static const U32 HPADDING = 10;
- static const U32 VPADDING = 5;
- LLVector3 focus = mGetFocus();
- LLVector3 sight = focus - mCamera.mOrigin;
- std::pair<const char*, const LLVector3&> const data[] =
- {
- { "Origin:", mCamera.mOrigin },
- { "X Axis:", mCamera.mXAxis },
- { "Y Axis:", mCamera.mYAxis },
- { "Z Axis:", mCamera.mZAxis },
- { "Focus:", focus },
- { "Sight:", sight }
- };
- S32 width = getRect().getWidth();
- S32 height = getRect().getHeight();
- S32 row_count = 1 + sizeof(data) / sizeof(*data);
- S32 row_height = (height - VPADDING * 2) / row_count;
- S32 top = height - VPADDING - row_height / 2;
- mFont->renderUTF8(mTitle, 0, HPADDING, top, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER);
- for (const auto& row : data)
- {
- top -= row_height;
- mFont->renderUTF8(row.first, 0, HPADDING, top, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER);
- const LLVector3& vector = row.second;
- for (S32 i = 0; i < 3; ++i)
- {
- std::string text = llformat("%.6f", vector[i]);
- S32 right = width / 4 * (i + 2) - HPADDING;
- mFont->renderUTF8(text, 0, right, top, LLColor4::white, LLFontGL::RIGHT, LLFontGL::VCENTER);
- }
- }
- }
-
-private:
- const char* mTitle;
- const LLCoordFrame& mCamera;
- const get_vector_t mGetFocus;
- const LLFontGL* mFont;
-};
-
-//
-// Member functions
-//
-
-// static
-bool LLFloaterCamera::inFreeCameraMode()
-{
- LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
- {
- return true;
- }
- return false;
-}
-
-// static
-void LLFloaterCamera::resetCameraMode()
-{
- LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (!floater_camera) return;
- floater_camera->switchMode(CAMERA_CTRL_MODE_PAN);
-}
-
-// static
-void LLFloaterCamera::onAvatarEditingAppearance(bool editing)
-{
- sAppearanceEditing = editing;
- LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (!floater_camera) return;
- floater_camera->handleAvatarEditingAppearance(editing);
-}
-
-// static
-void LLFloaterCamera::onDebugCameraToggled()
-{
- if (LLFloaterCamera* instance = LLFloaterCamera::findInstance())
- {
- instance->showDebugInfo(LLView::sDebugCamera);
- }
-
- if (LLView::sDebugCamera)
- {
- LLFloaterReg::showInstanceOrBringToFront("camera");
- }
-}
-
-void LLFloaterCamera::showDebugInfo(bool show)
-{
- // Initially LLPanel contains 1 child "view_border"
- if (show && mViewerCameraInfo->getChildCount() < 2)
- {
- mViewerCameraInfo->addChild(new LLCameraInfoPanel(mViewerCameraInfo, "Viewer Camera", *LLViewerCamera::getInstance(),
- []() { return LLViewerCamera::getInstance()->getPointOfInterest(); }));
- mAgentCameraInfo->addChild(new LLCameraInfoPanel(mAgentCameraInfo, "Agent Camera", gAgent.getFrameAgent(),
- []() { return gAgent.getPosAgentFromGlobal(gAgentCamera.calcFocusPositionTargetGlobal()); }));
- }
-
- mAgentCameraInfo->setVisible(show);
- mViewerCameraInfo->setVisible(show);
-}
-
-void LLFloaterCamera::handleAvatarEditingAppearance(bool editing)
-{
-}
-
-void LLFloaterCamera::update()
-{
- ECameraControlMode mode = determineMode();
- if (mode != mCurrMode)
- {
- setMode(mode);
- }
-}
-
-
-void LLFloaterCamera::toPrevMode()
-{
- switchMode(mPrevMode);
-}
-
-// static
-void LLFloaterCamera::onLeavingMouseLook()
-{
- LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (floater_camera)
- {
- floater_camera->updateItemsSelection();
- if(floater_camera->inFreeCameraMode())
- {
- activate_camera_tool();
- }
- }
-}
-
-LLFloaterCamera* LLFloaterCamera::findInstance()
-{
- return LLFloaterReg::findTypedInstance<LLFloaterCamera>("camera");
-}
-
-void LLFloaterCamera::onOpen(const LLSD& key)
-{
- LLFirstUse::viewPopup();
-
- mZoom->onOpen(key);
-
- // Returns to previous mode, see EXT-2727(View tool should remember state).
- // In case floater was just hidden and it isn't reset the mode
- // just update state to current one. Else go to previous.
- if ( !mClosed )
- updateState();
- else
- toPrevMode();
- mClosed = false;
-
- populatePresetCombo();
-
- showDebugInfo(LLView::sDebugCamera);
-}
-
-void LLFloaterCamera::onClose(bool app_quitting)
-{
- //We don't care of camera mode if app is quitting
- if (app_quitting)
- return;
- // It is necessary to reset mCurrMode to CAMERA_CTRL_MODE_PAN so
- // to avoid seeing an empty floater when reopening the control.
- if (mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA)
- mCurrMode = CAMERA_CTRL_MODE_PAN;
- // When mCurrMode is in CAMERA_CTRL_MODE_PAN
- // switchMode won't modify mPrevMode, so force it here.
- // It is needed to correctly return to previous mode on open, see EXT-2727.
- if (mCurrMode == CAMERA_CTRL_MODE_PAN)
- mPrevMode = CAMERA_CTRL_MODE_PAN;
-
- switchMode(CAMERA_CTRL_MODE_PAN);
- mClosed = true;
-
- gAgent.setMovementLocked(false);
-}
-
-LLFloaterCamera::LLFloaterCamera(const LLSD& val)
-: LLFloater(val),
- mClosed(false),
- mCurrMode(CAMERA_CTRL_MODE_PAN),
- mPrevMode(CAMERA_CTRL_MODE_PAN)
-{
- LLHints::getInstance()->registerHintTarget("view_popup", getHandle());
- mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
- mCommitCallbackRegistrar.add("CameraPresets.Save", boost::bind(&LLFloaterCamera::onSavePreset, this));
- mCommitCallbackRegistrar.add("CameraPresets.ShowPresetsList", boost::bind(&LLFloaterReg::showInstance, "camera_presets", LLSD(), false));
-}
-
-// virtual
-bool LLFloaterCamera::postBuild()
-{
- updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
-
- mControls = getChild<LLPanel>("controls");
- mAgentCameraInfo = getChild<LLPanel>("agent_camera_info");
- mViewerCameraInfo = getChild<LLPanel>("viewer_camera_info");
- mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
- mZoom = getChild<LLPanelCameraZoom>(ZOOM);
- mTrack = getChild<LLJoystickCameraTrack>(PAN);
- mPresetCombo = getChild<LLComboBox>("preset_combo");
- mPreciseCtrls = getChild<LLTextBox>("precise_ctrs_label");
-
- mPreciseCtrls->setShowCursorHand(false);
- mPreciseCtrls->setSoundFlags(LLView::MOUSE_UP);
- mPreciseCtrls->setClickedCallback(boost::bind(&LLFloaterReg::showInstance, "prefs_view_advanced", LLSD(), false));
-
- mPresetCombo->setCommitCallback(boost::bind(&LLFloaterCamera::onCustomPresetSelected, this));
- LLPresetsManager::getInstance()->setPresetListChangeCameraCallback(boost::bind(&LLFloaterCamera::populatePresetCombo, this));
-
- update();
-
- // ensure that appearance mode is handled while building. See EXT-7796.
- handleAvatarEditingAppearance(sAppearanceEditing);
-
- return LLFloater::postBuild();
-}
-
-F32 LLFloaterCamera::getCurrentTransparency()
-{
-
- static LLCachedControl<F32> camera_opacity(gSavedSettings, "CameraOpacity");
- static LLCachedControl<F32> active_floater_transparency(gSavedSettings, "ActiveFloaterTransparency");
- return llmin(camera_opacity(), active_floater_transparency());
-
-}
-
-void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel)
-{
- // copying child list and then iterating over a copy, because list itself
- // is changed in process
- const child_list_t child_list = *panel->getChildList();
- child_list_t::const_reverse_iterator iter = child_list.rbegin();
- child_list_t::const_reverse_iterator end = child_list.rend();
- for ( ; iter != end; ++iter)
- {
- LLView* view = *iter;
- LLPanel* item = dynamic_cast<LLPanel*>(view);
- if (panel)
- list->addItem(item);
- }
-
-}
-
-ECameraControlMode LLFloaterCamera::determineMode()
-{
- if (sAppearanceEditing)
- {
- // this is the only enabled camera mode while editing agent appearance.
- return CAMERA_CTRL_MODE_PAN;
- }
-
- LLTool* curr_tool = LLToolMgr::getInstance()->getCurrentTool();
- if (curr_tool == LLToolCamera::getInstance())
- {
- return CAMERA_CTRL_MODE_FREE_CAMERA;
- }
-
- if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
- {
- return CAMERA_CTRL_MODE_PRESETS;
- }
-
- return CAMERA_CTRL_MODE_PAN;
-}
-
-
-void clear_camera_tool()
-{
- LLToolMgr* tool_mgr = LLToolMgr::getInstance();
- if (tool_mgr->usingTransientTool() &&
- tool_mgr->getCurrentTool() == LLToolCamera::getInstance())
- {
- tool_mgr->clearTransientTool();
- }
-}
-
-
-void LLFloaterCamera::setMode(ECameraControlMode mode)
-{
- if (mode != mCurrMode)
- {
- mPrevMode = mCurrMode;
- mCurrMode = mode;
- }
-
- updateState();
-}
-
-void LLFloaterCamera::switchMode(ECameraControlMode mode)
-{
- switch (mode)
- {
- case CAMERA_CTRL_MODE_PRESETS:
- case CAMERA_CTRL_MODE_PAN:
- sFreeCamera = false;
- setMode(mode); // depends onto sFreeCamera
- clear_camera_tool();
- break;
-
- case CAMERA_CTRL_MODE_FREE_CAMERA:
- sFreeCamera = true;
- setMode(mode);
- activate_camera_tool();
- break;
-
- default:
- //normally we won't occur here
- llassert_always(false);
- }
-}
-
-void LLFloaterCamera::updateState()
-{
- updateItemsSelection();
-
- if (CAMERA_CTRL_MODE_FREE_CAMERA == mCurrMode)
- {
- return;
- }
-
- //updating buttons
- std::map<ECameraControlMode, LLButton*>::const_iterator iter = mMode2Button.begin();
- for (; iter != mMode2Button.end(); ++iter)
- {
- iter->second->setToggleState(iter->first == mCurrMode);
- }
-}
-
-void LLFloaterCamera::updateItemsSelection()
-{
- ECameraPreset preset = (ECameraPreset) gSavedSettings.getU32("CameraPresetType");
- LLSD argument;
- argument["selected"] = (preset == CAMERA_PRESET_REAR_VIEW) && !sFreeCamera;
- getChild<LLPanelCameraItem>("rear_view")->setValue(argument);
- argument["selected"] = (preset == CAMERA_PRESET_GROUP_VIEW) && !sFreeCamera;
- getChild<LLPanelCameraItem>("group_view")->setValue(argument);
- argument["selected"] = (preset == CAMERA_PRESET_FRONT_VIEW) && !sFreeCamera;
- getChild<LLPanelCameraItem>("front_view")->setValue(argument);
- argument["selected"] = gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK;
- getChild<LLPanelCameraItem>("mouselook_view")->setValue(argument);
- argument["selected"] = mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA;
- getChild<LLPanelCameraItem>("object_view")->setValue(argument);
-}
-
-// static
-void LLFloaterCamera::onClickCameraItem(const LLSD& param)
-{
- std::string name = param.asString();
-
- if ("mouselook_view" == name)
- {
- gAgentCamera.changeCameraToMouselook();
- }
- else if ("object_view" == name)
- {
- LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance();
- if (camera_floater)
- {
- camera_floater->switchMode(CAMERA_CTRL_MODE_FREE_CAMERA);
- camera_floater->updateItemsSelection();
- }
- }
- else
- {
- LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance();
- if (camera_floater)
- camera_floater->switchMode(CAMERA_CTRL_MODE_PAN);
- switchToPreset(name);
- }
-}
-
-// static
-void LLFloaterCamera::switchToPreset(const std::string& name)
-{
- sFreeCamera = false;
- clear_camera_tool();
- if (PRESETS_REAR_VIEW == name)
- {
- gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
- }
- else if (PRESETS_SIDE_VIEW == name)
- {
- gAgentCamera.switchCameraPreset(CAMERA_PRESET_GROUP_VIEW);
- }
- else if (PRESETS_FRONT_VIEW == name)
- {
- gAgentCamera.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW);
- }
- else
- {
- gAgentCamera.switchCameraPreset(CAMERA_PRESET_CUSTOM);
- }
-
- if (gSavedSettings.getString("PresetCameraActive") != name)
- {
- LLPresetsManager::getInstance()->loadPreset(PRESETS_CAMERA, name);
- }
-
- if (isAgentAvatarValid() && gAgentAvatarp->getParent())
- {
- LLQuaternion sit_rot(gSavedSettings.getLLSD("AvatarSitRotation"));
- if (sit_rot != LLQuaternion())
- {
- gAgent.rotate(~gAgent.getFrameAgent().getQuaternion());
- gAgent.rotate(sit_rot);
- }
- else
- {
- gAgentCamera.rotateToInitSitRot();
- }
- }
- gAgentCamera.resetCameraZoomFraction();
-
- LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance();
- if (camera_floater)
- {
- camera_floater->updateItemsSelection();
- camera_floater->switchMode(CAMERA_CTRL_MODE_PRESETS);
- }
-}
-
-void LLFloaterCamera::populatePresetCombo()
-{
- LLPresetsManager::getInstance()->setPresetNamesInComboBox(PRESETS_CAMERA, mPresetCombo, EDefaultOptions::DEFAULT_HIDE);
- std::string active_preset_name = gSavedSettings.getString("PresetCameraActive");
- if (active_preset_name.empty())
- {
- gSavedSettings.setU32("CameraPresetType", CAMERA_PRESET_CUSTOM);
- updateItemsSelection();
- mPresetCombo->setLabel(getString("inactive_combo_text"));
- }
- else if ((ECameraPreset)gSavedSettings.getU32("CameraPresetType") == CAMERA_PRESET_CUSTOM)
- {
- mPresetCombo->selectByValue(active_preset_name);
- }
- else
- {
- mPresetCombo->setLabel(getString("inactive_combo_text"));
- }
- updateItemsSelection();
-}
-
-void LLFloaterCamera::onSavePreset()
-{
- LLFloaterReg::hideInstance("delete_pref_preset", PRESETS_CAMERA);
- LLFloaterReg::hideInstance("load_pref_preset", PRESETS_CAMERA);
-
- LLFloaterReg::showInstance("save_camera_preset");
-}
-
-void LLFloaterCamera::onCustomPresetSelected()
-{
- std::string selected_preset = mPresetCombo->getSelectedItemLabel();
- if (getString("inactive_combo_text") != selected_preset)
- {
- switchToPreset(selected_preset);
- }
-}
+/** + * @file llfloatercamera.cpp + * @brief Container for camera control buttons (zoom, pan, orbit) + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatercamera.h" + +// Library includes +#include "llfloaterreg.h" + +// Viewer includes +#include "llagent.h" +#include "llagentcamera.h" +#include "llpresetsmanager.h" +#include "lljoystickbutton.h" +#include "llviewercontrol.h" +#include "llviewercamera.h" +#include "lltoolmgr.h" +#include "lltoolfocus.h" +#include "llslider.h" +#include "llfirstuse.h" +#include "llhints.h" +#include "lltabcontainer.h" +#include "llviewercamera.h" +#include "llvoavatarself.h" + +static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item"); + +const F32 NUDGE_TIME = 0.25f; // in seconds +const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed + +// constants +#define ORBIT "cam_rotate_stick" +#define PAN "cam_track_stick" +#define ZOOM "zoom" +#define CONTROLS "controls" + +bool LLFloaterCamera::sFreeCamera = false; +bool LLFloaterCamera::sAppearanceEditing = false; + +// Zoom the camera in and out +class LLPanelCameraZoom +: public LLPanel +{ + LOG_CLASS(LLPanelCameraZoom); + +public: + struct Params : public LLInitParam::Block<Params, LLPanel::Params> {}; + + LLPanelCameraZoom() { onCreate(); } + + /* virtual */ bool postBuild(); + /* virtual */ void draw(); + +protected: + LLPanelCameraZoom(const Params& p) { onCreate(); } + + void onCreate(); + void onZoomPlusHeldDown(); + void onZoomMinusHeldDown(); + void onSliderValueChanged(); + void onCameraTrack(); + void onCameraRotate(); + F32 getOrbitRate(F32 time); + +private: + LLButton* mPlusBtn { nullptr }; + LLButton* mMinusBtn{ nullptr }; + LLSlider* mSlider{ nullptr }; + + friend class LLUICtrlFactory; +}; + +LLPanelCameraItem::Params::Params() +: icon_over("icon_over"), + icon_selected("icon_selected"), + picture("picture"), + text("text"), + selected_picture("selected_picture"), + mousedown_callback("mousedown_callback") +{ +} + +LLPanelCameraItem::LLPanelCameraItem(const LLPanelCameraItem::Params& p) +: LLPanel(p) +{ + LLIconCtrl::Params icon_params = p.picture; + mPicture = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mPicture); + + icon_params = p.icon_over; + mIconOver = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mIconOver); + + icon_params = p.icon_selected; + mIconSelected = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mIconSelected); + + icon_params = p.selected_picture; + mPictureSelected = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + addChild(mPictureSelected); + + LLTextBox::Params text_params = p.text; + mText = LLUICtrlFactory::create<LLTextBox>(text_params); + addChild(mText); + + if (p.mousedown_callback.isProvided()) + { + setCommitCallback(initCommitCallback(p.mousedown_callback)); + } +} + +void set_view_visible(LLView* parent, const std::string& name, bool visible) +{ + parent->getChildView(name)->setVisible(visible); +} + +bool LLPanelCameraItem::postBuild() +{ + setMouseEnterCallback(boost::bind(set_view_visible, this, "hovered_icon", true)); + setMouseLeaveCallback(boost::bind(set_view_visible, this, "hovered_icon", false)); + setMouseDownCallback(boost::bind(&LLPanelCameraItem::onAnyMouseClick, this)); + setRightMouseDownCallback(boost::bind(&LLPanelCameraItem::onAnyMouseClick, this)); + return true; +} + +void LLPanelCameraItem::onAnyMouseClick() +{ + if (mCommitSignal) (*mCommitSignal)(this, LLSD()); +} + +void LLPanelCameraItem::setValue(const LLSD& value) +{ + if (!value.isMap()) return;; + if (!value.has("selected")) return; + getChildView("selected_icon")->setVisible( value["selected"]); + getChildView("picture")->setVisible( !value["selected"]); + getChildView("selected_picture")->setVisible( value["selected"]); +} + +static LLPanelInjector<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel"); + +//------------------------------------------------------------------------------- +// LLPanelCameraZoom +//------------------------------------------------------------------------------- + +void LLPanelCameraZoom::onCreate() +{ + mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); + mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); + mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this)); + mCommitCallbackRegistrar.add("Camera.track", boost::bind(&LLPanelCameraZoom::onCameraTrack, this)); + mCommitCallbackRegistrar.add("Camera.rotate", boost::bind(&LLPanelCameraZoom::onCameraRotate, this)); +} + +bool LLPanelCameraZoom::postBuild() +{ + mPlusBtn = getChild<LLButton>("zoom_plus_btn"); + mMinusBtn = getChild<LLButton>("zoom_minus_btn"); + mSlider = getChild<LLSlider>("zoom_slider"); + return LLPanel::postBuild(); +} + +void LLPanelCameraZoom::draw() +{ + mSlider->setValue(gAgentCamera.getCameraZoomFraction()); + LLPanel::draw(); +} + +void LLPanelCameraZoom::onZoomPlusHeldDown() +{ + F32 val = mSlider->getValueF32(); + F32 inc = mSlider->getIncrement(); + mSlider->setValue(val - inc); + F32 time = mPlusBtn->getHeldDownTime(); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitInKey(getOrbitRate(time)); +} + +void LLPanelCameraZoom::onZoomMinusHeldDown() +{ + F32 val = mSlider->getValueF32(); + F32 inc = mSlider->getIncrement(); + mSlider->setValue(val + inc); + F32 time = mMinusBtn->getHeldDownTime(); + gAgentCamera.unlockView(); + gAgentCamera.setOrbitOutKey(getOrbitRate(time)); +} + +void LLPanelCameraZoom::onCameraTrack() +{ + // EXP-202 when camera panning activated, remove the hint + LLFirstUse::viewPopup( false ); +} + +void LLPanelCameraZoom::onCameraRotate() +{ + // EXP-202 when camera rotation activated, remove the hint + LLFirstUse::viewPopup( false ); +} + +F32 LLPanelCameraZoom::getOrbitRate(F32 time) +{ + if( time < NUDGE_TIME ) + { + F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME; + return rate; + } + else + { + return 1; + } +} + +void LLPanelCameraZoom::onSliderValueChanged() +{ + F32 zoom_level = mSlider->getValueF32(); + gAgentCamera.setCameraZoomFraction(zoom_level); +} + +void activate_camera_tool() +{ + LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance()); +}; + +class LLCameraInfoPanel : public LLPanel +{ +public: + typedef std::function<LLVector3()> get_vector_t; + + LLCameraInfoPanel( + const LLView* parent, + const char* title, + const LLCoordFrame& camera, + const get_vector_t get_focus + ) + : LLPanel([&]() -> LLPanel::Params + { + LLPanel::Params params; + params.rect = LLRect(parent->getLocalRect()); + return params; + }()) + , mTitle(title) + , mCamera(camera) + , mGetFocus(get_focus) + , mFont(LLFontGL::getFontSansSerifBig()) + { + } + + virtual void draw() override + { + LLPanel::draw(); + + static const U32 HPADDING = 10; + static const U32 VPADDING = 5; + LLVector3 focus = mGetFocus(); + LLVector3 sight = focus - mCamera.mOrigin; + std::pair<const char*, const LLVector3&> const data[] = + { + { "Origin:", mCamera.mOrigin }, + { "X Axis:", mCamera.mXAxis }, + { "Y Axis:", mCamera.mYAxis }, + { "Z Axis:", mCamera.mZAxis }, + { "Focus:", focus }, + { "Sight:", sight } + }; + S32 width = getRect().getWidth(); + S32 height = getRect().getHeight(); + S32 row_count = 1 + sizeof(data) / sizeof(*data); + S32 row_height = (height - VPADDING * 2) / row_count; + S32 top = height - VPADDING - row_height / 2; + mFont->renderUTF8(mTitle, 0, HPADDING, top, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER); + for (const auto& row : data) + { + top -= row_height; + mFont->renderUTF8(row.first, 0, HPADDING, top, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER); + const LLVector3& vector = row.second; + for (S32 i = 0; i < 3; ++i) + { + std::string text = llformat("%.6f", vector[i]); + S32 right = width / 4 * (i + 2) - HPADDING; + mFont->renderUTF8(text, 0, right, top, LLColor4::white, LLFontGL::RIGHT, LLFontGL::VCENTER); + } + } + } + +private: + const char* mTitle; + const LLCoordFrame& mCamera; + const get_vector_t mGetFocus; + const LLFontGL* mFont; +}; + +// +// Member functions +// + +// static +bool LLFloaterCamera::inFreeCameraMode() +{ + LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); + if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK) + { + return true; + } + return false; +} + +// static +void LLFloaterCamera::resetCameraMode() +{ + LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); + if (!floater_camera) return; + floater_camera->switchMode(CAMERA_CTRL_MODE_PAN); +} + +// static +void LLFloaterCamera::onAvatarEditingAppearance(bool editing) +{ + sAppearanceEditing = editing; + LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); + if (!floater_camera) return; + floater_camera->handleAvatarEditingAppearance(editing); +} + +// static +void LLFloaterCamera::onDebugCameraToggled() +{ + if (LLFloaterCamera* instance = LLFloaterCamera::findInstance()) + { + instance->showDebugInfo(LLView::sDebugCamera); + } + + if (LLView::sDebugCamera) + { + LLFloaterReg::showInstanceOrBringToFront("camera"); + } +} + +void LLFloaterCamera::showDebugInfo(bool show) +{ + // Initially LLPanel contains 1 child "view_border" + if (show && mViewerCameraInfo->getChildCount() < 2) + { + mViewerCameraInfo->addChild(new LLCameraInfoPanel(mViewerCameraInfo, "Viewer Camera", *LLViewerCamera::getInstance(), + []() { return LLViewerCamera::getInstance()->getPointOfInterest(); })); + mAgentCameraInfo->addChild(new LLCameraInfoPanel(mAgentCameraInfo, "Agent Camera", gAgent.getFrameAgent(), + []() { return gAgent.getPosAgentFromGlobal(gAgentCamera.calcFocusPositionTargetGlobal()); })); + } + + mAgentCameraInfo->setVisible(show); + mViewerCameraInfo->setVisible(show); +} + +void LLFloaterCamera::handleAvatarEditingAppearance(bool editing) +{ +} + +void LLFloaterCamera::update() +{ + ECameraControlMode mode = determineMode(); + if (mode != mCurrMode) + { + setMode(mode); + } +} + + +void LLFloaterCamera::toPrevMode() +{ + switchMode(mPrevMode); +} + +// static +void LLFloaterCamera::onLeavingMouseLook() +{ + LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance(); + if (floater_camera) + { + floater_camera->updateItemsSelection(); + if(floater_camera->inFreeCameraMode()) + { + activate_camera_tool(); + } + } +} + +LLFloaterCamera* LLFloaterCamera::findInstance() +{ + return LLFloaterReg::findTypedInstance<LLFloaterCamera>("camera"); +} + +void LLFloaterCamera::onOpen(const LLSD& key) +{ + LLFirstUse::viewPopup(); + + mZoom->onOpen(key); + + // Returns to previous mode, see EXT-2727(View tool should remember state). + // In case floater was just hidden and it isn't reset the mode + // just update state to current one. Else go to previous. + if ( !mClosed ) + updateState(); + else + toPrevMode(); + mClosed = false; + + populatePresetCombo(); + + showDebugInfo(LLView::sDebugCamera); +} + +void LLFloaterCamera::onClose(bool app_quitting) +{ + //We don't care of camera mode if app is quitting + if (app_quitting) + return; + // It is necessary to reset mCurrMode to CAMERA_CTRL_MODE_PAN so + // to avoid seeing an empty floater when reopening the control. + if (mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA) + mCurrMode = CAMERA_CTRL_MODE_PAN; + // When mCurrMode is in CAMERA_CTRL_MODE_PAN + // switchMode won't modify mPrevMode, so force it here. + // It is needed to correctly return to previous mode on open, see EXT-2727. + if (mCurrMode == CAMERA_CTRL_MODE_PAN) + mPrevMode = CAMERA_CTRL_MODE_PAN; + + switchMode(CAMERA_CTRL_MODE_PAN); + mClosed = true; + + gAgent.setMovementLocked(false); +} + +LLFloaterCamera::LLFloaterCamera(const LLSD& val) +: LLFloater(val), + mClosed(false), + mCurrMode(CAMERA_CTRL_MODE_PAN), + mPrevMode(CAMERA_CTRL_MODE_PAN) +{ + LLHints::getInstance()->registerHintTarget("view_popup", getHandle()); + mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); + mCommitCallbackRegistrar.add("CameraPresets.Save", boost::bind(&LLFloaterCamera::onSavePreset, this)); + mCommitCallbackRegistrar.add("CameraPresets.ShowPresetsList", boost::bind(&LLFloaterReg::showInstance, "camera_presets", LLSD(), false)); +} + +// virtual +bool LLFloaterCamera::postBuild() +{ + updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) + + mControls = getChild<LLPanel>("controls"); + mAgentCameraInfo = getChild<LLPanel>("agent_camera_info"); + mViewerCameraInfo = getChild<LLPanel>("viewer_camera_info"); + mRotate = getChild<LLJoystickCameraRotate>(ORBIT); + mZoom = getChild<LLPanelCameraZoom>(ZOOM); + mTrack = getChild<LLJoystickCameraTrack>(PAN); + mPresetCombo = getChild<LLComboBox>("preset_combo"); + mPreciseCtrls = getChild<LLTextBox>("precise_ctrs_label"); + + mPreciseCtrls->setShowCursorHand(false); + mPreciseCtrls->setSoundFlags(LLView::MOUSE_UP); + mPreciseCtrls->setClickedCallback(boost::bind(&LLFloaterReg::showInstance, "prefs_view_advanced", LLSD(), false)); + + mPresetCombo->setCommitCallback(boost::bind(&LLFloaterCamera::onCustomPresetSelected, this)); + LLPresetsManager::getInstance()->setPresetListChangeCameraCallback(boost::bind(&LLFloaterCamera::populatePresetCombo, this)); + + update(); + + // ensure that appearance mode is handled while building. See EXT-7796. + handleAvatarEditingAppearance(sAppearanceEditing); + + return LLFloater::postBuild(); +} + +F32 LLFloaterCamera::getCurrentTransparency() +{ + + static LLCachedControl<F32> camera_opacity(gSavedSettings, "CameraOpacity"); + static LLCachedControl<F32> active_floater_transparency(gSavedSettings, "ActiveFloaterTransparency"); + return llmin(camera_opacity(), active_floater_transparency()); + +} + +void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel) +{ + // copying child list and then iterating over a copy, because list itself + // is changed in process + const child_list_t child_list = *panel->getChildList(); + child_list_t::const_reverse_iterator iter = child_list.rbegin(); + child_list_t::const_reverse_iterator end = child_list.rend(); + for ( ; iter != end; ++iter) + { + LLView* view = *iter; + LLPanel* item = dynamic_cast<LLPanel*>(view); + if (panel) + list->addItem(item); + } + +} + +ECameraControlMode LLFloaterCamera::determineMode() +{ + if (sAppearanceEditing) + { + // this is the only enabled camera mode while editing agent appearance. + return CAMERA_CTRL_MODE_PAN; + } + + LLTool* curr_tool = LLToolMgr::getInstance()->getCurrentTool(); + if (curr_tool == LLToolCamera::getInstance()) + { + return CAMERA_CTRL_MODE_FREE_CAMERA; + } + + if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) + { + return CAMERA_CTRL_MODE_PRESETS; + } + + return CAMERA_CTRL_MODE_PAN; +} + + +void clear_camera_tool() +{ + LLToolMgr* tool_mgr = LLToolMgr::getInstance(); + if (tool_mgr->usingTransientTool() && + tool_mgr->getCurrentTool() == LLToolCamera::getInstance()) + { + tool_mgr->clearTransientTool(); + } +} + + +void LLFloaterCamera::setMode(ECameraControlMode mode) +{ + if (mode != mCurrMode) + { + mPrevMode = mCurrMode; + mCurrMode = mode; + } + + updateState(); +} + +void LLFloaterCamera::switchMode(ECameraControlMode mode) +{ + switch (mode) + { + case CAMERA_CTRL_MODE_PRESETS: + case CAMERA_CTRL_MODE_PAN: + sFreeCamera = false; + setMode(mode); // depends onto sFreeCamera + clear_camera_tool(); + break; + + case CAMERA_CTRL_MODE_FREE_CAMERA: + sFreeCamera = true; + setMode(mode); + activate_camera_tool(); + break; + + default: + //normally we won't occur here + llassert_always(false); + } +} + +void LLFloaterCamera::updateState() +{ + updateItemsSelection(); + + if (CAMERA_CTRL_MODE_FREE_CAMERA == mCurrMode) + { + return; + } + + //updating buttons + std::map<ECameraControlMode, LLButton*>::const_iterator iter = mMode2Button.begin(); + for (; iter != mMode2Button.end(); ++iter) + { + iter->second->setToggleState(iter->first == mCurrMode); + } +} + +void LLFloaterCamera::updateItemsSelection() +{ + ECameraPreset preset = (ECameraPreset) gSavedSettings.getU32("CameraPresetType"); + LLSD argument; + argument["selected"] = (preset == CAMERA_PRESET_REAR_VIEW) && !sFreeCamera; + getChild<LLPanelCameraItem>("rear_view")->setValue(argument); + argument["selected"] = (preset == CAMERA_PRESET_GROUP_VIEW) && !sFreeCamera; + getChild<LLPanelCameraItem>("group_view")->setValue(argument); + argument["selected"] = (preset == CAMERA_PRESET_FRONT_VIEW) && !sFreeCamera; + getChild<LLPanelCameraItem>("front_view")->setValue(argument); + argument["selected"] = gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK; + getChild<LLPanelCameraItem>("mouselook_view")->setValue(argument); + argument["selected"] = mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA; + getChild<LLPanelCameraItem>("object_view")->setValue(argument); +} + +// static +void LLFloaterCamera::onClickCameraItem(const LLSD& param) +{ + std::string name = param.asString(); + + if ("mouselook_view" == name) + { + gAgentCamera.changeCameraToMouselook(); + } + else if ("object_view" == name) + { + LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance(); + if (camera_floater) + { + camera_floater->switchMode(CAMERA_CTRL_MODE_FREE_CAMERA); + camera_floater->updateItemsSelection(); + } + } + else + { + LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance(); + if (camera_floater) + camera_floater->switchMode(CAMERA_CTRL_MODE_PAN); + switchToPreset(name); + } +} + +// static +void LLFloaterCamera::switchToPreset(const std::string& name) +{ + sFreeCamera = false; + clear_camera_tool(); + if (PRESETS_REAR_VIEW == name) + { + gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW); + } + else if (PRESETS_SIDE_VIEW == name) + { + gAgentCamera.switchCameraPreset(CAMERA_PRESET_GROUP_VIEW); + } + else if (PRESETS_FRONT_VIEW == name) + { + gAgentCamera.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW); + } + else + { + gAgentCamera.switchCameraPreset(CAMERA_PRESET_CUSTOM); + } + + if (gSavedSettings.getString("PresetCameraActive") != name) + { + LLPresetsManager::getInstance()->loadPreset(PRESETS_CAMERA, name); + } + + if (isAgentAvatarValid() && gAgentAvatarp->getParent()) + { + LLQuaternion sit_rot(gSavedSettings.getLLSD("AvatarSitRotation")); + if (sit_rot != LLQuaternion()) + { + gAgent.rotate(~gAgent.getFrameAgent().getQuaternion()); + gAgent.rotate(sit_rot); + } + else + { + gAgentCamera.rotateToInitSitRot(); + } + } + gAgentCamera.resetCameraZoomFraction(); + + LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance(); + if (camera_floater) + { + camera_floater->updateItemsSelection(); + camera_floater->switchMode(CAMERA_CTRL_MODE_PRESETS); + } +} + +void LLFloaterCamera::populatePresetCombo() +{ + LLPresetsManager::getInstance()->setPresetNamesInComboBox(PRESETS_CAMERA, mPresetCombo, EDefaultOptions::DEFAULT_HIDE); + std::string active_preset_name = gSavedSettings.getString("PresetCameraActive"); + if (active_preset_name.empty()) + { + gSavedSettings.setU32("CameraPresetType", CAMERA_PRESET_CUSTOM); + updateItemsSelection(); + mPresetCombo->setLabel(getString("inactive_combo_text")); + } + else if ((ECameraPreset)gSavedSettings.getU32("CameraPresetType") == CAMERA_PRESET_CUSTOM) + { + mPresetCombo->selectByValue(active_preset_name); + } + else + { + mPresetCombo->setLabel(getString("inactive_combo_text")); + } + updateItemsSelection(); +} + +void LLFloaterCamera::onSavePreset() +{ + LLFloaterReg::hideInstance("delete_pref_preset", PRESETS_CAMERA); + LLFloaterReg::hideInstance("load_pref_preset", PRESETS_CAMERA); + + LLFloaterReg::showInstance("save_camera_preset"); +} + +void LLFloaterCamera::onCustomPresetSelected() +{ + std::string selected_preset = mPresetCombo->getSelectedItemLabel(); + if (getString("inactive_combo_text") != selected_preset) + { + switchToPreset(selected_preset); + } +} |