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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldriverparam.cpp
  3.  * @brief A visual parameter that drives (controls) other visual parameters.
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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 "lldriverparam.h"
  34. #include "llfasttimer.h"
  35. #include "llvoavatar.h"
  36. #include "llvoavatarself.h"
  37. #include "llagent.h"
  38. #include "llwearable.h"
  39. #include "llagentwearables.h"
  40. //-----------------------------------------------------------------------------
  41. // LLDriverParamInfo
  42. //-----------------------------------------------------------------------------
  43. LLDriverParamInfo::LLDriverParamInfo()
  44. {
  45. }
  46. BOOL LLDriverParamInfo::parseXml(LLXmlTreeNode* node)
  47. {
  48. llassert( node->hasName( "param" ) && node->getChildByName( "param_driver" ) );
  49. if( !LLViewerVisualParamInfo::parseXml( node ))
  50. return FALSE;
  51. LLXmlTreeNode* param_driver_node = node->getChildByName( "param_driver" );
  52. if( !param_driver_node )
  53. return FALSE;
  54. for (LLXmlTreeNode* child = param_driver_node->getChildByName( "driven" );
  55.  child;
  56.  child = param_driver_node->getNextNamedChild())
  57. {
  58. S32 driven_id;
  59. static LLStdStringHandle id_string = LLXmlTree::addAttributeString("id");
  60. if( child->getFastAttributeS32( id_string, driven_id ) )
  61. {
  62. F32 min1 = mMinWeight;
  63. F32 max1 = mMaxWeight;
  64. F32 max2 = max1;
  65. F32 min2 = max1;
  66. // driven    ________ //
  67. // ^        /|       | //
  68. // |       / |       |  //
  69. // |      /  |       |   //
  70. // |     /   |       |    //
  71. // |    /    |       |     //
  72. //-------|----|-------|----|-------> driver //
  73. //  | min1   max1    max2  min2
  74. static LLStdStringHandle min1_string = LLXmlTree::addAttributeString("min1");
  75. child->getFastAttributeF32( min1_string, min1 ); // optional
  76. static LLStdStringHandle max1_string = LLXmlTree::addAttributeString("max1");
  77. child->getFastAttributeF32( max1_string, max1 ); // optional
  78. static LLStdStringHandle max2_string = LLXmlTree::addAttributeString("max2");
  79. child->getFastAttributeF32( max2_string, max2 ); // optional
  80. static LLStdStringHandle min2_string = LLXmlTree::addAttributeString("min2");
  81. child->getFastAttributeF32( min2_string, min2 ); // optional
  82. // Push these on the front of the deque, so that we can construct
  83. // them in order later (faster)
  84. mDrivenInfoList.push_front( LLDrivenEntryInfo( driven_id, min1, max1, max2, min2 ) );
  85. }
  86. else
  87. {
  88. llerrs << "<driven> Unable to resolve driven parameter: " << driven_id << llendl;
  89. return FALSE;
  90. }
  91. }
  92. return TRUE;
  93. }
  94. //virtual 
  95. void LLDriverParamInfo::toStream(std::ostream &out)
  96. {
  97. LLViewerVisualParamInfo::toStream(out);
  98. out << "driver" << "t";
  99. out << mDrivenInfoList.size() << "t";
  100. for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++)
  101. {
  102. LLDrivenEntryInfo driven = *iter;
  103. out << driven.mDrivenID << "t";
  104. }
  105. out << std::endl;
  106. LLVOAvatarSelf *avatar = gAgent.getAvatarObject();
  107. if(avatar)
  108. {
  109. for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++)
  110. {
  111. LLDrivenEntryInfo driven = *iter;
  112. LLViewerVisualParam *param = (LLViewerVisualParam*)avatar->getVisualParam(driven.mDrivenID);
  113. if (param)
  114. {
  115. param->getInfo()->toStream(out);
  116. if (param->getWearableType() != mWearableType)
  117. {
  118. if(param->getCrossWearable())
  119. {
  120. out << "cross-wearable" << "t";
  121. }
  122. else
  123. {
  124. out << "ERROR!" << "t";
  125. }
  126. }
  127. else
  128. {
  129. out << "valid" << "t";
  130. }
  131. }
  132. else
  133. {
  134. llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << avatar << " for driver parameter " << getID() << llendl;
  135. }
  136. out << std::endl;
  137. }
  138. }
  139. }
  140. //-----------------------------------------------------------------------------
  141. // LLDriverParam
  142. //-----------------------------------------------------------------------------
  143. LLDriverParam::LLDriverParam(LLVOAvatar *avatarp) : 
  144. mCurrentDistortionParam( NULL ), 
  145. mAvatarp(avatarp), 
  146. mWearablep(NULL)
  147. {
  148. }
  149. LLDriverParam::LLDriverParam(LLWearable *wearablep) : 
  150. mCurrentDistortionParam( NULL ), 
  151. mAvatarp(NULL), 
  152. mWearablep(wearablep)
  153. {
  154. }
  155. LLDriverParam::~LLDriverParam()
  156. {
  157. }
  158. BOOL LLDriverParam::setInfo(LLDriverParamInfo *info)
  159. {
  160. llassert(mInfo == NULL);
  161. if (info->mID < 0)
  162. return FALSE;
  163. mInfo = info;
  164. mID = info->mID;
  165. setWeight(getDefaultWeight(), FALSE );
  166. return TRUE;
  167. }
  168. void LLDriverParam::setWearable(LLWearable *wearablep)
  169. {
  170. if (wearablep)
  171. {
  172. mWearablep = wearablep;
  173. mAvatarp = NULL;
  174. }
  175. }
  176. void LLDriverParam::setAvatar(LLVOAvatar *avatarp)
  177. {
  178. if (avatarp)
  179. {
  180. mWearablep = NULL;
  181. mAvatarp = avatarp;
  182. }
  183. }
  184. /*virtual*/ LLViewerVisualParam* LLDriverParam::cloneParam(LLWearable* wearable) const
  185. {
  186. LLDriverParam *new_param;
  187. if (wearable)
  188. {
  189. new_param = new LLDriverParam(wearable);
  190. }
  191. else
  192. {
  193. if (mWearablep)
  194. {
  195. new_param = new LLDriverParam(mWearablep);
  196. }
  197. else
  198. {
  199. new_param = new LLDriverParam(mAvatarp);
  200. }
  201. }
  202. *new_param = *this;
  203. return new_param;
  204. }
  205. #if 0 // obsolete
  206. BOOL LLDriverParam::parseData(LLXmlTreeNode* node)
  207. {
  208. LLDriverParamInfo* info = new LLDriverParamInfo;
  209. info->parseXml(node);
  210. if (!setInfo(info))
  211. {
  212. delete info;
  213. return FALSE;
  214. }
  215. return TRUE;
  216. }
  217. #endif
  218. void LLDriverParam::setWeight(F32 weight, BOOL upload_bake)
  219. {
  220. F32 min_weight = getMinWeight();
  221. F32 max_weight = getMaxWeight();
  222. if (mIsAnimating)
  223. {
  224. // allow overshoot when animating
  225. mCurWeight = weight;
  226. }
  227. else
  228. {
  229. mCurWeight = llclamp(weight, min_weight, max_weight);
  230. }
  231. // driven    ________
  232. // ^        /|       |       ^
  233. // |       / |       |       |
  234. // |      /  |       |       |
  235. // |     /   |       |       |
  236. // |    /    |       |       |
  237. //-------|----|-------|----|-------> driver
  238. //  | min1   max1    max2  min2
  239. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  240. {
  241. LLDrivenEntry* driven = &(*iter);
  242. LLDrivenEntryInfo* info = driven->mInfo;
  243. F32 driven_weight = 0.f;
  244. F32 driven_min = driven->mParam->getMinWeight();
  245. F32 driven_max = driven->mParam->getMaxWeight();
  246. if (mIsAnimating)
  247. {
  248. // driven param doesn't interpolate (textures, for example)
  249. if (!driven->mParam->getAnimating())
  250. {
  251. continue;
  252. }
  253. if( mCurWeight < info->mMin1 )
  254. {
  255. if (info->mMin1 == min_weight)
  256. {
  257. if (info->mMin1 == info->mMax1)
  258. {
  259. driven_weight = driven_max;
  260. }
  261. else
  262. {
  263. //up slope extrapolation
  264. F32 t = (mCurWeight - info->mMin1) / (info->mMax1 - info->mMin1 );
  265. driven_weight = driven_min + t * (driven_max - driven_min);
  266. }
  267. }
  268. else
  269. {
  270. driven_weight = driven_min;
  271. }
  272. setDrivenWeight(driven,driven_weight,upload_bake);
  273. continue;
  274. }
  275. else 
  276. if ( mCurWeight > info->mMin2 )
  277. {
  278. if (info->mMin2 == max_weight)
  279. {
  280. if (info->mMin2 == info->mMax2)
  281. {
  282. driven_weight = driven_max;
  283. }
  284. else
  285. {
  286. //down slope extrapolation
  287. F32 t = (mCurWeight - info->mMax2) / (info->mMin2 - info->mMax2 );
  288. driven_weight = driven_max + t * (driven_min - driven_max);
  289. }
  290. }
  291. else
  292. {
  293. driven_weight = driven_min;
  294. }
  295. setDrivenWeight(driven,driven_weight,upload_bake);
  296. continue;
  297. }
  298. }
  299. driven_weight = getDrivenWeight(driven, mCurWeight);
  300. setDrivenWeight(driven,driven_weight,upload_bake);
  301. }
  302. }
  303. F32 LLDriverParam::getTotalDistortion()
  304. {
  305. F32 sum = 0.f;
  306. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  307. {
  308. LLDrivenEntry* driven = &(*iter);
  309. sum += driven->mParam->getTotalDistortion();
  310. }
  311. return sum; 
  312. }
  313. const LLVector3 &LLDriverParam::getAvgDistortion()
  314. {
  315. // It's not actually correct to take the average of averages, but it good enough here.
  316. LLVector3 sum;
  317. S32 count = 0;
  318. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  319. {
  320. LLDrivenEntry* driven = &(*iter);
  321. sum += driven->mParam->getAvgDistortion();
  322. count++;
  323. }
  324. sum /= (F32)count;
  325. mDefaultVec = sum;
  326. return mDefaultVec; 
  327. }
  328. F32 LLDriverParam::getMaxDistortion() 
  329. {
  330. F32 max = 0.f;
  331. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  332. {
  333. LLDrivenEntry* driven = &(*iter);
  334. F32 param_max = driven->mParam->getMaxDistortion();
  335. if( param_max > max )
  336. {
  337. max = param_max;
  338. }
  339. }
  340. return max; 
  341. }
  342. LLVector3 LLDriverParam::getVertexDistortion(S32 index, LLPolyMesh *poly_mesh)
  343. {
  344. LLVector3 sum;
  345. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  346. {
  347. LLDrivenEntry* driven = &(*iter);
  348. sum += driven->mParam->getVertexDistortion( index, poly_mesh );
  349. }
  350. return sum;
  351. }
  352. const LLVector3* LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh)
  353. {
  354. mCurrentDistortionParam = NULL;
  355. const LLVector3* v = NULL;
  356. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  357. {
  358. LLDrivenEntry* driven = &(*iter);
  359. v = driven->mParam->getFirstDistortion( index, poly_mesh );
  360. if( v )
  361. {
  362. mCurrentDistortionParam = driven->mParam;
  363. break;
  364. }
  365. }
  366. return v;
  367. };
  368. const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh)
  369. {
  370. llassert( mCurrentDistortionParam );
  371. if( !mCurrentDistortionParam )
  372. {
  373. return NULL;
  374. }
  375. LLDrivenEntry* driven = NULL;
  376. entry_list_t::iterator iter;
  377. // Set mDriven iteration to the right point
  378. for( iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  379. {
  380. driven = &(*iter);
  381. if( driven->mParam == mCurrentDistortionParam )
  382. {
  383. break;
  384. }
  385. }
  386. llassert(driven);
  387. if (!driven)
  388. {
  389. return NULL; // shouldn't happen, but...
  390. }
  391. // We're already in the middle of a param's distortions, so get the next one.
  392. const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh );
  393. if( (!v) && (iter != mDriven.end()) )
  394. {
  395. // This param is finished, so start the next param.  It might not have any
  396. // distortions, though, so we have to loop to find the next param that does.
  397. for( iter++; iter != mDriven.end(); iter++ )
  398. {
  399. driven = &(*iter);
  400. v = driven->mParam->getFirstDistortion( index, poly_mesh );
  401. if( v )
  402. {
  403. mCurrentDistortionParam = driven->mParam;
  404. break;
  405. }
  406. }
  407. }
  408. return v;
  409. };
  410. //-----------------------------------------------------------------------------
  411. // setAnimationTarget()
  412. //-----------------------------------------------------------------------------
  413. void LLDriverParam::setAnimationTarget( F32 target_value, BOOL upload_bake )
  414. {
  415. LLVisualParam::setAnimationTarget(target_value, upload_bake);
  416. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  417. {
  418. LLDrivenEntry* driven = &(*iter);
  419. F32 driven_weight = getDrivenWeight(driven, mTargetWeight);
  420. // this isn't normally necessary, as driver params handle interpolation of their driven params
  421. // but texture params need to know to assume their final value at beginning of interpolation
  422. driven->mParam->setAnimationTarget(driven_weight, upload_bake);
  423. }
  424. }
  425. //-----------------------------------------------------------------------------
  426. // stopAnimating()
  427. //-----------------------------------------------------------------------------
  428. void LLDriverParam::stopAnimating(BOOL upload_bake)
  429. {
  430. LLVisualParam::stopAnimating(upload_bake);
  431. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  432. {
  433. LLDrivenEntry* driven = &(*iter);
  434. driven->mParam->setAnimating(FALSE);
  435. }
  436. }
  437. /*virtual*/ 
  438. BOOL LLDriverParam::linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params)
  439. {
  440. BOOL success = TRUE;
  441. LLDriverParamInfo::entry_info_list_t::iterator iter;
  442. for (iter = getInfo()->mDrivenInfoList.begin(); iter != getInfo()->mDrivenInfoList.end(); ++iter)
  443. {
  444. LLDrivenEntryInfo *driven_info = &(*iter);
  445. S32 driven_id = driven_info->mDrivenID;
  446. // check for already existing links. Do not overwrite.
  447. BOOL found = FALSE;
  448. for (entry_list_t::iterator driven_iter = mDriven.begin(); driven_iter != mDriven.end() && !found; ++driven_iter)
  449. {
  450. if (driven_iter->mInfo->mDrivenID == driven_id)
  451. {
  452. found = TRUE;
  453. }
  454. }
  455. if (!found)
  456. {
  457. LLViewerVisualParam* param = (LLViewerVisualParam*)mapper(driven_id);
  458. bool push = param && (!only_cross_params || param->getCrossWearable());
  459. if (push)
  460. {
  461. mDriven.push_back(LLDrivenEntry( param, driven_info ));
  462. }
  463. else
  464. {
  465. success = FALSE;
  466. }
  467. }
  468. }
  469. return success;
  470. }
  471. void LLDriverParam::resetDrivenParams()
  472. {
  473. mDriven.clear();
  474. mDriven.reserve(getInfo()->mDrivenInfoList.size());
  475. }
  476. void LLDriverParam::updateCrossDrivenParams(EWearableType driven_type)
  477. {
  478. bool needs_update = (getWearableType()==driven_type);
  479. // if the driver has a driven entry for the passed-in wearable type, we need to refresh the value
  480. for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
  481. {
  482. LLDrivenEntry* driven = &(*iter);
  483. if (driven && driven->mParam && driven->mParam->getCrossWearable() && driven->mParam->getWearableType() == driven_type)
  484. {
  485. needs_update = true;
  486. }
  487. }
  488. if (needs_update)
  489. {
  490. EWearableType driver_type = (EWearableType)getWearableType();
  491. // If we've gotten here, we've added a new wearable of type "type"
  492. // Thus this wearable needs to get updates from the driver wearable.
  493. // The call to setVisualParamWeight seems redundant, but is necessary
  494. // as the number of driven wearables has changed since the last update. -Nyx
  495. LLWearable *wearable = gAgentWearables.getTopWearable(driver_type);
  496. if (wearable)
  497. {
  498. wearable->setVisualParamWeight(mID, wearable->getVisualParamWeight(mID), false);
  499. }
  500. }
  501. }
  502. //-----------------------------------------------------------------------------
  503. // getDrivenWeight()
  504. //-----------------------------------------------------------------------------
  505. F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight)
  506. {
  507. F32 min_weight = getMinWeight();
  508. F32 max_weight = getMaxWeight();
  509. const LLDrivenEntryInfo* info = driven->mInfo;
  510. F32 driven_weight = 0.f;
  511. F32 driven_min = driven->mParam->getMinWeight();
  512. F32 driven_max = driven->mParam->getMaxWeight();
  513. if( input_weight <= info->mMin1 )
  514. {
  515. if( info->mMin1 == info->mMax1 && 
  516. info->mMin1 <= min_weight)
  517. {
  518. driven_weight = driven_max;
  519. }
  520. else
  521. {
  522. driven_weight = driven_min;
  523. }
  524. }
  525. else
  526. if( input_weight <= info->mMax1 )
  527. {
  528. F32 t = (input_weight - info->mMin1) / (info->mMax1 - info->mMin1 );
  529. driven_weight = driven_min + t * (driven_max - driven_min);
  530. }
  531. else
  532. if( input_weight <= info->mMax2 )
  533. {
  534. driven_weight = driven_max;
  535. }
  536. else
  537. if( input_weight <= info->mMin2 )
  538. {
  539. F32 t = (input_weight - info->mMax2) / (info->mMin2 - info->mMax2 );
  540. driven_weight = driven_max + t * (driven_min - driven_max);
  541. }
  542. else
  543. {
  544. if (info->mMax2 >= max_weight)
  545. {
  546. driven_weight = driven_max;
  547. }
  548. else
  549. {
  550. driven_weight = driven_min;
  551. }
  552. }
  553. return driven_weight;
  554. }
  555. void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake)
  556. {
  557. LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject();
  558. if(mWearablep && 
  559.    driven->mParam->getCrossWearable() &&
  560.    mWearablep->isOnTop())
  561. {
  562. // call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values
  563. avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake );
  564. }
  565. else
  566. {
  567. driven->mParam->setWeight( driven_weight, upload_bake );
  568. }
  569. }