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

游戏引擎

开发平台:

C++ Builder

  1. LLFloaterReg::hideInstance("properties", item_id);
  2. LLMessageSystem* msg = gMessageSystem;
  3. msg->newMessageFast(_PREHASH_RemoveTaskInventory);
  4. msg->nextBlockFast(_PREHASH_AgentData);
  5. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  6. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  7. msg->nextBlockFast(_PREHASH_InventoryData);
  8. msg->addU32Fast(_PREHASH_LocalID, mLocalID);
  9. msg->addUUIDFast(_PREHASH_ItemID, item_id);
  10. msg->sendReliable(mRegionp->getHost());
  11. deleteInventoryItem(item_id);
  12. ++mInventorySerialNum;
  13. }
  14. void LLViewerObject::updateInventory(
  15. LLViewerInventoryItem* item,
  16. U8 key,
  17. bool is_new)
  18. {
  19. LLMemType mt(LLMemType::MTYPE_OBJECT);
  20. // This slices the object into what we're concerned about on the
  21. // viewer. The simulator will take the permissions and transfer
  22. // ownership.
  23. LLPointer<LLViewerInventoryItem> task_item =
  24. new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
  25.   item->getAssetUUID(), item->getType(),
  26.   item->getInventoryType(),
  27.   item->getName(), item->getDescription(),
  28.   item->getSaleInfo(),
  29.   item->getFlags(),
  30.   item->getCreationDate());
  31. task_item->setTransactionID(item->getTransactionID());
  32. LLMessageSystem* msg = gMessageSystem;
  33. msg->newMessageFast(_PREHASH_UpdateTaskInventory);
  34. msg->nextBlockFast(_PREHASH_AgentData);
  35. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  36. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  37. msg->nextBlockFast(_PREHASH_UpdateData);
  38. msg->addU32Fast(_PREHASH_LocalID, mLocalID);
  39. msg->addU8Fast(_PREHASH_Key, key);
  40. msg->nextBlockFast(_PREHASH_InventoryData);
  41. task_item->packMessage(msg);
  42. msg->sendReliable(mRegionp->getHost());
  43. // do the internal logic
  44. doUpdateInventory(task_item, key, is_new);
  45. }
  46. void LLViewerObject::updateInventoryLocal(LLInventoryItem* item, U8 key)
  47. {
  48. LLPointer<LLViewerInventoryItem> task_item =
  49. new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
  50.   item->getAssetUUID(), item->getType(),
  51.   item->getInventoryType(),
  52.   item->getName(), item->getDescription(),
  53.   item->getSaleInfo(), item->getFlags(),
  54.   item->getCreationDate());
  55. // do the internal logic
  56. const bool is_new = false;
  57. doUpdateInventory(task_item, key, is_new);
  58. }
  59. LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)
  60. {
  61. LLInventoryObject* rv = NULL;
  62. if(mInventory)
  63. {
  64. InventoryObjectList::iterator it = mInventory->begin();
  65. InventoryObjectList::iterator end = mInventory->end();
  66. for ( ; it != end; ++it)
  67. {
  68. if((*it)->getUUID() == item_id)
  69. {
  70. rv = *it;
  71. break;
  72. }
  73. }
  74. }
  75. return rv;
  76. }
  77. void LLViewerObject::getInventoryContents(InventoryObjectList& objects)
  78. {
  79. if(mInventory)
  80. {
  81. InventoryObjectList::iterator it = mInventory->begin();
  82. InventoryObjectList::iterator end = mInventory->end();
  83. for( ; it != end; ++it)
  84. {
  85. if ((*it)->getType() != LLAssetType::AT_CATEGORY)
  86. {
  87. objects.push_back(*it);
  88. }
  89. }
  90. }
  91. }
  92. LLInventoryObject* LLViewerObject::getInventoryRoot()
  93. {
  94. if (!mInventory || !mInventory->size())
  95. {
  96. return NULL;
  97. }
  98. return mInventory->back();
  99. }
  100. LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& asset_id)
  101. {
  102. if (mInventoryDirty)
  103. llwarns << "Peforming inventory lookup for object " << mID << " that has dirty inventory!" << llendl;
  104. LLViewerInventoryItem* rv = NULL;
  105. if(mInventory)
  106. {
  107. LLViewerInventoryItem* item = NULL;
  108. InventoryObjectList::iterator it = mInventory->begin();
  109. InventoryObjectList::iterator end = mInventory->end();
  110. for( ; it != end; ++it)
  111. {
  112. LLInventoryObject* obj = *it;
  113. if(obj->getType() != LLAssetType::AT_CATEGORY)
  114. {
  115. // *FIX: gank-ass down cast!
  116. item = (LLViewerInventoryItem*)obj;
  117. if(item->getAssetUUID() == asset_id)
  118. {
  119. rv = item;
  120. break;
  121. }
  122. }
  123. }
  124. }
  125. return rv;
  126. }
  127. void LLViewerObject::updateViewerInventoryAsset(
  128. const LLViewerInventoryItem* item,
  129. const LLUUID& new_asset)
  130. {
  131. LLPointer<LLViewerInventoryItem> task_item =
  132. new LLViewerInventoryItem(item);
  133. task_item->setAssetUUID(new_asset);
  134. // do the internal logic
  135. doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, false);
  136. }
  137. void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
  138. {
  139. if (getVolume())
  140. { //volumes calculate pixel area and angle per face
  141. return;
  142. }
  143. LLVector3 viewer_pos_agent = agent.getCameraPositionAgent();
  144. LLVector3 pos_agent = getRenderPosition();
  145. F32 dx = viewer_pos_agent.mV[VX] - pos_agent.mV[VX];
  146. F32 dy = viewer_pos_agent.mV[VY] - pos_agent.mV[VY];
  147. F32 dz = viewer_pos_agent.mV[VZ] - pos_agent.mV[VZ];
  148. F32 max_scale = getMaxScale();
  149. F32 mid_scale = getMidScale();
  150. F32 min_scale = getMinScale();
  151. // IW: estimate - when close to large objects, computing range based on distance from center is no good
  152. // to try to get a min distance from face, subtract min_scale/2 from the range.
  153. // This means we'll load too much detail sometimes, but that's better than not enough
  154. // I don't think there's a better way to do this without calculating distance per-poly
  155. F32 range = sqrt(dx*dx + dy*dy + dz*dz) - min_scale/2;
  156. LLViewerCamera* camera = LLViewerCamera::getInstance();
  157. if (range < 0.001f || isHUDAttachment()) // range == zero
  158. {
  159. mAppAngle = 180.f;
  160. mPixelArea = (F32)camera->getScreenPixelArea();
  161. }
  162. else
  163. {
  164. mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG;
  165. F32 pixels_per_meter = camera->getPixelMeterRatio() / range;
  166. mPixelArea = (pixels_per_meter * max_scale) * (pixels_per_meter * mid_scale);
  167. if (mPixelArea > camera->getScreenPixelArea())
  168. {
  169. mAppAngle = 180.f;
  170. mPixelArea = (F32)camera->getScreenPixelArea();
  171. }
  172. }
  173. }
  174. BOOL LLViewerObject::updateLOD()
  175. {
  176. return FALSE;
  177. }
  178. BOOL LLViewerObject::updateGeometry(LLDrawable *drawable)
  179. {
  180. return TRUE;
  181. }
  182. void LLViewerObject::updateGL()
  183. {
  184. }
  185. void LLViewerObject::updateFaceSize(S32 idx)
  186. {
  187. }
  188. LLDrawable* LLViewerObject::createDrawable(LLPipeline *pipeline)
  189. {
  190. return NULL;
  191. }
  192. void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
  193. {
  194. LLPrimitive::setScale(scale);
  195. if (mDrawable.notNull())
  196. {
  197. //encompass completely sheared objects by taking 
  198. //the most extreme point possible (<1,1,0.5>)
  199. mDrawable->setRadius(LLVector3(1,1,0.5f).scaleVec(scale).magVec());
  200. updateDrawable(damped);
  201. }
  202. if( (LL_PCODE_VOLUME == getPCode()) && !isDead() )
  203. {
  204. if (permYouOwner() || (scale.magVecSquared() > (7.5f * 7.5f)) )
  205. {
  206. if (!mOnMap)
  207. {
  208. gObjectList.addToMap(this);
  209. mOnMap = TRUE;
  210. }
  211. }
  212. else
  213. {
  214. if (mOnMap)
  215. {
  216. gObjectList.removeFromMap(this);
  217. mOnMap = FALSE;
  218. }
  219. }
  220. }
  221. }
  222. void LLViewerObject::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
  223. {
  224. LLVector3 center = getRenderPosition();
  225. LLVector3 size = getScale();
  226. newMin.setVec(center-size);
  227. newMax.setVec(center+size);
  228. mDrawable->setPositionGroup((newMin + newMax) * 0.5f);
  229. }
  230. F32 LLViewerObject::getBinRadius()
  231. {
  232. if (mDrawable.notNull())
  233. {
  234. const LLVector3* ext = mDrawable->getSpatialExtents();
  235. return (ext[1]-ext[0]).magVec();
  236. }
  237. return getScale().magVec();
  238. }
  239. F32 LLViewerObject::getMaxScale() const
  240. {
  241. return llmax(getScale().mV[VX],getScale().mV[VY], getScale().mV[VZ]);
  242. }
  243. F32 LLViewerObject::getMinScale() const
  244. {
  245. return llmin(getScale().mV[0],getScale().mV[1],getScale().mV[2]);
  246. }
  247. F32 LLViewerObject::getMidScale() const
  248. {
  249. if (getScale().mV[VX] < getScale().mV[VY])
  250. {
  251. if (getScale().mV[VY] < getScale().mV[VZ])
  252. {
  253. return getScale().mV[VY];
  254. }
  255. else if (getScale().mV[VX] < getScale().mV[VZ])
  256. {
  257. return getScale().mV[VZ];
  258. }
  259. else
  260. {
  261. return getScale().mV[VX];
  262. }
  263. }
  264. else if (getScale().mV[VX] < getScale().mV[VZ])
  265. {
  266. return getScale().mV[VX];
  267. }
  268. else if (getScale().mV[VY] < getScale().mV[VZ])
  269. {
  270. return getScale().mV[VZ];
  271. }
  272. else
  273. {
  274. return getScale().mV[VY];
  275. }
  276. }
  277. void LLViewerObject::updateTextures()
  278. {
  279. }
  280. void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
  281. {
  282. if (isDead())
  283. {
  284. return;
  285. }
  286. S32 i;
  287. S32 tex_count = getNumTEs();
  288. for (i = 0; i < tex_count; i++)
  289. {
  290.   getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
  291. }
  292. if (isSculpted())
  293. {
  294. LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
  295. LLUUID sculpt_id = sculpt_params->getSculptTexture();
  296. LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
  297. }
  298. if (boost_children)
  299. {
  300. for (child_list_t::iterator iter = mChildList.begin();
  301.  iter != mChildList.end(); iter++)
  302. {
  303. LLViewerObject* child = *iter;
  304. child->boostTexturePriority();
  305. }
  306. }
  307. }
  308. void LLViewerObject::setLineWidthForWindowSize(S32 window_width)
  309. {
  310. if (window_width < 700)
  311. {
  312. LLUI::setLineWidth(2.0f);
  313. }
  314. else if (window_width < 1100)
  315. {
  316. LLUI::setLineWidth(3.0f);
  317. }
  318. else if (window_width < 2000)
  319. {
  320. LLUI::setLineWidth(4.0f);
  321. }
  322. else
  323. {
  324. // _damn_, what a nice monitor!
  325. LLUI::setLineWidth(5.0f);
  326. }
  327. }
  328. void LLViewerObject::increaseArrowLength()
  329. {
  330. /* ???
  331. if (mAxisArrowLength == 50)
  332. {
  333. mAxisArrowLength = 100;
  334. }
  335. else
  336. {
  337. mAxisArrowLength = 150;
  338. }
  339. */
  340. }
  341. void LLViewerObject::decreaseArrowLength()
  342. {
  343. /* ???
  344. if (mAxisArrowLength == 150)
  345. {
  346. mAxisArrowLength = 100;
  347. }
  348. else
  349. {
  350. mAxisArrowLength = 50;
  351. }
  352. */
  353. }
  354. // Culled from newsim LLTask::addNVPair
  355. void LLViewerObject::addNVPair(const std::string& data)
  356. {
  357. // cout << "LLViewerObject::addNVPair() with ---" << data << "---" << endl;
  358. LLNameValue *nv = new LLNameValue(data.c_str());
  359. // char splat[MAX_STRING];
  360. // temp->printNameValue(splat);
  361. // llinfos << "addNVPair " << splat << llendl;
  362. name_value_map_t::iterator iter = mNameValuePairs.find(nv->mName);
  363. if (iter != mNameValuePairs.end())
  364. {
  365. LLNameValue* foundnv = iter->second;
  366. if (foundnv->mClass != NVC_READ_ONLY)
  367. {
  368. delete foundnv;
  369. mNameValuePairs.erase(iter);
  370. }
  371. else
  372. {
  373. delete nv;
  374. // llinfos << "Trying to write to Read Only NVPair " << temp->mName << " in addNVPair()" << llendl;
  375. return;
  376. }
  377. }
  378. mNameValuePairs[nv->mName] = nv;
  379. }
  380. BOOL LLViewerObject::removeNVPair(const std::string& name)
  381. {
  382. char* canonical_name = gNVNameTable.addString(name);
  383. lldebugs << "LLViewerObject::removeNVPair(): " << name << llendl;
  384. name_value_map_t::iterator iter = mNameValuePairs.find(canonical_name);
  385. if (iter != mNameValuePairs.end())
  386. {
  387. if( mRegionp )
  388. {
  389. LLNameValue* nv = iter->second;
  390. /*
  391. std::string buffer = nv->printNameValue();
  392. gMessageSystem->newMessageFast(_PREHASH_RemoveNameValuePair);
  393. gMessageSystem->nextBlockFast(_PREHASH_TaskData);
  394. gMessageSystem->addUUIDFast(_PREHASH_ID, mID);
  395. gMessageSystem->nextBlockFast(_PREHASH_NameValueData);
  396. gMessageSystem->addStringFast(_PREHASH_NVPair, buffer);
  397. gMessageSystem->sendReliable( mRegionp->getHost() );
  398. */
  399. // Remove the NV pair from the local list.
  400. delete nv;
  401. mNameValuePairs.erase(iter);
  402. return TRUE;
  403. }
  404. else
  405. {
  406. lldebugs << "removeNVPair - No region for object" << llendl;
  407. }
  408. }
  409. return FALSE;
  410. }
  411. LLNameValue *LLViewerObject::getNVPair(const std::string& name) const
  412. {
  413. char *canonical_name;
  414. canonical_name = gNVNameTable.addString(name);
  415. // If you access a map with a name that isn't in it, it will add the name and a null pointer.
  416. // So first check if the data is in the map.
  417. name_value_map_t::const_iterator iter = mNameValuePairs.find(canonical_name);
  418. if (iter != mNameValuePairs.end())
  419. {
  420. return iter->second;
  421. }
  422. else
  423. {
  424. return NULL;
  425. }
  426. }
  427. void LLViewerObject::updatePositionCaches() const
  428. {
  429. if(mRegionp)
  430. {
  431. if (!isRoot())
  432. {
  433. mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
  434. mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
  435. }
  436. else
  437. {
  438. mPositionRegion = getPosition();
  439. mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
  440. }
  441. }
  442. }
  443. const LLVector3d LLViewerObject::getPositionGlobal() const
  444. {
  445. if(mRegionp)
  446. {
  447. LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
  448. if (isAttachment())
  449. {
  450. position_global = gAgent.getPosGlobalFromAgent(getRenderPosition());
  451. }
  452. return position_global;
  453. }
  454. else
  455. {
  456. LLVector3d position_global(getPosition());
  457. return position_global;
  458. }
  459. }
  460. const LLVector3 &LLViewerObject::getPositionAgent() const
  461. {
  462. if (mRegionp)
  463. {
  464. if (mDrawable.notNull() && (!mDrawable->isRoot() && getParent()))
  465. {
  466. // Don't return cached position if you have a parent, recalc (until all dirtying is done correctly.
  467. LLVector3 position_region;
  468. position_region = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
  469. mPositionAgent = mRegionp->getPosAgentFromRegion(position_region);
  470. }
  471. else
  472. {
  473. mPositionAgent = mRegionp->getPosAgentFromRegion(getPosition());
  474. }
  475. }
  476. return mPositionAgent;
  477. }
  478. const LLVector3 &LLViewerObject::getPositionRegion() const
  479. {
  480. if (!isRoot())
  481. {
  482. LLViewerObject *parent = (LLViewerObject *)getParent();
  483. mPositionRegion = parent->getPositionRegion() + (getPosition() * parent->getRotation());
  484. }
  485. else
  486. {
  487. mPositionRegion = getPosition();
  488. }
  489. return mPositionRegion;
  490. }
  491. const LLVector3 LLViewerObject::getPositionEdit() const
  492. {
  493. if (isRootEdit())
  494. {
  495. return getPosition();
  496. }
  497. else
  498. {
  499. LLViewerObject *parent = (LLViewerObject *)getParent();
  500. LLVector3 position_edit = parent->getPositionEdit() + getPosition() * parent->getRotationEdit();
  501. return position_edit;
  502. }
  503. }
  504. const LLVector3 LLViewerObject::getRenderPosition() const
  505. {
  506. if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
  507. {
  508. return getPositionAgent();
  509. }
  510. else
  511. {
  512. return mDrawable->getPositionAgent();
  513. }
  514. }
  515. const LLVector3 LLViewerObject::getPivotPositionAgent() const
  516. {
  517. return getRenderPosition();
  518. }
  519. const LLQuaternion LLViewerObject::getRenderRotation() const
  520. {
  521. LLQuaternion ret;
  522. if (mDrawable.isNull() || mDrawable->isStatic())
  523. {
  524. ret = getRotationEdit();
  525. }
  526. else
  527. {
  528. if (!mDrawable->isRoot())
  529. {
  530. ret = getRotation() * LLQuaternion(mDrawable->getParent()->getWorldMatrix());
  531. }
  532. else
  533. {
  534. ret = LLQuaternion(mDrawable->getWorldMatrix());
  535. }
  536. }
  537. return ret;
  538. }
  539. const LLMatrix4 LLViewerObject::getRenderMatrix() const
  540. {
  541. return mDrawable->getWorldMatrix();
  542. }
  543. const LLQuaternion LLViewerObject::getRotationRegion() const
  544. {
  545. LLQuaternion global_rotation = getRotation();
  546. if (!((LLXform *)this)->isRoot())
  547. {
  548. global_rotation = global_rotation * getParent()->getRotation();
  549. }
  550. return global_rotation;
  551. }
  552. const LLQuaternion LLViewerObject::getRotationEdit() const
  553. {
  554. LLQuaternion global_rotation = getRotation();
  555. if (!((LLXform *)this)->isRootEdit())
  556. {
  557. global_rotation = global_rotation * getParent()->getRotation();
  558. }
  559. return global_rotation;
  560. }
  561. void LLViewerObject::setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped )
  562. {
  563. if (isAttachment())
  564. {
  565. LLVector3 new_pos = mRegionp->getPosRegionFromGlobal(pos_global);
  566. if (isRootEdit())
  567. {
  568. new_pos -= mDrawable->mXform.getParent()->getWorldPosition();
  569. LLQuaternion world_rotation = mDrawable->mXform.getParent()->getWorldRotation();
  570. new_pos = new_pos * ~world_rotation;
  571. }
  572. else
  573. {
  574. LLViewerObject* parentp = (LLViewerObject*)getParent();
  575. new_pos -= parentp->getPositionAgent();
  576. new_pos = new_pos * ~parentp->getRotationRegion();
  577. }
  578. LLViewerObject::setPosition(new_pos);
  579. if (mParent && ((LLViewerObject*)mParent)->isAvatar())
  580. {
  581. // we have changed the position of an attachment, so we need to clamp it
  582. LLVOAvatar *avatar = (LLVOAvatar*)mParent;
  583. avatar->clampAttachmentPositions();
  584. }
  585. }
  586. else
  587. {
  588. if( isRoot() )
  589. {
  590. setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global));
  591. }
  592. else
  593. {
  594. // the relative position with the parent is not constant
  595. LLViewerObject* parent = (LLViewerObject *)getParent();
  596. //RN: this assumes we are only calling this function from the edit tools
  597. gPipeline.updateMoveNormalAsync(parent->mDrawable);
  598. LLVector3 pos_local = mRegionp->getPosRegionFromGlobal(pos_global) - parent->getPositionRegion();
  599. pos_local = pos_local * ~parent->getRotationRegion();
  600. LLViewerObject::setPosition( pos_local );
  601. }
  602. }
  603. //RN: assumes we always want to snap the object when calling this function
  604. gPipeline.updateMoveNormalAsync(mDrawable);
  605. }
  606. void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped)
  607. {
  608. if (getPosition() != pos)
  609. {
  610. setChanged(TRANSLATED | SILHOUETTE);
  611. }
  612. LLXform::setPosition(pos);
  613. updateDrawable(damped);
  614. if (isRoot())
  615. {
  616. // position caches need to be up to date on root objects
  617. updatePositionCaches();
  618. }
  619. }
  620. void LLViewerObject::setPositionGlobal(const LLVector3d &pos_global, BOOL damped)
  621. {
  622. if (isAttachment())
  623. {
  624. if (isRootEdit())
  625. {
  626. LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global);
  627. newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition();
  628. LLQuaternion invWorldRotation = mDrawable->mXform.getParent()->getWorldRotation();
  629. invWorldRotation.transQuat();
  630. newPos = newPos * invWorldRotation;
  631. LLViewerObject::setPosition(newPos);
  632. }
  633. else
  634. {
  635. // assumes parent is root editable (root of attachment)
  636. LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global);
  637. newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition();
  638. LLVector3 delta_pos = newPos - getPosition();
  639. LLQuaternion invRotation = mDrawable->getRotation();
  640. invRotation.transQuat();
  641. delta_pos = delta_pos * invRotation;
  642. // *FIX: is this right?  Shouldn't we be calling the
  643. // LLViewerObject version of setPosition?
  644. LLVector3 old_pos = mDrawable->mXform.getParent()->getPosition();
  645. mDrawable->mXform.getParent()->setPosition(old_pos + delta_pos);
  646. setChanged(TRANSLATED | SILHOUETTE);
  647. }
  648. if (mParent && ((LLViewerObject*)mParent)->isAvatar())
  649. {
  650. // we have changed the position of an attachment, so we need to clamp it
  651. LLVOAvatar *avatar = (LLVOAvatar*)mParent;
  652. avatar->clampAttachmentPositions();
  653. }
  654. }
  655. else
  656. {
  657. if (isRoot())
  658. {
  659. setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global));
  660. }
  661. else
  662. {
  663. // the relative position with the parent is constant, but the parent's position needs to be changed
  664. LLVector3d position_offset;
  665. position_offset.setVec(getPosition()*getParent()->getRotation());
  666. LLVector3d new_pos_global = pos_global - position_offset;
  667. ((LLViewerObject *)getParent())->setPositionGlobal(new_pos_global);
  668. }
  669. }
  670. updateDrawable(damped);
  671. }
  672. void LLViewerObject::setPositionParent(const LLVector3 &pos_parent, BOOL damped)
  673. {
  674. // Set position relative to parent, if no parent, relative to region
  675. if (!isRoot())
  676. {
  677. LLViewerObject::setPosition(pos_parent);
  678. updateDrawable(damped);
  679. }
  680. else
  681. {
  682. setPositionRegion(pos_parent, damped);
  683. }
  684. }
  685. void LLViewerObject::setPositionRegion(const LLVector3 &pos_region, BOOL damped)
  686. {
  687. if (!isRootEdit())
  688. {
  689. LLViewerObject* parent = (LLViewerObject*) getParent();
  690. LLViewerObject::setPosition((pos_region-parent->getPositionRegion())*~parent->getRotationRegion());
  691. }
  692. else
  693. {
  694. LLViewerObject::setPosition(pos_region);
  695. mPositionRegion = pos_region;
  696. mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
  697. }
  698. }
  699. void LLViewerObject::setPositionAgent(const LLVector3 &pos_agent, BOOL damped)
  700. {
  701. LLVector3 pos_region = getRegion()->getPosRegionFromAgent(pos_agent);
  702. setPositionRegion(pos_region, damped);
  703. }
  704. // identical to setPositionRegion() except it checks for child-joints 
  705. // and doesn't also move the joint-parent
  706. // TODO -- implement similar intelligence for joint-parents toward
  707. // their joint-children
  708. void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped)
  709. {
  710. if (!isRootEdit())
  711. {
  712. // the relative position with the parent is constant, but the parent's position needs to be changed
  713. LLVector3 position_offset = getPosition() * getParent()->getRotation();
  714. ((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset);
  715. }
  716. else if (isJointChild())
  717. {
  718. // compute new parent-relative position
  719. LLViewerObject *parent = (LLViewerObject *) getParent();
  720. LLQuaternion inv_parent_rot = parent->getRotation();
  721. inv_parent_rot.transQuat();
  722. LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot;
  723. LLViewerObject::setPosition(pos_parent);
  724. }
  725. else
  726. {
  727. LLViewerObject::setPosition(pos_edit);
  728. mPositionRegion = pos_edit;
  729. mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
  730. }
  731. updateDrawable(damped);
  732. }
  733. LLViewerObject* LLViewerObject::getRootEdit() const
  734. {
  735. const LLViewerObject* root = this;
  736. while (root->mParent 
  737.    && !(root->mJointInfo
  738.    || ((LLViewerObject*)root->mParent)->isAvatar()) )
  739. {
  740. root = (LLViewerObject*)root->mParent;
  741. }
  742. return (LLViewerObject*)root;
  743. }
  744. BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
  745.   S32 face,
  746.   BOOL pick_transparent,
  747.   S32* face_hit,
  748.   LLVector3* intersection,
  749.   LLVector2* tex_coord,
  750.   LLVector3* normal,
  751.   LLVector3* bi_normal)
  752. {
  753. return false;
  754. }
  755. BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end)
  756. {
  757. if (mDrawable.isNull() || mDrawable->isDead())
  758. {
  759. return FALSE;
  760. }
  761. const LLVector3* ext = mDrawable->getSpatialExtents();
  762. LLVector3 center = (ext[1]+ext[0])*0.5f;
  763. LLVector3 size = (ext[1]-ext[0])*0.5f;
  764. return LLLineSegmentBoxIntersect(start, end, center, size);
  765. }
  766. U8 LLViewerObject::getMediaType() const
  767. {
  768. if (mMedia)
  769. {
  770. return mMedia->mMediaType;
  771. }
  772. else
  773. {
  774. return LLViewerObject::MEDIA_NONE;
  775. }
  776. }
  777. void LLViewerObject::setMediaType(U8 media_type)
  778. {
  779. if (!mMedia)
  780. {
  781. // TODO what if we don't have a media pointer?
  782. }
  783. else if (mMedia->mMediaType != media_type)
  784. {
  785. mMedia->mMediaType = media_type;
  786. // TODO: update materials with new image
  787. }
  788. }
  789. std::string LLViewerObject::getMediaURL() const
  790. {
  791. if (mMedia)
  792. {
  793. return mMedia->mMediaURL;
  794. }
  795. else
  796. {
  797. return std::string();
  798. }
  799. }
  800. void LLViewerObject::setMediaURL(const std::string& media_url)
  801. {
  802. LLMemType mt(LLMemType::MTYPE_OBJECT);
  803. if (!mMedia)
  804. {
  805. mMedia = new LLViewerObjectMedia;
  806. mMedia->mMediaURL = media_url;
  807. mMedia->mPassedWhitelist = FALSE;
  808. // TODO: update materials with new image
  809. }
  810. else if (mMedia->mMediaURL != media_url)
  811. {
  812. mMedia->mMediaURL = media_url;
  813. mMedia->mPassedWhitelist = FALSE;
  814. // TODO: update materials with new image
  815. }
  816. }
  817. BOOL LLViewerObject::getMediaPassedWhitelist() const
  818. {
  819. if (mMedia)
  820. {
  821. return mMedia->mPassedWhitelist;
  822. }
  823. else
  824. {
  825. return FALSE;
  826. }
  827. }
  828. void LLViewerObject::setMediaPassedWhitelist(BOOL passed)
  829. {
  830. if (mMedia)
  831. {
  832. mMedia->mPassedWhitelist = passed;
  833. }
  834. }
  835. BOOL LLViewerObject::setMaterial(const U8 material)
  836. {
  837. BOOL res = LLPrimitive::setMaterial(material);
  838. if (res)
  839. {
  840. setChanged(TEXTURE);
  841. }
  842. return res;
  843. }
  844. void LLViewerObject::setNumTEs(const U8 num_tes)
  845. {
  846. LLMemType mt(LLMemType::MTYPE_OBJECT);
  847. U32 i;
  848. if (num_tes != getNumTEs())
  849. {
  850. if (num_tes)
  851. {
  852. LLPointer<LLViewerTexture> *new_images;
  853. new_images = new LLPointer<LLViewerTexture>[num_tes];
  854. for (i = 0; i < num_tes; i++)
  855. {
  856. if (i < getNumTEs())
  857. {
  858. new_images[i] = mTEImages[i];
  859. }
  860. else if (getNumTEs())
  861. {
  862. new_images[i] = mTEImages[getNumTEs()-1];
  863. }
  864. else
  865. {
  866. new_images[i] = NULL;
  867. }
  868. }
  869. deleteTEImages();
  870. mTEImages = new_images;
  871. }
  872. else
  873. {
  874. deleteTEImages();
  875. }
  876. LLPrimitive::setNumTEs(num_tes);
  877. setChanged(TEXTURE);
  878. if (mDrawable.notNull())
  879. {
  880. gPipeline.markTextured(mDrawable);
  881. }
  882. }
  883. }
  884. void LLViewerObject::sendMaterialUpdate() const
  885. {
  886. LLViewerRegion* regionp = getRegion();
  887. if(!regionp) return;
  888. gMessageSystem->newMessageFast(_PREHASH_ObjectMaterial);
  889. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  890. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  891. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  892. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  893. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
  894. gMessageSystem->addU8Fast(_PREHASH_Material, getMaterial() );
  895. gMessageSystem->sendReliable( regionp->getHost() );
  896. }
  897. // formerly send_object_rotation
  898. void LLViewerObject::sendRotationUpdate() const
  899. {
  900. LLViewerRegion* regionp = getRegion();
  901. if(!regionp) return;
  902. gMessageSystem->newMessageFast(_PREHASH_ObjectRotation);
  903. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  904. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  905. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  906. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  907. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID);
  908. gMessageSystem->addQuatFast(_PREHASH_Rotation, getRotationEdit());
  909. //llinfos << "Sent rotation " << getRotationEdit() << llendl;
  910. gMessageSystem->sendReliable( regionp->getHost() );
  911. }
  912. /* Obsolete, we use MultipleObjectUpdate instead
  913. //// formerly send_object_position_global
  914. //void LLViewerObject::sendPositionUpdate() const
  915. //{
  916. // gMessageSystem->newMessageFast(_PREHASH_ObjectPosition);
  917. // gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  918. // gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  919. // gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  920. // gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  921. // gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
  922. // gMessageSystem->addVector3Fast(_PREHASH_Position, getPositionRegion());
  923. // LLViewerRegion* regionp = getRegion();
  924. // gMessageSystem->sendReliable(regionp->getHost());
  925. //}
  926. */
  927. //formerly send_object_shape(LLViewerObject *object)
  928. void LLViewerObject::sendShapeUpdate()
  929. {
  930. gMessageSystem->newMessageFast(_PREHASH_ObjectShape);
  931. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  932. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  933. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  934. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  935. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
  936. LLVolumeMessage::packVolumeParams(&getVolume()->getParams(), gMessageSystem);
  937. LLViewerRegion *regionp = getRegion();
  938. gMessageSystem->sendReliable( regionp->getHost() );
  939. }
  940. void LLViewerObject::sendTEUpdate() const
  941. {
  942. LLMessageSystem* msg = gMessageSystem;
  943. msg->newMessageFast(_PREHASH_ObjectImage);
  944. msg->nextBlockFast(_PREHASH_AgentData);
  945. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  946. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  947. msg->nextBlockFast(_PREHASH_ObjectData);
  948. msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
  949. if (mMedia)
  950. {
  951. msg->addString("MediaURL", mMedia->mMediaURL);
  952. }
  953. else
  954. {
  955. msg->addString("MediaURL", NULL);
  956. }
  957. // TODO send media type
  958. packTEMessage(msg);
  959. LLViewerRegion *regionp = getRegion();
  960. msg->sendReliable( regionp->getHost() );
  961. }
  962. void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
  963. {
  964. LLPrimitive::setTE(te, texture_entry);
  965. //  This doesn't work, don't get any textures.
  966. // if (mDrawable.notNull() && mDrawable->isVisible())
  967. // {
  968. const LLUUID& image_id = getTE(te)->getID();
  969. mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
  970. // }
  971. }
  972. void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
  973. {
  974. if (mTEImages[te] != imagep)
  975. {
  976. mTEImages[te] = imagep;
  977. LLPrimitive::setTETexture(te, imagep->getID());
  978. setChanged(TEXTURE);
  979. if (mDrawable.notNull())
  980. {
  981. gPipeline.markTextured(mDrawable);
  982. }
  983. }
  984. }
  985. S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host)
  986. {
  987. S32 retval = 0;
  988. if (uuid != getTE(te)->getID() ||
  989. uuid == LLUUID::null)
  990. {
  991. retval = LLPrimitive::setTETexture(te, uuid);
  992. mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
  993. setChanged(TEXTURE);
  994. if (mDrawable.notNull())
  995. {
  996. gPipeline.markTextured(mDrawable);
  997. }
  998. }
  999. return retval;
  1000. }
  1001. void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image) 
  1002. {
  1003. if(index < 0 || index >= getNumTEs())
  1004. {
  1005. return ;
  1006. }
  1007. mTEImages[index] = new_image ;
  1008. }
  1009. S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid)
  1010. {
  1011. // Invalid host == get from the agent's sim
  1012. return setTETextureCore(te, uuid, LLHost::invalid);
  1013. }
  1014. S32 LLViewerObject::setTEColor(const U8 te, const LLColor3& color)
  1015. {
  1016. return setTEColor(te, LLColor4(color));
  1017. }
  1018. S32 LLViewerObject::setTEColor(const U8 te, const LLColor4& color)
  1019. {
  1020. S32 retval = 0;
  1021. const LLTextureEntry *tep = getTE(te);
  1022. if (!tep)
  1023. {
  1024. llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
  1025. }
  1026. else if (color != tep->getColor())
  1027. {
  1028. retval = LLPrimitive::setTEColor(te, color);
  1029. if (mDrawable.notNull() && retval)
  1030. {
  1031. // These should only happen on updates which are not the initial update.
  1032. dirtyMesh();
  1033. }
  1034. }
  1035. return retval;
  1036. }
  1037. S32 LLViewerObject::setTEBumpmap(const U8 te, const U8 bump)
  1038. {
  1039. S32 retval = 0;
  1040. const LLTextureEntry *tep = getTE(te);
  1041. if (!tep)
  1042. {
  1043. llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
  1044. }
  1045. else if (bump != tep->getBumpmap())
  1046. {
  1047. retval = LLPrimitive::setTEBumpmap(te, bump);
  1048. setChanged(TEXTURE);
  1049. if (mDrawable.notNull() && retval)
  1050. {
  1051. gPipeline.markTextured(mDrawable);
  1052. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
  1053. }
  1054. }
  1055. return retval;
  1056. }
  1057. S32 LLViewerObject::setTETexGen(const U8 te, const U8 texgen)
  1058. {
  1059. S32 retval = 0;
  1060. const LLTextureEntry *tep = getTE(te);
  1061. if (!tep)
  1062. {
  1063. llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
  1064. }
  1065. else if (texgen != tep->getTexGen())
  1066. {
  1067. retval = LLPrimitive::setTETexGen(te, texgen);
  1068. setChanged(TEXTURE);
  1069. }
  1070. return retval;
  1071. }
  1072. S32 LLViewerObject::setTEMediaTexGen(const U8 te, const U8 media)
  1073. {
  1074. S32 retval = 0;
  1075. const LLTextureEntry *tep = getTE(te);
  1076. if (!tep)
  1077. {
  1078. llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
  1079. }
  1080. else if (media != tep->getMediaTexGen())
  1081. {
  1082. retval = LLPrimitive::setTEMediaTexGen(te, media);
  1083. setChanged(TEXTURE);
  1084. }
  1085. return retval;
  1086. }
  1087. S32 LLViewerObject::setTEShiny(const U8 te, const U8 shiny)
  1088. {
  1089. S32 retval = 0;
  1090. const LLTextureEntry *tep = getTE(te);
  1091. if (!tep)
  1092. {
  1093. llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
  1094. }
  1095. else if (shiny != tep->getShiny())
  1096. {
  1097. retval = LLPrimitive::setTEShiny(te, shiny);
  1098. setChanged(TEXTURE);
  1099. }
  1100. return retval;
  1101. }
  1102. S32 LLViewerObject::setTEFullbright(const U8 te, const U8 fullbright)
  1103. {
  1104. S32 retval = 0;
  1105. const LLTextureEntry *tep = getTE(te);
  1106. if (!tep)
  1107. {
  1108. llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
  1109. }
  1110. else if (fullbright != tep->getFullbright())
  1111. {
  1112. retval = LLPrimitive::setTEFullbright(te, fullbright);
  1113. setChanged(TEXTURE);
  1114. if (mDrawable.notNull() && retval)
  1115. {
  1116. gPipeline.markTextured(mDrawable);
  1117. }
  1118. }
  1119. return retval;
  1120. }
  1121. S32 LLViewerObject::setTEMediaFlags(const U8 te, const U8 media_flags)
  1122. {
  1123. // this might need work for media type
  1124. S32 retval = 0;
  1125. const LLTextureEntry *tep = getTE(te);
  1126. if (!tep)
  1127. {
  1128. llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
  1129. }
  1130. else if (media_flags != tep->getMediaFlags())
  1131. {
  1132. retval = LLPrimitive::setTEMediaFlags(te, media_flags);
  1133. setChanged(TEXTURE);
  1134. if (mDrawable.notNull() && retval)
  1135. {
  1136. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, TRUE);
  1137. gPipeline.markTextured(mDrawable);
  1138. // JC - probably only need this if changes texture coords
  1139. //gPipeline.markRebuild(mDrawable);
  1140. }
  1141. }
  1142. return retval;
  1143. }
  1144. S32 LLViewerObject::setTEGlow(const U8 te, const F32 glow)
  1145. {
  1146. S32 retval = 0;
  1147. const LLTextureEntry *tep = getTE(te);
  1148. if (!tep)
  1149. {
  1150. llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
  1151. }
  1152. else if (glow != tep->getGlow())
  1153. {
  1154. retval = LLPrimitive::setTEGlow(te, glow);
  1155. setChanged(TEXTURE);
  1156. if (mDrawable.notNull() && retval)
  1157. {
  1158. gPipeline.markTextured(mDrawable);
  1159. }
  1160. }
  1161. return retval;
  1162. }
  1163. S32 LLViewerObject::setTEScale(const U8 te, const F32 s, const F32 t)
  1164. {
  1165. S32 retval = 0;
  1166. retval = LLPrimitive::setTEScale(te, s, t);
  1167. setChanged(TEXTURE);
  1168. if (mDrawable.notNull() && retval)
  1169. {
  1170. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
  1171. }
  1172. return retval;
  1173. }
  1174. S32 LLViewerObject::setTEScaleS(const U8 te, const F32 s)
  1175. {
  1176. S32 retval = LLPrimitive::setTEScaleS(te, s);
  1177. if (mDrawable.notNull() && retval)
  1178. {
  1179. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
  1180. }
  1181. return retval;
  1182. }
  1183. S32 LLViewerObject::setTEScaleT(const U8 te, const F32 t)
  1184. {
  1185. S32 retval = LLPrimitive::setTEScaleT(te, t);
  1186. if (mDrawable.notNull() && retval)
  1187. {
  1188. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
  1189. }
  1190. return retval;
  1191. }
  1192. S32 LLViewerObject::setTEOffset(const U8 te, const F32 s, const F32 t)
  1193. {
  1194. S32 retval = LLPrimitive::setTEOffset(te, s, t);
  1195. if (mDrawable.notNull() && retval)
  1196. {
  1197. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
  1198. }
  1199. return retval;
  1200. }
  1201. S32 LLViewerObject::setTEOffsetS(const U8 te, const F32 s)
  1202. {
  1203. S32 retval = LLPrimitive::setTEOffsetS(te, s);
  1204. if (mDrawable.notNull() && retval)
  1205. {
  1206. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
  1207. }
  1208. return retval;
  1209. }
  1210. S32 LLViewerObject::setTEOffsetT(const U8 te, const F32 t)
  1211. {
  1212. S32 retval = LLPrimitive::setTEOffsetT(te, t);
  1213. if (mDrawable.notNull() && retval)
  1214. {
  1215. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
  1216. }
  1217. return retval;
  1218. }
  1219. S32 LLViewerObject::setTERotation(const U8 te, const F32 r)
  1220. {
  1221. S32 retval = LLPrimitive::setTERotation(te, r);
  1222. if (mDrawable.notNull() && retval)
  1223. {
  1224. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
  1225. }
  1226. return retval;
  1227. }
  1228. LLViewerTexture *LLViewerObject::getTEImage(const U8 face) const
  1229. {
  1230. // llassert(mTEImages);
  1231. if (face < getNumTEs())
  1232. {
  1233. LLViewerTexture* image = mTEImages[face];
  1234. if (image)
  1235. {
  1236. return image;
  1237. }
  1238. else
  1239. {
  1240. return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep);
  1241. }
  1242. }
  1243. llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl;
  1244. return NULL;
  1245. }
  1246. void LLViewerObject::fitFaceTexture(const U8 face)
  1247. {
  1248. llinfos << "fitFaceTexture not implemented" << llendl;
  1249. }
  1250. LLBBox LLViewerObject::getBoundingBoxAgent() const
  1251. {
  1252. LLVector3 position_agent;
  1253. LLQuaternion rot;
  1254. LLViewerObject* avatar_parent = NULL;
  1255. LLViewerObject* root_edit = (LLViewerObject*)getRootEdit();
  1256. if (root_edit)
  1257. {
  1258. avatar_parent = (LLViewerObject*)root_edit->getParent();
  1259. }
  1260. if (avatar_parent && avatar_parent->isAvatar() && root_edit && root_edit->mDrawable.notNull())
  1261. {
  1262. LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
  1263. position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
  1264. rot = getRotationEdit() * parent_xform->getWorldRotation();
  1265. }
  1266. else
  1267. {
  1268. position_agent = getPositionAgent();
  1269. rot = getRotationRegion();
  1270. }
  1271. return LLBBox( position_agent, rot, getScale() * -0.5f, getScale() * 0.5f );
  1272. }
  1273. U32 LLViewerObject::getNumVertices() const
  1274. {
  1275. U32 num_vertices = 0;
  1276. if (mDrawable.notNull())
  1277. {
  1278. S32 i, num_faces;
  1279. num_faces = mDrawable->getNumFaces();
  1280. for (i = 0; i < num_faces; i++)
  1281. {
  1282. num_vertices += mDrawable->getFace(i)->getGeomCount();
  1283. }
  1284. }
  1285. return num_vertices;
  1286. }
  1287. U32 LLViewerObject::getNumIndices() const
  1288. {
  1289. U32 num_indices = 0;
  1290. if (mDrawable.notNull())
  1291. {
  1292. S32 i, num_faces;
  1293. num_faces = mDrawable->getNumFaces();
  1294. for (i = 0; i < num_faces; i++)
  1295. {
  1296. num_indices += mDrawable->getFace(i)->getIndicesCount();
  1297. }
  1298. }
  1299. return num_indices;
  1300. }
  1301. // Find the number of instances of this object's inventory that are of the given type
  1302. S32 LLViewerObject::countInventoryContents(LLAssetType::EType type)
  1303. {
  1304. S32 count = 0;
  1305. if( mInventory )
  1306. {
  1307. InventoryObjectList::const_iterator it = mInventory->begin();
  1308. InventoryObjectList::const_iterator end = mInventory->end();
  1309. for(  ; it != end ; ++it )
  1310. {
  1311. if( (*it)->getType() == type )
  1312. {
  1313. ++count;
  1314. }
  1315. }
  1316. }
  1317. return count;
  1318. }
  1319. void LLViewerObject::setCanSelect(BOOL canSelect)
  1320. {
  1321. mbCanSelect = canSelect;
  1322. for (child_list_t::iterator iter = mChildList.begin();
  1323.  iter != mChildList.end(); iter++)
  1324. {
  1325. LLViewerObject* child = *iter;
  1326. child->mbCanSelect = canSelect;
  1327. }
  1328. }
  1329. void LLViewerObject::setDebugText(const std::string &utf8text)
  1330. {
  1331. if (utf8text.empty() && !mText)
  1332. {
  1333. return;
  1334. }
  1335. if (!mText)
  1336. {
  1337. mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
  1338. mText->setFont(LLFontGL::getFontSansSerif());
  1339. mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
  1340. mText->setMaxLines(-1);
  1341. mText->setSourceObject(this);
  1342. mText->setOnHUDAttachment(isHUDAttachment());
  1343. }
  1344. mText->setColor(LLColor4::white);
  1345. mText->setStringUTF8(utf8text);
  1346. mText->setZCompare(FALSE);
  1347. mText->setDoFade(FALSE);
  1348. updateText();
  1349. }
  1350. void LLViewerObject::setIcon(LLViewerTexture* icon_image)
  1351. {
  1352. if (!mIcon)
  1353. {
  1354. mIcon = (LLHUDIcon *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_ICON);
  1355. mIcon->setSourceObject(this);
  1356. mIcon->setImage(icon_image);
  1357. // *TODO: make this user configurable
  1358. mIcon->setScale(0.03f);
  1359. }
  1360. else
  1361. {
  1362. mIcon->restartLifeTimer();
  1363. }
  1364. }
  1365. void LLViewerObject::clearIcon()
  1366. {
  1367. if (mIcon)
  1368. {
  1369. mIcon = NULL;
  1370. }
  1371. }
  1372. LLViewerObject* LLViewerObject::getSubParent() 
  1373. if (isJointChild())
  1374. {
  1375. return this;
  1376. }
  1377. return (LLViewerObject*) getParent();
  1378. }
  1379. const LLViewerObject* LLViewerObject::getSubParent() const
  1380. {
  1381. if (isJointChild())
  1382. {
  1383. return this;
  1384. }
  1385. return (const LLViewerObject*) getParent();
  1386. }
  1387. BOOL LLViewerObject::isOnMap()
  1388. {
  1389. return mOnMap;
  1390. }
  1391. void LLViewerObject::updateText()
  1392. {
  1393. if (!isDead())
  1394. {
  1395. if (mText.notNull())
  1396. {
  1397. LLVector3 up_offset(0,0,0);
  1398. up_offset.mV[2] = getScale().mV[VZ]*0.6f;
  1399. if (mDrawable.notNull())
  1400. {
  1401. mText->setPositionAgent(getRenderPosition() + up_offset);
  1402. }
  1403. else
  1404. {
  1405. mText->setPositionAgent(getPositionAgent() + up_offset);
  1406. }
  1407. }
  1408. }
  1409. }
  1410. LLVOAvatar* LLViewerObject::asAvatar()
  1411. {
  1412. return NULL;
  1413. }
  1414. BOOL LLViewerObject::isParticleSource() const
  1415. {
  1416. return !mPartSourcep.isNull() && !mPartSourcep->isDead();
  1417. }
  1418. void LLViewerObject::setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id)
  1419. {
  1420. if (mPartSourcep)
  1421. {
  1422. deleteParticleSource();
  1423. }
  1424. LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::createPSS(this, particle_parameters);
  1425. mPartSourcep = pss;
  1426. if (mPartSourcep)
  1427. {
  1428. mPartSourcep->setOwnerUUID(owner_id);
  1429. if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
  1430. {
  1431. LLViewerTexture* image;
  1432. if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
  1433. {
  1434. image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.tga");
  1435. }
  1436. else
  1437. {
  1438. image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
  1439. }
  1440. mPartSourcep->setImage(image);
  1441. }
  1442. }
  1443. LLViewerPartSim::getInstance()->addPartSource(pss);
  1444. }
  1445. void LLViewerObject::unpackParticleSource(const S32 block_num, const LLUUID& owner_id)
  1446. {
  1447. if (!mPartSourcep.isNull() && mPartSourcep->isDead())
  1448. {
  1449. mPartSourcep = NULL;
  1450. }
  1451. if (mPartSourcep)
  1452. {
  1453. // If we've got one already, just update the existing source (or remove it)
  1454. if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, block_num))
  1455. {
  1456. mPartSourcep->setDead();
  1457. mPartSourcep = NULL;
  1458. }
  1459. }
  1460. else
  1461. {
  1462. LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, block_num);
  1463. //If the owner is muted, don't create the system
  1464. if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return;
  1465. // We need to be able to deal with a particle source that hasn't changed, but still got an update!
  1466. if (pss)
  1467. {
  1468. //  llinfos << "Making particle system with owner " << owner_id << llendl;
  1469. pss->setOwnerUUID(owner_id);
  1470. mPartSourcep = pss;
  1471. LLViewerPartSim::getInstance()->addPartSource(pss);
  1472. }
  1473. }
  1474. if (mPartSourcep)
  1475. {
  1476. if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
  1477. {
  1478. LLViewerTexture* image;
  1479. if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
  1480. {
  1481. image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
  1482. }
  1483. else
  1484. {
  1485. image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
  1486. }
  1487. mPartSourcep->setImage(image);
  1488. }
  1489. }
  1490. }
  1491. void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id)
  1492. {
  1493. if (!mPartSourcep.isNull() && mPartSourcep->isDead())
  1494. {
  1495. mPartSourcep = NULL;
  1496. }
  1497. if (mPartSourcep)
  1498. {
  1499. // If we've got one already, just update the existing source (or remove it)
  1500. if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, dp))
  1501. {
  1502. mPartSourcep->setDead();
  1503. mPartSourcep = NULL;
  1504. }
  1505. }
  1506. else
  1507. {
  1508. LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, dp);
  1509. //If the owner is muted, don't create the system
  1510. if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return;
  1511. // We need to be able to deal with a particle source that hasn't changed, but still got an update!
  1512. if (pss)
  1513. {
  1514. //  llinfos << "Making particle system with owner " << owner_id << llendl;
  1515. pss->setOwnerUUID(owner_id);
  1516. mPartSourcep = pss;
  1517. LLViewerPartSim::getInstance()->addPartSource(pss);
  1518. }
  1519. }
  1520. if (mPartSourcep)
  1521. {
  1522. if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
  1523. {
  1524. LLViewerTexture* image;
  1525. if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
  1526. {
  1527. image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
  1528. }
  1529. else
  1530. {
  1531. image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
  1532. }
  1533. mPartSourcep->setImage(image);
  1534. }
  1535. }
  1536. }
  1537. void LLViewerObject::deleteParticleSource()
  1538. {
  1539. if (mPartSourcep.notNull())
  1540. {
  1541. mPartSourcep->setDead();
  1542. mPartSourcep = NULL;
  1543. }
  1544. }
  1545. // virtual
  1546. void LLViewerObject::updateDrawable(BOOL force_damped)
  1547. {
  1548. if (mDrawable.notNull() && 
  1549. !mDrawable->isState(LLDrawable::ON_MOVE_LIST) &&
  1550. isChanged(MOVED))
  1551. {
  1552. BOOL damped_motion = 
  1553. !isChanged(SHIFTED) && // not shifted between regions this frame and...
  1554. ( force_damped || // ...forced into damped motion by application logic or...
  1555. ( !isSelected() && // ...not selected and...
  1556. ( mDrawable->isRoot() || // ... is root or ...
  1557. (getParent() && !((LLViewerObject*)getParent())->isSelected())// ... parent is not selected and ...
  1558. ) &&
  1559. getPCode() == LL_PCODE_VOLUME && // ...is a volume object and...
  1560. getVelocity().isExactlyZero() && // ...is not moving physically and...
  1561. mDrawable->getGeneration() != -1                    // ...was not created this frame.
  1562. )
  1563. );
  1564. gPipeline.markMoved(mDrawable, damped_motion);
  1565. }
  1566. clearChanged(SHIFTED);
  1567. }
  1568. // virtual, overridden by LLVOVolume
  1569. F32 LLViewerObject::getVObjRadius() const
  1570. {
  1571. return mDrawable.notNull() ? mDrawable->getRadius() : 0.f;
  1572. }
  1573. void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags)
  1574. {
  1575. if (!gAudiop)
  1576. {
  1577. return;
  1578. }
  1579. if (audio_uuid.isNull())
  1580. {
  1581. if (!mAudioSourcep)
  1582. {
  1583. return;
  1584. }
  1585. if (mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads())
  1586. {
  1587. // We don't clear the sound if it's a loop, it'll go away on its own.
  1588. // At least, this appears to be how the scripts work.
  1589. // The attached sound ID is set to NULL to avoid it playing back when the
  1590. // object rezzes in on non-looping sounds.
  1591. //llinfos << "Clearing attached sound " << mAudioSourcep->getCurrentData()->getID() << llendl;
  1592. gAudiop->cleanupAudioSource(mAudioSourcep);
  1593. mAudioSourcep = NULL;
  1594. }
  1595. else if (flags & LL_SOUND_FLAG_STOP)
  1596.         {
  1597. // Just shut off the sound
  1598. mAudioSourcep->play(LLUUID::null);
  1599. }
  1600. return;
  1601. }
  1602. if (flags & LL_SOUND_FLAG_LOOP
  1603. && mAudioSourcep && mAudioSourcep->isLoop() && mAudioSourcep->getCurrentData()
  1604. && mAudioSourcep->getCurrentData()->getID() == audio_uuid)
  1605. {
  1606. //llinfos << "Already playing this sound on a loop, ignoring" << llendl;
  1607. return;
  1608. }
  1609. // don't clean up before previous sound is done. Solves: SL-33486
  1610. if ( mAudioSourcep && mAudioSourcep->isDone() ) 
  1611. {
  1612. gAudiop->cleanupAudioSource(mAudioSourcep);
  1613. mAudioSourcep = NULL;
  1614. }
  1615. getAudioSource(owner_id);
  1616. if (mAudioSourcep)
  1617. {
  1618. BOOL queue = flags & LL_SOUND_FLAG_QUEUE;
  1619. mAudioGain = gain;
  1620. mAudioSourcep->setGain(gain);
  1621. mAudioSourcep->setLoop(flags & LL_SOUND_FLAG_LOOP);
  1622. mAudioSourcep->setSyncMaster(flags & LL_SOUND_FLAG_SYNC_MASTER);
  1623. mAudioSourcep->setSyncSlave(flags & LL_SOUND_FLAG_SYNC_SLAVE);
  1624. mAudioSourcep->setQueueSounds(queue);
  1625. if(!queue) // stop any current sound first to avoid "farts of doom" (SL-1541) -MG
  1626. {
  1627. mAudioSourcep->play(LLUUID::null);
  1628. }
  1629. // Play this sound if region maturity permits
  1630. if( gAgent.canAccessMaturityAtGlobal(this->getPositionGlobal()) )
  1631. {
  1632. //llinfos << "Playing attached sound " << audio_uuid << llendl;
  1633. mAudioSourcep->play(audio_uuid);
  1634. }
  1635. }
  1636. }
  1637. LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)
  1638. {
  1639. if (!mAudioSourcep)
  1640. {
  1641. // Arbitrary low gain for a sound that's not playing.
  1642. // This is used for sound preloads, for example.
  1643. LLAudioSourceVO *asvop = new LLAudioSourceVO(mID, owner_id, 0.01f, this);
  1644. mAudioSourcep = asvop;
  1645. if(gAudiop) gAudiop->addAudioSource(asvop);
  1646. }
  1647. return mAudioSourcep;
  1648. }
  1649. void LLViewerObject::adjustAudioGain(const F32 gain)
  1650. {
  1651. if (!gAudiop)
  1652. {
  1653. return;
  1654. }
  1655. if (mAudioSourcep)
  1656. {
  1657. mAudioGain = gain;
  1658. mAudioSourcep->setGain(mAudioGain);
  1659. }
  1660. }
  1661. //----------------------------------------------------------------------------
  1662. bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp)
  1663. {
  1664. ExtraParameter* param = getExtraParameterEntryCreate(param_type);
  1665. if (param)
  1666. {
  1667. param->data->unpack(*dp);
  1668. param->in_use = TRUE;
  1669. parameterChanged(param_type, param->data, TRUE, false);
  1670. return true;
  1671. }
  1672. else
  1673. {
  1674. return false;
  1675. }
  1676. }
  1677. LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 param_type)
  1678. {
  1679. LLNetworkData* new_block = NULL;
  1680. switch (param_type)
  1681. {
  1682.   case LLNetworkData::PARAMS_FLEXIBLE:
  1683.   {
  1684.   new_block = new LLFlexibleObjectData();
  1685.   break;
  1686.   }
  1687.   case LLNetworkData::PARAMS_LIGHT:
  1688.   {
  1689.   new_block = new LLLightParams();
  1690.   break;
  1691.   }
  1692.   case LLNetworkData::PARAMS_SCULPT:
  1693.   {
  1694.   new_block = new LLSculptParams();
  1695.   break;
  1696.   }
  1697.   case LLNetworkData::PARAMS_LIGHT_IMAGE:
  1698.   {
  1699.   new_block = new LLLightImageParams();
  1700.   break;
  1701.   }
  1702.   default:
  1703.   {
  1704.   llinfos << "Unknown param type." << llendl;
  1705.   break;
  1706.   }
  1707. };
  1708. if (new_block)
  1709. {
  1710. ExtraParameter* new_entry = new ExtraParameter;
  1711. new_entry->data = new_block;
  1712. new_entry->in_use = false; // not in use yet
  1713. mExtraParameterList[param_type] = new_entry;
  1714. return new_entry;
  1715. }
  1716. return NULL;
  1717. }
  1718. LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntry(U16 param_type) const
  1719. {
  1720. std::map<U16, ExtraParameter*>::const_iterator itor = mExtraParameterList.find(param_type);
  1721. if (itor != mExtraParameterList.end())
  1722. {
  1723. return itor->second;
  1724. }
  1725. return NULL;
  1726. }
  1727. LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntryCreate(U16 param_type)
  1728. {
  1729. ExtraParameter* param = getExtraParameterEntry(param_type);
  1730. if (!param)
  1731. {
  1732. param = createNewParameterEntry(param_type);
  1733. }
  1734. return param;
  1735. }
  1736. LLNetworkData* LLViewerObject::getParameterEntry(U16 param_type) const
  1737. {
  1738. ExtraParameter* param = getExtraParameterEntry(param_type);
  1739. if (param)
  1740. {
  1741. return param->data;
  1742. }
  1743. else
  1744. {
  1745. return NULL;
  1746. }
  1747. }
  1748. BOOL LLViewerObject::getParameterEntryInUse(U16 param_type) const
  1749. {
  1750. ExtraParameter* param = getExtraParameterEntry(param_type);
  1751. if (param)
  1752. {
  1753. return param->in_use;
  1754. }
  1755. else
  1756. {
  1757. return FALSE;
  1758. }
  1759. }
  1760. bool LLViewerObject::setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin)
  1761. {
  1762. ExtraParameter* param = getExtraParameterEntryCreate(param_type);
  1763. if (param)
  1764. {
  1765. if (param->in_use && new_value == *(param->data))
  1766. {
  1767. return false;
  1768. }
  1769. param->in_use = true;
  1770. param->data->copy(new_value);
  1771. parameterChanged(param_type, param->data, TRUE, local_origin);
  1772. return true;
  1773. }
  1774. else
  1775. {
  1776. return false;
  1777. }
  1778. }
  1779. // Assumed to be called locally
  1780. // If in_use is TRUE, will crate a new extra parameter if none exists.
  1781. // Should always return true.
  1782. bool LLViewerObject::setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin)
  1783. {
  1784. ExtraParameter* param = getExtraParameterEntryCreate(param_type);
  1785. if (param && param->in_use != in_use)
  1786. {
  1787. param->in_use = in_use;
  1788. parameterChanged(param_type, param->data, in_use, local_origin);
  1789. return true;
  1790. }
  1791. return false;
  1792. }
  1793. void LLViewerObject::parameterChanged(U16 param_type, bool local_origin)
  1794. {
  1795. ExtraParameter* param = getExtraParameterEntry(param_type);
  1796. if (param)
  1797. {
  1798. parameterChanged(param_type, param->data, param->in_use, local_origin);
  1799. }
  1800. }
  1801. void LLViewerObject::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin)
  1802. {
  1803. if (local_origin)
  1804. {
  1805. LLViewerRegion* regionp = getRegion();
  1806. if(!regionp) return;
  1807. // Change happened on the viewer. Send the change up
  1808. U8 tmp[MAX_OBJECT_PARAMS_SIZE];
  1809. LLDataPackerBinaryBuffer dpb(tmp, MAX_OBJECT_PARAMS_SIZE);
  1810. if (data->pack(dpb))
  1811. {
  1812. U32 datasize = (U32)dpb.getCurrentSize();
  1813. LLMessageSystem* msg = gMessageSystem;
  1814. msg->newMessageFast(_PREHASH_ObjectExtraParams);
  1815. msg->nextBlockFast(_PREHASH_AgentData);
  1816. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  1817. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  1818. msg->nextBlockFast(_PREHASH_ObjectData);
  1819. msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
  1820. msg->addU16Fast(_PREHASH_ParamType, param_type);
  1821. msg->addBOOLFast(_PREHASH_ParamInUse, in_use);
  1822. msg->addU32Fast(_PREHASH_ParamSize, datasize);
  1823. msg->addBinaryDataFast(_PREHASH_ParamData, tmp, datasize);
  1824. msg->sendReliable( regionp->getHost() );
  1825. }
  1826. else
  1827. {
  1828. llwarns << "Failed to send object extra parameters: " << param_type << llendl;
  1829. }
  1830. }
  1831. }
  1832. void LLViewerObject::setDrawableState(U32 state, BOOL recursive)
  1833. {
  1834. if (mDrawable)
  1835. {
  1836. mDrawable->setState(state);
  1837. }
  1838. if (recursive)
  1839. {
  1840. for (child_list_t::iterator iter = mChildList.begin();
  1841.  iter != mChildList.end(); iter++)
  1842. {
  1843. LLViewerObject* child = *iter;
  1844. child->setDrawableState(state, recursive);
  1845. }
  1846. }
  1847. }
  1848. void LLViewerObject::clearDrawableState(U32 state, BOOL recursive)
  1849. {
  1850. if (mDrawable)
  1851. {
  1852. mDrawable->clearState(state);
  1853. }
  1854. if (recursive)
  1855. {
  1856. for (child_list_t::iterator iter = mChildList.begin();
  1857.  iter != mChildList.end(); iter++)
  1858. {
  1859. LLViewerObject* child = *iter;
  1860. child->clearDrawableState(state, recursive);
  1861. }
  1862. }
  1863. }
  1864. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1865. // RN: these functions assume a 2-level hierarchy 
  1866. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1867. // Owned by anyone?
  1868. BOOL LLViewerObject::permAnyOwner() const
  1869. if (isRootEdit())
  1870. {
  1871. return ((mFlags & FLAGS_OBJECT_ANY_OWNER) != 0); 
  1872. }
  1873. else
  1874. {
  1875. return ((LLViewerObject*)getParent())->permAnyOwner();
  1876. }
  1877. }
  1878. // Owned by this viewer?
  1879. BOOL LLViewerObject::permYouOwner() const
  1880. if (isRootEdit())
  1881. {
  1882. #ifdef HACKED_GODLIKE_VIEWER
  1883. return TRUE;
  1884. #else
  1885. # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  1886. if (!LLViewerLogin::getInstance()->isInProductionGrid()
  1887.             && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
  1888. {
  1889. return TRUE;
  1890. }
  1891. # endif
  1892. return ((mFlags & FLAGS_OBJECT_YOU_OWNER) != 0); 
  1893. #endif
  1894. }
  1895. else
  1896. {
  1897. return ((LLViewerObject*)getParent())->permYouOwner();
  1898. }
  1899. }
  1900. // Owned by a group?
  1901. BOOL LLViewerObject::permGroupOwner() const
  1902. if (isRootEdit())
  1903. {
  1904. return ((mFlags & FLAGS_OBJECT_GROUP_OWNED) != 0); 
  1905. }
  1906. else
  1907. {
  1908. return ((LLViewerObject*)getParent())->permGroupOwner();
  1909. }
  1910. }
  1911. // Can the owner edit
  1912. BOOL LLViewerObject::permOwnerModify() const
  1913. if (isRootEdit())
  1914. {
  1915. #ifdef HACKED_GODLIKE_VIEWER
  1916. return TRUE;
  1917. #else
  1918. # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  1919. if (!LLViewerLogin::getInstance()->isInProductionGrid()
  1920.             && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
  1921. {
  1922. return TRUE;
  1923. }
  1924. # endif
  1925. return ((mFlags & FLAGS_OBJECT_OWNER_MODIFY) != 0); 
  1926. #endif
  1927. }
  1928. else
  1929. {
  1930. return ((LLViewerObject*)getParent())->permOwnerModify();
  1931. }
  1932. }
  1933. // Can edit
  1934. BOOL LLViewerObject::permModify() const
  1935. if (isRootEdit())
  1936. {
  1937. #ifdef HACKED_GODLIKE_VIEWER
  1938. return TRUE;
  1939. #else
  1940. # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  1941. if (!LLViewerLogin::getInstance()->isInProductionGrid()
  1942.             && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
  1943. {
  1944. return TRUE;
  1945. }
  1946. # endif
  1947. return ((mFlags & FLAGS_OBJECT_MODIFY) != 0); 
  1948. #endif
  1949. }
  1950. else
  1951. {
  1952. return ((LLViewerObject*)getParent())->permModify();
  1953. }
  1954. }
  1955. // Can copy
  1956. BOOL LLViewerObject::permCopy() const
  1957. if (isRootEdit())
  1958. {
  1959. #ifdef HACKED_GODLIKE_VIEWER
  1960. return TRUE;
  1961. #else
  1962. # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  1963. if (!LLViewerLogin::getInstance()->isInProductionGrid()
  1964.             && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
  1965. {
  1966. return TRUE;
  1967. }
  1968. # endif
  1969. return ((mFlags & FLAGS_OBJECT_COPY) != 0); 
  1970. #endif
  1971. }
  1972. else
  1973. {
  1974. return ((LLViewerObject*)getParent())->permCopy();
  1975. }
  1976. }
  1977. // Can move
  1978. BOOL LLViewerObject::permMove() const
  1979. {
  1980. if (isRootEdit())
  1981. {
  1982. #ifdef HACKED_GODLIKE_VIEWER
  1983. return TRUE;
  1984. #else
  1985. # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  1986. if (!LLViewerLogin::getInstance()->isInProductionGrid()
  1987.             && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
  1988. {
  1989. return TRUE;
  1990. }
  1991. # endif
  1992. return ((mFlags & FLAGS_OBJECT_MOVE) != 0); 
  1993. #endif
  1994. }
  1995. else
  1996. {
  1997. return ((LLViewerObject*)getParent())->permMove();
  1998. }
  1999. }
  2000. // Can be transferred
  2001. BOOL LLViewerObject::permTransfer() const
  2002. if (isRootEdit())
  2003. {
  2004. #ifdef HACKED_GODLIKE_VIEWER
  2005. return TRUE;
  2006. #else
  2007. # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  2008. if (!LLViewerLogin::getInstance()->isInProductionGrid()
  2009.             && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
  2010. {
  2011. return TRUE;
  2012. }
  2013. # endif
  2014. return ((mFlags & FLAGS_OBJECT_TRANSFER) != 0); 
  2015. #endif
  2016. }
  2017. else
  2018. {
  2019. return ((LLViewerObject*)getParent())->permTransfer();
  2020. }
  2021. }
  2022. // Can only open objects that you own, or that someone has
  2023. // given you modify rights to.  JC
  2024. BOOL LLViewerObject::allowOpen() const
  2025. {
  2026. return !flagInventoryEmpty() && (permYouOwner() || permModify());
  2027. }
  2028. LLViewerObject::LLInventoryCallbackInfo::~LLInventoryCallbackInfo()
  2029. {
  2030. if (mListener)
  2031. {
  2032. mListener->clearVOInventoryListener();
  2033. }
  2034. }
  2035. void LLViewerObject::updateVolume(const LLVolumeParams& volume_params)
  2036. {
  2037. if (setVolume(volume_params, 1)) // *FIX: magic number, ack!
  2038. {
  2039. // Transmit the update to the simulator
  2040. sendShapeUpdate();
  2041. markForUpdate(TRUE);
  2042. }
  2043. }
  2044. void LLViewerObject::markForUpdate(BOOL priority)
  2045. {
  2046. if (mDrawable.notNull())
  2047. {
  2048. gPipeline.markTextured(mDrawable);
  2049. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, priority);
  2050. }
  2051. }
  2052. bool LLViewerObject::getIncludeInSearch() const
  2053. {
  2054. return ((mFlags & FLAGS_INCLUDE_IN_SEARCH) != 0);
  2055. }
  2056. void LLViewerObject::setIncludeInSearch(bool include_in_search)
  2057. {
  2058. if (include_in_search)
  2059. {
  2060. mFlags |= FLAGS_INCLUDE_IN_SEARCH;
  2061. }
  2062. else
  2063. {
  2064. mFlags &= ~FLAGS_INCLUDE_IN_SEARCH;
  2065. }
  2066. }
  2067. void LLViewerObject::setRegion(LLViewerRegion *regionp)
  2068. {
  2069. llassert(regionp);
  2070. mLatestRecvPacketID = 0;
  2071. mRegionp = regionp;
  2072. for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
  2073. {
  2074. LLViewerObject* child = *i;
  2075. child->setRegion(regionp);
  2076. }
  2077. setChanged(MOVED | SILHOUETTE);
  2078. updateDrawable(FALSE);
  2079. }
  2080. bool LLViewerObject::specialHoverCursor() const
  2081. {
  2082. return (mFlags & FLAGS_USE_PHYSICS)
  2083. || (mFlags & FLAGS_HANDLE_TOUCH)
  2084. || (mClickAction != 0);
  2085. }
  2086. void LLViewerObject::updateFlags()
  2087. {
  2088. LLViewerRegion* regionp = getRegion();
  2089. if(!regionp) return;
  2090. gMessageSystem->newMessage("ObjectFlagUpdate");
  2091. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  2092. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  2093. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  2094. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, getLocalID() );
  2095. gMessageSystem->addBOOLFast(_PREHASH_UsePhysics, usePhysics() );
  2096. gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
  2097. gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
  2098. gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
  2099. gMessageSystem->sendReliable( regionp->getHost() );
  2100. }
  2101. BOOL LLViewerObject::setFlags(U32 flags, BOOL state)
  2102. {
  2103. BOOL setit = FALSE;
  2104. if (state)
  2105. {
  2106. if ((mFlags & flags) != flags)
  2107. {
  2108. mFlags |= flags;
  2109. setit = TRUE;
  2110. }
  2111. }
  2112. else
  2113. {
  2114. if ((mFlags & flags) != 0)
  2115. {
  2116. mFlags &= ~flags;
  2117. setit = TRUE;
  2118. }
  2119. }
  2120. // BUG: Sometimes viewer physics and simulator physics get
  2121. // out of sync.  To fix this, always send update to simulator.
  2122. //  if (setit)
  2123. {
  2124. updateFlags();
  2125. }
  2126. return setit;
  2127. }
  2128. void LLViewerObject::applyAngularVelocity(F32 dt)
  2129. {
  2130. //do target omega here
  2131. mRotTime += dt;
  2132. LLVector3 ang_vel = getAngularVelocity();
  2133. F32 omega = ang_vel.magVecSquared();
  2134. F32 angle = 0.0f;
  2135. LLQuaternion dQ;
  2136. if (omega > 0.00001f)
  2137. {
  2138. omega = sqrt(omega);
  2139. angle = omega * dt;
  2140. ang_vel *= 1.f/omega;
  2141. dQ.setQuat(angle, ang_vel);
  2142. setRotation(getRotation()*dQ);
  2143. setChanged(MOVED | SILHOUETTE);
  2144. }
  2145. }
  2146. void LLViewerObject::resetRot()
  2147. {
  2148. mRotTime = 0.0f;
  2149. }
  2150. U32 LLViewerObject::getPartitionType() const
  2151. return LLViewerRegion::PARTITION_NONE; 
  2152. }
  2153. void LLViewerObject::dirtySpatialGroup(BOOL priority) const
  2154. {
  2155. if (mDrawable)
  2156. {
  2157. LLSpatialGroup* group = mDrawable->getSpatialGroup();
  2158. if (group)
  2159. {
  2160. group->dirtyGeom();
  2161. gPipeline.markRebuild(group, priority);
  2162. }
  2163. }
  2164. }
  2165. void LLViewerObject::dirtyMesh()
  2166. {
  2167. if (mDrawable)
  2168. {
  2169. LLSpatialGroup* group = mDrawable->getSpatialGroup();
  2170. if (group)
  2171. {
  2172. group->dirtyMesh();
  2173. }
  2174. }
  2175. }
  2176. F32 LLAlphaObject::getPartSize(S32 idx)
  2177. {
  2178. return 0.f;
  2179. }
  2180. // virtual
  2181. void LLStaticViewerObject::updateDrawable(BOOL force_damped)
  2182. {
  2183. // Force an immediate rebuild on any update
  2184. if (mDrawable.notNull())
  2185. {
  2186. mDrawable->updateXform(TRUE);
  2187. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
  2188. }
  2189. clearChanged(SHIFTED);
  2190. }
  2191. void LLViewerObject::saveUnselectedChildrenPosition(std::vector<LLVector3>& positions)
  2192. {
  2193. if(mChildList.empty() || !positions.empty())
  2194. {
  2195. return ;
  2196. }
  2197. for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
  2198. iter != mChildList.end(); iter++)
  2199. {
  2200. LLViewerObject* childp = *iter;
  2201. if (!childp->isSelected() && childp->mDrawable.notNull())
  2202. {
  2203. positions.push_back(childp->getPositionEdit());
  2204. }
  2205. }
  2206. return ;
  2207. }
  2208. void LLViewerObject::saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations)
  2209. {
  2210. if(mChildList.empty())
  2211. {
  2212. return ;
  2213. }
  2214. for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
  2215. iter != mChildList.end(); iter++)
  2216. {
  2217. LLViewerObject* childp = *iter;
  2218. if (!childp->isSelected() && childp->mDrawable.notNull())
  2219. {
  2220. rotations.push_back(childp->getRotationEdit());
  2221. }
  2222. }
  2223. return ;
  2224. }
  2225. //counter-rotation
  2226. void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, 
  2227. const std::vector<LLVector3>& positions)
  2228. {
  2229. if(mChildList.empty())
  2230. {
  2231. return ;
  2232. }
  2233. S32 index = 0 ;
  2234. LLQuaternion inv_rotation = ~getRotationEdit() ;
  2235. LLVector3 offset = getPositionEdit() ;
  2236. for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
  2237. iter != mChildList.end(); iter++)
  2238. {
  2239. LLViewerObject* childp = *iter;
  2240. if (!childp->isSelected() && childp->mDrawable.notNull())
  2241. {
  2242. if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
  2243. {
  2244. childp->setRotation(rotations[index] * inv_rotation);
  2245. childp->setPosition((positions[index] - offset) * inv_rotation);
  2246. LLManip::rebuild(childp);
  2247. }
  2248. else //avatar
  2249. {
  2250. LLVector3 reset_pos = (positions[index] - offset) * inv_rotation ;
  2251. LLQuaternion reset_rot = rotations[index] * inv_rotation ;
  2252. ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
  2253. ((LLVOAvatar*)childp)->mDrawable->mXform.setRotation(reset_rot) ;
  2254. ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos, TRUE);
  2255. ((LLVOAvatar*)childp)->mDrawable->getVObj()->setRotation(reset_rot, TRUE) ;
  2256. LLManip::rebuild(childp);
  2257. }
  2258. index++;
  2259. }
  2260. }
  2261. return ;
  2262. }
  2263. //counter-translation
  2264. void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified)
  2265. {
  2266. if(mChildList.empty())
  2267. {
  2268. return ;
  2269. }
  2270. LLVector3 child_offset;
  2271. if(simplified) //translation only, rotation matrix does not change
  2272. {
  2273. child_offset = offset * ~getRotation();
  2274. }
  2275. else //rotation matrix might change too.
  2276. {
  2277. if (isAttachment() && mDrawable.notNull())
  2278. {
  2279. LLXform* attachment_point_xform = mDrawable->getXform()->getParent();
  2280. LLQuaternion parent_rotation = getRotation() * attachment_point_xform->getWorldRotation();
  2281. child_offset = offset * ~parent_rotation;
  2282. }
  2283. else
  2284. {
  2285. child_offset = offset * ~getRenderRotation();
  2286. }
  2287. }
  2288. for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
  2289. iter != mChildList.end(); iter++)
  2290. {
  2291. LLViewerObject* childp = *iter;
  2292. if (!childp->isSelected() && childp->mDrawable.notNull())
  2293. {
  2294. if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
  2295. {
  2296. childp->setPosition(childp->getPosition() + child_offset);
  2297. LLManip::rebuild(childp);
  2298. }
  2299. else //avatar
  2300. {
  2301. LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
  2302. ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
  2303. ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);
  2304. LLManip::rebuild(childp);
  2305. }
  2306. }
  2307. }
  2308. return ;
  2309. }