tree party with out leafs by 3d point in space11th 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 |