llfloatercamera.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:10k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloatercamera.cpp
  3.  * @brief Container for camera control buttons (zoom, pan, orbit)
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llfloatercamera.h"
  34. // Library includes
  35. #include "llfloaterreg.h"
  36. // Viewer includes
  37. #include "lljoystickbutton.h"
  38. #include "llviewercontrol.h"
  39. #include "llviewercamera.h"
  40. #include "llbottomtray.h"
  41. #include "llagent.h"
  42. #include "lltoolmgr.h"
  43. #include "lltoolfocus.h"
  44. #include "llslider.h"
  45. // Constants
  46. const F32 CAMERA_BUTTON_DELAY = 0.0f;
  47. #define ORBIT "cam_rotate_stick"
  48. #define PAN "cam_track_stick"
  49. #define ZOOM "zoom"
  50. #define PRESETS "camera_presets"
  51. #define CONTROLS "controls"
  52. // Zoom the camera in and out
  53. class LLPanelCameraZoom
  54. : public LLPanel
  55. {
  56. LOG_CLASS(LLPanelCameraZoom);
  57. public:
  58. LLPanelCameraZoom();
  59. /* virtual */ BOOL postBuild();
  60. /* virtual */ void draw();
  61. protected:
  62. void onZoomPlusHeldDown();
  63. void onZoomMinusHeldDown();
  64. void onSliderValueChanged();
  65. private:
  66. LLButton* mPlusBtn;
  67. LLButton* mMinusBtn;
  68. LLSlider* mSlider;
  69. };
  70. static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel");
  71. //-------------------------------------------------------------------------------
  72. // LLPanelCameraZoom
  73. //-------------------------------------------------------------------------------
  74. LLPanelCameraZoom::LLPanelCameraZoom()
  75. : mPlusBtn( NULL ),
  76. mMinusBtn( NULL ),
  77. mSlider( NULL )
  78. {
  79. mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
  80. mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
  81. mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
  82. }
  83. BOOL LLPanelCameraZoom::postBuild()
  84. {
  85. mPlusBtn  = getChild <LLButton> ("zoom_plus_btn");
  86. mMinusBtn = getChild <LLButton> ("zoom_minus_btn");
  87. mSlider   = getChild <LLSlider> ("zoom_slider");
  88. return LLPanel::postBuild();
  89. }
  90. void LLPanelCameraZoom::draw()
  91. {
  92. mSlider->setValue(gAgent.getCameraZoomFraction());
  93. LLPanel::draw();
  94. }
  95. void LLPanelCameraZoom::onZoomPlusHeldDown()
  96. {
  97. F32 val = mSlider->getValueF32();
  98. F32 inc = mSlider->getIncrement();
  99. mSlider->setValue(val - inc);
  100. // commit only if value changed
  101. if (val != mSlider->getValueF32())
  102. mSlider->onCommit();
  103. }
  104. void LLPanelCameraZoom::onZoomMinusHeldDown()
  105. {
  106. F32 val = mSlider->getValueF32();
  107. F32 inc = mSlider->getIncrement();
  108. mSlider->setValue(val + inc);
  109. // commit only if value changed
  110. if (val != mSlider->getValueF32())
  111. mSlider->onCommit();
  112. }
  113. void  LLPanelCameraZoom::onSliderValueChanged()
  114. {
  115. F32 zoom_level = mSlider->getValueF32();
  116. gAgent.setCameraZoomFraction(zoom_level);
  117. }
  118. void activate_camera_tool()
  119. {
  120. LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
  121. };
  122. //
  123. // Member functions
  124. //
  125. /*static*/ bool LLFloaterCamera::inFreeCameraMode()
  126. {
  127. LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
  128. if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK)
  129. {
  130. return true;
  131. }
  132. return false;
  133. }
  134. bool LLFloaterCamera::inAvatarViewMode()
  135. {
  136. return mCurrMode == CAMERA_CTRL_MODE_AVATAR_VIEW;
  137. }
  138. void LLFloaterCamera::resetCameraMode()
  139. {
  140. LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
  141. if (!floater_camera) return;
  142. floater_camera->switchMode(CAMERA_CTRL_MODE_ORBIT);
  143. }
  144. void LLFloaterCamera::update()
  145. {
  146. ECameraControlMode mode = determineMode();
  147. if (mode != mCurrMode) setMode(mode);
  148. }
  149. void LLFloaterCamera::toPrevMode()
  150. {
  151. switchMode(mPrevMode);
  152. }
  153. /*static*/ void LLFloaterCamera::onLeavingMouseLook()
  154. {
  155. LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
  156. if (floater_camera && floater_camera->inFreeCameraMode())
  157. {
  158. activate_camera_tool();
  159. }
  160. }
  161. LLFloaterCamera* LLFloaterCamera::findInstance()
  162. {
  163. return LLFloaterReg::findTypedInstance<LLFloaterCamera>("camera");
  164. }
  165. void LLFloaterCamera::onOpen(const LLSD& key)
  166. {
  167. LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("camera_btn");
  168. setDockControl(new LLDockControl(
  169. anchor_panel, this,
  170. getDockTongue(), LLDockControl::TOP));
  171. mZoom->onOpen(key);
  172. // Returns to previous mode, see EXT-2727(View tool should remember state).
  173. // In case floater was just hidden and it isn't reset the mode
  174. // just update state to current one. Else go to previous.
  175. if ( !mClosed )
  176. updateState();
  177. else
  178. toPrevMode();
  179. mClosed = FALSE;
  180. }
  181. void LLFloaterCamera::onClose(bool app_quitting)
  182. {
  183. //We don't care of camera mode if app is quitting
  184. if(app_quitting)
  185. return;
  186. // When mCurrMode is in CAMERA_CTRL_MODE_ORBIT
  187. // switchMode won't modify mPrevMode, so force it here.
  188. // It is needed to correctly return to previous mode on open, see EXT-2727.
  189. if (mCurrMode == CAMERA_CTRL_MODE_ORBIT)
  190. mPrevMode = CAMERA_CTRL_MODE_ORBIT;
  191. // HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
  192. if ( !isDocked() )
  193. setDocked(true);
  194. switchMode(CAMERA_CTRL_MODE_ORBIT);
  195. mClosed = TRUE;
  196. }
  197. LLFloaterCamera::LLFloaterCamera(const LLSD& val)
  198. : LLTransientDockableFloater(NULL, true, val),
  199. mClosed(FALSE),
  200. mCurrMode(CAMERA_CTRL_MODE_ORBIT),
  201. mPrevMode(CAMERA_CTRL_MODE_ORBIT)
  202. {
  203. }
  204. // virtual
  205. BOOL LLFloaterCamera::postBuild()
  206. {
  207. setIsChrome(TRUE);
  208. mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
  209. mZoom = getChild<LLPanelCameraZoom>(ZOOM);
  210. mTrack = getChild<LLJoystickCameraTrack>(PAN);
  211. assignButton2Mode(CAMERA_CTRL_MODE_ORBIT, "orbit_btn");
  212. assignButton2Mode(CAMERA_CTRL_MODE_PAN, "pan_btn");
  213. assignButton2Mode(CAMERA_CTRL_MODE_FREE_CAMERA, "freecamera_btn");
  214. assignButton2Mode(CAMERA_CTRL_MODE_AVATAR_VIEW, "avatarview_btn");
  215. update();
  216. return LLDockableFloater::postBuild();
  217. }
  218. ECameraControlMode LLFloaterCamera::determineMode()
  219. {
  220. LLTool* curr_tool = LLToolMgr::getInstance()->getCurrentTool();
  221. if (curr_tool == LLToolCamera::getInstance())
  222. {
  223. return CAMERA_CTRL_MODE_FREE_CAMERA;
  224. if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
  225. {
  226. return CAMERA_CTRL_MODE_AVATAR_VIEW;
  227. }
  228. return CAMERA_CTRL_MODE_ORBIT;
  229. }
  230. void clear_camera_tool()
  231. {
  232. LLToolMgr* tool_mgr = LLToolMgr::getInstance();
  233. if (tool_mgr->usingTransientTool() && 
  234. tool_mgr->getCurrentTool() == LLToolCamera::getInstance())
  235. {
  236. tool_mgr->clearTransientTool();
  237. }
  238. }
  239. void LLFloaterCamera::setMode(ECameraControlMode mode)
  240. {
  241. if (mode != mCurrMode)
  242. {
  243. mPrevMode = mCurrMode;
  244. mCurrMode = mode;
  245. }
  246. updateState();
  247. }
  248. void LLFloaterCamera::switchMode(ECameraControlMode mode)
  249. {
  250. setMode(mode);
  251. switch (mode)
  252. {
  253. case CAMERA_CTRL_MODE_ORBIT:
  254. clear_camera_tool();
  255. break;
  256. case CAMERA_CTRL_MODE_PAN:
  257. clear_camera_tool();
  258. break;
  259. case CAMERA_CTRL_MODE_FREE_CAMERA:
  260. activate_camera_tool();
  261. break;
  262. case CAMERA_CTRL_MODE_AVATAR_VIEW:
  263. break;
  264. default:
  265. //normally we won't occur here
  266. llassert_always(FALSE);
  267. }
  268. }
  269. void LLFloaterCamera::onClickBtn(ECameraControlMode mode)
  270. {
  271. // check for a click on active button
  272. if (mCurrMode == mode) mMode2Button[mode]->setToggleState(TRUE);
  273. switchMode(mode);
  274. }
  275. void LLFloaterCamera::assignButton2Mode(ECameraControlMode mode, const std::string& button_name)
  276. {
  277. LLButton* button = getChild<LLButton>(button_name);
  278. button->setClickedCallback(boost::bind(&LLFloaterCamera::onClickBtn, this, mode));
  279. mMode2Button[mode] = button;
  280. }
  281. void LLFloaterCamera::updateState()
  282. {
  283. //updating buttons
  284. std::map<ECameraControlMode, LLButton*>::const_iterator iter = mMode2Button.begin();
  285. for (; iter != mMode2Button.end(); ++iter)
  286. {
  287. iter->second->setToggleState(iter->first == mCurrMode);
  288. }
  289. childSetVisible(ORBIT, CAMERA_CTRL_MODE_ORBIT == mCurrMode);
  290. childSetVisible(PAN, CAMERA_CTRL_MODE_PAN == mCurrMode);
  291. childSetVisible(ZOOM, CAMERA_CTRL_MODE_AVATAR_VIEW != mCurrMode);
  292. childSetVisible(PRESETS, CAMERA_CTRL_MODE_AVATAR_VIEW == mCurrMode);
  293. //hiding or showing the panel with controls by reshaping the floater
  294. bool showControls = CAMERA_CTRL_MODE_FREE_CAMERA != mCurrMode;
  295. if (showControls == childIsVisible(CONTROLS)) return;
  296. childSetVisible(CONTROLS, showControls);
  297. LLRect rect = getRect();
  298. LLRect controls_rect;
  299. if (childGetRect(CONTROLS, controls_rect))
  300. {
  301. S32 floater_header_size = getHeaderHeight();
  302. S32 height = controls_rect.getHeight() - floater_header_size;
  303. S32 newHeight = rect.getHeight();
  304. if (showControls)
  305. {
  306. newHeight += height;
  307. }
  308. else
  309. {
  310. newHeight -= height;
  311. }
  312. rect.setOriginAndSize(rect.mLeft, rect.mBottom, rect.getWidth(), newHeight);
  313. reshape(rect.getWidth(), rect.getHeight());
  314. setRect(rect);
  315. }
  316. }
  317. void LLFloaterCamera::onClickCameraPresets(const LLSD& param)
  318. {
  319. std::string name = param.asString();
  320. if ("rear_view" == name)
  321. {
  322. gAgent.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
  323. }
  324. else if ("group_view" == name)
  325. {
  326. gAgent.switchCameraPreset(CAMERA_PRESET_GROUP_VIEW);
  327. }
  328. else if ("front_view" == name)
  329. {
  330. gAgent.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW);
  331. }
  332. else if ("mouselook_view" == name)
  333. {
  334. gAgent.changeCameraToMouselook();
  335. }
  336. }