TGC Codebase Backup



tree party with out leafs by 3d point in space

11th Sep 2009 21:18
Summary

Tree party update where leaf don't fall



Description

I thought it would be nice to have tree party with out those anoying leaves falling all the time.



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    void DarkGDK ( void )
{
...
// load images for the terrain
//dbLoadImage ( "demomedia\terrain\texture.jpg", 1 );	// diffuse texture
//dbLoadImage ( "demomedia\terrain\texture2.jpg", 3 );	// diffuse texture
//dbLoadImage ( "demomedia\terrain\detail.jpg",  2 );	// detail texture
...
}

...
void tpUpdate( int camobj ){
	if  ( dtMasterTreeCount < 1 ) { return; } // no trees loaded? exit out 

//check if the system is initialized
	if ( dtInit != true ){ MessageBox(NULL, "Treeparty was not initialized, call the method 'dt_Init()' to initialize the system.", "Error!", MB_OK); exit(0); }

// misc local vars
	int lodcheck, aval, cnt;
	float applyamt, decamt;
	float dist, nlx, nly, nlz;
	float lx=0.0, ly=0.0, lz=0.0;
	char* str1 = "";
	char* str2 = "";
	char* str3;
	int inview;

// misc resets	
	totinview = 0; dtWobble = dtWobble + dtWobbleEffect;

// see if lod timer has expired
	if ( dtLODTimer < dbTimer() ){
		lodcheck = 1;
		dtLODTimer = dbTimer() + 75; }
	else{
		lodcheck = 0;
	}

// random wind gust variables
	if ( (dtRandWindGustChance > 0) && ( dtWindOnOff = 1 ) ){
		float applyamt2;
		float decamt;
		if ( dtGustTimer < dbTimer()){
			if ( dbRnd(dtRandWindGustChance) == dbRnd(dtRandWindGustChance) ){
				dbRandomize(dbTimer());
				//get random force value
				applyamt = tprandFloat( dtRandWindGustMaxForce/2 , dtRandWindGustMaxForce );
				applyamt2= tprandFloat( dtRandWindGustMaxSpeed/2, dtRandWindGustMaxSpeed );
				decamt = tprandFloat(0.001, 0.01);
				tpStartWindGust( applyamt, applyamt2, decamt);
				dtGustTimer = dbTimer() + ( 5000 + dbRnd(15000) );
			}
		}
	}

// monitor wind gust variables
	if ( dtWindGustForceReq > 0 ){
		dtWindGustForce = dtWindGustForce+ dtWindGustDecForce;
		dtWindGustForceReq = (dtWindGustForceReq - dtWindGustDecForce );
	}
	if ( dtWindGustForce > 0 ){
	    dtWindGustForce = dtWindGustForce - (dtWindGustForce * .0035);
		if ( dtWindGustForce < .01 ) { dtWindGustForce = 0; }
	}
	if ( dtWindGustSpeedReq > 0 ){
		dtWindGustSpeed = dtWindGustSpeed + dtWindGustDecSpeed;
	    dtWindGustSpeedReq = (dtWindGustSpeedReq - dtWindGustDecSpeed );
	}
	if ( dtWindGustSpeed > 0 ){
	    dtWindGustSpeed = dtWindGustSpeed - (dtWindGustSpeed * .0015);
		if ( dtWindGustSpeed < .001 ) { dtWindGustSpeed = 0; }
	}

// add leaf fall speed if wind is blowing
	if ( (dtWindGustForceReq > 0) || (dtWindGustSpeedReq > 0) ){
		dtAddSp = dtAddSp + ( dtblowstr * .1); }
	else{
		if ( dtAddSp > 0 ){
			dtAddSp = dtAddSp - (dtAddSp * .015);
			if ( dtAddSp < 1 ) { dtAddSp = 0; }
		}
	}


//////////////////////////////// loop the entire tree list  ////////////////////////////////////
	for ( int t = 1;  t < dtMasterTreeCount + 1; t++  ){
		int opTree = t + dtTreeObjNumStart;

	//first we get the distance from the camera and each tree space
		if ( lodcheck = 1 ){
			dbSetVector3( dtreeVec3, ( tree[t].x - dbCameraPositionX(camobj) ), ( tree[t].y - dbCameraPositionY(camobj) ), ( tree[t].z - dbCameraPositionZ(camobj) ) );
			tree[t].dist = dbLengthVector3(dtreeVec3);
		}
		dist = tree[t].dist;


	// Billboarding ( runs independant from the tree main operations )
		switch ( tree[t].BBMode ) {

			case 0: // BB is off and needs to be switch ON
				if ( (dist > dtClipMed) && ( dist < dtClipMax ) ){
					tree[t].BBMode=1;
					tree[t].BBAlpha=0;
					str1 = "bb_";
					str2 = tree[t].trunkfilename;
					str3 = (char *)malloc((strlen(str1) + strlen(str2) + 1)*sizeof(char));
					strcpy(str3, str1); strcat(str3, str2);
					aval = tpCACHE_ReturnBillboardMesh( str3 );
					dbCloneObject( tree[t].BBObj, aval );
					//vertex color
					dbConvertObjectFVF( tree[t].BBObj, 338 );
					dbLockVertexDataForLimb( tree[t].BBObj,1 );
					dbSetVertexDataDiffuse( 0, dbRgb(tree[t].colR1, tree[t].colG1, tree[t].colB1));
					dbSetVertexDataDiffuse( 1, dbRgb(tree[t].colR2, tree[t].colG2, tree[t].colB2));
					dbSetVertexDataDiffuse( 2, dbRgb(tree[t].colR3, tree[t].colG3, tree[t].colB3));
					dbSetVertexDataDiffuse( 3, dbRgb(tree[t].colR3, tree[t].colG3, tree[t].colB3));
					dbUnlockVertexData();
					dbPositionObject( tree[t].BBObj, tree[t].x, tree[t].y, tree[t].z);
					dbSetObjectLight( tree[t].BBObj, dtProngLighting );
					dbScaleObject( tree[t].BBObj, tree[t].scale , tree[t].scale + tree[t].AddYScale , tree[t].scale);
					dbTextureObject( tree[t].BBObj, tree[t].BillboardTextureRef );
					dbSetAlphaMappingOn( tree[t].BBObj, 0 );
					dbSetObjectTransparency( tree[t].BBObj, 6);
				}
			break;


			case 1:	//	rem on and fading IN
				if ( tree[t].BBAlpha < dtmaxBillBoardOpaque ){
		           tree[t].BBAlpha = tree[t].BBAlpha + ( dtFadeInSpeed* 2 );
				   if ( tree[t].BBAlpha > dtmaxBillBoardOpaque) { tree[t].BBAlpha = dtmaxBillBoardOpaque; }
				   dbSetAlphaMappingOn( tree[t].BBObj, tree[t].BBAlpha ); }
				else{
				   tree[t].BBMode = 3;
				}
			break;


			case 2: // on and fading out
				if ( tree[t].BBAlpha > 0 ){
                  tree[t].BBAlpha=tree[t].BBAlpha - (dtFadeInSpeed *2 );
				  if (tree[t].BBAlpha < 0) {tree[t].BBAlpha = 0; }
				   dbSetAlphaMappingOn( tree[t].BBObj, tree[t].BBAlpha ); }
				else{
                   tree[t].BBMode = 0;
                   dbDeleteObject( tree[t].BBObj );
				}
			break;

			case 3:
				if ( (dist < dtClipMed) || ( dist > dtClipMax ) ){
					tree[t].BBMode = 2;
				}
			break;
		}

   // billboard rotations
		if (tree[t].BBMode != 0){
		    dbPointObject( tree[t].BBObj, dbCameraPositionX(camobj) ,dbCameraPositionY(camobj) , dbCameraPositionZ(camobj));
	        // rotations
			nlx = ( dbSin(tree[t].WindWave2 + lx + tree[t].WindRand) * (tree[t].WindForce + dtWindGustForce )) /4;
		    nly= ((dbCos(tree[t].WindWave2 + ly - tree[t].WindRand) * ((tree[t].WindForce + dtWindGustForce)/4))/2)*2;
	        nlz=((dbCos(tree[t].WindWave2 + lz - tree[t].WindRand) * ((tree[t].WindForce+dtWindGustForce)/4)));
			tree[t].WindWave2 = dbWrapValue(tree[t].WindWave2 + (tree[t].WindSpeed * 4 ) + ( dtWindGustSpeed / 4));
	        dbRotateObject( tree[t].BBObj, dbObjectAngleX(tree[t].BBObj) + ( nlx + dbSin( tree[t].dtWobble )), dbObjectAngleY(tree[t].BBObj) + ( nly + dbSin( tree[t].dtWobble )), dbObjectAngleZ( tree[t].BBObj) + ( nlz + dbSin(tree[t].dtWobble)) );
		}


  // lets check to see if any trees currently OFF need to be turned ON
  // -----------------------------------------------------------------
	if (tree[t].status < 1 ){ /// OFF

      // if under the Med clip distance Spawn the Full tree
	  if ( dist < dtClipMed ){
		if ( ( dtLoadTreeTimer < dbTimer() ) || ( dtFirstpass <1) ){
         aval = tpCACHE_ReturnTrunkMesh( tree[t].trunkfilename ); // gets the treetrunk from the cache holder
         dbCloneObject( (t + dtTreeObjNumStart) , aval );


         // setup the prongs for this tree
         cnt=1;
         for ( int r = tree[t].limbObjStart; r != tree[t].limbObjEnd  ; ++r){

			 switch ( tree[t].ProngType ) {
               case 0:
				   dbCloneObject( r, dtProngObjectA  );
			   break;
               case 1:
				   dbCloneObject( r, dtProngObjectB  );
			   break;
               case 2:
				   dbCloneObject( r, dtProngObjectC  );
			   break;
			 }

			 dbScaleObject( r, tree[t].prongscale, tree[t].prongscale, tree[t].prongscale);

			 if ( dtProngLighting <1 ){ dbSetObjectLight( r, 0 ); }
             //dbTextureObject( r, (tree[t].ProngTextureRef + tree[t].ProngMipmapSetting) ); ( this currently isnt working, marked out for the time being )
             dbTextureObject( r, tree[t].ProngTextureRef );
			 dbSetObjectTransparency( r, 1 );
	 		 dbSetAlphaMappingOn( r, 0 );

             // assign wind variables to each prong
             dtSwayJointsWindForce[t][cnt]=dtWindForce*(dbRnd(2));
             dtSwayJointsWindSpeed[t][cnt]=dtWindSpeed*(dbRnd(2));
             dtSwayJointsWindRand[t][cnt]=-90+dbRnd(180);

             // misc porperties to set
             dbSetObjectCollisionOff( r );

 			//vertex color
			dbConvertObjectFVF( r, 338 );
			dbLockVertexDataForLimb( r,1 );
			switch ( tree[t].ProngType ) {
				case 0:
					dbSetVertexDataDiffuse( 0, dbRgb(tree[t].colR1, tree[t].colG1, tree[t].colB1));
					dbSetVertexDataDiffuse( 1, dbRgb(tree[t].colR2, tree[t].colG2, tree[t].colB2));
					dbSetVertexDataDiffuse( 2, dbRgb(tree[t].colR3, tree[t].colG3, tree[t].colB3));
					dbSetVertexDataDiffuse( 3, dbRgb(tree[t].colR3, tree[t].colG3, tree[t].colB3));
				break;
				case 2:
					dbSetVertexDataDiffuse( 0, dbRgb(tree[t].colR1, tree[t].colG1, tree[t].colB1));
					dbSetVertexDataDiffuse( 1, dbRgb(tree[t].colR1, tree[t].colG1, tree[t].colB1));
					dbSetVertexDataDiffuse( 2, dbRgb(tree[t].colR2, tree[t].colG2, tree[t].colB2));
					dbSetVertexDataDiffuse( 3, dbRgb(tree[t].colR2, tree[t].colG2, tree[t].colB2));
					dbSetVertexDataDiffuse( 4, dbRgb(tree[t].colR2, tree[t].colG2, tree[t].colB2));
					dbSetVertexDataDiffuse( 5, dbRgb(tree[t].colR2, tree[t].colG2, tree[t].colB2));
					dbSetVertexDataDiffuse( 6, dbRgb(tree[t].colR3, tree[t].colG3, tree[t].colB3));
					dbSetVertexDataDiffuse( 7, dbRgb(tree[t].colR3, tree[t].colG3, tree[t].colB3));
					dbSetVertexDataDiffuse( 8, dbRgb(tree[t].colR3, tree[t].colG3, tree[t].colB3));
				break;

			}
			dbUnlockVertexData();

		 }


         // position intial trees settings
         dbScaleObject( t + dtTreeObjNumStart, tree[t].scale, tree[t].scale + tree[t].AddYScale, tree[t].scale );
         dbPositionObject( t + dtTreeObjNumStart, tree[t].x, tree[t].y, tree[t].z );
         dbRotateObject( t + dtTreeObjNumStart, tree[t].xr, tree[t].yr, tree[t].zr );
         dbTextureObject( t + dtTreeObjNumStart, tree[t].trunkTextureRef );
		 dbSetObjectTransparency( t + dtTreeObjNumStart, 6 );
		 dbSetAlphaMappingOn( t + dtTreeObjNumStart, 0 );
         tree[t].TreeAlpha = 0;
         tree[t].status = 1;
         dtLoadTreeTimer = dbTimer() + dtTreeLoadTime;

		}
	  }

	}


	
	
// tick processing
  if ( dist < (dtClipMed / 2) ){ 
	  tree[t].tick = 0; }
  else{
	  if (tree[t].tick < 1) { tree[t].tick = dtTickProcessing; }
      tree[t].tick = tree[t].tick - 1;
  }




   ///  Inview range check  ////
  if (tree[t].status > 0 ){
	 if ( dbObjectInScreen( t+dtTreeObjNumStart ) ){
          inview = 1;
          totinview++;


 

 

// Trees that are at full detial need updating
    // --------------------------------------------
    if ( (tree[t].status > 0) && (tree[t].tick < 1)) {

	//rem trunk alpha
	  if ( (tree[t].TreeAlpha < 101) && ( dist < dtClipMed )){
         tree[t].TreeAlpha = tree[t].TreeAlpha + dtFadeInSpeed;
         dbSetAlphaMappingOn( t + dtTreeObjNumStart , tree[t].TreeAlpha *2 );
		 if ( tree[t].TreeAlpha > 99 ) { dbSetObjectTransparency( t + dtTreeObjNumStart, 0); }
	  }

	  if ( (tree[t].TreeAlpha > 0) && ( dist > dtClipMed )){
		 tree[t].TreeAlpha=tree[t].TreeAlpha - dtFadeInSpeed;
         dbSetAlphaMappingOn( t + dtTreeObjNumStart, tree[t].TreeAlpha);
	  }



   // Rustling 3d sound
	  if ( dtRustlingSoundFile > 0 ){
		  if ( dtSoundRustleTimer < dbTimer()) {
			  if ( dbRnd(2000) == dbRnd(2000) ){
               dbPositionSound( dtRustlingSoundFile, tree[t].x, tree[t].y, tree[t].z );
               dbPlaySound( dtRustlingSoundFile );
               dtSoundRustleTimer = dbTimer()+15000;
			  }
		  }
	  }



	//rem add wind motion to the sway points
	  for ( int r = 1; r < tree[t].SwayPivAmt +1; r++ ){
          lx=dbLimbAngleX(opTree, dtSwayJoints[t][r]  );
          lz=dbLimbAngleZ(opTree, dtSwayJoints[t][r]  );
          ly=dbLimbAngleY(opTree, dtSwayJoints[t][r]  );
          nlx=(dbSin(tree[t].WindWave+lx+tree[t].WindRand)*(tree[t].WindForce+dtWindGustForce))/4;
          nly=(dbCos(tree[t].WindWave + ly - tree[t].WindRand) * ((tree[t].WindForce+dtWindGustForce)/2))/2;
          nlz=(dbCos(tree[t].WindWave + lz - tree[t].WindRand) * ((tree[t].WindForce+dtWindGustForce)/2))/4;
          dbRotateLimb( opTree, dtSwayJoints[t][r], nlx+dbSin(tree[t].dtWobble), nly+dbSin(tree[t].dtWobble), nlz+dbSin(tree[t].dtWobble));
	  }
      tree[t].WindWave= dbWrapValue(tree[t].WindWave + (tree[t].WindSpeed)+(dtWindGustSpeed/2));


	//rem update the prongs to their proper locations
	  cnt=1;
	  for ( int r = tree[t].limbObjStart; r != tree[t].limbObjEnd  ; ++r){
		 dbPositionObject( r, dbLimbPositionX(opTree, dtProngJoints[t][cnt]), dbLimbPositionY(opTree, dtProngJoints[t][cnt]), dbLimbPositionZ(opTree, dtProngJoints[t][cnt]));
         dbPointObject( r, dbCameraPositionX(camobj) ,dbCameraPositionY(camobj) , dbCameraPositionZ(camobj) );
         dbRotateObject( r, dbObjectAngleX(r), dbCameraAngleY(camobj)-180 , dbCos(dbObjectAngleZ(r)*.2));
		 dbSetAlphaMappingOn( r, tree[t].TreeAlpha);
		 if ( tree[t].TreeAlpha < 85 ){ dbSetObjectTransparency( r, 2 ); } else { dbSetObjectTransparency( r, 2 ); }
		 cnt++;
	   }

  }
		  // ---- if not in view

		  if ( tree[t].Inview < 1 ){
              dbShowObject( t + dtTreeObjNumStart );
                for ( int r = tree[t].limbObjStart; r != tree[t].limbObjEnd  ; ++r){
	              dbExcludeObjectOff( r );
				}
              tree[t].Inview = 1;  
		  }
	  else
	  {
		  inview = 0;
		  if ( tree[t].Inview < 1 ) {
                 tree[t].Inview = 1;
                 dbHideObject( t + dtTreeObjNumStart );
                 for ( int r = tree[t].limbObjStart; r != tree[t].limbObjEnd  ; ++r){
                     dbExcludeObjectOn( r );
				 }
		  }
	   }

            // if it's past the clip - just remove it
			if ( dist > dtClipMed ) {
               tree[t].status = 0;
               //delete the trunk
               dbDeleteObject( t + dtTreeObjNumStart );
               //delete prongs
               for ( int r = tree[t].limbObjStart; r != tree[t].limbObjEnd  ; ++r){
                  dbDeleteObject( r );
			   }
               goto StopSpud;
			}

	 }
}



  //montior falling leaves ----------------------------------------------
  if (tree[t].FLRef > 0 ){
	  if (tree[t].tplstate == 1){
		  if (tree[t].tplAlpha < 100 ){
			  tree[t].tplAlpha = tree[t].tplAlpha + 5;
              dbSetAlphaMappingOn( tree[t].FLRef, tree[t].tplAlpha );
		  }
	  }

         //check state change for the leaf
	  if ( dbObjectPositionY(tree[t].FLRef ) <  ( tree[t].tplMiny + tree[t].tplMiny / 2  ) ){
             tree[t].tplstate=2; 
	  }


         dbPointObject( tree[t].FLRef, dbCameraPositionX(camobj) ,dbCameraPositionY(camobj), dbCameraPositionZ(camobj) );
		 dbRotateObject( tree[t].FLRef, dbObjectAngleX( tree[t].FLRef), dbCameraAngleY(camobj)-180 , dbWrapValue(tree[t].tplzr));
         tree[t].tplzr=tree[t].tplzr + tprandFloat(.4, .8);

         tree[t].tplvx = tree[t].tplvx + tprandFloat(-0.002, .002);
		 if ( dtAddSp > 0 ){
			 if (tree[t].tplvx > 0){ tree[t].tplvx = tree[t].tplvx + (dtAddSp *.0003); }
			 if (tree[t].tplvx < 0){ tree[t].tplvx = tree[t].tplvx - (dtAddSp *.0003); }
			 if (tree[t].tplvx > 5){ tree[t].tplvx = .0012; }
			 if (tree[t].tplvx < -5){ tree[t].tplvx = -.0012; }
		 }
         tree[t].tplvz = tree[t].tplvz + tprandFloat (-0.002, .002);
		 if ( dtAddSp > 0 ){
			 if (tree[t].tplvz > 0){ tree[t].tplvz=tree[t].tplvz+(dtAddSp*.0003); }
			 if (tree[t].tplvz < 0){ tree[t].tplvz=tree[t].tplvz-(dtAddSp*.0003); }
			 if (tree[t].tplvz > 5){ tree[t].tplvz = .0012;}
			 if (tree[t].tplvz <-5){ tree[t].tplvz = -.0012;}
		 }

         dbPositionObject( tree[t].FLRef, tree[t].tplx, tree[t].tply, tree[t].tplz);
         tree[t].tplx = (dbObjectPositionX( tree[t].FLRef) + tree[t].tplvx);
         tree[t].tply = (dbObjectPositionY( tree[t].FLRef) - dtLeafDropSpeed);
         tree[t].tplz = (dbObjectPositionZ( tree[t].FLRef) + tree[t].tplvz);


		//remove the leaf if tree is past the med clip range
		 if ( dist > dtClipMed ) {
			 if ( tree[t].FLRef > 0  ){
				dbDeleteObject(tree[t].FLRef);
				tree[t].FLRef = 0;
				tree[t].tplstate = 0;
			 }
		 }


         // fade out leaf then dissolve object
		 if (tree[t].tplstate == 2){
			 if (tree[t].tplAlpha > 0){
                tree[t].tplAlpha = tree[t].tplAlpha - 5;
				dbSetAlphaMappingOn( tree[t].FLRef, tree[t].tplAlpha );}
			 else{
                dbDeleteObject( tree[t].FLRef);
				tree[t].FLRef = 0;
			 }
		 }

  }





	// LAST THING TO CHECK
	// does this tree need removed from the live queue?
	  if ( dist > dtClipMed + 1 ){
            //remove falling leaves from this tree
			  if ( tree[t].FLRef > 0 ){
                dbDeleteObject( tree[t].FLRef );
                tree[t].FLRef = 0;
			  }
            tree[t].status = 0;
            //delete the trunk
            dbDeleteObject( t+dtTreeObjNumStart );
            //delete prongs
			for ( int r = tree[t].limbObjStart; r != tree[t].limbObjEnd  ; ++r){
               dbDeleteObject( r );
		  }
	  }

StopSpud:;
dtFirstpass=1;
	} //// for next end///////////////////////////////////////////////////////////////////////////////////////////
} //end Update