diff --git a/src/core/Game.cpp b/src/core/Game.cpp index e3ef8aed..92564289 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -591,7 +591,8 @@ void CGame::ShutDownForRestart(void) CStreaming::ms_disableStreaming = false; CRadar::RemoveRadarSections(); FrontEndMenuManager.UnloadTextures(); - CParticleObject::RemoveAllParticleObjects(); + CParticleObject::RemoveAllExpireableParticleObjects(); + //CWaterCreatures::RemoveAll(); //TODO VC CSetPieces::Init(); CPedType::Shutdown(); CSpecialFX::Shutdown(); diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index 8938b49a..394b8162 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -686,15 +686,12 @@ CEntity::AddSteamsFromGround(CVector *unused) case 4: CParticleObject::AddObject(POBJECT_DARK_SMOKE, pos, effect->particle.dir, effect->particle.scale, false); break; -// TODO(MIAMI): enable this once we have the particle objects -/* case 5: CParticleObject::AddObject(POBJECT_WATER_FOUNTAIN_VERT, pos, effect->particle.dir, effect->particle.scale, false); break; case 6: CParticleObject::AddObject(POBJECT_WATER_FOUNTAIN_HORIZ, pos, effect->particle.dir, effect->particle.scale, false); break; -*/ } } } diff --git a/src/objects/ParticleObject.cpp b/src/objects/ParticleObject.cpp index a8afaf6c..e611f5f2 100644 --- a/src/objects/ParticleObject.cpp +++ b/src/objects/ParticleObject.cpp @@ -162,226 +162,240 @@ CParticleObject::AddObject(uint16 type, CVector const &pos, CVector const &targe pobj->m_fSize = size; pobj->m_fRandVal = 0.0f; - if ( type <= POBJECT_CATALINAS_SHOTGUNFLASH ) + switch ( type ) { - switch ( type ) + case POBJECT_PAVEMENT_STEAM: { - case POBJECT_PAVEMENT_STEAM: - { - pobj->m_ParticleType = PARTICLE_STEAM_NY; - pobj->m_nNumEffectCycles = 1; -#ifdef PC_PARTICLE - pobj->m_nSkipFrames = 3; -#else - pobj->m_nSkipFrames = 1; -#endif - pobj->m_nCreationChance = 8; - break; - } - - case POBJECT_PAVEMENT_STEAM_SLOWMOTION: - { - pobj->m_ParticleType = PARTICLE_STEAM_NY_SLOWMOTION; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 8; - break; - } - - case POBJECT_WALL_STEAM: - { - pobj->m_ParticleType = PARTICLE_STEAM_NY; - pobj->m_nNumEffectCycles = 1; -#ifdef PC_PARTICLE - pobj->m_nSkipFrames = 3; -#else - pobj->m_nSkipFrames = 1; -#endif - pobj->m_nCreationChance = 8; - break; - } - - case POBJECT_WALL_STEAM_SLOWMOTION: - { - pobj->m_ParticleType = PARTICLE_STEAM_NY_SLOWMOTION; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 8; - break; - } - - case POBJECT_DARK_SMOKE: - { - pobj->m_ParticleType = PARTICLE_STEAM_NY; - pobj->m_nNumEffectCycles = 1; -#ifdef PC_PARTICLE - pobj->m_nSkipFrames = 3; -#else - pobj->m_nSkipFrames = 1; -#endif - pobj->m_nCreationChance = 8; - pobj->m_Color = CRGBA(16, 16, 16, 255); - break; - } - - case POBJECT_FIRE_HYDRANT: - { - pobj->m_ParticleType = PARTICLE_WATER_HYDRANT; - pobj->m_nNumEffectCycles = 4; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 0; - pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.3f); - pobj->m_nRemoveTimer = CTimer::GetTimeInMilliseconds() + 5000; - CAudioHydrant::Add(pobj); - break; - } - - case POBJECT_CAR_WATER_SPLASH: - case POBJECT_PED_WATER_SPLASH: - { - pobj->m_ParticleType = PARTICLE_CAR_SPLASH; - pobj->m_nNumEffectCycles = 0; -#ifdef PC_PARTICLE - pobj->m_nSkipFrames = 1; -#else - pobj->m_nSkipFrames = 3; -#endif - pobj->m_nCreationChance = 0; - break; - } - - case POBJECT_SPLASHES_AROUND: - { - pobj->m_ParticleType = PARTICLE_SPLASH; -#ifdef PC_PARTICLE - pobj->m_nNumEffectCycles = 15; -#else - pobj->m_nNumEffectCycles = 30; -#endif - pobj->m_nSkipFrames = 2; - pobj->m_nCreationChance = 0; - break; - } - - case POBJECT_SMALL_FIRE: - { - pobj->m_ParticleType = PARTICLE_FLAME; - pobj->m_nNumEffectCycles = 1; -#ifdef PC_PARTICLE - pobj->m_nSkipFrames = 2; -#else - pobj->m_nSkipFrames = 1; -#endif - pobj->m_nCreationChance = 2; - pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.0f); - break; - } - - case POBJECT_BIG_FIRE: - { - pobj->m_ParticleType = PARTICLE_FLAME; - pobj->m_nNumEffectCycles = 1; -#ifdef PC_PARTICLE - pobj->m_nSkipFrames = 2; -#else - pobj->m_nSkipFrames = 1; -#endif - pobj->m_nCreationChance = 4; - pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.0f); - break; - } - - case POBJECT_DRY_ICE: - { - pobj->m_ParticleType = PARTICLE_SMOKE; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 0; - pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.0f); - break; - } - - case POBJECT_DRY_ICE_SLOWMOTION: - { - pobj->m_ParticleType = PARTICLE_SMOKE_SLOWMOTION; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 0; - pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.0f); - break; - } - - case POBJECT_FIRE_TRAIL: - { - pobj->m_ParticleType = PARTICLE_EXPLOSION_MEDIUM; - pobj->m_nNumEffectCycles = 1; -#ifdef PC_PARTICLE - pobj->m_nSkipFrames = 3; -#else - pobj->m_nSkipFrames = 1; -#endif - pobj->m_nCreationChance = 2; - pobj->m_fRandVal = 0.01f; - break; - } - - case POBJECT_SMOKE_TRAIL: - { - pobj->m_ParticleType = PARTICLE_FIREBALL_SMOKE; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 2; - pobj->m_fRandVal = 0.02f; - break; - } - - case POBJECT_FIREBALL_AND_SMOKE: - { - pobj->m_ParticleType = PARTICLE_FLAME; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 2; - pobj->m_fRandVal = 0.1f; - break; - } - - case POBJECT_ROCKET_TRAIL: - { - pobj->m_ParticleType = PARTICLE_FLAME; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 2; - pobj->m_nCreationChance = 8; - pobj->m_fRandVal = 0.1f; - break; - } - - case POBJECT_EXPLOSION_ONCE: - { - pobj->m_ParticleType = PARTICLE_EXPLOSION_LARGE; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 0; - pobj->m_nRemoveTimer = CTimer::GetTimeInMilliseconds(); - break; - } - - case POBJECT_CATALINAS_GUNFLASH: - case POBJECT_CATALINAS_SHOTGUNFLASH: - { - pobj->m_ParticleType = PARTICLE_GUNFLASH_NOANIM; - pobj->m_nNumEffectCycles = 1; - pobj->m_nSkipFrames = 1; - pobj->m_nCreationChance = 0; - pobj->m_nRemoveTimer = CTimer::GetTimeInMilliseconds(); - pobj->m_vecTarget.Normalise(); - break; - } + pobj->m_ParticleType = PARTICLE_STEAM_NY; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 3; + pobj->m_nCreationChance = 8; + break; + } + + case POBJECT_PAVEMENT_STEAM_SLOWMOTION: + { + pobj->m_ParticleType = PARTICLE_STEAM_NY_SLOWMOTION; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 8; + break; + } + + case POBJECT_WALL_STEAM: + { + pobj->m_ParticleType = PARTICLE_STEAM_NY; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 3; + pobj->m_nCreationChance = 8; + break; + } + + case POBJECT_WALL_STEAM_SLOWMOTION: + { + pobj->m_ParticleType = PARTICLE_STEAM_NY_SLOWMOTION; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 8; + break; + } + + case POBJECT_DARK_SMOKE: + { + pobj->m_ParticleType = PARTICLE_STEAM_NY; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 3; + pobj->m_nCreationChance = 8; + pobj->m_Color = CRGBA(16, 16, 16, 255); + break; + } + + case POBJECT_WATER_FOUNTAIN_VERT: + { + pobj->m_ParticleType = PARTICLE_WATER_HYDRANT; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 0; + pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.1f); + break; + } + + case POBJECT_WATER_FOUNTAIN_HORIZ: + { + pobj->m_ParticleType = PARTICLE_WATER_HYDRANT; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 0; + break; + } + + case POBJECT_FIRE_HYDRANT: + { + pobj->m_ParticleType = PARTICLE_WATER_HYDRANT; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 0; + pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.3f); + pobj->m_nRemoveTimer = CTimer::GetTimeInMilliseconds() + 5000; + CAudioHydrant::Add(pobj); + break; + } + + case POBJECT_CAR_WATER_SPLASH: + case POBJECT_PED_WATER_SPLASH: + { + pobj->m_ParticleType = PARTICLE_CAR_SPLASH; + pobj->m_nNumEffectCycles = 0; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 0; + break; + } + + case POBJECT_SPLASHES_AROUND: + { + pobj->m_ParticleType = PARTICLE_SPLASH; + pobj->m_nNumEffectCycles = 15; + pobj->m_nSkipFrames = 2; + pobj->m_nCreationChance = 0; + break; + } + + case POBJECT_SMALL_FIRE: + { + pobj->m_ParticleType = PARTICLE_FLAME; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 2; + pobj->m_nCreationChance = 2; + pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.0f); + break; + } + + case POBJECT_BIG_FIRE: + { + pobj->m_ParticleType = PARTICLE_FLAME; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 2; + pobj->m_nCreationChance = 4; + pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.0f); + break; + } + + case POBJECT_DRY_ICE: + { + pobj->m_ParticleType = PARTICLE_SMOKE; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 0; + pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.0f); + break; + } + + case POBJECT_DRY_ICE_SLOWMOTION: + { + pobj->m_ParticleType = PARTICLE_SMOKE_SLOWMOTION; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 0; + pobj->m_vecTarget = CVector(0.0f, 0.0f, 0.0f); + break; + } + + case POBJECT_FIRE_TRAIL: + { + pobj->m_ParticleType = PARTICLE_EXPLOSION_MEDIUM; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 3; + pobj->m_nCreationChance = 2; + pobj->m_fRandVal = 0.01f; + break; + } + + case POBJECT_SMOKE_TRAIL: + { + pobj->m_ParticleType = PARTICLE_FIREBALL_SMOKE; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 2; + pobj->m_fRandVal = 0.02f; + break; + } + + case POBJECT_FIREBALL_AND_SMOKE: + { + pobj->m_ParticleType = PARTICLE_FLAME; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 0; + pobj->m_fRandVal = 0.1f; + break; + } + + case POBJECT_ROCKET_TRAIL: + { + pobj->m_ParticleType = PARTICLE_FLAME; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 2; + pobj->m_nCreationChance = 8; + pobj->m_fRandVal = 0.1f; + break; + } + + case POBJECT_EXPLOSION_ONCE: + { + pobj->m_ParticleType = PARTICLE_EXPLOSION_LARGE; + pobj->m_nNumEffectCycles = 1; + pobj->m_nSkipFrames = 1; + pobj->m_nCreationChance = 0; + pobj->m_nRemoveTimer = CTimer::GetTimeInMilliseconds(); + break; } } return pobj; } +CParticleObject * +CParticleObject::AddObject(tParticleType type, CVector const &pos, CVector const &target, float size, uint32 lifeTime, uint8 numEffectCycles, uint8 skipFrames, uint16 creationChance, uint8 remove) +{ + CParticleObject *pobj = pUnusedListHead; + + ASSERT(pobj != NULL); + + if ( pobj == NULL ) + { + printf("Error: No particle objects available!\n"); + return NULL; + } + + MoveToList(&pUnusedListHead, &pCloseListHead, pobj); + + pobj->m_nState = POBJECTSTATE_UPDATE_CLOSE; + pobj->m_Type = (eParticleObjectType)-1; + pobj->m_ParticleType = type; + + pobj->SetPosition(pos); + pobj->m_vecTarget = target; + + pobj->m_nNumEffectCycles = numEffectCycles; + pobj->m_nSkipFrames = skipFrames; + pobj->m_nCreationChance = creationChance; + pobj->m_nFrameCounter = 0; + + pobj->m_bRemove = remove; + + if ( lifeTime != 0 ) + pobj->m_nRemoveTimer = CTimer::GetTimeInMilliseconds() + lifeTime; + else + pobj->m_nRemoveTimer = 0; + + pobj->m_Color.alpha = 0; + + pobj->m_fSize = size; + pobj->m_fRandVal = 0.0f; + + return pobj; +} + void CParticleObject::RemoveObject(void) { @@ -631,7 +645,6 @@ void CParticleObject::UpdateClose(void) case POBJECT_PED_WATER_SPLASH: { -#ifdef PC_PARTICLE CRGBA colorsmoke(255, 255, 255, 196); CVector pos = this->GetPosition(); @@ -733,69 +746,12 @@ void CParticleObject::UpdateClose(void) CParticle::AddParticle(PARTICLE_CAR_SPLASH, splashpos, splashvel, NULL, CGeneral::GetRandomNumberInRange(0.4f, 1.0f), this->m_Color); } -#else - CVector pos; - CVector vel; - - for ( int32 i = -2; i < 2; i++ ) - { - pos = this->GetPosition(); - pos += CVector(-0.75f, 0.5f * float(i), 0.0f); - - vel = this->m_vecTarget; - vel.x += -1.5 * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.y += float(i) * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_PED_SPLASH, pos, vel, NULL, 0.8f, this->m_Color); - - pos = this->GetPosition(); - pos += CVector(0.75f, 0.5f * float(i), 0.0f); - - vel = this->m_vecTarget; - vel.x += 1.5f * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.y += float(i) * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_PED_SPLASH, pos, vel, NULL, 0.8f, this->m_Color); - - pos = this->GetPosition(); - pos += CVector(0.5f * float(i), -0.75, 0.0f); - - vel = this->m_vecTarget; - vel.x += float(i) * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.y += -1.5f * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_PED_SPLASH, pos, vel, NULL, 0.8f, this->m_Color); - - - pos = this->GetPosition(); - pos += CVector(0.5f * float(i), 0.75, 0.0f); - - vel = this->m_vecTarget; - vel.x += float(i) * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.y += 1.5f * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_PED_SPLASH, pos, vel, NULL, 0.8f, this->m_Color); - } - - - for ( int32 i = 0; i < 4; i++ ) - { - pos = this->GetPosition(); - - pos.x += CGeneral::GetRandomNumberInRange(-1.5f, 1.5f); - pos.y += CGeneral::GetRandomNumberInRange(-1.5f, 1.5f); - pos.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - vel = this->m_vecTarget; - CParticle::AddParticle(PARTICLE_PED_SPLASH, pos, vel, NULL, 0.8f, this->m_Color); - } -#endif break; } case POBJECT_CAR_WATER_SPLASH: { -#ifdef PC_PARTICLE CRGBA colorsmoke(255, 255, 255, 196); CVector pos = this->GetPosition(); @@ -890,65 +846,7 @@ void CParticleObject::UpdateClose(void) splashvel.z += CGeneral::GetRandomNumberInRange(0.26f, 0.53f); CParticle::AddParticle(PARTICLE_CAR_SPLASH, splashpos, splashvel, NULL, 0.0f, this->m_Color); } -#else - CVector pos; - CVector vel; - - for ( int32 i = -3; i < 4; i++ ) - { - pos = this->GetPosition(); - pos += CVector(-1.5f, 0.5f * float(i), 0.0f); - - - vel = this->m_vecTarget; - vel.x += -3.0f * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.y += float(i) * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_CAR_SPLASH, pos, vel, NULL, 0.0f, this->m_Color); - - - pos = this->GetPosition(); - pos += CVector(1.5f, 0.5f * float(i), 0.0f); - - vel = this->m_vecTarget; - vel.x += 3.0f * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.y += float(i) * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_CAR_SPLASH, pos, vel, NULL, 0.0f, this->m_Color); - - - pos = this->GetPosition(); - pos += CVector(0.5f * float(i), -1.5f, 0.0f); - - vel = this->m_vecTarget; - vel.x += float(i) * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.y += -3.0f * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_CAR_SPLASH, pos, vel, NULL, 0.0f, this->m_Color); - - - pos = this->GetPosition(); - pos += CVector(0.5f * float(i), 1.5f, 0.0f); - - - vel = this->m_vecTarget; - vel.x += float(i) * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.y += 3.0f * CGeneral::GetRandomNumberInRange(0.001f, 0.006f); - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_CAR_SPLASH, pos, vel, NULL, 0.0f, this->m_Color); - } - - for ( int32 i = 0; i < 8; i++ ) - { - pos = this->GetPosition(); - pos.x += CGeneral::GetRandomNumberInRange(-3.0f, 3.0f); - pos.y += CGeneral::GetRandomNumberInRange(-3.0f, 3.0f); - - vel = this->m_vecTarget; - vel.z += CGeneral::GetRandomNumberInRange(0.03f, 0.06f); - CParticle::AddParticle(PARTICLE_CAR_SPLASH, pos, vel, NULL, 0.0f, this->m_Color); - } -#endif + break; } @@ -979,63 +877,107 @@ void CParticleObject::UpdateClose(void) break; } - case POBJECT_CATALINAS_GUNFLASH: + case POBJECT_FIRE_HYDRANT: { - CRGBA flashcolor(120, 120, 120, 255); - - CVector vel = this->m_vecTarget; CVector pos = this->GetPosition(); - - float size = 1.0f; - if ( this->m_fSize != 0.0f ) - size = this->m_fSize; + CVector vel = this->m_vecTarget; - CParticle::AddParticle(PARTICLE_GUNFLASH, pos, CVector(0.0f, 0.0f, 0.0f), NULL, 0.12f*size, flashcolor); - - pos += size * (0.06f * vel); - CParticle::AddParticle(PARTICLE_GUNFLASH, pos, CVector(0.0f, 0.0f, 0.0f), NULL, 0.08f*size, flashcolor); - - pos += size * (0.04f * vel); - CParticle::AddParticle(PARTICLE_GUNFLASH, pos, CVector(0.0f, 0.0f, 0.0f), NULL, 0.04f*size, flashcolor); - - CVector smokepos = this->GetPosition(); - CVector smokevel = 0.1f * vel; - CParticle::AddParticle(PARTICLE_GUNSMOKE2, smokepos, smokevel, NULL, 0.005f*size); + if ( (TheCamera.GetPosition() - pos).Magnitude() > 5.0f ) + { + for ( int32 i = 0; i < 1; i++ ) + { + int32 angle = 180 * i; + + float fCos = CParticle::Cos(angle); + float fSin = CParticle::Sin(angle); + + CVector splashpos, splashvel; + + splashpos = pos + CVector(0.01f*fCos, 0.01f*fSin, 0.0f); + splashvel = vel + CVector(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(0.004f, 0.008f)); + + CParticle::AddParticle(PARTICLE_CAR_SPLASH, splashpos, splashvel, NULL, + CGeneral::GetRandomNumberInRange(0.005f, 0.0075f), this->m_Color, 0, 0, 1, 300); + + splashpos = pos + CVector(0.01f*fCos, 0.01f*-fSin, 0.0f); + splashvel = vel + CVector(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(0.004f, 0.008f)); + + CParticle::AddParticle(PARTICLE_CAR_SPLASH, splashpos, splashvel, NULL, + CGeneral::GetRandomNumberInRange(0.005f, 0.0075f), this->m_Color, 0, 0, 1, 300); + + splashpos = pos + CVector(0.01f*-fCos, 0.01f*fSin, 0.0f); + splashvel = vel + CVector(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(0.004f, 0.008f)); + + CParticle::AddParticle(PARTICLE_CAR_SPLASH, splashpos, splashvel, NULL, + CGeneral::GetRandomNumberInRange(0.005f, 0.0075f), this->m_Color, 0, 0, 1, 300); + + splashpos = pos + CVector(0.01f*-fCos, 0.01f*-fSin, 0.0f); + splashvel = vel + CVector(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(0.004f, 0.008f)); + + CParticle::AddParticle(PARTICLE_CAR_SPLASH, splashpos, splashvel, NULL, + CGeneral::GetRandomNumberInRange(0.005f, 0.0075f), this->m_Color, 0, 0, 1, 300); + } + for ( int32 i = 0; i < this->m_nNumEffectCycles; i++ ) + { + CParticle::AddParticle(this->m_ParticleType, pos, vel, NULL, 0.0f, this->m_Color); + } + } break; } - case POBJECT_CATALINAS_SHOTGUNFLASH: + case POBJECT_WATER_FOUNTAIN_VERT: { - CRGBA flashcolor(120, 120, 120, 255); - + CVector pos = this->GetPosition(); CVector vel = this->m_vecTarget; - float size = 1.0f; - if ( this->m_fSize != 0.0f ) - size = this->m_fSize; + for ( int32 i = 0; i < 2; i++ ) + { + int32 angle = 180 * i; + + float fCos = CParticle::Cos(angle); + float fSin = CParticle::Sin(angle); + + CVector splashpos, splashvel; + + splashpos = pos + CVector(0.015f*fCos, 0.015f*fSin, 0.0f); + splashvel = vel + CVector(0.015f*fCos, 0.015f*fSin, CGeneral::GetRandomNumberInRange(0.004f, 0.008f)); + + CParticle::AddParticle(PARTICLE_SPLASH, splashpos, splashvel, NULL, + CGeneral::GetRandomNumberInRange(0.001f, 0.005f), this->m_Color, 0, 0, 1, 1000); + + splashpos = pos + CVector(0.015f*fCos, 0.015f*-fSin, 0.0f); + splashvel = vel + CVector(0.015f*fCos, 0.015f*-fSin, CGeneral::GetRandomNumberInRange(0.004f, 0.008f)); + + CParticle::AddParticle(PARTICLE_SPLASH, splashpos, splashvel, NULL, + CGeneral::GetRandomNumberInRange(0.001f, 0.005f), this->m_Color, 0, 0, 1, 1000); + + splashpos = pos + CVector(0.015f*-fCos, 0.015f*fSin, 0.0f); + splashvel = vel + CVector(0.015f*-fCos, 0.015f*fSin, CGeneral::GetRandomNumberInRange(0.004f, 0.008f)); + + CParticle::AddParticle(PARTICLE_SPLASH, splashpos, splashvel, NULL, + CGeneral::GetRandomNumberInRange(0.001f, 0.005f), this->m_Color, 0, 0, 1, 1000); + + splashpos = pos + CVector(0.015f*-fCos, 0.015f*-fSin, 0.0f); + splashvel = vel + CVector(0.015f*-fCos, 0.015f*-fSin, CGeneral::GetRandomNumberInRange(0.004f, 0.008f)); + + CParticle::AddParticle(PARTICLE_SPLASH, splashpos, splashvel, NULL, + CGeneral::GetRandomNumberInRange(0.001f, 0.005f), this->m_Color, 0, 0, 1, 1000); + } + break; + } + + case POBJECT_WATER_FOUNTAIN_HORIZ: + { CVector pos = this->GetPosition(); - - CVector velstep = size * (0.1f * vel); - CVector flashpos = pos; + CVector vel = this->m_vecTarget; - flashpos += velstep; - CParticle::AddParticle(PARTICLE_GUNFLASH, flashpos, CVector(0.0f, 0.0f, 0.0f), NULL, 0.0f, flashcolor); + for ( int32 i = 0; i < 3; i++ ) + { + CParticle::AddParticle(PARTICLE_CAR_SPLASH, pos, vel, NULL, 0.001f, this->m_Color, 0, 0, 1, 1000); + } - flashpos += velstep; - CParticle::AddParticle(PARTICLE_GUNFLASH, flashpos, CVector(0.0f, 0.0f, 0.0f), NULL, 0.15f*size, flashcolor); - - flashpos += velstep; - CParticle::AddParticle(PARTICLE_GUNFLASH, flashpos, CVector(0.0f, 0.0f, 0.0f), NULL, 0.2f*size, flashcolor); - - - CParticle::AddParticle(PARTICLE_GUNFLASH, pos, CVector(0.0f, 0.0f, 0.0f), NULL, 0.0f, flashcolor); - - CVector smokepos = this->GetPosition(); - CVector smokevel = 0.1f*vel; - CParticle::AddParticle(PARTICLE_GUNSMOKE2, smokepos, smokevel, NULL, 0.1f*size); - break; } @@ -1201,6 +1143,48 @@ CParticleObject::LoadParticle(uint8 *buffer, uint32 length) return true; } +void +CParticleObject::RemoveAllExpireableParticleObjects(void) +{ + { + CParticleObject *pobj = pCloseListHead; + CParticleObject *nextpobj; + if ( pobj != NULL ) + { + do + { + nextpobj = pobj->m_pNext; + if ( pobj->m_nRemoveTimer != 0 ) + { + MoveToList(&pCloseListHead, &pUnusedListHead, pobj); + pobj->m_nState = POBJECTSTATE_FREE; + } + pobj = nextpobj; + } + while ( nextpobj != NULL ); + } + } + + { + CParticleObject *pobj = pFarListHead; + CParticleObject *nextpobj; + if ( pobj != NULL ) + { + do + { + nextpobj = pobj->m_pNext; + if ( pobj->m_nRemoveTimer != 0 ) + { + MoveToList(&pFarListHead, &pUnusedListHead, pobj); + pobj->m_nState = POBJECTSTATE_FREE; + } + pobj = nextpobj; + } + while ( nextpobj != NULL ); + } + } +} + void CParticleObject::RemoveAllParticleObjects(void) { diff --git a/src/objects/ParticleObject.h b/src/objects/ParticleObject.h index 34a672bb..25261243 100644 --- a/src/objects/ParticleObject.h +++ b/src/objects/ParticleObject.h @@ -4,12 +4,12 @@ #include "ParticleType.h" #include "Placeable.h" -#define MAX_PARTICLEOBJECTS 100 +#define MAX_PARTICLEOBJECTS 70 #define MAX_AUDIOHYDRANTS 8 enum eParticleObjectType { - POBJECT_PAVEMENT_STEAM, + POBJECT_PAVEMENT_STEAM = 0, POBJECT_PAVEMENT_STEAM_SLOWMOTION, POBJECT_WALL_STEAM, POBJECT_WALL_STEAM_SLOWMOTION, @@ -22,6 +22,8 @@ enum eParticleObjectType POBJECT_BIG_FIRE, POBJECT_DRY_ICE, POBJECT_DRY_ICE_SLOWMOTION, + POBJECT_WATER_FOUNTAIN_VERT, + POBJECT_WATER_FOUNTAIN_HORIZ, POBJECT_FIRE_TRAIL, POBJECT_SMOKE_TRAIL, POBJECT_FIREBALL_AND_SMOKE, @@ -69,12 +71,13 @@ public: ~CParticleObject(); static void Initialise(void); - - static CParticleObject *AddObject(uint16 type, CVector const &pos, uint8 remove); - static CParticleObject *AddObject(uint16 type, CVector const &pos, float size, uint8 remove); - static CParticleObject *AddObject(uint16 type, CVector const &pos, CVector const &target, float size, uint8 remove); - static CParticleObject *AddObject(uint16 type, CVector const &pos, CVector const &target, float size, uint32 lifeTime, RwRGBA const &color, uint8 remove); - + + static CParticleObject *AddObject(uint16 type, CVector const &pos, uint8 remove); + static CParticleObject *AddObject(uint16 type, CVector const &pos, float size, uint8 remove); + static CParticleObject *AddObject(uint16 type, CVector const &pos, CVector const &target, float size, uint8 remove); + static CParticleObject *AddObject(uint16 type, CVector const &pos, CVector const &target, float size, uint32 lifeTime, RwRGBA const &color, uint8 remove); + static CParticleObject *AddObject(tParticleType type, CVector const &pos, CVector const &target, float size, uint32 lifeTime, uint8 numEffectCycles, uint8 skipFrames, uint16 creationChance, uint8 remove); + void RemoveObject(void); static void UpdateAll(void); @@ -84,6 +87,7 @@ public: static bool SaveParticle(uint8 *buffer, uint32 *length); static bool LoadParticle(uint8 *buffer, uint32 length); + static void RemoveAllExpireableParticleObjects(void); static void RemoveAllParticleObjects(void); static void MoveToList(CParticleObject **from, CParticleObject **to, CParticleObject *obj); };