diff options
| author | Dave Parks <davep@lindenlab.com> | 2012-06-20 18:29:18 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2012-06-20 18:29:18 -0500 | 
| commit | 7929db82d1d1db8d4ce7ecbd8436c51dea106f82 (patch) | |
| tree | 4708ae96991d132921d6cb4802623c8e631ef01a | |
| parent | c030e3a51dac452936bc67690eedefe9fb5092d5 (diff) | |
MAINT-794 Move flexi idleUpdate and texture animation to their own update queues.
| -rw-r--r-- | indra/newview/llflexibleobject.cpp | 89 | ||||
| -rw-r--r-- | indra/newview/llflexibleobject.h | 10 | ||||
| -rw-r--r-- | indra/newview/llviewerobjectlist.cpp | 19 | ||||
| -rw-r--r-- | indra/newview/llviewertextureanim.cpp | 26 | ||||
| -rw-r--r-- | indra/newview/llviewertextureanim.h | 11 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 248 | ||||
| -rw-r--r-- | indra/newview/llvovolume.h | 5 | 
7 files changed, 245 insertions, 163 deletions
| diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index ef8d11a2e2..06aac5f529 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -44,6 +44,8 @@  #include "llvoavatar.h"  /*static*/ F32 LLVolumeImplFlexible::sUpdateFactor = 1.0f; +std::vector<LLVolumeImplFlexible*> LLVolumeImplFlexible::sInstanceList; +std::vector<S32> LLVolumeImplFlexible::sUpdateDelay;  static LLFastTimer::DeclareTimer FTM_FLEXIBLE_REBUILD("Rebuild");  static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Update"); @@ -70,8 +72,45 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD  	{  		mVO->mDrawable->makeActive() ;  	} + +	mInstanceIndex = sInstanceList.size(); +	sInstanceList.push_back(this); +	sUpdateDelay.push_back(0);  }//----------------------------------------------- +LLVolumeImplFlexible::~LLVolumeImplFlexible() +{ +	S32 end_idx = sInstanceList.size()-1; +	 +	if (end_idx != mInstanceIndex) +	{ +		sInstanceList[mInstanceIndex] = sInstanceList[end_idx]; +		sInstanceList[mInstanceIndex]->mInstanceIndex = mInstanceIndex; +		sUpdateDelay[mInstanceIndex] = sUpdateDelay[end_idx]; +	} + +	sInstanceList.pop_back(); +	sUpdateDelay.pop_back(); +} + +//static +void LLVolumeImplFlexible::updateClass() +{ +	std::vector<S32>::iterator delay_iter = sUpdateDelay.begin(); + +	for (std::vector<LLVolumeImplFlexible*>::iterator iter = sInstanceList.begin(); +			iter != sInstanceList.end(); +			++iter) +	{ +		--(*delay_iter); +		if (*delay_iter <= 0) +		{ +			(*iter)->doIdleUpdate(); +		} +		++delay_iter; +	} +} +  LLVector3 LLVolumeImplFlexible::getFramePosition() const  {  	return mVO->getRenderPosition(); @@ -296,7 +335,7 @@ void LLVolumeImplFlexible::updateRenderRes()  // optimization similar to what Havok does for objects that are stationary.   //---------------------------------------------------------------------------------  static LLFastTimer::DeclareTimer FTM_FLEXIBLE_UPDATE("Update Flexies"); -void LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVolumeImplFlexible::doIdleUpdate()  {  	LLDrawable* drawablep = mVO->mDrawable; @@ -316,31 +355,45 @@ void LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6  				updateRenderRes();  				gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);  			} -			else if	(visible && -				!drawablep->isState(LLDrawable::IN_REBUILD_Q1) && -				mVO->getPixelArea() > 256.f) +			else  			{ -				U32 id;  				F32 pixel_area = mVO->getPixelArea(); -				if (mVO->isRootEdit()) +				U32 update_period = (U32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f)))+1; + +				if	(visible)  				{ -					id = mID; +					if (!drawablep->isState(LLDrawable::IN_REBUILD_Q1) && +					mVO->getPixelArea() > 256.f) +					{ +						U32 id; +				 +						if (mVO->isRootEdit()) +						{ +							id = mID; +						} +						else +						{ +							LLVOVolume* parent = (LLVOVolume*) mVO->getParent(); +							id = parent->getVolumeInterfaceID(); +						} + +						if ((LLDrawable::getCurrentFrame()+id)%update_period == 0) +						{ +							sUpdateDelay[mInstanceIndex] = (S32) update_period-1; + +							updateRenderRes(); + +							gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE); +						} +					}  				}  				else  				{ -					LLVOVolume* parent = (LLVOVolume*) mVO->getParent(); -					id = parent->getVolumeInterfaceID(); -				} - -				U32 update_period = (U32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f)))+1; - -				if ((LLDrawable::getCurrentFrame()+id)%update_period == 0) -				{ -					updateRenderRes(); -					gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE); +					sUpdateDelay[mInstanceIndex] = (S32) update_period;  				}  			} +  		}  	}  } @@ -364,7 +417,7 @@ void LLVolumeImplFlexible::doFlexibleUpdate()  	if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible())   	{  		//mVO->markForUpdate(TRUE); -		doIdleUpdate(gAgent, *LLWorld::getInstance(), 0.0); +		doIdleUpdate();  		if (mSimulateRes == 0)  		{ diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h index 56d579d86f..beb281a906 100644 --- a/indra/newview/llflexibleobject.h +++ b/indra/newview/llflexibleobject.h @@ -70,8 +70,16 @@ struct LLFlexibleObjectSection  //---------------------------------------------------------  class LLVolumeImplFlexible : public LLVolumeInterface  { +private: +	static std::vector<LLVolumeImplFlexible*> sInstanceList; +	static std::vector<S32> sUpdateDelay; +	S32 mInstanceIndex; +  	public: +		static void updateClass(); +  		LLVolumeImplFlexible(LLViewerObject* volume, LLFlexibleObjectData* attributes); +		~LLVolumeImplFlexible();  		// Implements LLVolumeInterface  		U32 getID() const { return mID; } @@ -79,7 +87,7 @@ class LLVolumeImplFlexible : public LLVolumeInterface  		LLQuaternion getFrameRotation() const;  		LLVolumeInterfaceType getInterfaceType() const		{ return INTERFACE_FLEXIBLE; }  		void updateRenderRes(); -		void doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +		void doIdleUpdate();  		BOOL doUpdateGeometry(LLDrawable *drawable);  		LLVector3 getPivotPosition() const;  		void onSetVolume(const LLVolumeParams &volume_params, const S32 detail); diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 21a0331f70..be29621805 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -49,6 +49,8 @@  #include "llstring.h"  #include "llhudnametag.h"  #include "lldrawable.h" +#include "llflexibleobject.h" +#include "llviewertextureanim.h"  #include "xform.h"  #include "llsky.h"  #include "llviewercamera.h" @@ -941,6 +943,8 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  			objectp = *active_iter;  			if (objectp)  			{ +				llassert(objectp->isActive()); +  				if (idle_count >= idle_list.size())  				{  					idle_list.push_back( objectp ); @@ -979,10 +983,19 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  			idle_iter != idle_end; idle_iter++)  		{  			objectp = *idle_iter; +			llassert(objectp->isActive());  			objectp->idleUpdate(agent, world, frame_time);  		} + +		//update flexible objects +		LLVolumeImplFlexible::updateClass(); + +		//update animated textures +		LLViewerTextureAnim::updateClass();  	} + +  	fetchObjectCosts();  	fetchPhysicsFlags(); @@ -1402,8 +1415,9 @@ void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)  		{  			mActiveObjects[idx] = mActiveObjects[last_index];  			mActiveObjects[idx]->setListIndex(idx); -			mActiveObjects.pop_back();  		} + +		mActiveObjects.pop_back();  	}  } @@ -1447,6 +1461,9 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)  			objectp->setOnActiveList(FALSE);  		}  	} + +	llassert(objectp->isActive() || objectp->getListIndex() == -1); +  }  void LLViewerObjectList::updateObjectCost(LLViewerObject* object) diff --git a/indra/newview/llviewertextureanim.cpp b/indra/newview/llviewertextureanim.cpp index 9f1ac7c49c..2b364851a7 100644 --- a/indra/newview/llviewertextureanim.cpp +++ b/indra/newview/llviewertextureanim.cpp @@ -27,21 +27,37 @@  #include "llviewerprecompiledheaders.h"  #include "llviewertextureanim.h" +#include "llvovolume.h"  #include "llmath.h"  #include "llerror.h" -LLViewerTextureAnim::LLViewerTextureAnim() : LLTextureAnim() +std::vector<LLViewerTextureAnim*> LLViewerTextureAnim::sInstanceList; + +LLViewerTextureAnim::LLViewerTextureAnim(LLVOVolume* vobj) : LLTextureAnim()  { +	mVObj = vobj;  	mLastFrame = -1.f;	// Force an update initially  	mLastTime = 0.f;  	mOffS = mOffT = 0;  	mScaleS = mScaleT = 1;  	mRot = 0; + +	mInstanceIndex = sInstanceList.size(); +	sInstanceList.push_back(this);  }  LLViewerTextureAnim::~LLViewerTextureAnim()  { +	S32 end_idx = sInstanceList.size()-1; +	 +	if (end_idx != mInstanceIndex) +	{ +		sInstanceList[mInstanceIndex] = sInstanceList[end_idx]; +		sInstanceList[mInstanceIndex]->mInstanceIndex = mInstanceIndex; +	} + +	sInstanceList.pop_back();  }  void LLViewerTextureAnim::reset() @@ -50,6 +66,14 @@ void LLViewerTextureAnim::reset()  	mTimer.reset();  } +//static  +void LLViewerTextureAnim::updateClass() +{ +	for (std::vector<LLViewerTextureAnim*>::iterator iter = sInstanceList.begin(); iter != sInstanceList.end(); ++iter) +	{ +		(*iter)->mVObj->animateTextures(); +	} +}  S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t,  										F32 &scale_s, F32 &scale_t, diff --git a/indra/newview/llviewertextureanim.h b/indra/newview/llviewertextureanim.h index dd7bd0cb90..abbfabceb9 100644 --- a/indra/newview/llviewertextureanim.h +++ b/indra/newview/llviewertextureanim.h @@ -30,10 +30,18 @@  #include "lltextureanim.h"  #include "llframetimer.h" +class LLVOVolume; +  class LLViewerTextureAnim : public LLTextureAnim  { +private: +	static std::vector<LLViewerTextureAnim*> sInstanceList; +	S32 mInstanceIndex; +  public: -	LLViewerTextureAnim(); +	static void updateClass(); + +	LLViewerTextureAnim(LLVOVolume* vobj);  	virtual ~LLViewerTextureAnim();  	/*virtual*/ void reset(); @@ -51,6 +59,7 @@ public:  	F32 mRot;  protected: +	LLVOVolume* mVObj;  	LLFrameTimer mTimer;  	F64 mLastTime;  	F32 mLastFrame; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 510877e2be..c46ccd8ad5 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -329,7 +329,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  			{  				if (!mTextureAnimp)  				{ -					mTextureAnimp = new LLViewerTextureAnim(); +					mTextureAnimp = new LLViewerTextureAnim(this);  				}  				else  				{ @@ -431,7 +431,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  			{  				if (!mTextureAnimp)  				{ -					mTextureAnimp = new LLViewerTextureAnim(); +					mTextureAnimp = new LLViewerTextureAnim(this);  				}  				else  				{ @@ -499,169 +499,142 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  void LLVOVolume::animateTextures()  { -	F32 off_s = 0.f, off_t = 0.f, scale_s = 1.f, scale_t = 1.f, rot = 0.f; -	S32 result = mTextureAnimp->animateTextures(off_s, off_t, scale_s, scale_t, rot); -	 -	if (result) +	if (!mDead)  	{ -		if (!mTexAnimMode) -		{ -			mFaceMappingChanged = TRUE; -			gPipeline.markTextured(mDrawable); -		} -		mTexAnimMode = result | mTextureAnimp->mMode; -				 -		S32 start=0, end=mDrawable->getNumFaces()-1; -		if (mTextureAnimp->mFace >= 0 && mTextureAnimp->mFace <= end) -		{ -			start = end = mTextureAnimp->mFace; -		} -		 -		for (S32 i = start; i <= end; i++) +		F32 off_s = 0.f, off_t = 0.f, scale_s = 1.f, scale_t = 1.f, rot = 0.f; +		S32 result = mTextureAnimp->animateTextures(off_s, off_t, scale_s, scale_t, rot); +	 +		if (result)  		{ -			LLFace* facep = mDrawable->getFace(i); -			if (!facep) continue; -			if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue; - -			const LLTextureEntry* te = facep->getTextureEntry(); -			 -			if (!te) +			if (!mTexAnimMode)  			{ -				continue; +				mFaceMappingChanged = TRUE; +				gPipeline.markTextured(mDrawable);  			} -		 -			if (!(result & LLViewerTextureAnim::ROTATE)) +			mTexAnimMode = result | mTextureAnimp->mMode; +				 +			S32 start=0, end=mDrawable->getNumFaces()-1; +			if (mTextureAnimp->mFace >= 0 && mTextureAnimp->mFace <= end)  			{ -				te->getRotation(&rot); +				start = end = mTextureAnimp->mFace;  			} -			if (!(result & LLViewerTextureAnim::TRANSLATE)) -			{ -				te->getOffset(&off_s,&off_t); -			}			 -			if (!(result & LLViewerTextureAnim::SCALE)) +		 +			for (S32 i = start; i <= end; i++)  			{ -				te->getScale(&scale_s, &scale_t); -			} +				LLFace* facep = mDrawable->getFace(i); +				if (!facep) continue; +				if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue; -			if (!facep->mTextureMatrix) -			{ -				facep->mTextureMatrix = new LLMatrix4(); -			} +				const LLTextureEntry* te = facep->getTextureEntry(); +			 +				if (!te) +				{ +					continue; +				} +		 +				if (!(result & LLViewerTextureAnim::ROTATE)) +				{ +					te->getRotation(&rot); +				} +				if (!(result & LLViewerTextureAnim::TRANSLATE)) +				{ +					te->getOffset(&off_s,&off_t); +				}			 +				if (!(result & LLViewerTextureAnim::SCALE)) +				{ +					te->getScale(&scale_s, &scale_t); +				} -			LLMatrix4& tex_mat = *facep->mTextureMatrix; -			tex_mat.setIdentity(); -			LLVector3 trans ; +				if (!facep->mTextureMatrix) +				{ +					facep->mTextureMatrix = new LLMatrix4(); +				} + +				LLMatrix4& tex_mat = *facep->mTextureMatrix; +				tex_mat.setIdentity(); +				LLVector3 trans ; -			if(facep->isAtlasInUse()) -			{ -				// -				//if use atlas for animated texture -				//apply the following transform to the animation matrix. -				// - -				F32 tcoord_xoffset = 0.f ; -				F32 tcoord_yoffset = 0.f ; -				F32 tcoord_xscale = 1.f ; -				F32 tcoord_yscale = 1.f ;			  				if(facep->isAtlasInUse())  				{ -					const LLVector2* tmp = facep->getTexCoordOffset() ; -					tcoord_xoffset = tmp->mV[0] ;  -					tcoord_yoffset = tmp->mV[1] ; +					// +					//if use atlas for animated texture +					//apply the following transform to the animation matrix. +					// + +					F32 tcoord_xoffset = 0.f ; +					F32 tcoord_yoffset = 0.f ; +					F32 tcoord_xscale = 1.f ; +					F32 tcoord_yscale = 1.f ;			 +					if(facep->isAtlasInUse()) +					{ +						const LLVector2* tmp = facep->getTexCoordOffset() ; +						tcoord_xoffset = tmp->mV[0] ;  +						tcoord_yoffset = tmp->mV[1] ; -					tmp = facep->getTexCoordScale() ; -					tcoord_xscale = tmp->mV[0] ;  -					tcoord_yscale = tmp->mV[1] ;	 -				} -				trans.set(LLVector3(tcoord_xoffset + tcoord_xscale * (off_s+0.5f), tcoord_yoffset + tcoord_yscale * (off_t+0.5f), 0.f)); +						tmp = facep->getTexCoordScale() ; +						tcoord_xscale = tmp->mV[0] ;  +						tcoord_yscale = tmp->mV[1] ;	 +					} +					trans.set(LLVector3(tcoord_xoffset + tcoord_xscale * (off_s+0.5f), tcoord_yoffset + tcoord_yscale * (off_t+0.5f), 0.f)); -				tex_mat.translate(LLVector3(-(tcoord_xoffset + tcoord_xscale * 0.5f), -(tcoord_yoffset + tcoord_yscale * 0.5f), 0.f)); -			} -			else	//non atlas -			{ -				trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));			 -				tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); -			} +					tex_mat.translate(LLVector3(-(tcoord_xoffset + tcoord_xscale * 0.5f), -(tcoord_yoffset + tcoord_yscale * 0.5f), 0.f)); +				} +				else	//non atlas +				{ +					trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));			 +					tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); +				} -			LLVector3 scale(scale_s, scale_t, 1.f);			 -			LLQuaternion quat; -			quat.setQuat(rot, 0, 0, -1.f); +				LLVector3 scale(scale_s, scale_t, 1.f);			 +				LLQuaternion quat; +				quat.setQuat(rot, 0, 0, -1.f); -			tex_mat.rotate(quat);				 +				tex_mat.rotate(quat);				 -			LLMatrix4 mat; -			mat.initAll(scale, LLQuaternion(), LLVector3()); -			tex_mat *= mat; +				LLMatrix4 mat; +				mat.initAll(scale, LLQuaternion(), LLVector3()); +				tex_mat *= mat; -			tex_mat.translate(trans); +				tex_mat.translate(trans); +			}  		} -	} -	else -	{ -		if (mTexAnimMode && mTextureAnimp->mRate == 0) +		else  		{ -			U8 start, count; - -			if (mTextureAnimp->mFace == -1) -			{ -				start = 0; -				count = getNumTEs(); -			} -			else +			if (mTexAnimMode && mTextureAnimp->mRate == 0)  			{ -				start = (U8) mTextureAnimp->mFace; -				count = 1; -			} +				U8 start, count; -			for (S32 i = start; i < start + count; i++) -			{ -				if (mTexAnimMode & LLViewerTextureAnim::TRANSLATE) +				if (mTextureAnimp->mFace == -1)  				{ -					setTEOffset(i, mTextureAnimp->mOffS, mTextureAnimp->mOffT);				 +					start = 0; +					count = getNumTEs();  				} -				if (mTexAnimMode & LLViewerTextureAnim::SCALE) +				else  				{ -					setTEScale(i, mTextureAnimp->mScaleS, mTextureAnimp->mScaleT);	 +					start = (U8) mTextureAnimp->mFace; +					count = 1;  				} -				if (mTexAnimMode & LLViewerTextureAnim::ROTATE) + +				for (S32 i = start; i < start + count; i++)  				{ -					setTERotation(i, mTextureAnimp->mRot); +					if (mTexAnimMode & LLViewerTextureAnim::TRANSLATE) +					{ +						setTEOffset(i, mTextureAnimp->mOffS, mTextureAnimp->mOffT);				 +					} +					if (mTexAnimMode & LLViewerTextureAnim::SCALE) +					{ +						setTEScale(i, mTextureAnimp->mScaleS, mTextureAnimp->mScaleT);	 +					} +					if (mTexAnimMode & LLViewerTextureAnim::ROTATE) +					{ +						setTERotation(i, mTextureAnimp->mRot); +					}  				} -			} -			gPipeline.markTextured(mDrawable); -			mFaceMappingChanged = TRUE; -			mTexAnimMode = 0; -		} -	} -} - -void LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) -{ -	if (!mDead) -	{ -		if (!mStatic) -		{ //do some velocity interpolation/rotation -			LLViewerObject::idleUpdate(agent, world, time); -		} - -		//static LLFastTimer::DeclareTimer ftm("Volume Idle"); -		//LLFastTimer t(ftm); -		 -		/////////////////////// -		// -		// Do texture animation stuff -		// - -		if (mTextureAnimp && gAnimateTextures) -		{ -			animateTextures(); -		} - -		// Dispatch to implementation -		if (mVolumeImpl) -		{ -			mVolumeImpl->doIdleUpdate(agent, world, time); +				gPipeline.markTextured(mDrawable); +				mFaceMappingChanged = TRUE; +				mTexAnimMode = 0; +			}  		}  	}  } @@ -904,8 +877,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)  BOOL LLVOVolume::isActive() const  { -	return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive());// ||  -		//(mDrawable.notNull() && mDrawable->isActive()); +	return !mStatic;  }  BOOL LLVOVolume::setMaterial(const U8 material) diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 69072607f3..70da9ce510 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -68,7 +68,7 @@ class LLVolumeInterface  public:  	virtual ~LLVolumeInterface() { }  	virtual LLVolumeInterfaceType getInterfaceType() const = 0; -	virtual void doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) = 0; +	virtual void doIdleUpdate() = 0;  	virtual BOOL doUpdateGeometry(LLDrawable *drawable) = 0;  	virtual LLVector3 getPivotPosition() const = 0;  	virtual void onSetVolume(const LLVolumeParams &volume_params, const S32 detail) = 0; @@ -114,8 +114,7 @@ public:  				void	deleteFaces();  				void	animateTextures(); -	/*virtual*/ void	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); - +	  	            BOOL    isVisible() const ;  	/*virtual*/ BOOL	isActive() const;  	/*virtual*/ BOOL	isAttachment() const; | 
