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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmotioncontroller.cpp
  3.  * @brief Implementation of LLMotionController class.
  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. //-----------------------------------------------------------------------------
  33. // Header Files
  34. //-----------------------------------------------------------------------------
  35. #include "linden_common.h"
  36. #include "llmemtype.h"
  37. #include "llmotioncontroller.h"
  38. #include "llkeyframemotion.h"
  39. #include "llmath.h"
  40. #include "lltimer.h"
  41. #include "llanimationstates.h"
  42. #include "llstl.h"
  43. const S32 NUM_JOINT_SIGNATURE_STRIDES = LL_CHARACTER_MAX_JOINTS / 4;
  44. const U32 MAX_MOTION_INSTANCES = 32;
  45. //-----------------------------------------------------------------------------
  46. // Constants and statics
  47. //-----------------------------------------------------------------------------
  48. LLMotionRegistry LLMotionController::sRegistry;
  49. //-----------------------------------------------------------------------------
  50. //-----------------------------------------------------------------------------
  51. // LLMotionRegistry class
  52. //-----------------------------------------------------------------------------
  53. //-----------------------------------------------------------------------------
  54. //-----------------------------------------------------------------------------
  55. // LLMotionRegistry()
  56. // Class Constructor
  57. //-----------------------------------------------------------------------------
  58. LLMotionRegistry::LLMotionRegistry()
  59. {
  60. }
  61. //-----------------------------------------------------------------------------
  62. // ~LLMotionRegistry()
  63. // Class Destructor
  64. //-----------------------------------------------------------------------------
  65. LLMotionRegistry::~LLMotionRegistry()
  66. {
  67. mMotionTable.clear();
  68. }
  69. //-----------------------------------------------------------------------------
  70. // addMotion()
  71. //-----------------------------------------------------------------------------
  72. BOOL LLMotionRegistry::registerMotion( const LLUUID& id, LLMotionConstructor constructor )
  73. {
  74. // llinfos << "Registering motion: " << name << llendl;
  75. if (!is_in_map(mMotionTable, id))
  76. {
  77. mMotionTable[id] = constructor;
  78. return TRUE;
  79. }
  80. return FALSE;
  81. }
  82. //-----------------------------------------------------------------------------
  83. // markBad()
  84. //-----------------------------------------------------------------------------
  85. void LLMotionRegistry::markBad( const LLUUID& id )
  86. {
  87. mMotionTable[id] = LLMotionConstructor(NULL);
  88. }
  89. //-----------------------------------------------------------------------------
  90. // createMotion()
  91. //-----------------------------------------------------------------------------
  92. LLMotion *LLMotionRegistry::createMotion( const LLUUID &id )
  93. {
  94. LLMotionConstructor constructor = get_if_there(mMotionTable, id, LLMotionConstructor(NULL));
  95. LLMotion* motion = NULL;
  96. if ( constructor == NULL )
  97. {
  98. // *FIX: need to replace with a better default scheme. RN
  99. motion = LLKeyframeMotion::create(id);
  100. }
  101. else
  102. {
  103. motion = constructor(id);
  104. }
  105. return motion;
  106. }
  107. //-----------------------------------------------------------------------------
  108. //-----------------------------------------------------------------------------
  109. // LLMotionController class
  110. //-----------------------------------------------------------------------------
  111. //-----------------------------------------------------------------------------
  112. //-----------------------------------------------------------------------------
  113. // LLMotionController()
  114. // Class Constructor
  115. //-----------------------------------------------------------------------------
  116. LLMotionController::LLMotionController()
  117. : mTimeFactor(1.f),
  118.   mCharacter(NULL),
  119.   mAnimTime(0.f),
  120.   mPrevTimerElapsed(0.f),
  121.   mLastTime(0.0f),
  122.   mHasRunOnce(FALSE),
  123.   mPaused(FALSE),
  124.   mPauseTime(0.f),
  125.   mTimeStep(0.f),
  126.   mTimeStepCount(0),
  127.   mLastInterp(0.f)
  128. {
  129. }
  130. //-----------------------------------------------------------------------------
  131. // ~LLMotionController()
  132. // Class Destructor
  133. //-----------------------------------------------------------------------------
  134. LLMotionController::~LLMotionController()
  135. {
  136. deleteAllMotions();
  137. }
  138. void LLMotionController::incMotionCounts(S32& num_motions, S32& num_loading_motions, S32& num_loaded_motions, S32& num_active_motions, S32& num_deprecated_motions)
  139. {
  140. num_motions += mAllMotions.size();
  141. num_loading_motions += mLoadingMotions.size();
  142. num_loaded_motions += mLoadedMotions.size();
  143. num_active_motions += mActiveMotions.size();
  144. num_deprecated_motions += mDeprecatedMotions.size();
  145. }
  146. //-----------------------------------------------------------------------------
  147. // deleteAllMotions()
  148. //-----------------------------------------------------------------------------
  149. void LLMotionController::deleteAllMotions()
  150. {
  151. mLoadingMotions.clear();
  152. mLoadedMotions.clear();
  153. mActiveMotions.clear();
  154. for_each(mAllMotions.begin(), mAllMotions.end(), DeletePairedPointer());
  155. mAllMotions.clear();
  156. }
  157. //-----------------------------------------------------------------------------
  158. // purgeExcessMotion()
  159. //-----------------------------------------------------------------------------
  160. void LLMotionController::purgeExcessMotions()
  161. {
  162. if (mLoadedMotions.size() > MAX_MOTION_INSTANCES)
  163. {
  164. // clean up deprecated motions
  165. for (motion_set_t::iterator deprecated_motion_it = mDeprecatedMotions.begin(); 
  166.  deprecated_motion_it != mDeprecatedMotions.end(); )
  167. {
  168. motion_set_t::iterator cur_iter = deprecated_motion_it++;
  169. LLMotion* cur_motionp = *cur_iter;
  170. if (!isMotionActive(cur_motionp))
  171. {
  172. // Motion is deprecated so we know it's not cannonical,
  173. //  we can safely remove the instance
  174. removeMotionInstance(cur_motionp); // modifies mDeprecatedMotions
  175. mDeprecatedMotions.erase(cur_iter);
  176. }
  177. }
  178. }
  179. std::set<LLUUID> motions_to_kill;
  180. if (mLoadedMotions.size() > MAX_MOTION_INSTANCES)
  181. {
  182. // too many motions active this frame, kill all blenders
  183. mPoseBlender.clearBlenders();
  184. for (motion_set_t::iterator loaded_motion_it = mLoadedMotions.begin(); 
  185.  loaded_motion_it != mLoadedMotions.end(); 
  186.  ++loaded_motion_it)
  187. {
  188. LLMotion* cur_motionp = *loaded_motion_it;
  189. // motion isn't playing, delete it
  190. if (!isMotionActive(cur_motionp))
  191. {
  192. motions_to_kill.insert(cur_motionp->getID());
  193. }
  194. }
  195. }
  196. // clean up all inactive, loaded motions
  197. for (std::set<LLUUID>::iterator motion_it = motions_to_kill.begin();
  198. motion_it != motions_to_kill.end();
  199. ++motion_it)
  200. {
  201. // look up the motion again by ID to get canonical instance
  202. // and kill it only if that one is inactive
  203. LLUUID motion_id = *motion_it;
  204. LLMotion* motionp = findMotion(motion_id);
  205. if (motionp && !isMotionActive(motionp))
  206. {
  207. removeMotion(motion_id);
  208. }
  209. }
  210. if (mLoadedMotions.size() > 2*MAX_MOTION_INSTANCES)
  211. {
  212. LL_WARNS_ONCE("Animation") << "> " << 2*MAX_MOTION_INSTANCES << " Loaded Motions" << llendl;
  213. }
  214. }
  215. //-----------------------------------------------------------------------------
  216. // deactivateStoppedMotions()
  217. //-----------------------------------------------------------------------------
  218. void LLMotionController::deactivateStoppedMotions()
  219. {
  220. // Since we're hidden, deactivate any stopped motions.
  221. for (motion_list_t::iterator iter = mActiveMotions.begin();
  222.  iter != mActiveMotions.end(); )
  223. {
  224. motion_list_t::iterator curiter = iter++;
  225. LLMotion* motionp = *curiter;
  226. if (motionp->isStopped())
  227. {
  228. deactivateMotionInstance(motionp);
  229. }
  230. }
  231. }
  232. //-----------------------------------------------------------------------------
  233. // setTimeStep()
  234. //-----------------------------------------------------------------------------
  235. void LLMotionController::setTimeStep(F32 step)
  236. {
  237. mTimeStep = step;
  238. if (step != 0.f)
  239. {
  240. // make sure timestamps conform to new quantum
  241. for (motion_list_t::iterator iter = mActiveMotions.begin();
  242.  iter != mActiveMotions.end(); ++iter)
  243. {
  244. LLMotion* motionp = *iter;
  245. F32 activation_time = motionp->mActivationTimestamp;
  246. motionp->mActivationTimestamp = (F32)(llfloor(activation_time / step)) * step;
  247. BOOL stopped = motionp->isStopped();
  248. motionp->setStopTime((F32)(llfloor(motionp->getStopTime() / step)) * step);
  249. motionp->setStopped(stopped);
  250. motionp->mSendStopTimestamp = (F32)llfloor(motionp->mSendStopTimestamp / step) * step;
  251. }
  252. }
  253. }
  254. //-----------------------------------------------------------------------------
  255. // setTimeFactor()
  256. //-----------------------------------------------------------------------------
  257. void LLMotionController::setTimeFactor(F32 time_factor)
  258. mTimeFactor = time_factor; 
  259. }
  260. //-----------------------------------------------------------------------------
  261. // setCharacter()
  262. //-----------------------------------------------------------------------------
  263. void LLMotionController::setCharacter(LLCharacter *character)
  264. {
  265. mCharacter = character;
  266. }
  267. //-----------------------------------------------------------------------------
  268. // registerMotion()
  269. //-----------------------------------------------------------------------------
  270. BOOL LLMotionController::registerMotion( const LLUUID& id, LLMotionConstructor constructor )
  271. {
  272. return sRegistry.registerMotion(id, constructor);
  273. }
  274. //-----------------------------------------------------------------------------
  275. // removeMotion()
  276. //-----------------------------------------------------------------------------
  277. void LLMotionController::removeMotion( const LLUUID& id)
  278. {
  279. LLMotion* motionp = findMotion(id);
  280. mAllMotions.erase(id);
  281. removeMotionInstance(motionp);
  282. }
  283. // removes instance of a motion from all runtime structures, but does
  284. // not erase entry by ID, as this could be a duplicate instance
  285. // use removeMotion(id) to remove all references to a given motion by id.
  286. void LLMotionController::removeMotionInstance(LLMotion* motionp)
  287. {
  288. if (motionp)
  289. {
  290. llassert(findMotion(motionp->getID()) != motionp);
  291. if (motionp->isActive())
  292. motionp->deactivate();
  293. mLoadingMotions.erase(motionp);
  294. mLoadedMotions.erase(motionp);
  295. mActiveMotions.remove(motionp);
  296. delete motionp;
  297. }
  298. }
  299. //-----------------------------------------------------------------------------
  300. // createMotion()
  301. //-----------------------------------------------------------------------------
  302. LLMotion* LLMotionController::createMotion( const LLUUID &id )
  303. {
  304. LLMemType mt(LLMemType::MTYPE_ANIMATION);
  305. // do we have an instance of this motion for this character?
  306. LLMotion *motion = findMotion(id);
  307. // if not, we need to create one
  308. if (!motion)
  309. {
  310. // look up constructor and create it
  311. motion = sRegistry.createMotion(id);
  312. if (!motion)
  313. {
  314. return NULL;
  315. }
  316. // look up name for default motions
  317. const char* motion_name = gAnimLibrary.animStateToString(id);
  318. if (motion_name)
  319. {
  320. motion->setName(motion_name);
  321. }
  322. // initialize the new instance
  323. LLMotion::LLMotionInitStatus stat = motion->onInitialize(mCharacter);
  324. switch(stat)
  325. {
  326. case LLMotion::STATUS_FAILURE:
  327. llinfos << "Motion " << id << " init failed." << llendl;
  328. sRegistry.markBad(id);
  329. delete motion;
  330. return NULL;
  331. case LLMotion::STATUS_HOLD:
  332. mLoadingMotions.insert(motion);
  333. break;
  334. case LLMotion::STATUS_SUCCESS:
  335.     // add motion to our list
  336.     mLoadedMotions.insert(motion);
  337. break;
  338. default:
  339. llerrs << "Invalid initialization status" << llendl;
  340. break;
  341. }
  342. mAllMotions[id] = motion;
  343. }
  344. return motion;
  345. }
  346. //-----------------------------------------------------------------------------
  347. // startMotion()
  348. //-----------------------------------------------------------------------------
  349. BOOL LLMotionController::startMotion(const LLUUID &id, F32 start_offset)
  350. {
  351. // do we have an instance of this motion for this character?
  352. LLMotion *motion = findMotion(id);
  353. // motion that is stopping will be allowed to stop but
  354. // replaced by a new instance of that motion
  355. if (motion
  356. && !mPaused
  357. && motion->canDeprecate()
  358. && motion->getFadeWeight() > 0.01f // not LOD-ed out
  359. && (motion->isBlending() || motion->getStopTime() != 0.f))
  360. {
  361. deprecateMotionInstance(motion);
  362. // force creation of new instance
  363. motion = NULL;
  364. }
  365. // create new motion instance
  366. if (!motion)
  367. {
  368. motion = createMotion(id);
  369. }
  370. if (!motion)
  371. {
  372. return FALSE;
  373. }
  374. //if the motion is already active and allows deprecation, then let it keep playing
  375. else if (motion->canDeprecate() && isMotionActive(motion))
  376. {
  377. return TRUE;
  378. }
  379. // llinfos << "Starting motion " << name << llendl;
  380. return activateMotionInstance(motion, mAnimTime - start_offset);
  381. }
  382. //-----------------------------------------------------------------------------
  383. // stopMotionLocally()
  384. //-----------------------------------------------------------------------------
  385. BOOL LLMotionController::stopMotionLocally(const LLUUID &id, BOOL stop_immediate)
  386. {
  387. // if already inactive, return false
  388. LLMotion *motion = findMotion(id);
  389. return stopMotionInstance(motion, stop_immediate);
  390. }
  391. BOOL LLMotionController::stopMotionInstance(LLMotion* motion, BOOL stop_immediate)
  392. {
  393. if (!motion)
  394. {
  395. return FALSE;
  396. }
  397. // If on active list, stop it
  398. if (isMotionActive(motion) && !motion->isStopped())
  399. {
  400. motion->setStopTime(mAnimTime);
  401. if (stop_immediate)
  402. {
  403. deactivateMotionInstance(motion);
  404. }
  405. return TRUE;
  406. }
  407. else if (isMotionLoading(motion))
  408. {
  409. motion->setStopped(TRUE);
  410. return TRUE;
  411. }
  412. return FALSE;
  413. }
  414. //-----------------------------------------------------------------------------
  415. // updateRegularMotions()
  416. //-----------------------------------------------------------------------------
  417. void LLMotionController::updateRegularMotions()
  418. {
  419. updateMotionsByType(LLMotion::NORMAL_BLEND);
  420. }
  421. //-----------------------------------------------------------------------------
  422. // updateAdditiveMotions()
  423. //-----------------------------------------------------------------------------
  424. void LLMotionController::updateAdditiveMotions()
  425. {
  426. updateMotionsByType(LLMotion::ADDITIVE_BLEND);
  427. }
  428. //-----------------------------------------------------------------------------
  429. // resetJointSignatures()
  430. //-----------------------------------------------------------------------------
  431. void LLMotionController::resetJointSignatures()
  432. {
  433. memset(&mJointSignature[0][0], 0, sizeof(U8) * LL_CHARACTER_MAX_JOINTS);
  434. memset(&mJointSignature[1][0], 0, sizeof(U8) * LL_CHARACTER_MAX_JOINTS);
  435. }
  436. //-----------------------------------------------------------------------------
  437. // updateIdleMotion()
  438. // minimal updates for active motions
  439. //-----------------------------------------------------------------------------
  440. void LLMotionController::updateIdleMotion(LLMotion* motionp)
  441. {
  442. if (motionp->isStopped() && mAnimTime > motionp->getStopTime() + motionp->getEaseOutDuration())
  443. {
  444. deactivateMotionInstance(motionp);
  445. }
  446. else if (motionp->isStopped() && mAnimTime > motionp->getStopTime())
  447. {
  448. // is this the first iteration in the ease out phase?
  449. if (mLastTime <= motionp->getStopTime())
  450. {
  451. // store residual weight for this motion
  452. motionp->mResidualWeight = motionp->getPose()->getWeight();
  453. }
  454. }
  455. else if (mAnimTime > motionp->mSendStopTimestamp)
  456. {
  457. // notify character of timed stop event on first iteration past sendstoptimestamp
  458. // this will only be called when an animation stops itself (runs out of time)
  459. if (mLastTime <= motionp->mSendStopTimestamp)
  460. {
  461. mCharacter->requestStopMotion( motionp );
  462. stopMotionInstance(motionp, FALSE);
  463. }
  464. }
  465. else if (mAnimTime >= motionp->mActivationTimestamp)
  466. {
  467. if (mLastTime < motionp->mActivationTimestamp)
  468. {
  469. motionp->mResidualWeight = motionp->getPose()->getWeight();
  470. }
  471. }
  472. }
  473. //-----------------------------------------------------------------------------
  474. // updateIdleActiveMotions()
  475. // Call this instead of updateMotionsByType for hidden avatars
  476. //-----------------------------------------------------------------------------
  477. void LLMotionController::updateIdleActiveMotions()
  478. {
  479. for (motion_list_t::iterator iter = mActiveMotions.begin();
  480.  iter != mActiveMotions.end(); )
  481. {
  482. motion_list_t::iterator curiter = iter++;
  483. LLMotion* motionp = *curiter;
  484. updateIdleMotion(motionp);
  485. }
  486. }
  487. //-----------------------------------------------------------------------------
  488. // updateMotionsByType()
  489. //-----------------------------------------------------------------------------
  490. void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_type)
  491. {
  492. BOOL update_result = TRUE;
  493. U8 last_joint_signature[LL_CHARACTER_MAX_JOINTS];
  494. memset(&last_joint_signature, 0, sizeof(U8) * LL_CHARACTER_MAX_JOINTS);
  495. // iterate through active motions in chronological order
  496. for (motion_list_t::iterator iter = mActiveMotions.begin();
  497.  iter != mActiveMotions.end(); )
  498. {
  499. motion_list_t::iterator curiter = iter++;
  500. LLMotion* motionp = *curiter;
  501. if (motionp->getBlendType() != anim_type)
  502. {
  503. continue;
  504. }
  505. BOOL update_motion = FALSE;
  506. if (motionp->getPose()->getWeight() < 1.f)
  507. {
  508. update_motion = TRUE;
  509. }
  510. else
  511. {
  512. // NUM_JOINT_SIGNATURE_STRIDES should be multiple of 4
  513. for (S32 i = 0; i < NUM_JOINT_SIGNATURE_STRIDES; i++)
  514. {
  515.   U32 *current_signature = (U32*)&(mJointSignature[0][i * 4]);
  516. U32 test_signature = *(U32*)&(motionp->mJointSignature[0][i * 4]);
  517. if ((*current_signature | test_signature) > (*current_signature))
  518. {
  519. *current_signature |= test_signature;
  520. update_motion = TRUE;
  521. }
  522. *((U32*)&last_joint_signature[i * 4]) = *(U32*)&(mJointSignature[1][i * 4]);
  523. current_signature = (U32*)&(mJointSignature[1][i * 4]);
  524. test_signature = *(U32*)&(motionp->mJointSignature[1][i * 4]);
  525. if ((*current_signature | test_signature) > (*current_signature))
  526. {
  527. *current_signature |= test_signature;
  528. update_motion = TRUE;
  529. }
  530. }
  531. }
  532. if (!update_motion)
  533. {
  534. updateIdleMotion(motionp);
  535. continue;
  536. }
  537. LLPose *posep = motionp->getPose();
  538. // only filter by LOD after running every animation at least once (to prime the avatar state)
  539. if (mHasRunOnce && motionp->getMinPixelArea() > mCharacter->getPixelArea())
  540. {
  541. motionp->fadeOut();
  542. //should we notify the simulator that this motion should be stopped (check even if skipped by LOD logic)
  543. if (mAnimTime > motionp->mSendStopTimestamp)
  544. {
  545. // notify character of timed stop event on first iteration past sendstoptimestamp
  546. // this will only be called when an animation stops itself (runs out of time)
  547. if (mLastTime <= motionp->mSendStopTimestamp)
  548. {
  549. mCharacter->requestStopMotion( motionp );
  550. stopMotionInstance(motionp, FALSE);
  551. }
  552. }
  553. if (motionp->getFadeWeight() < 0.01f)
  554. {
  555. if (motionp->isStopped() && mAnimTime > motionp->getStopTime() + motionp->getEaseOutDuration())
  556. {
  557. posep->setWeight(0.f);
  558. deactivateMotionInstance(motionp);
  559. }
  560. continue;
  561. }
  562. }
  563. else
  564. {
  565. motionp->fadeIn();
  566. }
  567. //**********************
  568. // MOTION INACTIVE
  569. //**********************
  570. if (motionp->isStopped() && mAnimTime > motionp->getStopTime() + motionp->getEaseOutDuration())
  571. {
  572. // this motion has gone on too long, deactivate it
  573. // did we have a chance to stop it?
  574. if (mLastTime <= motionp->getStopTime())
  575. {
  576. // if not, let's stop it this time through and deactivate it the next
  577. posep->setWeight(motionp->getFadeWeight());
  578. motionp->onUpdate(motionp->getStopTime() - motionp->mActivationTimestamp, last_joint_signature);
  579. }
  580. else
  581. {
  582. posep->setWeight(0.f);
  583. deactivateMotionInstance(motionp);
  584. continue;
  585. }
  586. }
  587. //**********************
  588. // MOTION EASE OUT
  589. //**********************
  590. else if (motionp->isStopped() && mAnimTime > motionp->getStopTime())
  591. {
  592. // is this the first iteration in the ease out phase?
  593. if (mLastTime <= motionp->getStopTime())
  594. {
  595. // store residual weight for this motion
  596. motionp->mResidualWeight = motionp->getPose()->getWeight();
  597. }
  598. if (motionp->getEaseOutDuration() == 0.f)
  599. {
  600. posep->setWeight(0.f);
  601. }
  602. else
  603. {
  604. posep->setWeight(motionp->getFadeWeight() * motionp->mResidualWeight * cubic_step(1.f - ((mAnimTime - motionp->getStopTime()) / motionp->getEaseOutDuration())));
  605. }
  606. // perform motion update
  607. update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature);
  608. }
  609. //**********************
  610. // MOTION ACTIVE
  611. //**********************
  612. else if (mAnimTime > motionp->mActivationTimestamp + motionp->getEaseInDuration())
  613. {
  614. posep->setWeight(motionp->getFadeWeight());
  615. //should we notify the simulator that this motion should be stopped?
  616. if (mAnimTime > motionp->mSendStopTimestamp)
  617. {
  618. // notify character of timed stop event on first iteration past sendstoptimestamp
  619. // this will only be called when an animation stops itself (runs out of time)
  620. if (mLastTime <= motionp->mSendStopTimestamp)
  621. {
  622. mCharacter->requestStopMotion( motionp );
  623. stopMotionInstance(motionp, FALSE);
  624. }
  625. }
  626. // perform motion update
  627. update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature);
  628. }
  629. //**********************
  630. // MOTION EASE IN
  631. //**********************
  632. else if (mAnimTime >= motionp->mActivationTimestamp)
  633. {
  634. if (mLastTime < motionp->mActivationTimestamp)
  635. {
  636. motionp->mResidualWeight = motionp->getPose()->getWeight();
  637. }
  638. if (motionp->getEaseInDuration() == 0.f)
  639. {
  640. posep->setWeight(motionp->getFadeWeight());
  641. }
  642. else
  643. {
  644. // perform motion update
  645. posep->setWeight(motionp->getFadeWeight() * motionp->mResidualWeight + (1.f - motionp->mResidualWeight) * cubic_step((mAnimTime - motionp->mActivationTimestamp) / motionp->getEaseInDuration()));
  646. }
  647. // perform motion update
  648. update_result = motionp->onUpdate(mAnimTime - motionp->mActivationTimestamp, last_joint_signature);
  649. }
  650. else
  651. {
  652. posep->setWeight(0.f);
  653. update_result = motionp->onUpdate(0.f, last_joint_signature);
  654. }
  655. // allow motions to deactivate themselves 
  656. if (!update_result)
  657. {
  658. if (!motionp->isStopped() || motionp->getStopTime() > mAnimTime)
  659. {
  660. // animation has stopped itself due to internal logic
  661. // propagate this to the network
  662. // as not all viewers are guaranteed to have access to the same logic
  663. mCharacter->requestStopMotion( motionp );
  664. stopMotionInstance(motionp, FALSE);
  665. }
  666. }
  667. // even if onupdate returns FALSE, add this motion in to the blend one last time
  668. mPoseBlender.addMotion(motionp);
  669. }
  670. }
  671. //-----------------------------------------------------------------------------
  672. // updateLoadingMotions()
  673. //-----------------------------------------------------------------------------
  674. void LLMotionController::updateLoadingMotions()
  675. {
  676. // query pending motions for completion
  677. for (motion_set_t::iterator iter = mLoadingMotions.begin();
  678.  iter != mLoadingMotions.end(); )
  679. {
  680. motion_set_t::iterator curiter = iter++;
  681. LLMotion* motionp = *curiter;
  682. if( !motionp)
  683. {
  684. continue; // maybe shouldn't happen but i've seen it -MG
  685. }
  686. LLMotion::LLMotionInitStatus status = motionp->onInitialize(mCharacter);
  687. if (status == LLMotion::STATUS_SUCCESS)
  688. {
  689. mLoadingMotions.erase(curiter);
  690. // add motion to our loaded motion list
  691. mLoadedMotions.insert(motionp);
  692. // this motion should be playing
  693. if (!motionp->isStopped())
  694. {
  695. activateMotionInstance(motionp, mAnimTime);
  696. }
  697. }
  698. else if (status == LLMotion::STATUS_FAILURE)
  699. {
  700. llinfos << "Motion " << motionp->getID() << " init failed." << llendl;
  701. sRegistry.markBad(motionp->getID());
  702. mLoadingMotions.erase(curiter);
  703. motion_set_t::iterator found_it = mDeprecatedMotions.find(motionp);
  704. if (found_it != mDeprecatedMotions.end())
  705. {
  706. mDeprecatedMotions.erase(found_it);
  707. }
  708. mAllMotions.erase(motionp->getID());
  709. delete motionp;
  710. }
  711. }
  712. }
  713. //-----------------------------------------------------------------------------
  714. // call updateMotion() or updateMotionsMinimal() every frame
  715. //-----------------------------------------------------------------------------
  716. //-----------------------------------------------------------------------------
  717. // updateMotion()
  718. //-----------------------------------------------------------------------------
  719. void LLMotionController::updateMotions(bool force_update)
  720. {
  721. BOOL use_quantum = (mTimeStep != 0.f);
  722. // Always update mPrevTimerElapsed
  723. F32 cur_time = mTimer.getElapsedTimeF32();
  724. F32 delta_time = cur_time - mPrevTimerElapsed;
  725. mPrevTimerElapsed = cur_time;
  726. mLastTime = mAnimTime;
  727. // Always cap the number of loaded motions
  728. purgeExcessMotions();
  729. // Update timing info for this time step.
  730. if (!mPaused)
  731. {
  732. F32 update_time = mAnimTime + delta_time * mTimeFactor;
  733. if (use_quantum)
  734. {
  735. F32 time_interval = fmodf(update_time, mTimeStep);
  736. // always animate *ahead* of actual time
  737. S32 quantum_count = llmax(0, llfloor((update_time - time_interval) / mTimeStep)) + 1;
  738. if (quantum_count == mTimeStepCount)
  739. {
  740. // we're still in same time quantum as before, so just interpolate and exit
  741. if (!mPaused)
  742. {
  743. F32 interp = time_interval / mTimeStep;
  744. mPoseBlender.interpolate(interp - mLastInterp);
  745. mLastInterp = interp;
  746. }
  747. updateLoadingMotions();
  748. return;
  749. }
  750. // is calculating a new keyframe pose, make sure the last one gets applied
  751. mPoseBlender.interpolate(1.f);
  752. clearBlenders();
  753. mTimeStepCount = quantum_count;
  754. mAnimTime = (F32)quantum_count * mTimeStep;
  755. mLastInterp = 0.f;
  756. }
  757. else
  758. {
  759. mAnimTime = update_time;
  760. }
  761. }
  762. updateLoadingMotions();
  763. resetJointSignatures();
  764. if (mPaused && !force_update)
  765. {
  766. updateIdleActiveMotions();
  767. }
  768. else
  769. {
  770. // update additive motions
  771. updateAdditiveMotions();
  772. resetJointSignatures();
  773. // update all regular motions
  774. updateRegularMotions();
  775. if (use_quantum)
  776. {
  777. mPoseBlender.blendAndCache(TRUE);
  778. }
  779. else
  780. {
  781. mPoseBlender.blendAndApply();
  782. }
  783. }
  784. mHasRunOnce = TRUE;
  785. // llinfos << "Motion controller time " << motionTimer.getElapsedTimeF32() << llendl;
  786. }
  787. //-----------------------------------------------------------------------------
  788. // updateMotionsMinimal()
  789. // minimal update (e.g. while hidden)
  790. //-----------------------------------------------------------------------------
  791. void LLMotionController::updateMotionsMinimal()
  792. {
  793. // Always update mPrevTimerElapsed
  794. mPrevTimerElapsed = mTimer.getElapsedTimeF32();
  795. purgeExcessMotions();
  796. updateLoadingMotions();
  797. resetJointSignatures();
  798. deactivateStoppedMotions();
  799. mHasRunOnce = TRUE;
  800. }
  801. //-----------------------------------------------------------------------------
  802. // activateMotionInstance()
  803. //-----------------------------------------------------------------------------
  804. BOOL LLMotionController::activateMotionInstance(LLMotion *motion, F32 time)
  805. {
  806. // It's not clear why the getWeight() line seems to be crashing this, but
  807. // hopefully this fixes it.
  808. if (motion == NULL || motion->getPose() == NULL)
  809. {
  810. return FALSE;
  811. }
  812. if (mLoadingMotions.find(motion) != mLoadingMotions.end())
  813. {
  814. // we want to start this motion, but we can't yet, so flag it as started
  815. motion->setStopped(FALSE);
  816. // report pending animations as activated
  817. return TRUE;
  818. }
  819. motion->mResidualWeight = motion->getPose()->getWeight();
  820. // set stop time based on given duration and ease out time
  821. if (motion->getDuration() != 0.f && !motion->getLoop())
  822. {
  823. F32 ease_out_time;
  824. F32 motion_duration;
  825. // should we stop at the end of motion duration, or a bit earlier 
  826. // to allow it to ease out while moving?
  827. ease_out_time = motion->getEaseOutDuration();
  828. // is the clock running when the motion is easing in?
  829. // if not (POSTURE_EASE) then we need to wait that much longer before triggering the stop
  830. motion_duration = llmax(motion->getDuration() - ease_out_time, 0.f);
  831. motion->mSendStopTimestamp = time + motion_duration;
  832. else
  833. {
  834. motion->mSendStopTimestamp = F32_MAX;
  835. }
  836. if (motion->isActive())
  837. {
  838. mActiveMotions.remove(motion);
  839. }
  840. mActiveMotions.push_front(motion);
  841. motion->activate(time);
  842. motion->onUpdate(0.f, mJointSignature[1]);
  843. if (mAnimTime >= motion->mSendStopTimestamp)
  844. {
  845. motion->setStopTime(motion->mSendStopTimestamp);
  846. if (motion->mResidualWeight == 0.0f)
  847. {
  848. // bit of a hack; if newly activating a motion while easing out, weight should = 1
  849. motion->mResidualWeight = 1.f;
  850. }
  851. }
  852. return TRUE;
  853. }
  854. //-----------------------------------------------------------------------------
  855. // deactivateMotionInstance()
  856. //-----------------------------------------------------------------------------
  857. BOOL LLMotionController::deactivateMotionInstance(LLMotion *motion)
  858. {
  859. motion->deactivate();
  860. motion_set_t::iterator found_it = mDeprecatedMotions.find(motion);
  861. if (found_it != mDeprecatedMotions.end())
  862. {
  863. // deprecated motions need to be completely excised
  864. removeMotionInstance(motion);
  865. mDeprecatedMotions.erase(found_it);
  866. }
  867. else
  868. {
  869. // for motions that we are keeping, simply remove from active queue
  870. mActiveMotions.remove(motion);
  871. }
  872. return TRUE;
  873. }
  874. void LLMotionController::deprecateMotionInstance(LLMotion* motion)
  875. {
  876. mDeprecatedMotions.insert(motion);
  877. //fade out deprecated motion
  878. stopMotionInstance(motion, FALSE);
  879. //no longer canonical
  880. mAllMotions.erase(motion->getID());
  881. }
  882. //-----------------------------------------------------------------------------
  883. // isMotionActive()
  884. //-----------------------------------------------------------------------------
  885. bool LLMotionController::isMotionActive(LLMotion *motion)
  886. {
  887. return (motion && motion->isActive());
  888. }
  889. //-----------------------------------------------------------------------------
  890. // isMotionLoading()
  891. //-----------------------------------------------------------------------------
  892. bool LLMotionController::isMotionLoading(LLMotion* motion)
  893. {
  894. return (mLoadingMotions.find(motion) != mLoadingMotions.end());
  895. }
  896. //-----------------------------------------------------------------------------
  897. // findMotion()
  898. //-----------------------------------------------------------------------------
  899. LLMotion* LLMotionController::findMotion(const LLUUID& id) const
  900. {
  901. motion_map_t::const_iterator iter = mAllMotions.find(id);
  902. if(iter == mAllMotions.end())
  903. {
  904. return NULL;
  905. }
  906. else
  907. {
  908. return iter->second;
  909. }
  910. }
  911. //-----------------------------------------------------------------------------
  912. // deactivateAllMotions()
  913. //-----------------------------------------------------------------------------
  914. void LLMotionController::deactivateAllMotions()
  915. {
  916. for (motion_map_t::iterator iter = mAllMotions.begin();
  917.  iter != mAllMotions.end(); iter++)
  918. {
  919. LLMotion* motionp = iter->second;
  920. deactivateMotionInstance(motionp);
  921. }
  922. }
  923. //-----------------------------------------------------------------------------
  924. // flushAllMotions()
  925. //-----------------------------------------------------------------------------
  926. void LLMotionController::flushAllMotions()
  927. {
  928. std::vector<std::pair<LLUUID,F32> > active_motions;
  929. active_motions.reserve(mActiveMotions.size());
  930. for (motion_list_t::iterator iter = mActiveMotions.begin();
  931.  iter != mActiveMotions.end(); )
  932. {
  933. motion_list_t::iterator curiter = iter++;
  934. LLMotion* motionp = *curiter;
  935. F32 dtime = mAnimTime - motionp->mActivationTimestamp;
  936. active_motions.push_back(std::make_pair(motionp->getID(),dtime));
  937. motionp->deactivate(); // don't call deactivateMotionInstance() because we are going to reactivate it
  938. }
  939.   mActiveMotions.clear();
  940. // delete all motion instances
  941. deleteAllMotions();
  942. // kill current hand pose that was previously called out by
  943. // keyframe motion
  944. mCharacter->removeAnimationData("Hand Pose");
  945. // restart motions
  946. for (std::vector<std::pair<LLUUID,F32> >::iterator iter = active_motions.begin();
  947.  iter != active_motions.end(); ++iter)
  948. {
  949. startMotion(iter->first, iter->second);
  950. }
  951. }
  952. //-----------------------------------------------------------------------------
  953. // pause()
  954. //-----------------------------------------------------------------------------
  955. void LLMotionController::pauseAllMotions()
  956. {
  957. if (!mPaused)
  958. {
  959. //llinfos << "Pausing animations..." << llendl;
  960. mPaused = TRUE;
  961. }
  962. }
  963. //-----------------------------------------------------------------------------
  964. // unpause()
  965. //-----------------------------------------------------------------------------
  966. void LLMotionController::unpauseAllMotions()
  967. {
  968. if (mPaused)
  969. {
  970. //llinfos << "Unpausing animations..." << llendl;
  971. mPaused = FALSE;
  972. }
  973. }
  974. // End