diff options
author | Tim Angus <tim@ngus.net> | 2004-01-21 23:10:35 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2004-01-21 23:10:35 +0000 |
commit | 8a7b1a7098224a0b3c36a3c2173f47ee22d4f583 (patch) | |
tree | 0dbc6c579f33a6cb8427b2999f6c38c7da836efd | |
parent | bddf02ca99719240d6a47efc3940ec96656eb810 (diff) |
* Improved robustness of the particle system, hopefully resulting in fewer
floating pointers
* Moved adding particles to after adding the player weapon so that the muzzle
particle systems match up properly
-rw-r--r-- | src/cgame/cg_buildable.c | 26 | ||||
-rw-r--r-- | src/cgame/cg_local.h | 4 | ||||
-rw-r--r-- | src/cgame/cg_particles.c | 55 | ||||
-rw-r--r-- | src/cgame/cg_players.c | 32 | ||||
-rw-r--r-- | src/cgame/cg_view.c | 16 | ||||
-rw-r--r-- | src/cgame/cg_weapons.c | 67 |
6 files changed, 126 insertions, 74 deletions
diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c index d788657d..2414b3d5 100644 --- a/src/cgame/cg_buildable.c +++ b/src/cgame/cg_buildable.c @@ -795,33 +795,26 @@ static void CG_BuildableParticleEffects( centity_t *cent ) if( team == BIT_HUMANS ) { - if( healthFrac < 0.33f && cent->buildablePS == NULL ) + if( healthFrac < 0.33f && !CG_IsParticleSystemValid( ¢->buildablePS ) ) { cent->buildablePS = CG_SpawnNewParticleSystem( cgs.media.humanBuildableDamagedPS ); CG_SetParticleSystemCent( cent->buildablePS, cent ); CG_AttachParticleSystemToCent( cent->buildablePS ); } - else if( healthFrac >= 0.33f && cent->buildablePS != NULL ) - { - CG_DestroyParticleSystem( cent->buildablePS ); - cent->buildablePS = NULL; - } + else if( healthFrac >= 0.33f && CG_IsParticleSystemValid( ¢->buildablePS ) ) + CG_DestroyParticleSystem( ¢->buildablePS ); } else if( team == BIT_ALIENS ) { - if( healthFrac < 0.33f && cent->buildablePS == NULL ) + if( healthFrac < 0.33f && !CG_IsParticleSystemValid( ¢->buildablePS ) ) { cent->buildablePS = CG_SpawnNewParticleSystem( cgs.media.alienBuildableDamagedPS ); CG_SetParticleSystemCent( cent->buildablePS, cent ); CG_SetParticleSystemNormal( cent->buildablePS, es->origin2 ); CG_AttachParticleSystemToCent( cent->buildablePS ); } - else if( healthFrac >= 0.33f && cent->buildablePS != NULL ) - { - CG_DestroyParticleSystem( cent->buildablePS ); - cent->buildablePS = NULL; - } - + else if( healthFrac >= 0.33f && CG_IsParticleSystemValid( ¢->buildablePS ) ) + CG_DestroyParticleSystem( ¢->buildablePS ); } } @@ -930,11 +923,8 @@ void CG_Buildable( centity_t *cent ) // if set to invisible, skip if( es->eFlags & EF_NODRAW ) { - if( cent->buildablePS != NULL ) - { - CG_DestroyParticleSystem( cent->buildablePS ); - cent->buildablePS = NULL; - } + if( CG_IsParticleSystemValid( ¢->buildablePS ) ) + CG_DestroyParticleSystem( ¢->buildablePS ); return; } diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h index 40644e84..3120ee18 100644 --- a/src/cgame/cg_local.h +++ b/src/cgame/cg_local.h @@ -689,6 +689,7 @@ typedef struct weaponInfoMode_s qhandle_t impactMark; qhandle_t impactMarkSize; sfxHandle_t impactSound[ 4 ]; //random impact sound + sfxHandle_t impactFleshSound[ 4 ]; //random impact sound float impactDlight; vec3_t impactDlightColor; } weaponInfoMode_t; @@ -1747,9 +1748,10 @@ void CG_LoadParticleSystems( void ); qhandle_t CG_RegisterParticleSystem( char *name ); particleSystem_t *CG_SpawnNewParticleSystem( qhandle_t psHandle ); -void CG_DestroyParticleSystem( particleSystem_t *ps ); +void CG_DestroyParticleSystem( particleSystem_t **ps ); qboolean CG_IsParticleSystemInfinite( particleSystem_t *ps ); +qboolean CG_IsParticleSystemValid( particleSystem_t **ps ); void CG_SetParticleSystemCent( particleSystem_t *ps, centity_t *cent ); void CG_AttachParticleSystemToCent( particleSystem_t *ps ); diff --git a/src/cgame/cg_particles.c b/src/cgame/cg_particles.c index 59b5d5f9..ce0020d5 100644 --- a/src/cgame/cg_particles.c +++ b/src/cgame/cg_particles.c @@ -1325,7 +1325,7 @@ Attach a particle system to a centity_t */ void CG_AttachParticleSystemToCent( particleSystem_t *ps ) { - if( ps == NULL ) + if( ps == NULL || !ps->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to modify a NULL particle system\n" ); return; @@ -1344,7 +1344,7 @@ Set a particle system attachment means */ void CG_SetParticleSystemCent( particleSystem_t *ps, centity_t *cent ) { - if( ps == NULL ) + if( ps == NULL || !ps->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to modify a NULL particle system\n" ); return; @@ -1363,7 +1363,7 @@ Attach a particle system to a model tag */ void CG_AttachParticleSystemToTag( particleSystem_t *ps ) { - if( ps == NULL ) + if( ps == NULL || !ps->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to modify a NULL particle system\n" ); return; @@ -1383,7 +1383,7 @@ Set a particle system attachment means void CG_SetParticleSystemTag( particleSystem_t *ps, refEntity_t parent, qhandle_t model, char *tagName ) { - if( ps == NULL ) + if( ps == NULL || !ps->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to modify a NULL particle system\n" ); return; @@ -1404,7 +1404,7 @@ Attach a particle system to a point in space */ void CG_AttachParticleSystemToOrigin( particleSystem_t *ps ) { - if( ps == NULL ) + if( ps == NULL || !ps->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to modify a NULL particle system\n" ); return; @@ -1423,7 +1423,7 @@ Set a particle system attachment means */ void CG_SetParticleSystemOrigin( particleSystem_t *ps, vec3_t origin ) { - if( ps == NULL ) + if( ps == NULL || !ps->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to modify a NULL particle system\n" ); return; @@ -1442,7 +1442,7 @@ Set a particle system attachment means */ void CG_SetParticleSystemNormal( particleSystem_t *ps, vec3_t normal ) { - if( ps == NULL ) + if( ps == NULL || !ps->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to modify a NULL particle system\n" ); return; @@ -1461,15 +1461,17 @@ Destroy a particle system This doesn't actually invalidate anything, it just stops particle ejectors from producing new particles so the -garbage collector will eventually remove this system +garbage collector will eventually remove this system. +However is does set the pointer to NULL so the user is +unable to manipulate this particle system any longer. =============== */ -void CG_DestroyParticleSystem( particleSystem_t *ps ) +void CG_DestroyParticleSystem( particleSystem_t **ps ) { int i; particleEjector_t *pe; - if( ps == NULL ) + if( *ps == NULL || !(*ps)->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to destroy a NULL particle system\n" ); return; @@ -1482,9 +1484,11 @@ void CG_DestroyParticleSystem( particleSystem_t *ps ) { pe = &particleEjectors[ i ]; - if( pe->valid && pe->parent == ps ) + if( pe->valid && pe->parent == *ps ) pe->totalParticles = pe->count = 0; } + + *ps = NULL; } /* @@ -1499,7 +1503,7 @@ qboolean CG_IsParticleSystemInfinite( particleSystem_t *ps ) int i; particleEjector_t *pe; - if( ps == NULL ) + if( ps == NULL || !ps->valid ) { CG_Printf( S_COLOR_YELLOW "WARNING: tried to test a NULL particle system\n" ); return qfalse; @@ -1523,6 +1527,25 @@ qboolean CG_IsParticleSystemInfinite( particleSystem_t *ps ) return qfalse; } +/* +=============== +CG_IsParticleSystemValid + +Test a particle system for validity +=============== +*/ +qboolean CG_IsParticleSystemValid( particleSystem_t **ps ) +{ + if( *ps == NULL || ( *ps && !(*ps)->valid ) ) + { + if( *ps && !(*ps)->valid ) + *ps = NULL; + + return qfalse; + } + + return qtrue; +} /* =============== @@ -1975,15 +1998,13 @@ void CG_ParticleSystemEntity( centity_t *cent ) if( es->eFlags & EF_NODRAW ) { - if( cent->entityPS != NULL && CG_IsParticleSystemInfinite( cent->entityPS ) ) - CG_DestroyParticleSystem( cent->entityPS ); - - cent->entityPS = NULL; + if( CG_IsParticleSystemValid( ¢->entityPS ) && CG_IsParticleSystemInfinite( cent->entityPS ) ) + CG_DestroyParticleSystem( ¢->entityPS ); return; } - if( cent->entityPS == NULL ) + if( !CG_IsParticleSystemValid( ¢->entityPS ) ) { cent->entityPS = CG_SpawnNewParticleSystem( cgs.gameParticleSystems[ es->modelindex ] ); CG_SetParticleSystemOrigin( cent->entityPS, cent->lerpOrigin ); diff --git a/src/cgame/cg_players.c b/src/cgame/cg_players.c index 8c7711d8..0759927e 100644 --- a/src/cgame/cg_players.c +++ b/src/cgame/cg_players.c @@ -1457,8 +1457,8 @@ static void CG_PlayerUpgrades( centity_t *cent, refEntity_t *torso ) { if( cent->jetPackState != JPS_ASCENDING ) { - if( cent->jetPackPS != NULL ) - CG_DestroyParticleSystem( cent->jetPackPS ); + if( CG_IsParticleSystemValid( ¢->jetPackPS ) ) + CG_DestroyParticleSystem( ¢->jetPackPS ); cent->jetPackPS = CG_SpawnNewParticleSystem( cgs.media.jetPackAscendPS ); cent->jetPackState = JPS_ASCENDING; @@ -1471,8 +1471,8 @@ static void CG_PlayerUpgrades( centity_t *cent, refEntity_t *torso ) { if( cent->jetPackState != JPS_DESCENDING ) { - if( cent->jetPackPS != NULL ) - CG_DestroyParticleSystem( cent->jetPackPS ); + if( CG_IsParticleSystemValid( ¢->jetPackPS ) ) + CG_DestroyParticleSystem( ¢->jetPackPS ); cent->jetPackPS = CG_SpawnNewParticleSystem( cgs.media.jetPackDescendPS ); cent->jetPackState = JPS_DESCENDING; @@ -1485,8 +1485,8 @@ static void CG_PlayerUpgrades( centity_t *cent, refEntity_t *torso ) { if( cent->jetPackState != JPS_HOVERING ) { - if( cent->jetPackPS != NULL ) - CG_DestroyParticleSystem( cent->jetPackPS ); + if( CG_IsParticleSystemValid( ¢->jetPackPS ) ) + CG_DestroyParticleSystem( ¢->jetPackPS ); cent->jetPackPS = CG_SpawnNewParticleSystem( cgs.media.jetPackHoverPS ); cent->jetPackState = JPS_HOVERING; @@ -1510,25 +1510,23 @@ static void CG_PlayerUpgrades( centity_t *cent, refEntity_t *torso ) CG_PositionRotatedEntityOnTag( &flash, &jetpack, jetpack.hModel, "tag_flash" ); trap_R_AddRefEntityToScene( &flash ); - if( cent->jetPackPS != NULL ) + if( CG_IsParticleSystemValid( ¢->jetPackPS ) ) { CG_SetParticleSystemTag( cent->jetPackPS, jetpack, jetpack.hModel, "tag_flash" ); CG_SetParticleSystemCent( cent->jetPackPS, cent ); CG_AttachParticleSystemToTag( cent->jetPackPS ); } } - else if( cent->jetPackPS != NULL ) + else if( CG_IsParticleSystemValid( ¢->jetPackPS ) ) { - CG_DestroyParticleSystem( cent->jetPackPS ); + CG_DestroyParticleSystem( ¢->jetPackPS ); cent->jetPackState = JPS_OFF; - cent->jetPackPS = NULL; } } - else if( cent->jetPackPS != NULL ) + else if( CG_IsParticleSystemValid( ¢->jetPackPS ) ) { - CG_DestroyParticleSystem( cent->jetPackPS ); + CG_DestroyParticleSystem( ¢->jetPackPS ); cent->jetPackState = JPS_OFF; - cent->jetPackPS = NULL; } if( es->eFlags & EF_BLOBLOCKED ) @@ -2103,11 +2101,11 @@ void CG_Player( centity_t *cent ) //sanity check that particle systems are stopped when dead if( es->eFlags & EF_DEAD ) { - if( cent->muzzlePS != NULL ) - CG_DestroyParticleSystem( cent->muzzlePS ); + if( CG_IsParticleSystemValid( ¢->muzzlePS ) ) + CG_DestroyParticleSystem( ¢->muzzlePS ); - if( cent->jetPackPS != NULL ) - CG_DestroyParticleSystem( cent->jetPackPS ); + if( CG_IsParticleSystemValid( ¢->jetPackPS ) ) + CG_DestroyParticleSystem( ¢->jetPackPS ); } } diff --git a/src/cgame/cg_view.c b/src/cgame/cg_view.c index c3e13457..9a5b8aaf 100644 --- a/src/cgame/cg_view.c +++ b/src/cgame/cg_view.c @@ -1136,11 +1136,8 @@ static int CG_CalcViewValues( void ) //shut off the poison cloud effect if it's still on the go if( cg.snap->ps.stats[ STAT_HEALTH ] <= 0 ) { - if( cg.poisonCloudPS != NULL ) - { - CG_DestroyParticleSystem( cg.poisonCloudPS ); - cg.poisonCloudPS = NULL; - } + if( CG_IsParticleSystemValid( &cg.poisonCloudPS ) ) + CG_DestroyParticleSystem( &cg.poisonCloudPS ); } if( cg.renderingThirdPerson ) @@ -1274,13 +1271,18 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo CG_AddPacketEntities( ); // adter calcViewValues, so predicted player state is correct CG_AddMarks( ); CG_AddLocalEntities( ); + } + + CG_AddViewWeapon( &cg.predictedPlayerState ); + + //after CG_AddViewWeapon + if( !cg.hyperspace ) + { CG_AddParticles( ); //TA: wolf trails stuff CG_AddTrails( ); // this must come last, so the trails dropped this frame get drawn } - - CG_AddViewWeapon( &cg.predictedPlayerState ); // add buffered sounds CG_PlayBufferedSounds( ); diff --git a/src/cgame/cg_weapons.c b/src/cgame/cg_weapons.c index fbb79c08..a6099915 100644 --- a/src/cgame/cg_weapons.c +++ b/src/cgame/cg_weapons.c @@ -447,6 +447,29 @@ static qboolean CG_ParseWeaponModeSection( weaponInfoMode_t *wim, char **text_p continue; } + else if( !Q_stricmp( token, "impactFleshSound" ) ) + { + int index = 0; + + token = COM_Parse( text_p ); + if( !token ) + break; + + index = atoi( token ); + + if( index < 0 ) + index = 0; + else if( index > 3 ) + index = 3; + + token = COM_Parse( text_p ); + if( !token ) + break; + + wim->impactFleshSound[ index ] = trap_S_RegisterSound( token, qfalse ); + + continue; + } else if( !Q_stricmp( token, "impactDlightColor" ) ) { for( i = 0 ; i < 3 ; i++ ) @@ -1079,7 +1102,7 @@ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent if( ( nonPredictedCent - cg_entities ) != cent->currentState.clientNum ) nonPredictedCent = cent; - if( cent->muzzlePS ) + if( CG_IsParticleSystemValid( ¢->muzzlePS ) ) { if( ps || cg.renderingThirdPerson || cent->currentState.number != cg.predictedPlayerState.clientNum ) @@ -1095,10 +1118,7 @@ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent ( !( cent->currentState.eFlags & EF_FIRING2 ) && weaponMode == WPM_SECONDARY ) || ( !( cent->currentState.eFlags & EF_FIRING3 ) && weaponMode == WPM_TERTIARY ) ) && CG_IsParticleSystemInfinite( cent->muzzlePS ) ) - { - CG_DestroyParticleSystem( cent->muzzlePS ); - cent->muzzlePS = NULL; - } + CG_DestroyParticleSystem( ¢->muzzlePS ); } // add the flash @@ -1701,18 +1721,37 @@ void CG_MissileHitWall( weapon_t weaponNum, weaponMode_t weaponMode, int clientN VectorCopy( weapon->wim[ weaponMode ].impactDlightColor, lightColor ); ps = weapon->wim[ weaponMode ].impactParticleSystem; - // play a sound - for( c = 0; c < 4; c++ ) + if( soundType == IMPACTSOUND_FLESH ) { - if( !weapon->wim[ weaponMode ].impactSound[ c ] ) - break; + //flesh sound + for( c = 0; c < 4; c++ ) + { + if( !weapon->wim[ weaponMode ].impactFleshSound[ c ] ) + break; + } + + if( c > 0 ) + { + c = rand( ) % c; + if( weapon->wim[ weaponMode ].impactFleshSound[ c ] ) + trap_S_StartSound( origin, ENTITYNUM_WORLD, CHAN_AUTO, weapon->wim[ weaponMode ].impactFleshSound[ c ] ); + } } - - if( c > 0 ) + else { - c = rand( ) % c; - if( weapon->wim[ weaponMode ].impactSound[ c ] ) - trap_S_StartSound( origin, ENTITYNUM_WORLD, CHAN_AUTO, weapon->wim[ weaponMode ].impactSound[ c ] ); + //normal sound + for( c = 0; c < 4; c++ ) + { + if( !weapon->wim[ weaponMode ].impactSound[ c ] ) + break; + } + + if( c > 0 ) + { + c = rand( ) % c; + if( weapon->wim[ weaponMode ].impactSound[ c ] ) + trap_S_StartSound( origin, ENTITYNUM_WORLD, CHAN_AUTO, weapon->wim[ weaponMode ].impactSound[ c ] ); + } } //create impact particle system |