Game Development Community

dev|Pro Game Development Curriculum

apply alpha to tsStatic Object base distance.

by Mquaker · 10/24/2011 (6:33 pm) · 7 comments

this resource port AlphaLOD for Torque 3D 1.1 Final.
this resource possible instead general object LOD.
apply alpha to tsStatic Object base distance from cam.

i tested Torque 3D Pro.

open 'tsStatic.h' and add below code in 'class TSStatic : public SceneObject' class.
// Mquaker :: Add AlphaLOD Logic >>>
   protected:
	   bool	mUseAlphaLod;
	   F32	mAlphaLODStart;
	   F32	mAlphaLODEnd;
	   F32	mAlphaLOD;
	   bool	mInvertAlphaLod;

   public:
	   void setAlphaLOD(bool enable, F32 start, F32 end, bool inverse)
	   {
		   mUseAlphaLod		= enable;
		   mAlphaLODStart	= start;		
		   mAlphaLODEnd		= end;		
		   mInvertAlphaLod	= inverse;	
	   }
   // Mquaker :: Add AlphaLOD Logic <<<


open 'tsStatic.cpp' and add below code in 'TSStatic::TSStatic()'.
// Mquaker :: Add AlphaLOD Logic >>>
   mUseAlphaLod		= false;
   mAlphaLODStart	= 100.0f;
   mAlphaLODEnd		= 150.0f;
   mInvertAlphaLod	= false;
   // Mquaker :: Add AlphaLOD Logic <<<

add below code in 'void TSStatic::initPersistFields()'.
// Mquaker :: Add AlphaLOD Logic >>>
   addGroup( "AlphaLOD" );
      addField( "ALODEnable",	TypeBool,	Offset(mUseAlphaLod,	TSStatic), "Turn on/off AlphaLod" );
      addField( "ALODStart",	TypeF32,	Offset(mAlphaLODStart,	TSStatic), "Distance of start AlphaLOD" );
      addField( "ALODEnd",		TypeF32,	Offset(mAlphaLODEnd,	TSStatic), "Distance of end AlphaLOD" );
      addField( "ALODInverse", TypeBool,	Offset(mInvertAlphaLod, TSStatic), "Invert AlphaLOD's Start & End Distance" );
   endGroup( "AlphaLOD" );
   // Mquaker :: Add AlphaLOD Logic <<<

add below code in 'void TSStatic::prepRenderImage( SceneRenderState* state )'.
// Mquaker :: Add AlphaLOD Logic >>>
   if (mUseAlphaLod)
   {
	   mAlphaLOD = 1.0f;
	   if ((mAlphaLODStart < mAlphaLODEnd) && mAlphaLODStart > 0.1f)
	   {
		   if (mInvertAlphaLod) {
			   if (dist <= mAlphaLODStart)
				   return;

			   if (dist < mAlphaLODEnd)
				   mAlphaLOD = ((dist - mAlphaLODStart) / (mAlphaLODEnd - mAlphaLODStart));
		   }
		   else {
			   if (dist >= mAlphaLODEnd)
				   return;

			   if (dist > mAlphaLODStart)
				   mAlphaLOD -= ((dist - mAlphaLODStart) / (mAlphaLODEnd - mAlphaLODStart));
		   }
	   }
   }
   // Mquaker :: Add AlphaLOD Logic <<<

add below code before 'mShapeInstance->animate();' in same function.
// Mquaker :: Add AlphaLOD Logic >>>
   if(mShapeInstance)   
   {
	   if (mUseAlphaLod)
	   {
		   mShapeInstance->setAlphaAlways(mAlphaLOD);             
		   S32 s = mShapeInstance->mMeshObjects.size();  

		   for(S32 x = 0; x < s; x++)      
		   {         
			   mShapeInstance->mMeshObjects[x].visible = mAlphaLOD;   
		   }
	   }
   }
   // Mquaker :: Add AlphaLOD Logic <<<

add below code in 'U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream)'.
// Mquaker :: Add AlphaLOD Logic >>>
   if ( stream->writeFlag(mUseAlphaLod) )
   {
	   stream->write(mAlphaLODStart);
	   stream->write(mAlphaLODEnd);
	   stream->write(mInvertAlphaLod);
   }
   // Mquaker :: Add AlphaLOD Logic <<<

add below code in 'void TSStatic::unpackUpdate(NetConnection *con, BitStream *stream)'.
// Mquaker :: Add AlphaLOD Logic >>>
   mUseAlphaLod = stream->readFlag();
   if (mUseAlphaLod)
   {
	   stream->read(&mAlphaLODStart);
	   stream->read(&mAlphaLODEnd);
	   stream->read(&mInvertAlphaLod);
   }
   // Mquaker :: Add AlphaLOD Logic <<<

recompile your project and test...

#1
10/24/2011 (11:59 pm)
Nice resource, thanks!
#2
10/25/2011 (8:48 am)
Nice job. (I assume this is a port of the old TGE resource?)

#3
10/25/2011 (3:46 pm)
@Kevin Rogers
yes, this resource port of the old TGE/TGEA resource.. :D
#4
10/28/2011 (5:25 am)
Just a word of caution on this, it fades out the objects based on distance from the camera which is ok in normal instances but if you've implemented something that zooms in i.e. sniper rifle then you'll find objects faded out as you look down the scope.

I implemented a better approach for TGEA that used LOD system in Torque to determine whether to fade or not, if it helps then I'll look to port that over and post.
#5
10/30/2011 (12:30 pm)
I cant see how something like that couldnt help.

personally, id be VERY interested in that.
#6
11/07/2011 (12:11 pm)
@Andy: Please do.

Also, realistically, larger objects should be visible over longer distances -- a fade distance based on over-all size would be useful as well.