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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lljoystickbutton.cpp
  3.  * @brief LLJoystick class implementation
  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 "lljoystickbutton.h"
  34. // Library includes
  35. #include "llcoord.h"
  36. #include "indra_constants.h"
  37. #include "llrender.h"
  38. // Project includes
  39. #include "llui.h"
  40. #include "llagent.h"
  41. #include "llviewertexture.h"
  42. #include "llviewertexturelist.h"
  43. #include "llviewerwindow.h"
  44. #include "llmoveview.h"
  45. #include "llglheaders.h"
  46. static LLDefaultChildRegistry::Register<LLJoystickAgentSlide> r1("joystick_slide");
  47. static LLDefaultChildRegistry::Register<LLJoystickAgentTurn> r2("joystick_turn");
  48. static LLDefaultChildRegistry::Register<LLJoystickCameraRotate> r3("joystick_rotate");
  49. static LLDefaultChildRegistry::Register<LLJoystickCameraZoom> r4("joystick_zoom");
  50. static LLDefaultChildRegistry::Register<LLJoystickCameraTrack> r5("joystick_track");
  51. const F32 NUDGE_TIME = 0.25f; // in seconds
  52. const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
  53. //
  54. // Public Methods
  55. //
  56. void QuadrantNames::declareValues()
  57. {
  58. declare("origin", JQ_ORIGIN);
  59. declare("up", JQ_UP);
  60. declare("down", JQ_DOWN);
  61. declare("left", JQ_LEFT);
  62. declare("right", JQ_RIGHT);
  63. }
  64. LLJoystick::LLJoystick(const LLJoystick::Params& p)
  65. : LLButton(p),
  66. mInitialOffset(0, 0),
  67. mLastMouse(0, 0),
  68. mFirstMouse(0, 0),
  69. mVertSlopNear(0),
  70. mVertSlopFar(0),
  71. mHorizSlopNear(0),
  72. mHorizSlopFar(0),
  73. mHeldDown(FALSE),
  74. mHeldDownTimer(),
  75. mInitialQuadrant(p.quadrant)
  76. {
  77. setHeldDownCallback(&LLJoystick::onBtnHeldDown, this);
  78. }
  79. void LLJoystick::updateSlop()
  80. {
  81. mVertSlopNear = getRect().getHeight();
  82. mVertSlopFar = getRect().getHeight() * 2;
  83. mHorizSlopNear = getRect().getWidth();
  84. mHorizSlopFar = getRect().getWidth() * 2;
  85. // Compute initial mouse offset based on initial quadrant.
  86. // Place the mouse evenly between the near and far zones.
  87. switch (mInitialQuadrant)
  88. {
  89. case JQ_ORIGIN:
  90. mInitialOffset.set(0, 0);
  91. break;
  92. case JQ_UP:
  93. mInitialOffset.mX = 0;
  94. mInitialOffset.mY = (mVertSlopNear + mVertSlopFar) / 2;
  95. break;
  96. case JQ_DOWN:
  97. mInitialOffset.mX = 0;
  98. mInitialOffset.mY = - (mVertSlopNear + mVertSlopFar) / 2;
  99. break;
  100. case JQ_LEFT:
  101. mInitialOffset.mX = - (mHorizSlopNear + mHorizSlopFar) / 2;
  102. mInitialOffset.mY = 0;
  103. break;
  104. case JQ_RIGHT:
  105. mInitialOffset.mX = (mHorizSlopNear + mHorizSlopFar) / 2;
  106. mInitialOffset.mY = 0;
  107. break;
  108. default:
  109. llerrs << "LLJoystick::LLJoystick() - bad switch case" << llendl;
  110. break;
  111. }
  112. return;
  113. }
  114. bool LLJoystick::pointInCircle(S32 x, S32 y) const 
  115. if(this->getLocalRect().getHeight() != this->getLocalRect().getWidth())
  116. {
  117. llwarns << "Joystick shape is not square"<<llendl;
  118. return true;
  119. }
  120. //center is x and y coordinates of center of joystick circle, and also its radius
  121. int center = this->getLocalRect().getHeight()/2;
  122. bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center;
  123. return in_circle;
  124. }
  125. BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
  126. {
  127. //llinfos << "joystick mouse down " << x << ", " << y << llendl;
  128. bool handles = false;
  129. if(pointInCircle(x, y))
  130. {
  131. mLastMouse.set(x, y);
  132. mFirstMouse.set(x, y);
  133. mMouseDownTimer.reset();
  134. handles = LLButton::handleMouseDown(x, y, mask);
  135. }
  136. return handles;
  137. }
  138. BOOL LLJoystick::handleMouseUp(S32 x, S32 y, MASK mask)
  139. {
  140. // llinfos << "joystick mouse up " << x << ", " << y << llendl;
  141. if( hasMouseCapture() )
  142. {
  143. mLastMouse.set(x, y);
  144. mHeldDown = FALSE;
  145. onMouseUp();
  146. }
  147. return LLButton::handleMouseUp(x, y, mask);
  148. }
  149. BOOL LLJoystick::handleHover(S32 x, S32 y, MASK mask)
  150. {
  151. if( hasMouseCapture() )
  152. {
  153. mLastMouse.set(x, y);
  154. }
  155. return LLButton::handleHover(x, y, mask);
  156. }
  157. F32 LLJoystick::getElapsedHeldDownTime()
  158. {
  159. if( mHeldDown )
  160. {
  161. return getHeldDownTime();
  162. }
  163. else
  164. {
  165. return 0.f;
  166. }
  167. }
  168. // static
  169. void LLJoystick::onBtnHeldDown(void *userdata)
  170. {
  171. LLJoystick *self = (LLJoystick *)userdata;
  172. if (self)
  173. {
  174. self->mHeldDown = TRUE;
  175. self->onHeldDown();
  176. }
  177. }
  178. EJoystickQuadrant LLJoystick::selectQuadrant(LLXMLNodePtr node)
  179. {
  180. EJoystickQuadrant quadrant = JQ_RIGHT;
  181. if (node->hasAttribute("quadrant"))
  182. {
  183. std::string quadrant_name;
  184. node->getAttributeString("quadrant", quadrant_name);
  185. quadrant = quadrantFromName(quadrant_name);
  186. }
  187. return quadrant;
  188. }
  189. std::string LLJoystick::nameFromQuadrant(EJoystickQuadrant quadrant)
  190. {
  191. if (quadrant == JQ_ORIGIN)     return std::string("origin");
  192. else if (quadrant == JQ_UP)     return std::string("up");
  193. else if (quadrant == JQ_DOWN) return std::string("down");
  194. else if (quadrant == JQ_LEFT) return std::string("left");
  195. else if (quadrant == JQ_RIGHT) return std::string("right");
  196. else return std::string();
  197. }
  198. EJoystickQuadrant LLJoystick::quadrantFromName(const std::string& sQuadrant)
  199. {
  200. EJoystickQuadrant quadrant = JQ_RIGHT;
  201. if (sQuadrant == "origin")
  202. {
  203. quadrant = JQ_ORIGIN;
  204. }
  205. else if (sQuadrant == "up")
  206. {
  207. quadrant = JQ_UP;
  208. }
  209. else if (sQuadrant == "down")
  210. {
  211. quadrant = JQ_DOWN;
  212. }
  213. else if (sQuadrant == "left")
  214. {
  215. quadrant = JQ_LEFT;
  216. }
  217. else if (sQuadrant == "right")
  218. {
  219. quadrant = JQ_RIGHT;
  220. }
  221. return quadrant;
  222. }
  223. //-------------------------------------------------------------------------------
  224. // LLJoystickAgentTurn
  225. //-------------------------------------------------------------------------------
  226. void LLJoystickAgentTurn::onHeldDown()
  227. {
  228. F32 time = getElapsedHeldDownTime();
  229. updateSlop();
  230. //llinfos << "move forward/backward (and/or turn)" << llendl;
  231. S32 dx = mLastMouse.mX - mFirstMouse.mX + mInitialOffset.mX;
  232. S32 dy = mLastMouse.mY - mFirstMouse.mY + mInitialOffset.mY;
  233. float m = (float) (dx)/abs(dy);
  234. if (m > 1) {
  235. m = 1;
  236. }
  237. else if (m < -1) {
  238. m = -1;
  239. }
  240. gAgent.moveYaw(-LLFloaterMove::getYawRate(time)*m);
  241. // handle forward/back movement
  242. if (dy > mVertSlopFar)
  243. {
  244. // ...if mouse is forward of run region run forward
  245. gAgent.moveAt(1);
  246. }
  247. else if (dy > mVertSlopNear)
  248. {
  249. if( time < NUDGE_TIME )
  250. {
  251. gAgent.moveAtNudge(1);
  252. }
  253. else
  254. {
  255. // ...else if mouse is forward of walk region walk forward
  256. // JC 9/5/2002 - Always run / move quickly.
  257. gAgent.moveAt(1);
  258. }
  259. }
  260. else if (dy < -mVertSlopFar)
  261. {
  262. // ...else if mouse is behind run region run backward
  263. gAgent.moveAt(-1);
  264. }
  265. else if (dy < -mVertSlopNear)
  266. {
  267. if( time < NUDGE_TIME )
  268. {
  269. gAgent.moveAtNudge(-1);
  270. }
  271. else
  272. {
  273. // ...else if mouse is behind walk region walk backward
  274. // JC 9/5/2002 - Always run / move quickly.
  275. gAgent.moveAt(-1);
  276. }
  277. }
  278. }
  279. //-------------------------------------------------------------------------------
  280. // LLJoystickAgentSlide
  281. //-------------------------------------------------------------------------------
  282. void LLJoystickAgentSlide::onMouseUp()
  283. {
  284. F32 time = getElapsedHeldDownTime();
  285. if( time < NUDGE_TIME )
  286. {
  287. switch (mInitialQuadrant)
  288. {
  289. case JQ_LEFT:
  290. gAgent.moveLeftNudge(1);
  291. break;
  292. case JQ_RIGHT:
  293. gAgent.moveLeftNudge(-1);
  294. break;
  295. default:
  296. break;
  297. }
  298. }
  299. }
  300. void LLJoystickAgentSlide::onHeldDown()
  301. {
  302. //llinfos << "slide left/right (and/or move forward/backward)" << llendl;
  303. updateSlop();
  304. S32 dx = mLastMouse.mX - mFirstMouse.mX + mInitialOffset.mX;
  305. S32 dy = mLastMouse.mY - mFirstMouse.mY + mInitialOffset.mY;
  306. // handle left-right sliding
  307. if (dx > mHorizSlopNear)
  308. {
  309. gAgent.moveLeft(-1);
  310. }
  311. else if (dx < -mHorizSlopNear)
  312. {
  313. gAgent.moveLeft(1);
  314. }
  315. // handle forward/back movement
  316. if (dy > mVertSlopFar)
  317. {
  318. // ...if mouse is forward of run region run forward
  319. gAgent.moveAt(1);
  320. }
  321. else if (dy > mVertSlopNear)
  322. {
  323. // ...else if mouse is forward of walk region walk forward
  324. gAgent.moveAtNudge(1);
  325. }
  326. else if (dy < -mVertSlopFar)
  327. {
  328. // ...else if mouse is behind run region run backward
  329. gAgent.moveAt(-1);
  330. }
  331. else if (dy < -mVertSlopNear)
  332. {
  333. // ...else if mouse is behind walk region walk backward
  334. gAgent.moveAtNudge(-1);
  335. }
  336. }
  337. //-------------------------------------------------------------------------------
  338. // LLJoystickCameraRotate
  339. //-------------------------------------------------------------------------------
  340. LLJoystickCameraRotate::LLJoystickCameraRotate(const LLJoystickCameraRotate::Params& p)
  341. : LLJoystick(p), 
  342. mInLeft( FALSE ),
  343. mInTop( FALSE ),
  344. mInRight( FALSE ),
  345. mInBottom( FALSE )
  346. { }
  347. void LLJoystickCameraRotate::updateSlop()
  348. {
  349. // do the initial offset calculation based on mousedown location
  350. // small fixed slop region
  351. mVertSlopNear = 16;
  352. mVertSlopFar = 32;
  353. mHorizSlopNear = 16;
  354. mHorizSlopFar = 32;
  355. return;
  356. }
  357. BOOL LLJoystickCameraRotate::handleMouseDown(S32 x, S32 y, MASK mask)
  358. {
  359. updateSlop();
  360. // Set initial offset based on initial click location
  361. S32 horiz_center = getRect().getWidth() / 2;
  362. S32 vert_center = getRect().getHeight() / 2;
  363. S32 dx = x - horiz_center;
  364. S32 dy = y - vert_center;
  365. if (dy > dx && dy > -dx)
  366. {
  367. // top
  368. mInitialOffset.mX = 0;
  369. mInitialOffset.mY = (mVertSlopNear + mVertSlopFar) / 2;
  370. mInitialQuadrant = JQ_UP;
  371. }
  372. else if (dy > dx && dy <= -dx)
  373. {
  374. // left
  375. mInitialOffset.mX = - (mHorizSlopNear + mHorizSlopFar) / 2;
  376. mInitialOffset.mY = 0;
  377. mInitialQuadrant = JQ_LEFT;
  378. }
  379. else if (dy <= dx && dy <= -dx)
  380. {
  381. // bottom
  382. mInitialOffset.mX = 0;
  383. mInitialOffset.mY = - (mVertSlopNear + mVertSlopFar) / 2;
  384. mInitialQuadrant = JQ_DOWN;
  385. }
  386. else
  387. {
  388. // right
  389. mInitialOffset.mX = (mHorizSlopNear + mHorizSlopFar) / 2;
  390. mInitialOffset.mY = 0;
  391. mInitialQuadrant = JQ_RIGHT;
  392. }
  393. return LLJoystick::handleMouseDown(x, y, mask);
  394. }
  395. void LLJoystickCameraRotate::onHeldDown()
  396. {
  397. updateSlop();
  398. S32 dx = mLastMouse.mX - mFirstMouse.mX + mInitialOffset.mX;
  399. S32 dy = mLastMouse.mY - mFirstMouse.mY + mInitialOffset.mY;
  400. // left-right rotation
  401. if (dx > mHorizSlopNear)
  402. {
  403. gAgent.unlockView();
  404. gAgent.setOrbitLeftKey(getOrbitRate());
  405. }
  406. else if (dx < -mHorizSlopNear)
  407. {
  408. gAgent.unlockView();
  409. gAgent.setOrbitRightKey(getOrbitRate());
  410. }
  411. // over/under rotation
  412. if (dy > mVertSlopNear)
  413. {
  414. gAgent.unlockView();
  415. gAgent.setOrbitUpKey(getOrbitRate());
  416. }
  417. else if (dy < -mVertSlopNear)
  418. {
  419. gAgent.unlockView();
  420. gAgent.setOrbitDownKey(getOrbitRate());
  421. }
  422. }
  423. F32 LLJoystickCameraRotate::getOrbitRate()
  424. {
  425. F32 time = getElapsedHeldDownTime();
  426. if( time < NUDGE_TIME )
  427. {
  428. F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME;
  429. //llinfos << rate << llendl;
  430. return rate;
  431. }
  432. else
  433. {
  434. return 1;
  435. }
  436. }
  437. // Only used for drawing
  438. void LLJoystickCameraRotate::setToggleState( BOOL left, BOOL top, BOOL right, BOOL bottom )
  439. {
  440. mInLeft = left;
  441. mInTop = top;
  442. mInRight = right;
  443. mInBottom = bottom;
  444. }
  445. void LLJoystickCameraRotate::draw()
  446. {
  447. LLGLSUIDefault gls_ui;
  448. getImageUnselected()->draw( 0, 0 );
  449. LLPointer<LLUIImage> image = getImageSelected();
  450. if( mInTop )
  451. {
  452. drawRotatedImage( getImageSelected(), 0 );
  453. }
  454. if( mInRight )
  455. {
  456. drawRotatedImage( getImageSelected(), 1 );
  457. }
  458. if( mInBottom )
  459. {
  460. drawRotatedImage( getImageSelected(), 2 );
  461. }
  462. if( mInLeft )
  463. {
  464. drawRotatedImage( getImageSelected(), 3 );
  465. }
  466. }
  467. // Draws image rotated by multiples of 90 degrees
  468. void LLJoystickCameraRotate::drawRotatedImage( LLPointer<LLUIImage> image, S32 rotations )
  469. {
  470. S32 width = image->getWidth();
  471. S32 height = image->getHeight();
  472. LLTexture* texture = image->getImage();
  473. /*
  474.  * Scale  texture coordinate system 
  475.  * to handle the different between image size and size of texture.
  476.  * If we will use default matrix, 
  477.  * it may break texture mapping after rotation.
  478.  * see EXT-2023 Camera floater: arrows became shifted when pressed.
  479.  */ 
  480. F32 uv[][2] = 
  481. {
  482. { (F32)width/texture->getWidth(), (F32)height/texture->getHeight() },
  483. { 0.f, (F32)height/texture->getHeight() },
  484. { 0.f, 0.f },
  485. { (F32)width/texture->getWidth(), 0.f }
  486. };
  487. gGL.getTexUnit(0)->bind(texture);
  488. gGL.color4fv(UI_VERTEX_COLOR.mV);
  489. gGL.begin(LLRender::QUADS);
  490. {
  491. gGL.texCoord2fv( uv[ (rotations + 0) % 4]);
  492. gGL.vertex2i(width, height );
  493. gGL.texCoord2fv( uv[ (rotations + 1) % 4]);
  494. gGL.vertex2i(0, height );
  495. gGL.texCoord2fv( uv[ (rotations + 2) % 4]);
  496. gGL.vertex2i(0, 0);
  497. gGL.texCoord2fv( uv[ (rotations + 3) % 4]);
  498. gGL.vertex2i(width, 0);
  499. }
  500. gGL.end();
  501. }
  502. //-------------------------------------------------------------------------------
  503. // LLJoystickCameraTrack
  504. //-------------------------------------------------------------------------------
  505. LLJoystickCameraTrack::Params::Params()
  506. {
  507. held_down_delay.seconds(0.0);
  508. }
  509. LLJoystickCameraTrack::LLJoystickCameraTrack(const LLJoystickCameraTrack::Params& p)
  510. : LLJoystickCameraRotate(p)
  511. {}
  512. void LLJoystickCameraTrack::onHeldDown()
  513. {
  514. updateSlop();
  515. S32 dx = mLastMouse.mX - mFirstMouse.mX + mInitialOffset.mX;
  516. S32 dy = mLastMouse.mY - mFirstMouse.mY + mInitialOffset.mY;
  517. if (dx > mVertSlopNear)
  518. {
  519. gAgent.unlockView();
  520. gAgent.setPanRightKey(getOrbitRate());
  521. }
  522. else if (dx < -mVertSlopNear)
  523. {
  524. gAgent.unlockView();
  525. gAgent.setPanLeftKey(getOrbitRate());
  526. }
  527. // over/under rotation
  528. if (dy > mVertSlopNear)
  529. {
  530. gAgent.unlockView();
  531. gAgent.setPanUpKey(getOrbitRate());
  532. }
  533. else if (dy < -mVertSlopNear)
  534. {
  535. gAgent.unlockView();
  536. gAgent.setPanDownKey(getOrbitRate());
  537. }
  538. }
  539. //-------------------------------------------------------------------------------
  540. // LLJoystickCameraZoom
  541. //-------------------------------------------------------------------------------
  542. LLJoystickCameraZoom::LLJoystickCameraZoom(const LLJoystickCameraZoom::Params& p)
  543. : LLJoystick(p),
  544. mInTop( FALSE ),
  545. mInBottom( FALSE ),
  546. mPlusInImage(p.plus_image),
  547. mMinusInImage(p.minus_image)
  548. {
  549. }
  550. BOOL LLJoystickCameraZoom::handleMouseDown(S32 x, S32 y, MASK mask)
  551. {
  552. BOOL handled = LLJoystick::handleMouseDown(x, y, mask);
  553. if( handled )
  554. {
  555. if (mFirstMouse.mY > getRect().getHeight() / 2)
  556. {
  557. mInitialQuadrant = JQ_UP;
  558. }
  559. else
  560. {
  561. mInitialQuadrant = JQ_DOWN;
  562. }
  563. }
  564. return handled;
  565. }
  566. void LLJoystickCameraZoom::onHeldDown()
  567. {
  568. updateSlop();
  569. const F32 FAST_RATE = 2.5f; // two and a half times the normal rate
  570. S32 dy = mLastMouse.mY - mFirstMouse.mY + mInitialOffset.mY;
  571. if (dy > mVertSlopFar)
  572. {
  573. // Zoom in fast
  574. gAgent.unlockView();
  575. gAgent.setOrbitInKey(FAST_RATE);
  576. }
  577. else if (dy > mVertSlopNear)
  578. {
  579. // Zoom in slow
  580. gAgent.unlockView();
  581. gAgent.setOrbitInKey(getOrbitRate());
  582. }
  583. else if (dy < -mVertSlopFar)
  584. {
  585. // Zoom out fast
  586. gAgent.unlockView();
  587. gAgent.setOrbitOutKey(FAST_RATE);
  588. }
  589. else if (dy < -mVertSlopNear)
  590. {
  591. // Zoom out slow
  592. gAgent.unlockView();
  593. gAgent.setOrbitOutKey(getOrbitRate());
  594. }
  595. }
  596. // Only used for drawing
  597. void LLJoystickCameraZoom::setToggleState( BOOL top, BOOL bottom )
  598. {
  599. mInTop = top;
  600. mInBottom = bottom;
  601. }
  602. void LLJoystickCameraZoom::draw()
  603. {
  604. if( mInTop )
  605. {
  606. mPlusInImage->draw(0,0);
  607. }
  608. else
  609. if( mInBottom )
  610. {
  611. mMinusInImage->draw(0,0);
  612. }
  613. else
  614. {
  615. getImageUnselected()->draw( 0, 0 );
  616. }
  617. }
  618. void LLJoystickCameraZoom::updateSlop()
  619. {
  620. mVertSlopNear = getRect().getHeight() / 4;
  621. mVertSlopFar = getRect().getHeight() / 2;
  622. mHorizSlopNear = getRect().getWidth() / 4;
  623. mHorizSlopFar = getRect().getWidth() / 2;
  624. // Compute initial mouse offset based on initial quadrant.
  625. // Place the mouse evenly between the near and far zones.
  626. switch (mInitialQuadrant)
  627. {
  628. case JQ_ORIGIN:
  629. mInitialOffset.set(0, 0);
  630. break;
  631. case JQ_UP:
  632. mInitialOffset.mX = 0;
  633. mInitialOffset.mY = (mVertSlopNear + mVertSlopFar) / 2;
  634. break;
  635. case JQ_DOWN:
  636. mInitialOffset.mX = 0;
  637. mInitialOffset.mY = - (mVertSlopNear + mVertSlopFar) / 2;
  638. break;
  639. case JQ_LEFT:
  640. mInitialOffset.mX = - (mHorizSlopNear + mHorizSlopFar) / 2;
  641. mInitialOffset.mY = 0;
  642. break;
  643. case JQ_RIGHT:
  644. mInitialOffset.mX = (mHorizSlopNear + mHorizSlopFar) / 2;
  645. mInitialOffset.mY = 0;
  646. break;
  647. default:
  648. llerrs << "LLJoystick::LLJoystick() - bad switch case" << llendl;
  649. break;
  650. }
  651. return;
  652. }
  653. F32 LLJoystickCameraZoom::getOrbitRate()
  654. {
  655. F32 time = getElapsedHeldDownTime();
  656. if( time < NUDGE_TIME )
  657. {
  658. F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME;
  659. // llinfos << "rate " << rate << " time " << time << llendl;
  660. return rate;
  661. }
  662. else
  663. {
  664. return 1;
  665. }
  666. }