diff options
| author | Dave Parks <davep@lindenlab.com> | 2012-06-19 18:08:39 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2012-06-19 18:08:39 -0500 | 
| commit | 029103133ebac7ee13f1af767f41b012d19a84f5 (patch) | |
| tree | c531d0662f06b0bd721485cf28e3e40e1b1d0f3e /indra/newview | |
| parent | a1d0d67e05c45bdc1a7a8bb0aad79772a2a94f6e (diff) | |
MAINT-794 Factor out a lot of CPU overhead around updating objects.
Diffstat (limited to 'indra/newview')
28 files changed, 115 insertions, 352 deletions
| diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 563b9b9cab..c1f82edaaa 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -99,7 +99,6 @@ void LLDrawable::init()  	mPositionGroup.clear();  	mExtents[0].clear();  	mExtents[1].clear(); -	mQuietCount = 0;  	mState     = 0;  	mVObjp   = NULL; @@ -407,6 +406,8 @@ void LLDrawable::makeActive()  		if (!isRoot() && !mParent->isActive())  		{  			mParent->makeActive(); +			//NOTE: linked set will now NEVER become static +			mParent->setState(LLDrawable::ACTIVE_CHILD);  		}  		//all child objects must also be active @@ -426,41 +427,27 @@ void LLDrawable::makeActive()  		if (mVObjp->getPCode() == LL_PCODE_VOLUME)  		{ -			if (mVObjp->isFlexible()) -			{ -				return; -			} -		} -	 -		if (mVObjp->getPCode() == LL_PCODE_VOLUME) -		{  			gPipeline.markRebuild(this, LLDrawable::REBUILD_VOLUME, TRUE);  		}  		updatePartition();  	} -	if (isRoot()) -	{ -		mQuietCount = 0; -	} -	else -	{ -		getParent()->mQuietCount = 0; -	} +	llassert(isRoot() || mParent->isActive());  }  void LLDrawable::makeStatic(BOOL warning_enabled)  { -	if (isState(ACTIVE)) +	if (isState(ACTIVE) &&  +		!isState(ACTIVE_CHILD) &&  +		!mVObjp->isAttachment() &&  +		!mVObjp->isFlexible())  	{  		clearState(ACTIVE | ANIMATED_CHILD); -		if (mParent.notNull() && mParent->isActive() && warning_enabled) -		{ -			LL_WARNS_ONCE("Drawable") << "Drawable becomes static with active parent!" << LL_ENDL; -		} - +		//drawable became static with active parent, not acceptable +		llassert(mParent.isNull() || !mParent->isActive() || !warning_enabled); +		  		LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren();  		for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();  			 iter != child_list.end(); iter++) @@ -487,8 +474,8 @@ void LLDrawable::makeStatic(BOOL warning_enabled)  			mSpatialBridge->markDead();  			setSpatialBridge(NULL);  		} +		updatePartition();  	} -	updatePartition();  }  // Returns "distance" between target destination and resulting xfrom @@ -792,18 +779,6 @@ void LLDrawable::updateTexture()  	if (getVOVolume())  	{ -		/*if (isActive()) -		{ -			if (isRoot()) -			{ -				mQuietCount = 0; -			} -			else -			{ -				getParent()->mQuietCount = 0; -			} -		}*/ -				  		gPipeline.markRebuild(this, LLDrawable::REBUILD_MATERIAL, TRUE);  	}  } diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index bc4b301ebb..bb0d0d1805 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -281,6 +281,7 @@ public:  		RIGGED			= 0x08000000,  		PARTITION_MOVE	= 0x10000000,  		ANIMATED_CHILD  = 0x20000000, +		ACTIVE_CHILD	= 0x40000000,  	} EDrawableFlags;  private: //aligned members @@ -294,8 +295,6 @@ public:  	LLPointer<LLDrawable> mParent;  	F32				mDistanceWRTCamera; -	 -	S32				mQuietCount;  	static S32 getCurrentFrame() { return sCurVisible; }  	static S32 getMinVisFrameRange(); diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index c4dca4cb79..ef8d11a2e2 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -303,15 +303,10 @@ void LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6  	if (drawablep)  	{  		//LLFastTimer ftm(FTM_FLEXIBLE_UPDATE); - -		//flexible objects never go static -		drawablep->mQuietCount = 0; -		if (!drawablep->isRoot()) -		{ -			LLViewerObject* parent = (LLViewerObject*) mVO->getParent(); -			parent->mDrawable->mQuietCount = 0; -		} - +		 +		//ensure drawable is active +		drawablep->makeActive(); +			  		if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE))  		{  			bool visible = drawablep->isVisible(); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index a55565909f..562ac9fff5 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -390,7 +390,7 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj,  	// don't include an avatar.  	LLViewerObject* root = obj; -	while(!root->isAvatar() && root->getParent() && !root->isJointChild()) +	while(!root->isAvatar() && root->getParent())  	{  		LLViewerObject* parent = (LLViewerObject*)root->getParent();  		if (parent->isAvatar()) @@ -674,7 +674,7 @@ void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_s  		// don't include an avatar.  		LLViewerObject* root = object; -		while(!root->isAvatar() && root->getParent() && !root->isJointChild()) +		while(!root->isAvatar() && root->getParent())  		{  			LLViewerObject* parent = (LLViewerObject*)root->getParent();  			if (parent->isAvatar()) @@ -1387,7 +1387,7 @@ void LLSelectMgr::promoteSelectionToRoot()  		}  		LLViewerObject* parentp = object; -		while(parentp->getParent() && !(parentp->isRootEdit() || parentp->isJointChild())) +		while(parentp->getParent() && !(parentp->isRootEdit()))  		{  			parentp = (LLViewerObject*)parentp->getParent();  		} @@ -4174,8 +4174,7 @@ struct LLSelectMgrApplyFlags : public LLSelectedObjectFunctor  	virtual bool apply(LLViewerObject* object)  	{  		if ( object->permModify() &&	// preemptive permissions check -			 object->isRoot() &&		// don't send for child objects -			 !object->isJointChild()) +			 object->isRoot()) 		// don't send for child objects  		{  			object->setFlags( mFlags, mState);  		} @@ -6036,8 +6035,6 @@ void LLSelectMgr::updateSelectionCenter()  		// matches the root prim's (affecting the orientation of the manipulators).   		bbox.addBBoxAgent( (mSelectedObjects->getFirstRootObject(TRUE))->getBoundingBoxAgent() );  -		std::vector < LLViewerObject *> jointed_objects; -  		for (LLObjectSelection::iterator iter = mSelectedObjects->begin();  			 iter != mSelectedObjects->end(); iter++)  		{ @@ -6055,11 +6052,6 @@ void LLSelectMgr::updateSelectionCenter()  			}  			bbox.addBBoxAgent( object->getBoundingBoxAgent() ); - -			if (object->isJointChild()) -			{ -				jointed_objects.push_back(object); -			}  		}  		LLVector3 bbox_center_agent = bbox.getCenterAgent(); @@ -6349,19 +6341,19 @@ void LLSelectMgr::setAgentHUDZoom(F32 target_zoom, F32 current_zoom)  bool LLObjectSelection::is_root::operator()(LLSelectNode *node)  {  	LLViewerObject* object = node->getObject(); -	return (object != NULL) && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild()); +	return (object != NULL) && !node->mIndividualSelection && (object->isRootEdit());  }  bool LLObjectSelection::is_valid_root::operator()(LLSelectNode *node)  {  	LLViewerObject* object = node->getObject(); -	return (object != NULL) && node->mValid && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild()); +	return (object != NULL) && node->mValid && !node->mIndividualSelection && (object->isRootEdit());  }  bool LLObjectSelection::is_root_object::operator()(LLSelectNode *node)  {  	LLViewerObject* object = node->getObject(); -	return (object != NULL) && (object->isRootEdit() || object->isJointChild()); +	return (object != NULL) && (object->isRootEdit());  }  LLObjectSelection::LLObjectSelection() :  diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index af007743bf..4e7055f0bb 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -236,7 +236,6 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe  	mNumFaces(0),  	mTimeDilation(1.f),  	mRotTime(0.f), -	mJointInfo(NULL),  	mState(0),  	mMedia(NULL),  	mClickAction(0), @@ -281,12 +280,6 @@ LLViewerObject::~LLViewerObject()  		mInventory = NULL;  	} -	if (mJointInfo) -	{ -		delete mJointInfo; -		mJointInfo = NULL; -	} -  	if (mPartSourcep)  	{  		mPartSourcep->setDead(); @@ -337,9 +330,6 @@ void LLViewerObject::markDead()  		if (getParent())  		{  			((LLViewerObject *)getParent())->removeChild(this); -			// go ahead and delete any jointinfo's that we find -			delete mJointInfo; -			mJointInfo = NULL;  		}  		// Mark itself as dead @@ -742,7 +732,7 @@ void LLViewerObject::addThisAndNonJointChildren(std::vector<LLViewerObject*>& ob  		 iter != mChildList.end(); iter++)  	{  		LLViewerObject* child = *iter; -		if ( (!child->isAvatar()) && (!child->isJointChild())) +		if ( (!child->isAvatar()))  		{  			child->addThisAndNonJointChildren(objects);  		} @@ -1295,26 +1285,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  					}  				} -				U8 joint_type = 0; -				mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_JointType, joint_type, block_num); -				if (joint_type) -				{ -					// create new joint info  -					if (!mJointInfo) -					{ -						mJointInfo = new LLVOJointInfo; -					} -					mJointInfo->mJointType = (EHavokJointType) joint_type; -					mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointPivot, mJointInfo->mPivot, block_num); -					mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointAxisOrAnchor, mJointInfo->mAxisOrAnchor, block_num); -				} -				else if (mJointInfo) -				{ -					// this joint info is no longer needed -					delete mJointInfo; -					mJointInfo = NULL; -				} -  				break;  			} @@ -1962,14 +1932,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  						cur_parentp->removeChild(this); -						if (mJointInfo && !parent_id) -						{ -							// since this object is no longer parent-relative -							// we make sure we delete any joint info -							delete mJointInfo; -							mJointInfo = NULL; -						} -  						setChanged(MOVED | SILHOUETTE);  						if (mDrawable.notNull()) @@ -2097,9 +2059,15 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  		gPipeline.addDebugBlip(getPositionAgent(), color);  	} -	if ((0.0f == vel_mag_sq) &&  -		(0.0f == accel_mag_sq) && -		(0.0f == getAngularVelocity().magVecSquared())) +	const F32 MAG_CUTOFF = F_APPROXIMATELY_ZERO; + +	llassert(vel_mag_sq >= 0.f); +	llassert(accel_mag_sq >= 0.f); +	llassert(getAngularVelocity().magVecSquared() >= 0.f); + +	if ((MAG_CUTOFF >= vel_mag_sq) &&  +		(MAG_CUTOFF >= accel_mag_sq) && +		(MAG_CUTOFF >= getAngularVelocity().magVecSquared()))  	{  		mStatic = TRUE; // This object doesn't move!  	} @@ -2170,117 +2138,36 @@ BOOL LLViewerObject::isActive() const -BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  {  	//static LLFastTimer::DeclareTimer ftm("Viewer Object");  	//LLFastTimer t(ftm); -	if (mDead) -	{ -		// It's dead.  Don't update it. -		return TRUE; -	} - -	// CRO - don't velocity interp linked objects! -	// Leviathan - but DO velocity interp joints -	if (!mStatic && sVelocityInterpolate && !isSelected()) +	if (!mDead)  	{ -		// calculate dt from last update -		F32 dt_raw = (F32)(time - mLastInterpUpdateSecs); -		F32 dt = mTimeDilation * dt_raw; - -		if (!mJointInfo) +		// CRO - don't velocity interp linked objects! +		// Leviathan - but DO velocity interp joints +		if (!mStatic && sVelocityInterpolate && !isSelected())  		{ -			applyAngularVelocity(dt); -		} +			// calculate dt from last update +			F32 dt_raw = (F32)(time - mLastInterpUpdateSecs); +			F32 dt = mTimeDilation * dt_raw; -		LLViewerObject *parentp = (LLViewerObject *) getParent(); -		if (mJointInfo) -		{ -			if (parentp) +			applyAngularVelocity(dt); +			 +			if (isAttachment())  			{ -				// do parent-relative stuff -				LLVector3 ang_vel = getAngularVelocity(); -				F32 omega = ang_vel.magVecSquared(); -				F32 angle = 0.0f; -				LLQuaternion dQ; -				if (omega > 0.00001f) -				{ -					omega = sqrt(omega); -					angle = omega * dt; -					dQ.setQuat(angle, ang_vel); -				} -				LLVector3 pos = getPosition(); -	 -				if (HJT_HINGE == mJointInfo->mJointType) -				{ -					// hinge = uniform circular motion -					LLVector3 parent_pivot = getVelocity(); -					LLVector3 parent_axis = getAcceleration(); -	 -					angle = dt * (ang_vel * mJointInfo->mAxisOrAnchor);	// AxisOrAnchor = axis -					dQ.setQuat(angle, mJointInfo->mAxisOrAnchor);		// AxisOrAnchor = axis -					LLVector3 pivot_offset = pos - mJointInfo->mPivot;	// pos in pivot-frame -					pivot_offset = pivot_offset * dQ;					// new rotated pivot-frame pos -					pos = mJointInfo->mPivot + pivot_offset;			// parent-frame -					LLViewerObject::setPosition(pos); -					LLQuaternion Q_PC = getRotation(); -					setRotation(Q_PC * dQ); -					mLastInterpUpdateSecs = time; -				} -				else if (HJT_POINT == mJointInfo->mJointType) -						// || HJT_LPOINT == mJointInfo->mJointType) -				{ -					// point-to-point = spin about axis and uniform circular motion -					// 					of axis about the pivot point -					// -					// NOTE: this interpolation scheme is not quite good enough to -					// reduce the bandwidth -- needs a gravitational correction.  -					// Similarly for hinges with axes that deviate from vertical. -	 -					LLQuaternion Q_PC = getRotation(); -					Q_PC = Q_PC * dQ; -					setRotation(Q_PC); - -					LLVector3 pivot_to_child = - mJointInfo->mAxisOrAnchor;	// AxisOrAnchor = anchor -					pos = mJointInfo->mPivot + pivot_to_child * Q_PC; -					LLViewerObject::setPosition(pos); -					mLastInterpUpdateSecs = time; -				} -				/* else if (HJT_WHEEL == mJointInfo->mJointInfo) -				{ -					// wheel = uniform rotation about axis, with linear -					//		   velocity interpolation (if any) -					LLVector3 parent_axis = getAcceleration();	// HACK -- accel stores the parent-axis (parent-frame) -	 -					LLQuaternion Q_PC = getRotation(); -	 -					angle = dt * (parent_axis * ang_vel); -					dQ.setQuat(angle, parent_axis); -	 -					Q_PC = Q_PC * dQ; -					setRotation(Q_PC); - -					pos = getPosition() + dt * getVelocity(); -					LLViewerObject::setPosition(pos); -					mLastInterpUpdateSecs = time; -				}*/ +				mLastInterpUpdateSecs = time; +				return; +			} +			else +			{	// Move object based on it's velocity and rotation +				interpolateLinearMotion(time, dt);  			}  		} -		else if (isAttachment()) -		{ -			mLastInterpUpdateSecs = time; -			return TRUE; -		} -		else -		{	// Move object based on it's velocity and rotation -			interpolateLinearMotion(time, dt); -		} -	} -	updateDrawable(FALSE); - -	return TRUE; +		updateDrawable(FALSE); +	}  } @@ -3857,15 +3744,6 @@ void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped)  		((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset);  		updateDrawable(damped);  	} -	else if (isJointChild()) -	{ -		// compute new parent-relative position -		LLViewerObject *parent = (LLViewerObject *) getParent(); -		LLQuaternion inv_parent_rot = parent->getRotation(); -		inv_parent_rot.transQuat(); -		LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot; -		LLViewerObject::setPosition(pos_parent, damped); -	}  	else  	{  		LLViewerObject::setPosition(pos_edit, damped); @@ -3879,8 +3757,7 @@ LLViewerObject* LLViewerObject::getRootEdit() const  {  	const LLViewerObject* root = this;  	while (root->mParent  -		   && !(root->mJointInfo -			   || ((LLViewerObject*)root->mParent)->isAvatar()) ) +		   && !((LLViewerObject*)root->mParent)->isAvatar())   	{  		root = (LLViewerObject*)root->mParent;  	} @@ -4621,19 +4498,11 @@ void LLViewerObject::clearIcon()  LLViewerObject* LLViewerObject::getSubParent()   {  -	if (isJointChild()) -	{ -		return this; -	}  	return (LLViewerObject*) getParent();  }  const LLViewerObject* LLViewerObject::getSubParent() const  { -	if (isJointChild()) -	{ -		return this; -	}  	return (const LLViewerObject*) getParent();  } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 30c3d03635..19ea06ed20 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -88,18 +88,6 @@ typedef void (*inventory_callback)(LLViewerObject*,  								   S32 serial_num,  								   void*); -// a small struct for keeping track of joints -struct LLVOJointInfo -{ -	EHavokJointType mJointType; -	LLVector3 mPivot;			// parent-frame -	// whether the below an axis or anchor (and thus its frame) -	// depends on the joint type: -	//     HINGE   ==>   axis=parent-frame -	//     P2P     ==>   anchor=child-frame -	LLVector3 mAxisOrAnchor;	 -}; -  // for exporting textured materials from SL  struct LLMaterialExportInfo  { @@ -157,7 +145,7 @@ public:  	LLNameValue*	getNVPair(const std::string& name) const;			// null if no name value pair by that name  	// Object create and update functions -	virtual BOOL	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	virtual void	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	// Types of media we can associate  	enum { MEDIA_NONE = 0, MEDIA_SET = 1 }; @@ -188,8 +176,6 @@ public:  	virtual void 	updateRadius() {};  	virtual F32 	getVObjRadius() const; // default implemenation is mDrawable->getRadius() -	BOOL 			isJointChild() const { return mJointInfo ? TRUE : FALSE; }  -	EHavokJointType	getJointType() const { return mJointInfo ? mJointInfo->mJointType : HJT_INVALID; }  	// for jointed and other parent-relative hacks  	LLViewerObject* getSubParent();  	const LLViewerObject* getSubParent() const; @@ -721,7 +707,6 @@ protected:  	F32				mRotTime;					// Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)  	LLQuaternion	mLastRot;					// last rotation received from the simulator -	LLVOJointInfo*  mJointInfo;  	U8				mState;	// legacy  	LLViewerObjectMedia* mMedia;	// NULL if no media associated  	U8 mClickAction; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 383d4a7955..21a0331f70 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -923,8 +923,6 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  	const F64 frame_time = LLFrameTimer::getElapsedSeconds(); -	std::vector<LLViewerObject*> kill_list; -	S32 num_active_objects = 0;  	LLViewerObject *objectp = NULL;	  	// Make a copy of the list in case something in idleUpdate() messes with it @@ -964,8 +962,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  	std::vector<LLViewerObject*>::iterator idle_end = idle_list.begin()+idle_count;  	if (gSavedSettings.getBOOL("FreezeTime")) -	{ -		 +	{	  		for (std::vector<LLViewerObject*>::iterator iter = idle_list.begin();  			iter != idle_end; iter++)  		{ @@ -982,21 +979,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  			idle_iter != idle_end; idle_iter++)  		{  			objectp = *idle_iter; -			if (objectp->idleUpdate(agent, world, frame_time)) -			{ -				num_active_objects++;				 -			} -			else -			{ -				//  If Idle Update returns false, kill object! -				kill_list.push_back(objectp); -			} -		} -		for (std::vector<LLViewerObject*>::iterator kill_iter = kill_list.begin(); -			kill_iter != kill_list.end(); kill_iter++) -		{ -			objectp = *kill_iter; -			killObject(objectp); +			objectp->idleUpdate(agent, world, frame_time);  		}  	} @@ -1066,7 +1049,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  	*/  	LLViewerStats::getInstance()->mNumObjectsStat.addValue((S32) mObjects.size()); -	LLViewerStats::getInstance()->mNumActiveObjectsStat.addValue(num_active_objects); +	LLViewerStats::getInstance()->mNumActiveObjectsStat.addValue(idle_count);  	LLViewerStats::getInstance()->mNumSizeCulledStat.addValue(mNumSizeCulled);  	LLViewerStats::getInstance()->mNumVisCulledStat.addValue(mNumVisCulled);  } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index ade21ff30e..0e117d36e8 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2335,7 +2335,7 @@ void LLVOAvatar::dumpAnimationState()  //------------------------------------------------------------------------  // idleUpdate()  //------------------------------------------------------------------------ -BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  {  	LLMemType mt(LLMemType::MTYPE_AVATAR);  	LLFastTimer t(FTM_AVATAR_UPDATE); @@ -2343,12 +2343,12 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	if (isDead())  	{  		llinfos << "Warning!  Idle on dead avatar" << llendl; -		return TRUE; +		return;  	}	   	if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))  	{ -		return TRUE; +		return;  	}  	checkTextureLoading() ; @@ -2431,8 +2431,6 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	idleUpdateNameTag( root_pos_last );  	idleUpdateRenderCost(); - -	return TRUE;  }  void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index d106086c88..7e1b8698b0 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -123,7 +123,7 @@ public:  													 U32 block_num,  													 const EObjectUpdateType update_type,  													 LLDataPacker *dp); -	virtual BOOL   	 	 	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	virtual void   	 	 	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	virtual BOOL   	 	 	updateLOD();  	BOOL  	 	 	 	 	updateJointLODs();  	void					updateLODRiggedAttachments( void ); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index c99e94e60c..482d4d19e0 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -631,15 +631,13 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)  }  // virtual -BOOL LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { -	if (!isAgentAvatarValid()) +	if (isAgentAvatarValid())  	{ -		return TRUE; +		LLVOAvatar::idleUpdate(agent, world, time); +		idleUpdateTractorBeam();  	} -	LLVOAvatar::idleUpdate(agent, world, time); -	idleUpdateTractorBeam(); -	return TRUE;  }  // virtual diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 655fb3a012..3e469e3090 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -75,7 +75,7 @@ protected:  	//--------------------------------------------------------------------  public:  	/*virtual*/ void 		updateRegion(LLViewerRegion *regionp); -	/*virtual*/ BOOL   	 	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void   	 	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	//--------------------------------------------------------------------  	// LLCharacter interface and related diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index 5ad9ccc9af..566c33c0af 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -277,17 +277,17 @@ BOOL LLVOGrass::isActive() const  	return TRUE;  } -BOOL LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  {   	if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_GRASS)))  	{ -		return TRUE; +		return;  	}  	if (!mDrawable)  	{  		// So drones work. -		return TRUE; +		return;  	}  	if(LLVOTree::isTreeRenderingStopped()) //stop rendering grass @@ -297,14 +297,14 @@ BOOL LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  			mNumBlades = 0 ;  			gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);  		} -		return TRUE ; +		return;  	}  	else if(!mNumBlades)//restart grass rendering  	{  		mNumBlades = GRASS_MAX_BLADES ;  		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE); -		return TRUE ; +		return;  	}  	if (mPatch && (mLastPatchUpdateTime != mPatch->getLastUpdateTime())) @@ -312,7 +312,7 @@ BOOL LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);  	} -	return TRUE; +	return;  } diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h index 00a59facf7..b9835b8802 100644 --- a/indra/newview/llvograss.h +++ b/indra/newview/llvograss.h @@ -73,7 +73,7 @@ public:  	void plantBlades();  	/*virtual*/ BOOL    isActive() const; // Whether this object needs to do an idleUpdate. -	BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,   										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp index 6da54435e3..97b7418b40 100644 --- a/indra/newview/llvoground.cpp +++ b/indra/newview/llvoground.cpp @@ -49,18 +49,8 @@ LLVOGround::~LLVOGround()  {  } -BOOL LLVOGround::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOGround::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { - 	if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_GROUND))) -	{ -		return TRUE; -	} -	 -	/*if (mDrawable) -	{ -		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE); -	}*/ -	return TRUE;  } diff --git a/indra/newview/llvoground.h b/indra/newview/llvoground.h index 73b097327e..290579b4da 100644 --- a/indra/newview/llvoground.h +++ b/indra/newview/llvoground.h @@ -41,7 +41,7 @@ protected:  public:  	LLVOGround(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); -	/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	// Graphical stuff for objects - maybe broken out into render class  	// later? diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 9cce68fff6..e4f9915e93 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -196,9 +196,8 @@ void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)  	mDrawable->setPositionGroup(pos);  } -BOOL LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { -	return TRUE;  }  void LLVOPartGroup::setPixelAreaAndAngle(LLAgent &agent) diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index 43b2844f07..42c1252d01 100644 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -63,7 +63,7 @@ public:  	LLVOPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);  	/*virtual*/ BOOL    isActive() const; // Whether this object needs to do an idleUpdate. -	BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	virtual F32 getBinRadius();  	virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 312034022e..31358df85f 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -1052,9 +1052,8 @@ void LLVOSky::calcAtmospherics(void)  	mFadeColor.setAlpha(0);  } -BOOL LLVOSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { -	return TRUE;  }  BOOL LLVOSky::updateSky() diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index 6e6898d80a..2a150eccb9 100644 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -461,7 +461,7 @@ public:  	void cleanupGL();  	void restoreGL(); -	/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	BOOL updateSky();  	// Graphical stuff for objects - maybe broken out into render class diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 337ddfb24d..6687ce432f 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -339,11 +339,11 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,  	return retval;  } -BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  {   	if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_TREE)))  	{ -		return TRUE; +		return;  	}  	S32 trunk_LOD = sMAX_NUM_TREE_LOD_LEVELS ; @@ -393,8 +393,6 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	}  	mTrunkLOD = trunk_LOD; - -	return TRUE;  }  const F32 TREE_BLEND_MIN = 1.f; diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index 0554935539..52debc85ab 100644 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -59,7 +59,7 @@ public:  											void **user_data,  											U32 block_num, const EObjectUpdateType update_type,  											LLDataPacker *dp); -	/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	// Graphical stuff for objects - maybe broken out into render class later?  	/*virtual*/ void render(LLAgent &agent); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 082818b112..510877e2be 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -635,47 +635,35 @@ void LLVOVolume::animateTextures()  		}  	}  } -BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) -{ -	LLViewerObject::idleUpdate(agent, world, time); - -	//static LLFastTimer::DeclareTimer ftm("Volume Idle"); -	//LLFastTimer t(ftm); - -	if (mDead || mDrawable.isNull()) -	{ -		return TRUE; -	} -	 -	/////////////////////// -	// -	// Do texture animation stuff -	// -	if (mTextureAnimp && gAnimateTextures) +void LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +{ +	if (!mDead)  	{ -		animateTextures(); -	} +		if (!mStatic) +		{ //do some velocity interpolation/rotation +			LLViewerObject::idleUpdate(agent, world, time); +		} -	// Dispatch to implementation -	if (mVolumeImpl) -	{ -		mVolumeImpl->doIdleUpdate(agent, world, time); -	} +		//static LLFastTimer::DeclareTimer ftm("Volume Idle"); +		//LLFastTimer t(ftm); +		 +		/////////////////////// +		// +		// Do texture animation stuff +		// -	const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40; +		if (mTextureAnimp && gAnimateTextures) +		{ +			animateTextures(); +		} -	if (mDrawable->isActive()) -	{ -		if (mDrawable->isRoot() &&  -			mDrawable->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES &&  -			(!mDrawable->getParent() || !mDrawable->getParent()->isActive())) +		// Dispatch to implementation +		if (mVolumeImpl)  		{ -			mDrawable->makeStatic(); +			mVolumeImpl->doIdleUpdate(agent, world, time);  		}  	} - -	return TRUE;  }  void LLVOVolume::updateTextures() @@ -916,8 +904,8 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)  BOOL LLVOVolume::isActive() const  { -	return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive()) ||  -		(mDrawable.notNull() && mDrawable->isActive()); +	return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive());// ||  +		//(mDrawable.notNull() && mDrawable->isActive());  }  BOOL LLVOVolume::setMaterial(const U8 material) diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 5a0960204c..69072607f3 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -114,7 +114,7 @@ public:  				void	deleteFaces();  				void	animateTextures(); -	/*virtual*/ BOOL	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	            BOOL    isVisible() const ;  	/*virtual*/ BOOL	isActive() const; diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index 942eff6171..e8a1c3d1d6 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -100,17 +100,8 @@ void LLVOWater::updateTextures()  }  // Never gets called -BOOL LLVOWater::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void  LLVOWater::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { - 	/*if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER))) -	{ -		return TRUE; -	} -	if (mDrawable)  -	{ -		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE); -	}*/ -	return TRUE;  }  LLDrawable *LLVOWater::createDrawable(LLPipeline *pipeline) diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h index ed709dd840..cf9323ef2e 100644 --- a/indra/newview/llvowater.h +++ b/indra/newview/llvowater.h @@ -58,7 +58,7 @@ public:  	static void initClass();  	static void cleanupClass(); -	/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);  	/*virtual*/ BOOL        updateGeometry(LLDrawable *drawable);  	/*virtual*/ void		updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index afd902201b..a33f42cf84 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -92,9 +92,9 @@ void LLVOWLSky::initSunDirection(LLVector3 const & sun_direction,  {  } -BOOL LLVOWLSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOWLSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { -	return TRUE; +	  }  BOOL LLVOWLSky::isActive(void) const diff --git a/indra/newview/llvowlsky.h b/indra/newview/llvowlsky.h index 825e13a203..729dced15e 100644 --- a/indra/newview/llvowlsky.h +++ b/indra/newview/llvowlsky.h @@ -53,7 +53,7 @@ public:  	void initSunDirection(LLVector3 const & sun_direction,  		LLVector3 const & sun_angular_velocity); -	/*virtual*/ BOOL		 idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void		 idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);  	/*virtual*/ BOOL		 isActive(void) const;  	/*virtual*/ LLDrawable * createDrawable(LLPipeline *pipeline);  	/*virtual*/ BOOL		 updateGeometry(LLDrawable *drawable); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c195f0ea14..ebb28ff239 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1843,6 +1843,10 @@ void LLPipeline::updateMovedList(LLDrawable::drawable_vector_t& moved_list)  		drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED);  		if (done)  		{ +			if (drawablep->isRoot()) +			{ +				drawablep->makeStatic(); +			}  			drawablep->clearState(LLDrawable::ON_MOVE_LIST);  			if (drawablep->isState(LLDrawable::ANIMATED_CHILD))  			{ //will likely not receive any future world matrix updates | 
