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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldrawable.cpp
  3.  * @brief LLDrawable class implementation
  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 "lldrawable.h"
  34. // library includes
  35. #include "material_codes.h"
  36. // viewer includes
  37. #include "llcriticaldamp.h"
  38. #include "llface.h"
  39. #include "lllightconstants.h"
  40. #include "llsky.h"
  41. #include "llsurfacepatch.h"
  42. #include "llviewercamera.h"
  43. #include "llviewerregion.h"
  44. #include "llvolume.h"
  45. #include "llvoavatar.h"
  46. #include "llvovolume.h"
  47. #include "llvosurfacepatch.h" // for debugging
  48. #include "llworld.h"
  49. #include "pipeline.h"
  50. #include "llspatialpartition.h"
  51. #include "llviewerobjectlist.h"
  52. #include "llviewerwindow.h"
  53. const F32 MIN_INTERPOLATE_DISTANCE_SQUARED = 0.001f * 0.001f;
  54. const F32 MAX_INTERPOLATE_DISTANCE_SQUARED = 10.f * 10.f;
  55. const F32 OBJECT_DAMPING_TIME_CONSTANT = 0.06f;
  56. const F32 MIN_SHADOW_CASTER_RADIUS = 2.0f;
  57. static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound");
  58. ////////////////////////
  59. //
  60. // Inline implementations.
  61. //
  62. //
  63. //////////////////////////////
  64. //
  65. // Drawable code
  66. //
  67. //
  68. // static
  69. U32 LLDrawable::sCurVisible = 0;
  70. U32 LLDrawable::sNumZombieDrawables = 0;
  71. F32 LLDrawable::sCurPixelAngle = 0;
  72. LLDynamicArrayPtr<LLPointer<LLDrawable> > LLDrawable::sDeadList;
  73. #define FORCE_INVISIBLE_AREA 16.f
  74. // static
  75. void LLDrawable::incrementVisible() 
  76. {
  77. sCurVisible++;
  78. sCurPixelAngle = (F32) gViewerWindow->getWindowHeightRaw()/LLViewerCamera::getInstance()->getView();
  79. }
  80. void LLDrawable::init()
  81. {
  82. // mXform
  83. mParent = NULL;
  84. mRenderType = 0;
  85. mCurrentScale = LLVector3(1,1,1);
  86. mDistanceWRTCamera = 0.0f;
  87. mQuietCount = 0;
  88. mState     = 0;
  89. mVObjp   = NULL;
  90. // mFaces
  91. mSpatialGroupp = NULL;
  92. mVisible = sCurVisible - 2;//invisible for the current frame and the last frame.
  93. mRadius = 0.f;
  94. mGeneration = -1;
  95. mBinRadius = 1.f;
  96. mSpatialBridge = NULL;
  97. }
  98. // static
  99. void LLDrawable::initClass()
  100. {
  101. }
  102. void LLDrawable::destroy()
  103. {
  104. if (isDead())
  105. {
  106. sNumZombieDrawables--;
  107. }
  108. if (LLSpatialGroup::sNoDelete)
  109. {
  110. llerrs << "Illegal deletion of LLDrawable!" << llendl;
  111. }
  112. std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
  113. mFaces.clear();
  114. /*if (!(sNumZombieDrawables % 10))
  115. {
  116. llinfos << "- Zombie drawables: " << sNumZombieDrawables << llendl;
  117. }*/
  118. }
  119. void LLDrawable::markDead()
  120. {
  121. if (isDead())
  122. {
  123. llwarns << "Warning!  Marking dead multiple times!" << llendl;
  124. return;
  125. }
  126. if (mSpatialBridge)
  127. {
  128. mSpatialBridge->markDead();
  129. mSpatialBridge = NULL;
  130. }
  131. sNumZombieDrawables++;
  132. // We're dead.  Free up all of our references to other objects
  133. setState(DEAD);
  134. cleanupReferences();
  135. // sDeadList.put(this);
  136. }
  137. LLVOVolume* LLDrawable::getVOVolume() const
  138. {
  139. LLViewerObject* objectp = mVObjp;
  140. if ( !isDead() && objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
  141. {
  142. return ((LLVOVolume*)objectp);
  143. }
  144. else
  145. {
  146. return NULL;
  147. }
  148. }
  149. BOOL LLDrawable::isLight() const
  150. {
  151. LLViewerObject* objectp = mVObjp;
  152. if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME) && !isDead())
  153. {
  154. return ((LLVOVolume*)objectp)->getIsLight();
  155. }
  156. else
  157. {
  158. return FALSE;
  159. }
  160. }
  161. void LLDrawable::cleanupReferences()
  162. {
  163. LLFastTimer t(FTM_PIPELINE);
  164. std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
  165. mFaces.clear();
  166. gObjectList.removeDrawable(this);
  167. gPipeline.unlinkDrawable(this);
  168. // Cleanup references to other objects
  169. mVObjp = NULL;
  170. mParent = NULL;
  171. }
  172. void LLDrawable::cleanupDeadDrawables()
  173. {
  174. /*
  175. S32 i;
  176. for (i = 0; i < sDeadList.count(); i++)
  177. {
  178. if (sDeadList[i]->getNumRefs() > 1)
  179. {
  180. llwarns << "Dead drawable has " << sDeadList[i]->getNumRefs() << " remaining refs" << llendl;
  181. gPipeline.findReferences(sDeadList[i]);
  182. }
  183. }
  184. */
  185. sDeadList.reset();
  186. }
  187. S32 LLDrawable::findReferences(LLDrawable *drawablep)
  188. {
  189. S32 count = 0;
  190. if (mParent == drawablep)
  191. {
  192. llinfos << this << ": parent reference" << llendl;
  193. count++;
  194. }
  195. return count;
  196. }
  197. LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)
  198. {
  199. LLMemType mt(LLMemType::MTYPE_DRAWABLE);
  200. LLFace *face = new LLFace(this, mVObjp);
  201. if (!face) llerrs << "Allocating new Face: " << mFaces.size() << llendl;
  202. if (face)
  203. {
  204. mFaces.push_back(face);
  205. if (poolp)
  206. {
  207. face->setPool(poolp, texturep);
  208. }
  209. if (isState(UNLIT))
  210. {
  211. face->setState(LLFace::FULLBRIGHT);
  212. }
  213. }
  214. return face;
  215. }
  216. LLFace* LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep)
  217. {
  218. LLMemType mt(LLMemType::MTYPE_DRAWABLE);
  219. LLFace *face;
  220. face = new LLFace(this, mVObjp);
  221. face->setTEOffset(mFaces.size());
  222. face->setTexture(texturep);
  223. face->setPoolType(gPipeline.getPoolTypeFromTE(te, texturep));
  224. mFaces.push_back(face);
  225. if (isState(UNLIT))
  226. {
  227. face->setState(LLFace::FULLBRIGHT);
  228. }
  229. return face;
  230. }
  231. void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep)
  232. {
  233. if (newFaces == (S32)mFaces.size())
  234. {
  235. return;
  236. }
  237. else if (newFaces < (S32)mFaces.size())
  238. {
  239. std::for_each(mFaces.begin() + newFaces, mFaces.end(), DeletePointer());
  240. mFaces.erase(mFaces.begin() + newFaces, mFaces.end());
  241. }
  242. else // (newFaces > mFaces.size())
  243. {
  244. mFaces.reserve(newFaces);
  245. for (int i = mFaces.size(); i<newFaces; i++)
  246. {
  247. addFace(poolp, texturep);
  248. }
  249. }
  250. llassert_always(mFaces.size() == newFaces);
  251. }
  252. void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep)
  253. {
  254. if (newFaces <= (S32)mFaces.size() && newFaces >= (S32)mFaces.size()/2)
  255. {
  256. return;
  257. }
  258. else if (newFaces < (S32)mFaces.size())
  259. {
  260. std::for_each(mFaces.begin() + newFaces, mFaces.end(), DeletePointer());
  261. mFaces.erase(mFaces.begin() + newFaces, mFaces.end());
  262. }
  263. else // (newFaces > mFaces.size())
  264. {
  265. mFaces.reserve(newFaces);
  266. for (int i = mFaces.size(); i<newFaces; i++)
  267. {
  268. addFace(poolp, texturep);
  269. }
  270. }
  271. llassert_always(mFaces.size() == newFaces) ;
  272. }
  273. void LLDrawable::mergeFaces(LLDrawable* src)
  274. {
  275. U32 face_count = mFaces.size() + src->mFaces.size();
  276. mFaces.reserve(face_count);
  277. for (U32 i = 0; i < src->mFaces.size(); i++)
  278. {
  279. LLFace* facep = src->mFaces[i];
  280. facep->setDrawable(this);
  281. mFaces.push_back(facep);
  282. }
  283. src->mFaces.clear();
  284. }
  285. void LLDrawable::deleteFaces(S32 offset, S32 count)
  286. {
  287. face_list_t::iterator face_begin = mFaces.begin() + offset;
  288. face_list_t::iterator face_end = face_begin + count;
  289. std::for_each(face_begin, face_end, DeletePointer());
  290. mFaces.erase(face_begin, face_end);
  291. }
  292. void LLDrawable::update()
  293. {
  294. llerrs << "Shouldn't be called!" << llendl;
  295. }
  296. void LLDrawable::updateMaterial()
  297. {
  298. }
  299. void LLDrawable::makeActive()
  300. {
  301. #if !LL_RELEASE_FOR_DOWNLOAD
  302. if (mVObjp.notNull())
  303. {
  304. U32 pcode = mVObjp->getPCode();
  305. if (pcode == LLViewerObject::LL_VO_WATER ||
  306. pcode == LLViewerObject::LL_VO_SURFACE_PATCH ||
  307. pcode == LLViewerObject::LL_VO_PART_GROUP ||
  308. pcode == LLViewerObject::LL_VO_HUD_PART_GROUP ||
  309. pcode == LLViewerObject::LL_VO_CLOUDS ||
  310. pcode == LLViewerObject::LL_VO_GROUND ||
  311. pcode == LLViewerObject::LL_VO_SKY)
  312. {
  313. llerrs << "Static viewer object has active drawable!" << llendl;
  314. }
  315. }
  316. #endif
  317. if (!isState(ACTIVE)) // && mGeneration > 0)
  318. {
  319. setState(ACTIVE);
  320. //parent must be made active first
  321. if (!isRoot() && !mParent->isActive())
  322. {
  323. mParent->makeActive();
  324. }
  325. gPipeline.setActive(this, TRUE);
  326. //all child objects must also be active
  327. llassert_always(mVObjp);
  328. LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren();
  329. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  330.  iter != child_list.end(); iter++)
  331. {
  332. LLViewerObject* child = *iter;
  333. LLDrawable* drawable = child->mDrawable;
  334. if (drawable)
  335. {
  336. drawable->makeActive();
  337. }
  338. }
  339. if (mVObjp->getPCode() == LL_PCODE_VOLUME)
  340. {
  341. if (mVObjp->isFlexible())
  342. {
  343. return;
  344. }
  345. }
  346. if (mVObjp->getPCode() == LL_PCODE_VOLUME)
  347. {
  348. gPipeline.markRebuild(this, LLDrawable::REBUILD_VOLUME, TRUE);
  349. }
  350. updatePartition();
  351. }
  352. if (isRoot())
  353. {
  354. mQuietCount = 0;
  355. }
  356. else
  357. {
  358. getParent()->mQuietCount = 0;
  359. }
  360. }
  361. void LLDrawable::makeStatic(BOOL warning_enabled)
  362. {
  363. if (isState(ACTIVE))
  364. {
  365. clearState(ACTIVE);
  366. gPipeline.setActive(this, FALSE);
  367. if (mParent.notNull() && mParent->isActive() && warning_enabled)
  368. {
  369. LL_WARNS_ONCE("Drawable") << "Drawable becomes static with active parent!" << LL_ENDL;
  370. }
  371. LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren();
  372. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  373.  iter != child_list.end(); iter++)
  374. {
  375. LLViewerObject* child = *iter;
  376. LLDrawable* child_drawable = child->mDrawable;
  377. if (child_drawable)
  378. {
  379. if (child_drawable->getParent() != this)
  380. {
  381. llwarns << "Child drawable has unknown parent." << llendl;
  382. }
  383. child_drawable->makeStatic(warning_enabled);
  384. }
  385. }
  386. if (mVObjp->getPCode() == LL_PCODE_VOLUME)
  387. {
  388. gPipeline.markRebuild(this, LLDrawable::REBUILD_VOLUME, TRUE);
  389. }
  390. if (mSpatialBridge)
  391. {
  392. mSpatialBridge->markDead();
  393. setSpatialBridge(NULL);
  394. }
  395. }
  396. updatePartition();
  397. }
  398. // Returns "distance" between target destination and resulting xfrom
  399. F32 LLDrawable::updateXform(BOOL undamped)
  400. {
  401. BOOL damped = !undamped;
  402. // Position
  403. LLVector3 old_pos(mXform.getPosition());
  404. LLVector3 target_pos;
  405. if (mXform.isRoot())
  406. {
  407. // get root position in your agent's region
  408. target_pos = mVObjp->getPositionAgent();
  409. }
  410. else
  411. {
  412. // parent-relative position
  413. target_pos = mVObjp->getPosition();
  414. }
  415. // Rotation
  416. LLQuaternion old_rot(mXform.getRotation());
  417. LLQuaternion target_rot = mVObjp->getRotation();
  418. //scaling
  419. LLVector3 target_scale = mVObjp->getScale();
  420. LLVector3 old_scale = mCurrentScale;
  421. LLVector3 dest_scale = target_scale;
  422. // Damping
  423. F32 dist_squared = 0.f;
  424. F32 camdist2 = (mDistanceWRTCamera * mDistanceWRTCamera);
  425. if (damped && isVisible())
  426. {
  427. F32 lerp_amt = llclamp(LLCriticalDamp::getInterpolant(OBJECT_DAMPING_TIME_CONSTANT), 0.f, 1.f);
  428. LLVector3 new_pos = lerp(old_pos, target_pos, lerp_amt);
  429. dist_squared = dist_vec_squared(new_pos, target_pos);
  430. LLQuaternion new_rot = nlerp(lerp_amt, old_rot, target_rot);
  431. dist_squared += (1.f - dot(new_rot, target_rot)) * 10.f;
  432. LLVector3 new_scale = lerp(old_scale, target_scale, lerp_amt);
  433. dist_squared += dist_vec_squared(new_scale, target_scale);
  434. if ((dist_squared >= MIN_INTERPOLATE_DISTANCE_SQUARED * camdist2) &&
  435. (dist_squared <= MAX_INTERPOLATE_DISTANCE_SQUARED))
  436. {
  437. // interpolate
  438. target_pos = new_pos;
  439. target_rot = new_rot;
  440. target_scale = new_scale;
  441. }
  442. else
  443. {
  444. // snap to final position
  445. dist_squared = 0.0f;
  446. if (!isRoot())
  447. { //child prim snapping to some position, needs a rebuild
  448. gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION, TRUE);
  449. }
  450. }
  451. }
  452. if ((mCurrentScale != target_scale) ||
  453. (!isRoot() && 
  454.  (dist_squared >= MIN_INTERPOLATE_DISTANCE_SQUARED || 
  455.  !mVObjp->getAngularVelocity().isExactlyZero() ||
  456.  target_pos != mXform.getPosition() ||
  457.  target_rot != mXform.getRotation())))
  458. { //child prim moving or scale change requires immediate rebuild
  459. gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION, TRUE);
  460. }
  461. else if (!getVOVolume() && !isAvatar())
  462. {
  463. movePartition();
  464. }
  465. // Update
  466. mXform.setPosition(target_pos);
  467. mXform.setRotation(target_rot);
  468. mXform.setScale(LLVector3(1,1,1)); //no scale in drawable transforms (IT'S A RULE!)
  469. mXform.updateMatrix();
  470. mCurrentScale = target_scale;
  471. if (mSpatialBridge)
  472. {
  473. gPipeline.markMoved(mSpatialBridge, FALSE);
  474. }
  475. return dist_squared;
  476. }
  477. void LLDrawable::setRadius(F32 radius)
  478. {
  479. if (mRadius != radius)
  480. {
  481. mRadius = radius;
  482. }
  483. }
  484. void LLDrawable::moveUpdatePipeline(BOOL moved)
  485. {
  486. makeActive();
  487. // Update the face centers.
  488. for (S32 i = 0; i < getNumFaces(); i++)
  489. {
  490. getFace(i)->updateCenterAgent();
  491. }
  492. }
  493. void LLDrawable::movePartition()
  494. {
  495. LLSpatialPartition* part = getSpatialPartition();
  496. if (part)
  497. {
  498. part->move(this, getSpatialGroup());
  499. }
  500. }
  501. BOOL LLDrawable::updateMove()
  502. {
  503. if (isDead())
  504. {
  505. llwarns << "Update move on dead drawable!" << llendl;
  506. return TRUE;
  507. }
  508. if (mVObjp.isNull())
  509. {
  510. return FALSE;
  511. }
  512. makeActive();
  513. BOOL done;
  514. if (isState(MOVE_UNDAMPED))
  515. {
  516. done = updateMoveUndamped();
  517. }
  518. else
  519. {
  520. done = updateMoveDamped();
  521. }
  522. return done;
  523. }
  524. BOOL LLDrawable::updateMoveUndamped()
  525. {
  526. F32 dist_squared = updateXform(TRUE);
  527. mGeneration++;
  528. if (!isState(LLDrawable::INVISIBLE))
  529. {
  530. BOOL moved = (dist_squared > 0.001f && dist_squared < 255.99f);
  531. moveUpdatePipeline(moved);
  532. mVObjp->updateText();
  533. }
  534. mVObjp->clearChanged(LLXform::MOVED);
  535. return TRUE;
  536. }
  537. void LLDrawable::updatePartition()
  538. {
  539. if (!getVOVolume())
  540. {
  541. movePartition();
  542. }
  543. else if (mSpatialBridge)
  544. {
  545. gPipeline.markMoved(mSpatialBridge, FALSE);
  546. }
  547. else
  548. {
  549. //a child prim moved and needs its verts regenerated
  550. gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION, TRUE);
  551. }
  552. }
  553. BOOL LLDrawable::updateMoveDamped()
  554. {
  555. F32 dist_squared = updateXform(FALSE);
  556. mGeneration++;
  557. if (!isState(LLDrawable::INVISIBLE))
  558. {
  559. BOOL moved = (dist_squared > 0.001f && dist_squared < 128.0f);
  560. moveUpdatePipeline(moved);
  561. mVObjp->updateText();
  562. }
  563. BOOL done_moving = (dist_squared == 0.0f) ? TRUE : FALSE;
  564. if (done_moving)
  565. {
  566. mVObjp->clearChanged(LLXform::MOVED);
  567. }
  568. return done_moving;
  569. }
  570. void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
  571. {
  572. if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
  573. {
  574. llerrs << "WTF?" << llendl;
  575. }
  576. //switch LOD with the spatial group to avoid artifacts
  577. //LLSpatialGroup* sg = getSpatialGroup();
  578. LLVector3 pos;
  579. //if (!sg || sg->changeLOD())
  580. {
  581. LLVOVolume* volume = getVOVolume();
  582. if (volume)
  583. {
  584. volume->updateRelativeXform();
  585. pos = volume->getRelativeXform().getTranslation();
  586. if (isStatic())
  587. {
  588. pos += volume->getRegion()->getOriginAgent();
  589. }
  590. if (isState(LLDrawable::HAS_ALPHA))
  591. {
  592. for (S32 i = 0; i < getNumFaces(); i++)
  593. {
  594. LLFace* facep = getFace(i);
  595. if (force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA)
  596. {
  597. LLVector3 box = (facep->mExtents[1] - facep->mExtents[0]) * 0.25f;
  598. LLVector3 v = (facep->mCenterLocal-camera.getOrigin());
  599. const LLVector3& at = camera.getAtAxis();
  600. for (U32 j = 0; j < 3; j++)
  601. {
  602. v.mV[j] -= box.mV[j] * at.mV[j];
  603. }
  604. facep->mDistance = v * camera.getAtAxis();
  605. }
  606. }
  607. }
  608. }
  609. else
  610. {
  611. pos = LLVector3(getPositionGroup());
  612. }
  613. pos -= camera.getOrigin();
  614. mDistanceWRTCamera = llround(pos.magVec(), 0.01f);
  615. mVObjp->updateLOD();
  616. }
  617. }
  618. void LLDrawable::updateTexture()
  619. {
  620. LLMemType mt(LLMemType::MTYPE_DRAWABLE);
  621. if (isDead())
  622. {
  623. llwarns << "Dead drawable updating texture!" << llendl;
  624. return;
  625. }
  626. if (getNumFaces() != mVObjp->getNumTEs())
  627. { //drawable is transitioning its face count
  628. return;
  629. }
  630. if (getVOVolume())
  631. {
  632. if (isActive())
  633. {
  634. if (isRoot())
  635. {
  636. mQuietCount = 0;
  637. }
  638. else
  639. {
  640. getParent()->mQuietCount = 0;
  641. }
  642. }
  643. gPipeline.markRebuild(this, LLDrawable::REBUILD_MATERIAL, TRUE);
  644. }
  645. }
  646. BOOL LLDrawable::updateGeometry(BOOL priority)
  647. {
  648. llassert(mVObjp.notNull());
  649. BOOL res = mVObjp->updateGeometry(this);
  650. return res;
  651. }
  652. void LLDrawable::shiftPos(const LLVector3 &shift_vector)
  653. {
  654. if (isDead())
  655. {
  656. llwarns << "Shifting dead drawable" << llendl;
  657. return;
  658. }
  659. if (mParent)
  660. {
  661. mXform.setPosition(mVObjp->getPosition());
  662. }
  663. else
  664. {
  665. mXform.setPosition(mVObjp->getPositionAgent());
  666. }
  667. mXform.setRotation(mVObjp->getRotation());
  668. mXform.setScale(1,1,1);
  669. mXform.updateMatrix();
  670. if (isStatic())
  671. {
  672. LLVOVolume* volume = getVOVolume();
  673. if (!volume)
  674. {
  675. gPipeline.markRebuild(this, LLDrawable::REBUILD_ALL, TRUE);
  676. }
  677. for (S32 i = 0; i < getNumFaces(); i++)
  678. {
  679. LLFace *facep = getFace(i);
  680. facep->mCenterAgent += shift_vector;
  681. facep->mExtents[0] += shift_vector;
  682. facep->mExtents[1] += shift_vector;
  683. if (!volume && facep->hasGeometry())
  684. {
  685. facep->mVertexBuffer = NULL;
  686. facep->mLastVertexBuffer = NULL;
  687. }
  688. }
  689. mExtents[0] += shift_vector;
  690. mExtents[1] += shift_vector;
  691. mPositionGroup += LLVector3d(shift_vector);
  692. }
  693. else if (mSpatialBridge)
  694. {
  695. mSpatialBridge->shiftPos(shift_vector);
  696. }
  697. else if (isAvatar())
  698. {
  699. mExtents[0] += shift_vector;
  700. mExtents[1] += shift_vector;
  701. mPositionGroup += LLVector3d(shift_vector);
  702. }
  703. mVObjp->onShift(shift_vector);
  704. }
  705. const LLVector3& LLDrawable::getBounds(LLVector3& min, LLVector3& max) const
  706. {
  707. mXform.getMinMax(min,max);
  708. return mXform.getPositionW();
  709. }
  710. const LLVector3* LLDrawable::getSpatialExtents() const
  711. {
  712. return mExtents;
  713. }
  714. void LLDrawable::setSpatialExtents(LLVector3 min, LLVector3 max)
  715. LLVector3 size = max - min;
  716. mExtents[0] = min; 
  717. mExtents[1] = max; 
  718. }
  719. void LLDrawable::setPositionGroup(const LLVector3d& pos)
  720. {
  721. mPositionGroup.setVec(pos);
  722. }
  723. void LLDrawable::updateSpatialExtents()
  724. {
  725. if (mVObjp)
  726. {
  727. mVObjp->updateSpatialExtents(mExtents[0], mExtents[1]);
  728. }
  729. updateBinRadius();
  730. if (mSpatialBridge.notNull())
  731. {
  732. mPositionGroup.setVec(0,0,0);
  733. }
  734. }
  735. void LLDrawable::updateBinRadius()
  736. {
  737. if (mVObjp.notNull())
  738. {
  739. mBinRadius = llmin(mVObjp->getBinRadius(), 256.f);
  740. }
  741. else
  742. {
  743. mBinRadius = llmin(getRadius()*4.f, 256.f);
  744. }
  745. }
  746. void LLDrawable::updateSpecialHoverCursor(BOOL enabled)
  747. {
  748. // TODO: maintain a list of objects that have special
  749. // hover cursors, then use that list for per-frame
  750. // hover cursor selection. JC
  751. }
  752. F32 LLDrawable::getVisibilityRadius() const
  753. {
  754. if (isDead())
  755. {
  756. return 0.f;
  757. }
  758. else if (isLight())
  759. {
  760. const LLVOVolume *vov = getVOVolume();
  761. if (vov)
  762. {
  763. return llmax(getRadius(), vov->getLightRadius());
  764. } else {
  765. // llwarns ?
  766. }
  767. }
  768. return getRadius();
  769. }
  770. void LLDrawable::updateUVMinMax()
  771. {
  772. }
  773. void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
  774. {
  775. /*if (mSpatialGroupp && (groupp != mSpatialGroupp))
  776. {
  777. mSpatialGroupp->setState(LLSpatialGroup::GEOM_DIRTY);
  778. }*/
  779. mSpatialGroupp = groupp;
  780. }
  781. LLSpatialPartition* LLDrawable::getSpatialPartition()
  782. LLSpatialPartition* retval = NULL;
  783. if (!mVObjp || 
  784. !getVOVolume() ||
  785. isStatic())
  786. {
  787. retval = gPipeline.getSpatialPartition((LLViewerObject*) mVObjp);
  788. }
  789. else if (isRoot())
  790. { //must be an active volume
  791. if (!mSpatialBridge)
  792. {
  793. if (mVObjp->isHUDAttachment())
  794. {
  795. setSpatialBridge(new LLHUDBridge(this));
  796. }
  797. else
  798. {
  799. setSpatialBridge(new LLVolumeBridge(this));
  800. }
  801. }
  802. return mSpatialBridge->asPartition();
  803. }
  804. else 
  805. {
  806. retval = getParent()->getSpatialPartition();
  807. }
  808. if (retval && mSpatialBridge.notNull())
  809. {
  810. mSpatialBridge->markDead();
  811. setSpatialBridge(NULL);
  812. }
  813. return retval;
  814. }
  815. const S32 MIN_VIS_FRAME_RANGE = 2 ; //two frames:the current one and the last one.
  816. //static 
  817. S32 LLDrawable::getMinVisFrameRange()
  818. {
  819. return MIN_VIS_FRAME_RANGE ;
  820. }
  821. BOOL LLDrawable::isRecentlyVisible() const
  822. {
  823. //currently visible or visible in the previous frame.
  824. BOOL vis = isVisible() || (sCurVisible - mVisible < MIN_VIS_FRAME_RANGE)  ;
  825. if(!vis)
  826. {
  827. LLSpatialGroup* group = getSpatialGroup();
  828. if (group && group->isRecentlyVisible())
  829. {
  830. mVisible = sCurVisible;
  831. vis = TRUE ;
  832. }
  833. }
  834. return vis ;
  835. }
  836. BOOL LLDrawable::isVisible() const
  837. {
  838. if (mVisible == sCurVisible)
  839. {
  840. return TRUE;
  841. }
  842. #if 0
  843. //disabling this code fixes DEV-20105.  Leaving in place in case some other bug pops up as a a result.
  844. //should be safe to just always ask the spatial group for visibility.
  845. if (isActive())
  846. {
  847. if (isRoot())
  848. {
  849. LLSpatialGroup* group = mSpatialBridge.notNull() ? mSpatialBridge->getSpatialGroup() :
  850. getSpatialGroup();
  851. if (group && group->isVisible())
  852. {
  853. mVisible = sCurVisible;
  854. return TRUE;
  855. }
  856. }
  857. else
  858. {
  859. if (getParent()->isVisible())
  860. {
  861. mVisible = sCurVisible;
  862. return TRUE;
  863. }
  864. }
  865. }
  866. else
  867. #endif
  868. {
  869. LLSpatialGroup* group = getSpatialGroup();
  870. if (group && group->isVisible())
  871. {
  872. mVisible = sCurVisible;
  873. return TRUE;
  874. }
  875. }
  876. return FALSE;
  877. }
  878. //=======================================
  879. // Spatial Partition Bridging Drawable
  880. //=======================================
  881. LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask)
  882. : LLSpatialPartition(data_mask, render_by_group, FALSE)
  883. {
  884. mDrawable = root;
  885. root->setSpatialBridge(this);
  886. mRenderType = mDrawable->mRenderType;
  887. mDrawableType = mDrawable->mRenderType;
  888. mPartitionType = LLViewerRegion::PARTITION_VOLUME;
  889. mOctree->balance();
  890. llassert(mDrawable);
  891. llassert(mDrawable->getRegion());
  892. LLSpatialPartition *part = mDrawable->getRegion()->getSpatialPartition(mPartitionType);
  893. llassert(part);
  894. if (part)
  895. {
  896. part->put(this);
  897. }
  898. }
  899. LLSpatialBridge::~LLSpatialBridge()
  900. {
  901. LLSpatialGroup* group = getSpatialGroup();
  902. if (group)
  903. {
  904. group->mSpatialPartition->remove(this, group);
  905. }
  906. }
  907. void LLSpatialBridge::updateSpatialExtents()
  908. {
  909. LLSpatialGroup* root = (LLSpatialGroup*) mOctree->getListener(0);
  910. {
  911. LLFastTimer ftm(FTM_CULL_REBOUND);
  912. root->rebound();
  913. }
  914. LLXformMatrix* mat = mDrawable->getXform();
  915. LLVector3 offset = root->mBounds[0];
  916. LLVector3 size = root->mBounds[1];
  917. LLVector3 center = LLVector3(0,0,0) * mat->getWorldMatrix();
  918. LLQuaternion rotation = LLQuaternion(mat->getWorldMatrix());
  919. offset *= rotation;
  920. center += offset;
  921. LLVector3 v[4];
  922. //get 4 corners of bounding box
  923. v[0] = (size * rotation);
  924. v[1] = (LLVector3(-size.mV[0], -size.mV[1], size.mV[2]) * rotation);
  925. v[2] = (LLVector3(size.mV[0], -size.mV[1], -size.mV[2]) * rotation);
  926. v[3] = (LLVector3(-size.mV[0], size.mV[1], -size.mV[2]) * rotation);
  927. LLVector3& newMin = mExtents[0];
  928. LLVector3& newMax = mExtents[1];
  929. newMin = newMax = center;
  930. for (U32 i = 0; i < 4; i++)
  931. {
  932. for (U32 j = 0; j < 3; j++)
  933. {
  934. F32 delta = fabsf(v[i].mV[j]);
  935. F32 min = center.mV[j] - delta;
  936. F32 max = center.mV[j] + delta;
  937. if (min < newMin.mV[j])
  938. {
  939. newMin.mV[j] = min;
  940. }
  941. if (max > newMax.mV[j])
  942. {
  943. newMax.mV[j] = max;
  944. }
  945. }
  946. }
  947. LLVector3 diagonal = newMax - newMin;
  948. mRadius = diagonal.magVec() * 0.5f;
  949. mPositionGroup.setVec((newMin + newMax) * 0.5f);
  950. updateBinRadius();
  951. }
  952. void LLSpatialBridge::updateBinRadius()
  953. {
  954. mBinRadius = llmin((F32) mOctree->getSize().mdV[0]*0.5f, 256.f);
  955. }
  956. LLCamera LLSpatialBridge::transformCamera(LLCamera& camera)
  957. {
  958. LLCamera ret = camera;
  959. LLXformMatrix* mat = mDrawable->getXform();
  960. LLVector3 center = LLVector3(0,0,0) * mat->getWorldMatrix();
  961. LLQuaternion rotation = LLQuaternion(mat->getWorldMatrix());
  962. LLVector3 delta = ret.getOrigin() - center;
  963. LLQuaternion rot = ~mat->getRotation();
  964. delta *= rot;
  965. LLVector3 lookAt = ret.getAtAxis();
  966. LLVector3 up_axis = ret.getUpAxis();
  967. LLVector3 left_axis = ret.getLeftAxis();
  968. lookAt *= rot;
  969. up_axis *= rot;
  970. left_axis *= rot;
  971. if (!delta.isFinite())
  972. {
  973. delta.clearVec();
  974. }
  975. ret.setOrigin(delta);
  976. ret.setAxes(lookAt, left_axis, up_axis);
  977. return ret;
  978. }
  979. void LLDrawable::setVisible(LLCamera& camera, std::vector<LLDrawable*>* results, BOOL for_select)
  980. {
  981. mVisible = sCurVisible;
  982. #if 0 && !LL_RELEASE_FOR_DOWNLOAD
  983. //crazy paranoid rules checking
  984. if (getVOVolume())
  985. {
  986. if (!isRoot())
  987. {
  988. if (isActive() && !mParent->isActive())
  989. {
  990. llerrs << "Active drawable has static parent!" << llendl;
  991. }
  992. if (isStatic() && !mParent->isStatic())
  993. {
  994. llerrs << "Static drawable has active parent!" << llendl;
  995. }
  996. if (mSpatialBridge)
  997. {
  998. llerrs << "Child drawable has spatial bridge!" << llendl;
  999. }
  1000. }
  1001. else if (isActive() && !mSpatialBridge)
  1002. {
  1003. llerrs << "Active root drawable has no spatial bridge!" << llendl;
  1004. }
  1005. else if (isStatic() && mSpatialBridge.notNull())
  1006. {
  1007. llerrs << "Static drawable has spatial bridge!" << llendl;
  1008. }
  1009. }
  1010. #endif
  1011. }
  1012. class LLOctreeMarkNotCulled: public LLOctreeTraveler<LLDrawable>
  1013. {
  1014. public:
  1015. LLCamera* mCamera;
  1016. LLOctreeMarkNotCulled(LLCamera* camera_in) : mCamera(camera_in) { }
  1017. virtual void traverse(const LLOctreeNode<LLDrawable>* node)
  1018. {
  1019. LLSpatialGroup* group = (LLSpatialGroup*) node->getListener(0);
  1020. group->setVisible();
  1021. LLOctreeTraveler<LLDrawable>::traverse(node);
  1022. }
  1023. void visit(const LLOctreeNode<LLDrawable>* branch)
  1024. {
  1025. gPipeline.markNotCulled((LLSpatialGroup*) branch->getListener(0), *mCamera);
  1026. }
  1027. };
  1028. void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results, BOOL for_select)
  1029. {
  1030. if (!gPipeline.hasRenderType(mDrawableType))
  1031. {
  1032. return;
  1033. }
  1034. //HACK don't draw attachments for avatars that haven't been visible in more than a frame
  1035. LLViewerObject *vobj = mDrawable->getVObj();
  1036. if (vobj && vobj->isAttachment() && !vobj->isHUDAttachment())
  1037. {
  1038. LLDrawable* av;
  1039. LLDrawable* parent = mDrawable->getParent();
  1040. if (parent)
  1041. {
  1042. LLViewerObject* objparent = parent->getVObj();
  1043. av = objparent->mDrawable;
  1044. LLSpatialGroup* group = av->getSpatialGroup();
  1045. BOOL impostor = FALSE;
  1046. BOOL loaded = FALSE;
  1047. if (objparent->isAvatar())
  1048. {
  1049. LLVOAvatar* avatarp = (LLVOAvatar*) objparent;
  1050. if (avatarp->isVisible())
  1051. {
  1052. impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor();
  1053. loaded   = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded();
  1054. }
  1055. else
  1056. {
  1057. return;
  1058. }
  1059. }
  1060. if (!group ||
  1061. LLDrawable::getCurrentFrame() - av->mVisible > 1 ||
  1062. impostor ||
  1063. !loaded)
  1064. {
  1065. return;
  1066. }
  1067. }
  1068. }
  1069. LLSpatialGroup* group = (LLSpatialGroup*) mOctree->getListener(0);
  1070. group->rebound();
  1071. LLVector3 center = (mExtents[0] + mExtents[1]) * 0.5f;
  1072. LLVector3 size = (mExtents[1]-mExtents[0]) * 0.5f;
  1073. if ((LLPipeline::sShadowRender && camera_in.AABBInFrustum(center, size)) ||
  1074. LLPipeline::sImpostorRender ||
  1075. (camera_in.AABBInFrustumNoFarClip(center, size) && 
  1076. AABBSphereIntersect(mExtents[0], mExtents[1], camera_in.getOrigin(), camera_in.mFrustumCornerDist)))
  1077. {
  1078. if (!LLPipeline::sImpostorRender &&
  1079. !LLPipeline::sShadowRender && 
  1080. LLPipeline::calcPixelArea(center, size, camera_in) < FORCE_INVISIBLE_AREA)
  1081. {
  1082. return;
  1083. }
  1084. LLDrawable::setVisible(camera_in);
  1085. if (for_select)
  1086. {
  1087. results->push_back(mDrawable);
  1088. if (mDrawable->getVObj())
  1089. {
  1090. LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
  1091. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  1092.  iter != child_list.end(); iter++)
  1093. {
  1094. LLViewerObject* child = *iter;
  1095. LLDrawable* drawable = child->mDrawable;
  1096. results->push_back(drawable);
  1097. }
  1098. }
  1099. }
  1100. else 
  1101. {
  1102. LLCamera trans_camera = transformCamera(camera_in);
  1103. LLOctreeMarkNotCulled culler(&trans_camera);
  1104. culler.traverse(mOctree);
  1105. }
  1106. }
  1107. }
  1108. void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
  1109. {
  1110. if (mDrawable == NULL)
  1111. {
  1112. markDead();
  1113. return;
  1114. }
  1115. if (mDrawable->getVObj())
  1116. {
  1117. if (mDrawable->getVObj()->isAttachment())
  1118. {
  1119. LLDrawable* parent = mDrawable->getParent();
  1120. if (parent && parent->getVObj())
  1121. {
  1122. LLVOAvatar* av = parent->getVObj()->asAvatar();
  1123. if (av && av->isImpostor())
  1124. {
  1125. return;
  1126. }
  1127. }
  1128. }
  1129. LLCamera camera = transformCamera(camera_in);
  1130. mDrawable->updateDistance(camera, force_update);
  1131. LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
  1132. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  1133.  iter != child_list.end(); iter++)
  1134. {
  1135. LLViewerObject* child = *iter;
  1136. LLDrawable* drawable = child->mDrawable;
  1137. if (!drawable)
  1138. {
  1139. continue;
  1140. }
  1141. if (!drawable->isAvatar())
  1142. {
  1143. drawable->updateDistance(camera, force_update);
  1144. }
  1145. }
  1146. }
  1147. }
  1148. void LLSpatialBridge::makeActive()
  1149. { //it is an error to make a spatial bridge active (it's already active)
  1150. llerrs << "makeActive called on spatial bridge" << llendl;
  1151. }
  1152. void LLSpatialBridge::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate)
  1153. {
  1154. LLSpatialPartition::move(drawablep, curp, immediate);
  1155. gPipeline.markMoved(this, FALSE);
  1156. }
  1157. BOOL LLSpatialBridge::updateMove()
  1158. {
  1159. llassert(mDrawable);
  1160. llassert(mDrawable->getRegion());
  1161. LLSpatialPartition* part = mDrawable->getRegion()->getSpatialPartition(mPartitionType);
  1162. llassert(part);
  1163. mOctree->balance();
  1164. if (part)
  1165. {
  1166. part->move(this, getSpatialGroup(), TRUE);
  1167. }
  1168. return TRUE;
  1169. }
  1170. void LLSpatialBridge::shiftPos(const LLVector3& vec)
  1171. {
  1172. mExtents[0] += vec;
  1173. mExtents[1] += vec;
  1174. mPositionGroup += LLVector3d(vec);
  1175. }
  1176. void LLSpatialBridge::cleanupReferences()
  1177. {
  1178. LLDrawable::cleanupReferences();
  1179. if (mDrawable)
  1180. {
  1181. mDrawable->setSpatialGroup(NULL);
  1182. if (mDrawable->getVObj())
  1183. {
  1184. LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
  1185. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  1186.  iter != child_list.end(); iter++)
  1187. {
  1188. LLViewerObject* child = *iter;
  1189. LLDrawable* drawable = child->mDrawable;
  1190. if (drawable)
  1191. {
  1192. drawable->setSpatialGroup(NULL);
  1193. }
  1194. }
  1195. }
  1196. LLDrawable* drawablep = mDrawable;
  1197. mDrawable = NULL;
  1198. drawablep->setSpatialBridge(NULL);
  1199. }
  1200. }
  1201. const LLVector3 LLDrawable::getPositionAgent() const
  1202. {
  1203. if (getVOVolume())
  1204. {
  1205. if (isActive())
  1206. {
  1207. LLVector3 pos(0,0,0);
  1208. if (!isRoot())
  1209. {
  1210. pos = mVObjp->getPosition();
  1211. }
  1212. return pos * getRenderMatrix();
  1213. }
  1214. else
  1215. {
  1216. return mVObjp->getPositionAgent();
  1217. }
  1218. }
  1219. else
  1220. {
  1221. return getWorldPosition();
  1222. }
  1223. }
  1224. BOOL LLDrawable::isAnimating() const
  1225. {
  1226. if (!getVObj())
  1227. {
  1228. return TRUE;
  1229. }
  1230. if (getScale() != mVObjp->getScale())
  1231. {
  1232. return TRUE;
  1233. }
  1234. if (mVObjp->getPCode() == LLViewerObject::LL_VO_PART_GROUP)
  1235. {
  1236. return TRUE;
  1237. }
  1238. if (mVObjp->getPCode() == LLViewerObject::LL_VO_HUD_PART_GROUP)
  1239. {
  1240. return TRUE;
  1241. }
  1242. if (mVObjp->getPCode() == LLViewerObject::LL_VO_CLOUDS)
  1243. {
  1244. return TRUE;
  1245. }
  1246. if (!isRoot() && !mVObjp->getAngularVelocity().isExactlyZero())
  1247. {
  1248. return TRUE;
  1249. }
  1250. return FALSE;
  1251. }
  1252. void LLDrawable::updateFaceSize(S32 idx)
  1253. {
  1254. if (mVObjp.notNull())
  1255. {
  1256. mVObjp->updateFaceSize(idx);
  1257. }
  1258. }
  1259. LLBridgePartition::LLBridgePartition()
  1260. : LLSpatialPartition(0, FALSE, 0) 
  1261. mDrawableType = LLPipeline::RENDER_TYPE_AVATAR; 
  1262. mPartitionType = LLViewerRegion::PARTITION_BRIDGE;
  1263. mLODPeriod = 16;
  1264. mSlopRatio = 0.25f;
  1265. }
  1266. LLHUDBridge::LLHUDBridge(LLDrawable* drawablep)
  1267. : LLVolumeBridge(drawablep)
  1268. {
  1269. mDrawableType = LLPipeline::RENDER_TYPE_HUD;
  1270. mPartitionType = LLViewerRegion::PARTITION_HUD;
  1271. mSlopRatio = 0.0f;
  1272. }
  1273. F32 LLHUDBridge::calcPixelArea(LLSpatialGroup* group, LLCamera& camera)
  1274. {
  1275. return 1024.f;
  1276. }
  1277. void LLHUDBridge::shiftPos(const LLVector3& vec)
  1278. {
  1279. //don't shift hud bridges on region crossing
  1280. }