From e34261d3ef3d618822b531d12cdd7a79b5ad46f8 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Mon, 12 Oct 2020 18:09:58 +0300 Subject: [PATCH 01/45] mark some audio stuff and fix frameCounter --- src/audio/AudioLogic.cpp | 23 +++------------ src/audio/AudioManager.cpp | 4 +-- src/audio/AudioManager.h | 59 +++++++++++++++++++------------------- 3 files changed, 35 insertions(+), 51 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 9a8dda28..bf99f991 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -46,16 +46,6 @@ const int channels = ARRAY_SIZE(cAudioManager::m_asActiveSamples); const int policeChannel = channels + 1; const int allChannels = channels + 2; -uint32 gPornNextTime; -uint32 gSawMillNextTime; -uint32 gShopNextTime; -uint32 gAirportNextTime; -uint32 gCinemaNextTime; -uint32 gDocksNextTime; -uint32 gHomeNextTime; -uint32 gCellNextTime; -uint32 gNextCryTime; - enum PLAY_STATUS : uint8 { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FINISHED }; enum LOADING_STATUS : uint8 { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_FAILED }; @@ -187,7 +177,11 @@ cAudioManager::PostInitialiseGameSpecificSetup() field_5538 = 127; ResetAudioLogicTimers(CTimer::GetTimeInMilliseconds()); + m_bIsPlayerShutUp = false; + m_nPlayerMood = 0; + m_nPlayerMoodTimer = 0; } + void cAudioManager::PreTerminateGameSpecificShutdown() { @@ -240,15 +234,6 @@ cAudioManager::PostTerminateGameSpecificShutdown() void cAudioManager::ResetAudioLogicTimers(uint32 timer) { - gPornNextTime = timer; - gNextCryTime = timer; - gSawMillNextTime = timer; - gCellNextTime = timer; - gShopNextTime = timer; - gHomeNextTime = timer; - gAirportNextTime = timer; - gDocksNextTime = timer; - gCinemaNextTime = timer; for (int32 i = 0; i < m_nAudioEntitiesTotal; i++) { if (m_asAudioEntities[m_anAudioEntityIndices[i]].m_nType == AUDIOTYPE_PHYSICAL) { CPed *ped = (CPed *)m_asAudioEntities[m_anAudioEntityIndices[i]].m_pEntity; diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index 93ac8857..d2a85285 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -432,7 +432,7 @@ cAudioManager::IsAudioInitialised() const void cAudioManager::ServiceSoundEffects() { - field_5554++; + m_FrameCounter++; m_bFifthFrameFlag = (m_FrameCounter++ % 5) == 0; if (m_nUserPause && !m_nPreviousUserPause) { for (int32 i = 0; i < allChannels; i++) @@ -771,7 +771,7 @@ cAudioManager::ProcessActiveQueues() sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) { if (sample.m_nLoopCount) { - if (field_5554 & 1) { + if (m_FrameCounter & 1) { if (!(j & 1)) { flag = false; } else { diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index a43b4309..d2f9bc94 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -226,14 +226,13 @@ public: uint8 m_nUserPause; uint8 m_nPreviousUserPause; uint32 m_FrameCounter; - uint32 field_5554; cAudioManager(); ~cAudioManager(); // getters - uint32 GetFrameCounter() const { return m_FrameCounter; } - float GetReflectionsDistance(int32 idx) const { return m_afReflectionsDistances[idx]; } + uint32 GetFrameCounter() const { return m_FrameCounter; } // done + float GetReflectionsDistance(int32 idx) const { return m_afReflectionsDistances[idx]; } // done int32 GetRandomNumber(int32 idx) const { return m_anRandomTable[idx]; } int32 GetRandomNumberInRange(int32 idx, int32 low, int32 high) const { return (m_anRandomTable[idx] % (high - low + 1)) + low; } bool IsMissionAudioSamplePlaying(uint8 slot) const; // { return m_sMissionAudio.m_nPlayStatus == 1; } @@ -250,7 +249,7 @@ public: void CalculateDistance(bool &condition, float dist); // done bool CheckForAnAudioFileOnCD() const; // done void ClearActiveSamples(); // done - void ClearMissionAudio(uint8 slot); // done + void ClearMissionAudio(uint8 slot); // done (inlined in vc) void ClearRequestedQueue(); // done (inlined in vc) uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier) const; // done int32 ComputePan(float, CVector *); // done @@ -266,7 +265,7 @@ public: // TODO: miami // end of functions returning talk sfx - void GenerateIntegerRandomNumberTable(); + void GenerateIntegerRandomNumberTable(); // done char *Get3DProviderName(uint8 id) const; uint8 GetCDAudioDriveLetter() const; int8 GetCurrent3DProviderIndex() const; @@ -290,24 +289,24 @@ public: void InitialisePoliceRadio(); void InitialisePoliceRadioZones(); void InterrogateAudioEntities(); // done - bool IsAudioInitialised() const; - bool IsMissionAudioSampleFinished(uint8 slot); + bool IsAudioInitialised() const; // done + bool IsMissionAudioSampleFinished(uint8 slot); // done bool IsMP3RadioChannelAvailable() const; // done - bool MissionScriptAudioUsesPoliceChannel(int32 soundMission) const; + bool MissionScriptAudioUsesPoliceChannel(int32 soundMission) const; //done void PlayLoadedMissionAudio(uint8 slot); // done void PlayOneShot(int32 index, int16 sound, float vol); // done void PlaySuspectLastSeen(float x, float y, float z); // void PlayerJustGotInCar() const; // done void PlayerJustLeftCar() const; // done - void PostInitialiseGameSpecificSetup(); // + void PostInitialiseGameSpecificSetup(); // done void PostTerminateGameSpecificShutdown(); // done void PreInitialiseGameSpecificSetup() const; // done void PreloadMissionAudio(uint8 slot, Const char *name); // done void PreTerminateGameSpecificShutdown(); // done /// processX - main logic of adding new sounds - void ProcessActiveQueues(); //done + void ProcessActiveQueues(); // done bool ProcessAirBrakes(cVehicleParams *params); bool ProcessBoatEngine(cVehicleParams *params); bool ProcessBoatMovingOverWater(cVehicleParams *params); @@ -355,32 +354,32 @@ public: #ifdef GTA_TRAIN bool ProcessTrainNoise(cVehicleParams *params); #endif - void ProcessVehicle(CVehicle *vehicle); //done, but need add model functions - bool ProcessVehicleDoors(cVehicleParams *params); //done - void ProcessVehicleEngine(cVehicleParams *params); //done - void UpdateGasPedalAudio(CVehicle* veh, int vehType); //done - void ProcessVehicleHorn(cVehicleParams *params); - void ProcessVehicleOneShots(cVehicleParams *params); - bool ProcessVehicleReverseWarning(cVehicleParams *params); - bool ProcessVehicleRoadNoise(cVehicleParams *params); - bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); - bool ProcessVehicleSkidding(cVehicleParams *params); - void ProcessWaterCannon(int32); - void ProcessWeather(int32 id); //done - bool ProcessWetRoadNoise(cVehicleParams *params); - void ProcessEscalators(); //done - void ProcessExtraSounds(); //done + void ProcessVehicle(CVehicle *vehicle); // done, but need add model functions + bool ProcessVehicleDoors(cVehicleParams *params); // done + void ProcessVehicleEngine(cVehicleParams *params); // done + void UpdateGasPedalAudio(CVehicle* veh, int vehType); // done + void ProcessVehicleHorn(cVehicleParams *params); // + void ProcessVehicleOneShots(cVehicleParams *params); // + bool ProcessVehicleReverseWarning(cVehicleParams *params); // + bool ProcessVehicleRoadNoise(cVehicleParams *params); // + bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); // + bool ProcessVehicleSkidding(cVehicleParams *params); // + void ProcessWaterCannon(int32); // + void ProcessWeather(int32 id); // done + bool ProcessWetRoadNoise(cVehicleParams *params); // + void ProcessEscalators(); // done + void ProcessExtraSounds(); // done - int32 RandomDisplacement(uint32 seed) const; + int32 RandomDisplacement(uint32 seed) const; // void ReacquireDigitalHandle() const; // done void ReleaseDigitalHandle() const; // done void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2); // done void ReportCrime(int32 crime, const CVector *pos); // done - void ResetAudioLogicTimers(uint32 timer); - void ResetPoliceRadio(); - void ResetTimers(uint32 time); + void ResetAudioLogicTimers(uint32 timer); // done + void ResetPoliceRadio(); // + void ResetTimers(uint32 time); // - void Service(); + void Service(); //done void ServiceCollisions(); void ServicePoliceRadio(); void ServicePoliceRadioChannel(int32 wantedLevel); From a4fd1a9f395c3ef9bf5ead3eb1eff6254b9ed678 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Mon, 12 Oct 2020 20:55:19 +0300 Subject: [PATCH 02/45] sirenes and more marks for audio. also fix cAudioMrg size --- src/audio/AudioLogic.cpp | 26 +++++--------------------- src/audio/AudioManager.cpp | 1 + src/audio/AudioManager.h | 23 ++++++++++++----------- src/audio/MusicManager.cpp | 6 +++--- 4 files changed, 21 insertions(+), 35 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index bf99f991..7bc2b93f 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2027,33 +2027,17 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams *params) } bool -cAudioManager::UsesSiren(int32 model) const +cAudioManager::UsesSiren(cVehicleParams *params) const { - switch (model) { - case FIRETRUK: - case AMBULAN: - case FBICAR: - case POLICE: - case ENFORCER: - case PREDATOR: - return true; - default: - return false; - } + params->m_pVehicle->UsesSiren(); } bool -cAudioManager::UsesSirenSwitching(int32 model) const +cAudioManager::UsesSirenSwitching(cVehicleParams *params) const { - switch (model) { - case AMBULAN: - case POLICE: - case ENFORCER: - case PREDATOR: - return true; - default: + if (params->m_nIndex == FIRETRUK || params->m_nIndex == MRWHOOP) return false; - } + return params->m_pVehicle->UsesSiren(); } bool diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index d2a85285..338f33a4 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -275,6 +275,7 @@ cAudioManager::ResetTimers(uint32 time) SampleManager.SetEffectsFadeVolume(0); SampleManager.SetMusicFadeVolume(0); MusicManager.ResetMusicAfterReload(); + m_bIsPlayerShutUp = false; #ifdef AUDIO_OAL SampleManager.Service(); #endif diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index d2f9bc94..7783590e 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -76,6 +76,7 @@ public: uint8 m_nIndexMap[NUM_PED_COMMENTS_BANKS][NUM_PED_COMMENTS_SLOTS]; uint8 m_nCommentsInBank[NUM_PED_COMMENTS_BANKS]; uint8 m_nActiveBank; + uint32 field_48C; cPedComments() { @@ -93,7 +94,7 @@ public: void Process(); }; -VALIDATE_SIZE(cPedComments, 1164); +VALIDATE_SIZE(cPedComments, 0x490); class CEntity; @@ -286,8 +287,8 @@ public: bool HasAirBrakes(int32 model) const; // done void Initialise(); // done - void InitialisePoliceRadio(); - void InitialisePoliceRadioZones(); + void InitialisePoliceRadio(); //done + void InitialisePoliceRadioZones(); //done void InterrogateAudioEntities(); // done bool IsAudioInitialised() const; // done bool IsMissionAudioSampleFinished(uint8 slot); // done @@ -370,17 +371,17 @@ public: void ProcessEscalators(); // done void ProcessExtraSounds(); // done - int32 RandomDisplacement(uint32 seed) const; // + int32 RandomDisplacement(uint32 seed) const; // done void ReacquireDigitalHandle() const; // done void ReleaseDigitalHandle() const; // done void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2); // done void ReportCrime(int32 crime, const CVector *pos); // done void ResetAudioLogicTimers(uint32 timer); // done - void ResetPoliceRadio(); // - void ResetTimers(uint32 time); // + void ResetPoliceRadio(); // done + void ResetTimers(uint32 time); // done void Service(); //done - void ServiceCollisions(); + void ServiceCollisions(); //done void ServicePoliceRadio(); void ServicePoliceRadioChannel(int32 wantedLevel); void ServiceSoundEffects(); @@ -408,13 +409,13 @@ public: void SetupPedComments(cPedParams *params, uint32 sound); void SetupSuspectLastSeenReport(); - void Terminate(); - void TranslateEntity(Const CVector *v1, CVector *v2) const; + void Terminate(); //done + void TranslateEntity(Const CVector *v1, CVector *v2) const; //done void UpdateReflections(); bool UsesReverseWarning(int32 model) const; //done - bool UsesSiren(int32 model) const; - bool UsesSirenSwitching(int32 model) const; + bool UsesSiren(cVehicleParams *params) const; //done + bool UsesSirenSwitching(cVehicleParams* params) const; //done CVehicle *FindVehicleOfPlayer(); //done void SetPedTalkingStatus(CPed *ped, uint8 status); diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index fde92590..4653acb7 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -374,7 +374,7 @@ cMusicManager::Service() field_399A = true; if (!field_3999 && !AudioManager.m_nUserPause && AudioManager.m_nPreviousUserPause) field_3999 = true; - if (AudioManager.field_5554 % 4 == 0) { + if (AudioManager.m_FrameCounter % 4 == 0) { gNumRetunePresses = 0; gRetuneCounter = 0; field_2 = false; @@ -422,7 +422,7 @@ cMusicManager::ServiceFrontEndMode() m_nPlayingTrack = NO_TRACK; } - if (AudioManager.field_5554 % 4 != 0) return; + if (AudioManager.m_FrameCounter % 4 != 0) return; if (!field_398F && !field_3995) { m_nStreamedTrack = m_nFrontendTrack; @@ -893,7 +893,7 @@ cMusicManager::ServiceTrack(CVehicle *veh, CPed *ped) { field_398F = true; SampleManager.SetStreamedVolumeAndPan(0, 63, 0, 0); - if (!(AudioManager.field_5554 & 1)) { + if (!(AudioManager.m_FrameCounter & 1)) { if (field_3995 || !SampleManager.IsStreamPlaying(0)) { bRadioStatsRecorded2 = false; if (SampleManager.IsStreamPlaying(0)) { From 894a1ae93aa7ec14e9d83ba43caa75adc500d582 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 17 Oct 2020 00:27:28 +0300 Subject: [PATCH 03/45] siren and horn --- src/audio/AudioLogic.cpp | 202 +++++++++++++++++++++----------------- src/audio/AudioManager.h | 8 +- src/audio/PoliceRadio.cpp | 11 +-- 3 files changed, 120 insertions(+), 101 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 7bc2b93f..aa390b64 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -1981,49 +1981,62 @@ cAudioManager::GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automo return Max(relativeVelChange, Min(1.0f, Abs(automobile->m_vecTurnSpeed.z) * 20.0f)); } -void -cAudioManager::ProcessVehicleHorn(cVehicleParams *params) +bool +cAudioManager::ProcessVehicleHorn(cVehicleParams* params) { const float SOUND_INTENSITY = 40.0f; - CAutomobile *automobile; + CVehicle *veh; + uint8 volume; - if (params->m_fDistance < SQR(SOUND_INTENSITY)) { - automobile = (CAutomobile *)params->m_pVehicle; - if ((!automobile->m_bSirenOrAlarm || !UsesSirenSwitching(params->m_nIndex)) && automobile->GetModelIndex() != MI_MRWHOOP) { - if (automobile->m_nCarHornTimer) { - if (params->m_pVehicle->GetStatus() != STATUS_PLAYER) { - automobile->m_nCarHornTimer = Min(44, automobile->m_nCarHornTimer); - if (automobile->m_nCarHornTimer == 44) - automobile->m_nCarHornPattern = (m_FrameCounter + m_sQueueSample.m_nEntityIndex) & 7; - if (!hornPatternsArray[automobile->m_nCarHornPattern][44 - automobile->m_nCarHornTimer]) - return; - } + if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + return false; - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(80, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 4; - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nHornSample; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = false; - m_sQueueSample.m_nReleasingVolumeModificator = 2; - m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nHornFrequency; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = 80; - m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_fSpeedMultiplier = 5.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = false; - m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_bReverbFlag = true; - m_sQueueSample.m_bRequireReflection = false; - AddSampleToRequestedQueue(); - } - } + veh = params->m_pVehicle; + if (veh->m_bSirenOrAlarm && UsesSirenSwitching(params)) + return true; + + if (veh->m_modelIndex == MI_MRWHOOP) + return true; + + veh->m_nAlarmState; + if (veh->IsAlarmOn()) + return true; + + if (veh->m_nCarHornTimer != 0) { + if (veh->GetStatus() != STATUS_PLAYER) { + veh->m_nCarHornTimer = Min(44, veh->m_nCarHornTimer); + if (veh->m_nCarHornTimer == 44) + veh->m_nCarHornPattern = (m_FrameCounter + m_sQueueSample.m_nEntityIndex) & 7; + + if (!hornPatternsArray[veh->m_nCarHornPattern][44 - veh->m_nCarHornTimer]) + return true; + } + + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + volume = veh->bIsDrowning ? 20 : 80; + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 4; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nHornSample; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nReleasingVolumeModificator = 2; + m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nHornFrequency; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = 80; //mb bug? + m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_fSpeedMultiplier = 5.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = false; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = true; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); } } + return true; } bool @@ -2037,68 +2050,74 @@ cAudioManager::UsesSirenSwitching(cVehicleParams *params) const { if (params->m_nIndex == FIRETRUK || params->m_nIndex == MRWHOOP) return false; - return params->m_pVehicle->UsesSiren(); + return UsesSiren(params); } bool -cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams *params) +cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams* params) { const float SOUND_INTENSITY = 110.0f; - if (params->m_fDistance < SQR(SOUND_INTENSITY)) { - CVehicle *veh = params->m_pVehicle; - if (veh->m_bSirenOrAlarm == false && !veh->IsAlarmOn()) + CVehicle* veh; + uint8 volume; + + if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + return false; + + veh = params->m_pVehicle; + if (!veh->m_bSirenOrAlarm && !veh->IsAlarmOn()) + return true; + + if (veh->IsAlarmOn()) { + if (CTimer::GetTimeInMilliseconds() > veh->m_nCarHornTimer) + veh->m_nCarHornTimer = CTimer::GetTimeInMilliseconds() + 750; + + if (veh->m_nCarHornTimer < CTimer::GetTimeInMilliseconds() + 375) return true; + } - if (veh->IsAlarmOn()) { - if (CTimer::GetTimeInMilliseconds() > veh->m_bRainAudioCounter) - veh->m_bRainAudioCounter = CTimer::GetTimeInMilliseconds() + 750; - - if (veh->m_bRainAudioCounter < CTimer::GetTimeInMilliseconds() + 375) + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + volume = veh->bIsDrowning ? 20 : 80; + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 5; + if (UsesSiren(params)) { + if (params->m_pVehicle->GetStatus() == STATUS_ABANDONED) return true; - } - - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(veh->bIsDrowning ? 20 : 80, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 5; - if (UsesSiren(params->m_nIndex)) { - if (params->m_pVehicle->GetStatus() == STATUS_ABANDONED) - return true; - if (veh->m_nCarHornTimer && params->m_nIndex != FIRETRUK) { - m_sQueueSample.m_nSampleIndex = SFX_SIREN_FAST; - if (params->m_nIndex == FBICAR) - m_sQueueSample.m_nFrequency = 16113; - else - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_SIREN_FAST); - m_sQueueSample.m_nCounter = 60; - } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nSirenOrAlarmSample; - m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nSirenOrAlarmFrequency; - } + if (veh->m_nCarHornTimer != 0 && params->m_nIndex != FIRETRUK && params->m_nIndex != MRWHOOP) { + m_sQueueSample.m_nSampleIndex = SFX_SIREN_FAST; + if (params->m_nIndex == FBIRANCH) + m_sQueueSample.m_nFrequency = 12668; + else + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_SIREN_FAST); + m_sQueueSample.m_nCounter = 60; + } else if (params->m_nIndex == VICECHEE) { + m_sQueueSample.m_nSampleIndex = SFX_POLICE_SIREN_SLOW; + m_sQueueSample.m_nFrequency = 11440; } else { m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nSirenOrAlarmSample; m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nSirenOrAlarmFrequency; } - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = false; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = 80; - m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_fSpeedMultiplier = 7.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = false; - m_sQueueSample.m_nReleasingVolumeDivider = 5; - m_sQueueSample.m_bReverbFlag = true; - m_sQueueSample.m_bRequireReflection = false; - AddSampleToRequestedQueue(); - return true; - } else - return true; - } else - return false; + } else { + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nHornSample; + m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nHornFrequency; + } + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = volume; + m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_fSpeedMultiplier = 7.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = false; + m_sQueueSample.m_nReleasingVolumeDivider = 5; + m_sQueueSample.m_bReverbFlag = true; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); + } + return true; } bool @@ -2194,10 +2213,11 @@ cAudioManager::ProcessVehicleDoors(cVehicleParams *params) bool cAudioManager::ProcessAirBrakes(cVehicleParams *params) { + const float SOUND_INTENSITY = 30.0f; CAutomobile *automobile; - uint8 rand; + uint8 volume; - if (params->m_fDistance > SQR(30)) + if (params->m_fDistance > SQR(SOUND_INTENSITY)) return false; automobile = (CAutomobile *)params->m_pVehicle; if (!automobile->bEngineOn) @@ -2208,8 +2228,8 @@ cAudioManager::ProcessAirBrakes(cVehicleParams *params) return true; CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - rand = m_anRandomTable[0] % 10 + 70; - m_sQueueSample.m_nVolume = ComputeVolume(rand, 30.0f, m_sQueueSample.m_fDistance); + volume = m_anRandomTable[0] % 10 + 70; + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 13; m_sQueueSample.m_nSampleIndex = SFX_AIR_BRAKES; @@ -2219,11 +2239,11 @@ cAudioManager::ProcessAirBrakes(cVehicleParams *params) m_sQueueSample.m_bIs2D = false; m_sQueueSample.m_nReleasingVolumeModificator = 10; m_sQueueSample.m_nLoopCount = 1; - m_sQueueSample.m_nEmittingVolume = rand; + m_sQueueSample.m_nEmittingVolume = volume; m_sQueueSample.m_nLoopStart = 0; m_sQueueSample.m_nLoopEnd = -1; m_sQueueSample.m_fSpeedMultiplier = 0.0f; - m_sQueueSample.m_fSoundIntensity = 30.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; m_sQueueSample.m_bReleasingSoundFlag = true; m_sQueueSample.m_bReverbFlag = true; m_sQueueSample.m_bRequireReflection = false; diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 7783590e..aacf0006 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -298,7 +298,7 @@ public: void PlayLoadedMissionAudio(uint8 slot); // done void PlayOneShot(int32 index, int16 sound, float vol); // done - void PlaySuspectLastSeen(float x, float y, float z); // + void PlaySuspectLastSeen(float x, float y, float z); // done void PlayerJustGotInCar() const; // done void PlayerJustLeftCar() const; // done void PostInitialiseGameSpecificSetup(); // done @@ -308,7 +308,7 @@ public: void PreTerminateGameSpecificShutdown(); // done /// processX - main logic of adding new sounds void ProcessActiveQueues(); // done - bool ProcessAirBrakes(cVehicleParams *params); + bool ProcessAirBrakes(cVehicleParams *params); // done bool ProcessBoatEngine(cVehicleParams *params); bool ProcessBoatMovingOverWater(cVehicleParams *params); #ifdef GTA_BRIDGE @@ -359,11 +359,11 @@ public: bool ProcessVehicleDoors(cVehicleParams *params); // done void ProcessVehicleEngine(cVehicleParams *params); // done void UpdateGasPedalAudio(CVehicle* veh, int vehType); // done - void ProcessVehicleHorn(cVehicleParams *params); // + bool ProcessVehicleHorn(cVehicleParams *params); // done void ProcessVehicleOneShots(cVehicleParams *params); // bool ProcessVehicleReverseWarning(cVehicleParams *params); // bool ProcessVehicleRoadNoise(cVehicleParams *params); // - bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); // + bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); // done bool ProcessVehicleSkidding(cVehicleParams *params); // void ProcessWaterCannon(int32); // void ProcessWeather(int32 id); // done diff --git a/src/audio/PoliceRadio.cpp b/src/audio/PoliceRadio.cpp index bd29ad4b..15dafab1 100644 --- a/src/audio/PoliceRadio.cpp +++ b/src/audio/PoliceRadio.cpp @@ -671,7 +671,6 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z) float halfY; float quarterX; float quarterY; - int32 sample; bool processed = false; CVector vec = CVector(x, y, z); @@ -683,8 +682,7 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z) zone = CTheZones::GetAudioZone(audioZone); for (int i = 0; i < NUMAUDIOZONES; i++) { if (strcmp(zone->name, ZoneSfx[i].m_aName) == 0) { - sample = ZoneSfx[i].m_nSampleIndex; - m_sPoliceRadioQueue.Add(m_anRandomTable[4] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1); + m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1); m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_SUSPECT); m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_LAST_SEEN); m_sPoliceRadioQueue.Add(SFX_IN); @@ -709,9 +707,10 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z) m_sPoliceRadioQueue.Add(SFX_WEST); else if (!processed) m_sPoliceRadioQueue.Add(SFX_CENTRAL); - m_sPoliceRadioQueue.Add(sample); - m_sPoliceRadioQueue.Add(m_anRandomTable[2] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1); - m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES); + + m_sPoliceRadioQueue.Add(ZoneSfx[i].m_nSampleIndex); + m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1); + m_sPoliceRadioQueue.Add(NO_SAMPLE); gSpecialSuspectLastSeenReport = true; break; } From 97fc5224e7e65c513e6a299b531bc2be98bf2a5f Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 17 Oct 2020 02:22:02 +0300 Subject: [PATCH 04/45] road noise --- src/audio/AudioLogic.cpp | 168 +++++++++++++++++++++++---------------- src/audio/AudioManager.h | 6 +- 2 files changed, 102 insertions(+), 72 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index aa390b64..b1d1eeb3 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -972,7 +972,7 @@ cAudioManager::ProcessModelCarEngine(cVehicleParams *params) bool -cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params) +cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params) { const float SOUND_INTENSITY = 95.0f; @@ -981,51 +981,66 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params) float modificator; int sampleFreq; float velocity; + uint8 wheelsOnGround; if (params->m_fDistance >= SQR(SOUND_INTENSITY)) return false; - if (params->m_pTransmission != nil) { - if (((CAutomobile*)params->m_pVehicle)->m_nDriveWheelsOnGround != 0) { - velocity = Abs(params->m_fVelocityChange); - if (velocity > 0.0f) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - emittingVol = 30.f * Min(1.f, velocity / (0.5f * params->m_pTransmission->fMaxVelocity)); - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 0; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = false; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - if (params->m_pVehicle->m_nSurfaceTouched == SURFACE_WATER) { - m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP; - freq = 6050 * emittingVol / 30 + 16000; - } else { - m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; - modificator = m_sQueueSample.m_fDistance / 190.f; - sampleFreq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); - freq = (sampleFreq * modificator) + ((3 * sampleFreq) / 4); - } - m_sQueueSample.m_nFrequency = freq; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = false; - m_sQueueSample.m_nReleasingVolumeDivider = 4; - m_sQueueSample.m_bReverbFlag = true; - m_sQueueSample.m_bRequireReflection = false; - AddSampleToRequestedQueue(); - } + + if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + return false; + switch (params->m_VehicleType) { + case VEHICLE_TYPE_CAR: + wheelsOnGround = ((CAutomobile*)params->m_pVehicle)->m_nWheelsOnGround; + break; + case VEHICLE_TYPE_BIKE: + wheelsOnGround = ((CBike*)params->m_pVehicle)->m_nWheelsOnGround; + break; + default: + wheelsOnGround = 4; + break; + } + if (params->m_pTransmission == nil || wheelsOnGround == 0) + return true; + + velocity = Abs(params->m_fVelocityChange); + if (velocity > 0.0f) { + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + emittingVol = 30.f * Min(1.f, velocity / (0.5f * params->m_pTransmission->fMaxVelocity)); + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 0; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + if (params->m_pVehicle->m_nSurfaceTouched == SURFACE_WATER) { + m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP; + freq = 6050 * emittingVol / 30 + 16000; + } else { + m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; + modificator = (m_sQueueSample.m_fDistance / 95.0f) * 0.5f; //mb SOUND_INTENSITY? + sampleFreq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); + freq = (sampleFreq * modificator) + ((3 * sampleFreq) / 4); } + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = false; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = true; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); } } + return true; } bool -cAudioManager::ProcessWetRoadNoise(cVehicleParams *params) +cAudioManager::ProcessWetRoadNoise(cVehicleParams* params) { const float SOUND_INTENSITY = 30.0f; @@ -1033,42 +1048,54 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams *params) int32 emittingVol; float modificator; int freq; - float velChange; + float velocity; + uint8 wheelsOnGround; if (params->m_fDistance >= SQR(SOUND_INTENSITY)) return false; - if (params->m_pTransmission != nil) { - if (((CAutomobile *)params->m_pVehicle)->m_nDriveWheelsOnGround != 0) { - velChange = Abs(params->m_fVelocityChange); - if (velChange > 0.f) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - relativeVelocity = Min(1.0f, velChange / (0.5f * params->m_pTransmission->fMaxVelocity)); - emittingVol = 23.0f * relativeVelocity * CWeather::WetRoads; - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 1; - m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = false; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - modificator = m_sQueueSample.m_fDistance / 6.f; - freq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); - m_sQueueSample.m_nFrequency = freq + freq * modificator; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = false; - m_sQueueSample.m_nReleasingVolumeDivider = 4; - m_sQueueSample.m_bReverbFlag = true; - m_sQueueSample.m_bRequireReflection = false; - AddSampleToRequestedQueue(); - } - } + switch (params->m_VehicleType) { + case VEHICLE_TYPE_CAR: + wheelsOnGround = ((CAutomobile*)params->m_pVehicle)->m_nWheelsOnGround; + break; + case VEHICLE_TYPE_BIKE: + wheelsOnGround = ((CBike*)params->m_pVehicle)->m_nWheelsOnGround; + break; + default: + wheelsOnGround = 4; + break; + } + if (params->m_pTransmission == nil || wheelsOnGround == 0) + return true; + + velocity = Abs(params->m_fVelocityChange); + if (velocity > 0.0f) { + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + relativeVelocity = Min(1.0f, velocity / (0.5f * params->m_pTransmission->fMaxVelocity)); + emittingVol = 23.0f * relativeVelocity * CWeather::WetRoads; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 1; + m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + modificator = (m_sQueueSample.m_fDistance / 30.0f) * 0.5f; //need recheck in III, mb sount_intensity? + freq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); + m_sQueueSample.m_nFrequency = freq + freq * modificator; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = false; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = true; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); } } + return true; } @@ -2132,13 +2159,15 @@ cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params) const float SOUND_INTENSITY = 50.0f; CVehicle *veh = params->m_pVehicle; + uint8 volume; if (params->m_fDistance >= SQR(SOUND_INTENSITY)) return false; if (veh->bEngineOn && veh->m_fGasPedal < 0.0f) { CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(60, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + volume = veh->bIsDrowning ? 15 : 60; + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 12; m_sQueueSample.m_nSampleIndex = SFX_REVERSE_WARNING; @@ -2147,7 +2176,7 @@ cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params) m_sQueueSample.m_nReleasingVolumeModificator = 2; m_sQueueSample.m_nFrequency = (100 * m_sQueueSample.m_nEntityIndex & 1023) + SampleManager.GetSampleBaseFrequency(SFX_REVERSE_WARNING); m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = 60; + m_sQueueSample.m_nEmittingVolume = 60; //mb bug? m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_fSpeedMultiplier = 3.0f; @@ -2803,6 +2832,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) } } } + #ifdef GTA_TRAIN bool cAudioManager::ProcessTrainNoise(cVehicleParams *params) diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index aacf0006..60845bde 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -361,13 +361,13 @@ public: void UpdateGasPedalAudio(CVehicle* veh, int vehType); // done bool ProcessVehicleHorn(cVehicleParams *params); // done void ProcessVehicleOneShots(cVehicleParams *params); // - bool ProcessVehicleReverseWarning(cVehicleParams *params); // - bool ProcessVehicleRoadNoise(cVehicleParams *params); // + bool ProcessVehicleReverseWarning(cVehicleParams *params); // done + bool ProcessVehicleRoadNoise(cVehicleParams *params); // done bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); // done bool ProcessVehicleSkidding(cVehicleParams *params); // void ProcessWaterCannon(int32); // void ProcessWeather(int32 id); // done - bool ProcessWetRoadNoise(cVehicleParams *params); // + bool ProcessWetRoadNoise(cVehicleParams *params); // done void ProcessEscalators(); // done void ProcessExtraSounds(); // done From eeee5012b79297f042eca7ea59c7fa2e35ec5b39 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 17 Oct 2020 16:57:36 +0300 Subject: [PATCH 05/45] model cars and other audio stuff --- src/audio/AudioLogic.cpp | 278 +++++++++++++++++++++++++-------------- src/audio/AudioManager.h | 8 +- 2 files changed, 183 insertions(+), 103 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index b1d1eeb3..3520ca72 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -744,7 +744,7 @@ void cAudioManager::ProcessVehicle(CVehicle* veh) automobile = (CAutomobile*)veh; UpdateGasPedalAudio(veh, params.m_VehicleType); if (veh->m_modelIndex == MI_RCBANDIT || veh->m_modelIndex == MI_RCBARON) { - ProcessModelCarEngine(¶ms); + ProcessModelVehicle(¶ms); ProcessEngineDamage(¶ms); } else if (veh->m_modelIndex == MI_RCRAIDER || veh->m_modelIndex == MI_RCGOBLIN) { //ProcessModelHeliVehicle(this, ¶ms); @@ -825,37 +825,42 @@ void cAudioManager::ProcessVehicle(CVehicle* veh) } void -cAudioManager::ProcessRainOnVehicle(cVehicleParams *params) +cAudioManager::ProcessRainOnVehicle(cVehicleParams* params) { - const int rainOnVehicleIntensity = 22; - if (params->m_fDistance < SQR(rainOnVehicleIntensity) && CWeather::Rain > 0.01f && (!CCullZones::CamNoRain() || !CCullZones::PlayerNoRain())) { - CVehicle *veh = params->m_pVehicle; - ++veh->m_bRainAudioCounter; - if (veh->m_bRainAudioCounter >= 2) { - veh->m_bRainAudioCounter = 0; - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - float emittingVol = 30.f * CWeather::Rain; - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, rainOnVehicleIntensity, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = veh->m_bRainSamplesCounter++; - if (veh->m_bRainSamplesCounter > 4) - veh->m_bRainSamplesCounter = 68; - m_sQueueSample.m_nSampleIndex = (m_anRandomTable[1] & 3) + SFX_CAR_RAIN_1; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = false; - m_sQueueSample.m_nReleasingVolumeModificator = 9; - m_sQueueSample.m_nFrequency = m_anRandomTable[1] % 4000 + 28000; - m_sQueueSample.m_nLoopCount = 1; - m_sQueueSample.m_nEmittingVolume = (uint8)emittingVol; - m_sQueueSample.m_nLoopStart = 0; - m_sQueueSample.m_nLoopEnd = -1; - m_sQueueSample.m_fSpeedMultiplier = 0.0f; - m_sQueueSample.m_fSoundIntensity = rainOnVehicleIntensity; - m_sQueueSample.m_bReleasingSoundFlag = true; - m_sQueueSample.m_bReverbFlag = false; - m_sQueueSample.m_bRequireReflection = false; - AddSampleToRequestedQueue(); - } + const int SOUND_INTENSITY = 22.0f; + + CVehicle* veh; + uint8 emittingVol; + + if (params->m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain()) + return; + + veh = params->m_pVehicle; + veh->m_bRainAudioCounter++; + if (veh->m_bRainAudioCounter >= 2) { + veh->m_bRainAudioCounter = 0; + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + emittingVol = 30.0f * CWeather::Rain; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = veh->m_bRainSamplesCounter++; + if (veh->m_bRainSamplesCounter > 4) + veh->m_bRainSamplesCounter = 68; + m_sQueueSample.m_nSampleIndex = (m_anRandomTable[1] & 3) + SFX_CAR_RAIN_1; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nReleasingVolumeModificator = 9; + m_sQueueSample.m_nFrequency = m_anRandomTable[1] % 4000 + 28000; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.m_nEmittingVolume = emittingVol; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + m_sQueueSample.m_fSpeedMultiplier = 0.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = true; + m_sQueueSample.m_bReverbFlag = false; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); } } } @@ -915,62 +920,131 @@ cAudioManager::ProcessReverseGear(cVehicleParams *params) return true; } -// TODO(Miami): this becomes ProcessModelVehicle void -cAudioManager::ProcessModelCarEngine(cVehicleParams *params) +cAudioManager::ProcessModelVehicle(cVehicleParams *params) { -/* const float SOUND_INTENSITY = 30.0f; - CAutomobile *automobile; - float allowedVelocity; - int32 emittingVol; - float velocityChange; + const float SOUND_INTENSITY = 35.0f; + uint8 volume; + uint32 freq; + bool isPlayerVeh; - if (params->m_fDistance < SQR(SOUND_INTENSITY)) { - automobile = (CAutomobile *)params->m_pVehicle; - if (automobile->bEngineOn) { - if (automobile->m_nWheelsOnGround == 0) { - if (automobile->m_nDriveWheelsOnGround != 0) - automobile->m_fGasPedalAudio *= 0.4f; - velocityChange = automobile->m_fGasPedalAudio * params->m_pTransmission->fMaxVelocity; - } else { - velocityChange = Abs(params->m_fVelocityChange); - } - if (velocityChange > 0.001f) { - allowedVelocity = 0.5f * params->m_pTransmission->fMaxVelocity; - if (velocityChange < allowedVelocity) - emittingVol = (90.f * velocityChange / allowedVelocity); - else - emittingVol = 90; - if (emittingVol) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 30.f, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 2; - m_sQueueSample.m_nSampleIndex = SFX_REMOTE_CONTROLLED_CAR; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = false; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nFrequency = (11025.f * velocityChange / params->m_pTransmission->fMaxVelocity + 11025.f); - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_fSpeedMultiplier = 3.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = false; - m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_bReverbFlag = true; - m_sQueueSample.m_bRequireReflection = false; - AddSampleToRequestedQueue(); - } - } + static uint8 prevVolume = 0; + static uint32 prevFreq = 14000; + int16 acceletateState; + int16 brakeState; + bool vehSlowdown; + + if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + return; + + if (FindPlayerVehicle() == params->m_pVehicle) + isPlayerVeh = true; + else + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; //mb bug? + if (params->m_pVehicle->m_modelIndex == MI_RCBANDIT) { + if (((CAutomobile*)params->m_pVehicle)->m_nDriveWheelsOnGround != 0) { + volume = Min(127, 127.0f * Abs(params->m_fVelocityChange) * 3.0f); + freq = 8000.0f * Abs(params->m_fVelocityChange) + 14000; + } else { + volume = 127; + freq = 25000; + } + if (isPlayerVeh) { + volume = clamp2(volume, prevVolume, 7); + freq = clamp2(freq, prevFreq, 800); + } + if (volume > 0) { + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 2; + m_sQueueSample.m_nSampleIndex = SFX_RC_REV; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = volume; + m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(SFX_RC_REV); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(SFX_RC_REV); + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = false; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = true; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); } } - }*/ + if (isPlayerVeh) { + prevFreq = freq; + prevVolume = volume; + } + } else if (params->m_pVehicle != nil) { + if (isPlayerVeh) { + acceletateState = Pads[0].GetAccelerate(); + brakeState = Pads[0].GetBrake(); + } else { + acceletateState = 255.0f * params->m_pVehicle->m_fGasPedal; + brakeState = 255.0f * params->m_pVehicle->m_fBrakePedal; + } + if (acceletateState < brakeState) + acceletateState = brakeState; + if (acceletateState <= 0) { + vehSlowdown = true; + volume = 127; + freq = 18000; + } else { + vehSlowdown = false; + volume = Min(127, (127 * acceletateState / 255) * 3.0f * Abs(params->m_fVelocityChange)); + freq = Min(22000, (8000 * acceletateState / 255 + 14000) * 3.0f * Abs(params->m_fVelocityChange)); + } + if (isPlayerVeh && !vehSlowdown) { + volume = clamp2(volume, prevVolume, 7); + freq = clamp2(freq, prevFreq, 800); + } + if (!vehSlowdown) + freq += 8000.0f * Abs(params->m_pVehicle->GetUp().y); + if (params->m_pVehicle->bIsDrowning) + volume /= 4; + if (volume > 0) { + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + if (vehSlowdown) { + m_sQueueSample.m_nCounter = 0; + m_sQueueSample.m_nSampleIndex = SFX_RC_IDLE; + m_sQueueSample.m_nReleasingVolumeDivider = 6; + } else { + m_sQueueSample.m_nCounter = 2; + m_sQueueSample.m_nSampleIndex = SFX_RC_REV; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + } + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = volume; + m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = false; + m_sQueueSample.m_bReverbFlag = true; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); + } + } + if (isPlayerVeh) { + if (vehSlowdown) { + prevFreq = freq; + prevVolume = volume; + } + } + } } - - bool cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params) { @@ -4942,17 +5016,17 @@ cAudioManager::ProcessFires(int32) void cAudioManager::ProcessWaterCannon(int32) { - const float SOUND_INTENSITY = 900.0f; + const float SOUND_INTENSITY = 30.0f; for (int32 i = 0; i < NUM_WATERCANNONS; i++) { if (CWaterCannons::aCannons[i].m_nId) { m_sQueueSample.m_vecPos = CWaterCannons::aCannons[0].m_avecPos[CWaterCannons::aCannons[i].m_nCur]; float distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); - if (distSquared < SOUND_INTENSITY) { - m_sQueueSample.m_fDistance = Sqrt(distSquared); - m_sQueueSample.m_nVolume = ComputeVolume(50, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if (distSquared < SQR(SOUND_INTENSITY)) { + m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared); + m_sQueueSample.m_nVolume = ComputeVolume(50, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; //BUG IN III!!!! m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nFrequency = 15591; @@ -5773,39 +5847,45 @@ cAudioManager::ProcessCrane() void cAudioManager::ProcessProjectiles() { - const int rocketLauncherIntensity = 90; - const int molotovIntensity = 30; - const int molotovVolume = 50; uint8 emittingVol; + float distSquared; for (int32 i = 0; i < NUM_PROJECTILES; i++) { if (CProjectileInfo::GetProjectileInfo(i)->m_bInUse) { switch (CProjectileInfo::GetProjectileInfo(i)->m_eWeaponType) { - case WEAPONTYPE_ROCKETLAUNCHER: - emittingVol = MAX_VOLUME; - m_sQueueSample.m_fSoundIntensity = rocketLauncherIntensity; - m_sQueueSample.m_nSampleIndex = SFX_ROCKET_FLY; + case WEAPONTYPE_TEARGAS: + emittingVol = 80; + m_sQueueSample.m_fSoundIntensity = 40.0f; + m_sQueueSample.m_nSampleIndex = SFX_PALM_TREE_LO; m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_ROCKET_FLY); - m_sQueueSample.m_nReleasingVolumeModificator = 3; + m_sQueueSample.m_nFrequency = 13879; + m_sQueueSample.m_nReleasingVolumeModificator = 7; break; case WEAPONTYPE_MOLOTOV: - emittingVol = molotovVolume; - m_sQueueSample.m_fSoundIntensity = molotovIntensity; + emittingVol = 50; + m_sQueueSample.m_fSoundIntensity = 30.0f; m_sQueueSample.m_nSampleIndex = SFX_PED_ON_FIRE; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nFrequency = 32 * SampleManager.GetSampleBaseFrequency(SFX_PED_ON_FIRE) / 25; m_sQueueSample.m_nReleasingVolumeModificator = 7; break; + case WEAPONTYPE_ROCKET: + emittingVol = 127; + m_sQueueSample.m_fSoundIntensity = 90.0f; + m_sQueueSample.m_nSampleIndex = SFX_ROCKET_FLY; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_ROCKET_FLY); + m_sQueueSample.m_nReleasingVolumeModificator = 3; + break; default: return; } m_sQueueSample.m_fSpeedMultiplier = 4.0f; m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition(); - float distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); + m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition(); //?? + distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); if (distSquared < SQR(m_sQueueSample.m_fSoundIntensity)) { - m_sQueueSample.m_fDistance = Sqrt(distSquared); + m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared); m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = i; diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 60845bde..80607b35 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -339,15 +339,15 @@ public: void ProcessLoopingScriptObject(uint8 sound); // void ProcessMissionAudio(); // void ProcessMissionAudioSlot(uint8 slot); // - void ProcessModelCarEngine(cVehicleParams *params); // + void ProcessModelVehicle(cVehicleParams *params); // done void ProcessOneShotScriptObject(uint8 sound); // void ProcessPed(CPhysical *ped); // void ProcessPedOneShots(cPedParams *params); // void ProcessPhysical(int32 id); // done void ProcessPlane(cVehicleParams *params); // done void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done - void ProcessProjectiles(); // - void ProcessRainOnVehicle(cVehicleParams *params); // + void ProcessProjectiles(); // done + void ProcessRainOnVehicle(cVehicleParams *params); // done void ProcessReverb() const; // bool ProcessReverseGear(cVehicleParams *params); // done void ProcessScriptObject(int32 id); // done @@ -365,7 +365,7 @@ public: bool ProcessVehicleRoadNoise(cVehicleParams *params); // done bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); // done bool ProcessVehicleSkidding(cVehicleParams *params); // - void ProcessWaterCannon(int32); // + void ProcessWaterCannon(int32); // done void ProcessWeather(int32 id); // done bool ProcessWetRoadNoise(cVehicleParams *params); // done void ProcessEscalators(); // done From 1e3aabf65486a4a1f32ae92704e1082566090eef Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 17 Oct 2020 21:30:48 +0300 Subject: [PATCH 06/45] fix bugs --- src/audio/AudioLogic.cpp | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 3520ca72..3712f49b 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -940,7 +940,11 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params) if (FindPlayerVehicle() == params->m_pVehicle) isPlayerVeh = true; else - isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; //mb bug? +#ifdef FIX_BUGS + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params->m_pVehicle; +#else + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; +#endif if (params->m_pVehicle->m_modelIndex == MI_RCBANDIT) { if (((CAutomobile*)params->m_pVehicle)->m_nDriveWheelsOnGround != 0) { volume = Min(127, 127.0f * Abs(params->m_fVelocityChange) * 3.0f); @@ -1052,7 +1056,7 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params) int32 emittingVol; uint32 freq; - float modificator; + float multiplier; int sampleFreq; float velocity; uint8 wheelsOnGround; @@ -1091,9 +1095,9 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params) freq = 6050 * emittingVol / 30 + 16000; } else { m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; - modificator = (m_sQueueSample.m_fDistance / 95.0f) * 0.5f; //mb SOUND_INTENSITY? + multiplier = (m_sQueueSample.m_fDistance / SOUND_INTENSITY) * 0.5f; sampleFreq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); - freq = (sampleFreq * modificator) + ((3 * sampleFreq) / 4); + freq = (sampleFreq * multiplier) + ((3 * sampleFreq) / 4); } m_sQueueSample.m_nFrequency = freq; m_sQueueSample.m_nLoopCount = 0; @@ -1120,7 +1124,7 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams* params) float relativeVelocity; int32 emittingVol; - float modificator; + float multiplier; int freq; float velocity; uint8 wheelsOnGround; @@ -1153,9 +1157,9 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams* params) m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = false; m_sQueueSample.m_nReleasingVolumeModificator = 3; - modificator = (m_sQueueSample.m_fDistance / 30.0f) * 0.5f; //need recheck in III, mb sount_intensity? + multiplier = (m_sQueueSample.m_fDistance / SOUND_INTENSITY) * 0.5f; freq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); - m_sQueueSample.m_nFrequency = freq + freq * modificator; + m_sQueueSample.m_nFrequency = freq + freq * multiplier; m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_nEmittingVolume = emittingVol; m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); @@ -2125,7 +2129,11 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams* params) m_sQueueSample.m_nReleasingVolumeModificator = 2; m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nHornFrequency; m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = 80; //mb bug? +#ifdef FIX_BUGS + m_sQueueSample.m_nEmittingVolume = volume; +#else + m_sQueueSample.m_nEmittingVolume = 80; +#endif m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_fSpeedMultiplier = 5.0f; @@ -2143,7 +2151,7 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams* params) bool cAudioManager::UsesSiren(cVehicleParams *params) const { - params->m_pVehicle->UsesSiren(); + return params->m_pVehicle->UsesSiren(); } bool @@ -2250,7 +2258,11 @@ cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params) m_sQueueSample.m_nReleasingVolumeModificator = 2; m_sQueueSample.m_nFrequency = (100 * m_sQueueSample.m_nEntityIndex & 1023) + SampleManager.GetSampleBaseFrequency(SFX_REVERSE_WARNING); m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = 60; //mb bug? +#ifdef FIX_BUGS + m_sQueueSample.m_nEmittingVolume = volume; +#else + m_sQueueSample.m_nEmittingVolume = 60; +#endif m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_fSpeedMultiplier = 3.0f; @@ -5882,7 +5894,7 @@ cAudioManager::ProcessProjectiles() } m_sQueueSample.m_fSpeedMultiplier = 4.0f; m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition(); //?? + m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition(); distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); if (distSquared < SQR(m_sQueueSample.m_fSoundIntensity)) { m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared); From 0594ed5b4631ed779d946fced1e189c10cc0e5c5 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 18 Oct 2020 23:03:03 +0300 Subject: [PATCH 07/45] peds --- src/audio/AudioLogic.cpp | 82 +++++++++++++++++++++++++++++++--------- src/audio/AudioManager.h | 8 ++-- src/control/Script.h | 1 + 3 files changed, 71 insertions(+), 20 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 3712f49b..dcaf4dcb 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -40,6 +40,7 @@ #include "Bike.h" #include "WindModifiers.h" #include "Fluff.h" +#include "Script.h" const int channels = ARRAY_SIZE(cAudioManager::m_asActiveSamples); @@ -251,15 +252,14 @@ cAudioManager::ResetAudioLogicTimers(uint32 timer) void cAudioManager::ProcessReverb() const { - if (SampleManager.UpdateReverb() && m_bDynamicAcousticModelingStatus) { - for (uint32 i = 0; i < #ifdef FIX_BUGS - channels + const uint32 numChannels = channels; #else - 28 + const uint32 numChannels = 28; #endif - ; - i++) { + + if (SampleManager.UpdateReverb() && m_bDynamicAcousticModelingStatus) { + for (uint32 i = 0; i < numChannels; i++) { if (m_asActiveSamples[i].m_bReverbFlag) SampleManager.SetChannelReverbFlag(i, 1); } @@ -297,25 +297,67 @@ CVehicle *cAudioManager::FindVehicleOfPlayer() return vehicle; } +void +cAudioManager::ProcessPlayerMood() +{ + CPlayerPed* playerPed; + uint32* lastMisstonPassedTime; + uint32 curTime = CTimer::GetTimeInMilliseconds(); + + if (m_nPlayerMoodTimer <= curTime) { + playerPed = FindPlayerPed(); + if (playerPed != nil) { +#ifdef 0 + if (playerPed->m_pWanted->m_nWantedLevel > 3) { + m_nPlayerMood = 2; + return; + } + if (playerPed->m_pWanted->m_nWantedLevel > 1) { + m_nPlayerMood = 1; + return; + } +#endif + if (playerPed->m_pWanted->m_nWantedLevel > 1) { + m_nPlayerMood = (playerPed->m_pWanted->m_nWantedLevel > 3) ? 2 : 1; + return; + } + lastMisstonPassedTime = CTheScripts::GetLastMissionPassedTime(); + if (*lastMisstonPassedTime != -1) { + if (curTime < *lastMisstonPassedTime) { + *lastMisstonPassedTime = curTime; + return; + } + if (curTime < *lastMisstonPassedTime + 180000) { + m_nPlayerMood = 3; + return; + } + } + m_nPlayerMood = 0; + } + } +} + void cAudioManager::ProcessSpecial() { + CPlayerPed* playerPed; + if (m_nUserPause) { if (!m_nPreviousUserPause) { - MusicManager.ChangeMusicMode(MUSICMODE_FRONTEND); SampleManager.SetEffectsFadeVolume(MAX_VOLUME); SampleManager.SetMusicFadeVolume(MAX_VOLUME); } } else { - if (m_nPreviousUserPause) { - MusicManager.StopFrontEndTrack(); - MusicManager.ChangeMusicMode(MUSICMODE_GAME); - } - CPlayerPed *playerPed = FindPlayerPed(); - if (playerPed) { - const PedState &state = playerPed->m_nPedState; - if (state != PED_ENTER_CAR && state != PED_STEAL_CAR && !playerPed->bInVehicle) - SampleManager.StopChannel(m_nActiveSamples); + if (!CReplay::IsPlayingBack()) + ProcessPlayerMood(); + playerPed = FindPlayerPed(); + if (playerPed != nil) { + if (playerPed->m_audioEntityId >= 0 && m_asAudioEntities[playerPed->m_audioEntityId].m_bIsUsed) { + if (playerPed->m_nPedState != PED_ENTER_CAR && playerPed->m_nPedState != PED_CARJACK) { + if(!playerPed->bInVehicle&& CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == nil) + SampleManager.StopChannel(m_nActiveSamples); + } + } } } } @@ -3902,7 +3944,7 @@ cAudioManager::ProcessPed(CPhysical *ped) m_sQueueSample.m_vecPos = ped->GetPosition(); - // params.m_bDistanceCalculated = false; + //params.m_bDistanceCalculated = false; params.m_pPed = (CPed *)ped; params.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); ProcessPedOneShots(¶ms); @@ -6855,6 +6897,12 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot) } } +void +cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params) +{ + +} + void cAudioManager::ProcessMissionAudio() { diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 80607b35..7b2e01ae 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -339,19 +339,21 @@ public: void ProcessLoopingScriptObject(uint8 sound); // void ProcessMissionAudio(); // void ProcessMissionAudioSlot(uint8 slot); // + void ProcessModelHeliVehicle(cVehicleParams* params); // void ProcessModelVehicle(cVehicleParams *params); // done void ProcessOneShotScriptObject(uint8 sound); // - void ProcessPed(CPhysical *ped); // + void ProcessPed(CPhysical *ped); // done void ProcessPedOneShots(cPedParams *params); // void ProcessPhysical(int32 id); // done void ProcessPlane(cVehicleParams *params); // done + void ProcessPlayerMood(); // done(need redo pointer) void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done void ProcessProjectiles(); // done void ProcessRainOnVehicle(cVehicleParams *params); // done - void ProcessReverb() const; // + void ProcessReverb() const; // done bool ProcessReverseGear(cVehicleParams *params); // done void ProcessScriptObject(int32 id); // done - void ProcessSpecial(); + void ProcessSpecial(); // done #ifdef GTA_TRAIN bool ProcessTrainNoise(cVehicleParams *params); #endif diff --git a/src/control/Script.h b/src/control/Script.h index c7218847..ac11f967 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -381,6 +381,7 @@ private: public: static void RemoveThisPed(CPed* pPed); + static uint32* GetLastMissionPassedTime() { return &LastMissionPassedTime; } #ifdef MISSION_SWITCHER static void SwitchToMission(int32 mission); #endif From 19ffb9c8df3a2535e0f502f6153c3096082f0215 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 24 Oct 2020 19:24:48 +0300 Subject: [PATCH 08/45] model heli --- src/audio/AudioLogic.cpp | 81 ++++++++++++++++++++++++++++++++-------- src/audio/AudioManager.h | 4 +- 2 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index b690882e..6b6d1082 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -789,7 +789,7 @@ void cAudioManager::ProcessVehicle(CVehicle* veh) ProcessModelVehicle(¶ms); ProcessEngineDamage(¶ms); } else if (veh->m_modelIndex == MI_RCRAIDER || veh->m_modelIndex == MI_RCGOBLIN) { - //ProcessModelHeliVehicle(this, ¶ms); + ProcessModelHeliVehicle(¶ms); ProcessEngineDamage(¶ms); } else { switch (veh->GetVehicleAppearance()) { @@ -966,14 +966,15 @@ void cAudioManager::ProcessModelVehicle(cVehicleParams *params) { const float SOUND_INTENSITY = 35.0f; - uint8 volume; - uint32 freq; - bool isPlayerVeh; - static uint8 prevVolume = 0; static uint32 prevFreq = 14000; + static uint8 prevVolume = 0; + + uint32 freq; int16 acceletateState; int16 brakeState; + uint8 volume; + bool isPlayerVeh; bool vehSlowdown; if (params->m_fDistance >= SQR(SOUND_INTENSITY)) @@ -1091,6 +1092,64 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params) } } +void +cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params) +{ + const float SOUND_INTENSITY = 35.0f; + + static uint32 prevFreq = 22050; + + uint32 freq; + bool isPlayerVeh; + int16 acceletateState; + int16 brakeState; + + if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + return; + + if (FindPlayerVehicle() == params->m_pVehicle) + isPlayerVeh = true; + else +#ifdef FIX_BUGS + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params->m_pVehicle; +#else + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; +#endif + if (isPlayerVeh) { + brakeState = Pads[0].GetBrake(); + acceletateState = Max(Pads[0].GetAccelerate(), Abs(Pads[0].GetCarGunUpDown()) * 2); + } else { + acceletateState = 255.0f * params->m_pVehicle->m_fGasPedal; + brakeState = 255.0f * params->m_pVehicle->m_fBrakePedal; + } + if (acceletateState < brakeState) + acceletateState = brakeState; + freq = clamp2(5 * acceletateState + 22050, prevFreq, 30); + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(70, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 2; + m_sQueueSample.m_nSampleIndex = SFX_CAR_RC_HELI; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = 70; + m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(SFX_CAR_RC_HELI); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(SFX_CAR_RC_HELI); + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = false; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = true; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); + } + if (isPlayerVeh) + prevFreq = freq; +} + bool cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params) { @@ -5079,12 +5138,8 @@ cAudioManager::ProcessWaterCannon(int32) if (distSquared < SQR(SOUND_INTENSITY)) { m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared); m_sQueueSample.m_nVolume = ComputeVolume(50, SOUND_INTENSITY, m_sQueueSample.m_fDistance); -#endif if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; //BUG IN III!!!! -#else - m_sQueueSample.m_fSoundIntensity = SQR(SOUND_INTENSITY); -#endif + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nFrequency = 15591; @@ -6901,12 +6956,6 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot) } } -void -cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params) -{ - -} - void cAudioManager::ProcessMissionAudio() { diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index dbc58ac2..daa65470 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -335,7 +335,7 @@ public: void ProcessLoopingScriptObject(uint8 sound); // void ProcessMissionAudio(); // void ProcessMissionAudioSlot(uint8 slot); // - void ProcessModelHeliVehicle(cVehicleParams* params); // + void ProcessModelHeliVehicle(cVehicleParams* params); // done void ProcessModelVehicle(cVehicleParams *params); // done void ProcessOneShotScriptObject(uint8 sound); // void ProcessPed(CPhysical *ped); // done @@ -353,7 +353,7 @@ public: #ifdef GTA_TRAIN bool ProcessTrainNoise(cVehicleParams *params); #endif - void ProcessVehicle(CVehicle *vehicle); // done, but need add model functions + void ProcessVehicle(CVehicle *vehicle); // done bool ProcessVehicleDoors(cVehicleParams *params); // done void ProcessVehicleEngine(cVehicleParams *params); // done void UpdateGasPedalAudio(CVehicle* veh, int vehType); // done From beae41b2079645f5e2053d12fd794b1f0414aecf Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 24 Oct 2020 19:43:11 +0300 Subject: [PATCH 09/45] fires --- src/audio/AudioLogic.cpp | 36 ++++++++++++++++++++++++++++++------ src/audio/AudioManager.h | 2 +- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 6b6d1082..d999dfed 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -5070,7 +5070,7 @@ cAudioManager::ProcessFires(int32) if (entity) { switch (entity->GetType()) { case ENTITY_TYPE_BUILDING: - m_sQueueSample.m_fSoundIntensity = 50.0f; + m_sQueueSample.m_fSoundIntensity = 80.0f; m_sQueueSample.m_nSampleIndex = SFX_CAR_ON_FIRE; emittingVol = 100; m_sQueueSample.m_nFrequency = 8 * SampleManager.GetSampleBaseFrequency(SFX_CAR_ON_FIRE) / 10; @@ -5086,7 +5086,7 @@ cAudioManager::ProcessFires(int32) m_sQueueSample.m_nReleasingVolumeModificator = 10; break; default: - m_sQueueSample.m_fSoundIntensity = 50.0f; + m_sQueueSample.m_fSoundIntensity = 80.0f; m_sQueueSample.m_nSampleIndex = SFX_CAR_ON_FIRE; m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_CAR_ON_FIRE); m_sQueueSample.m_nFrequency += i * (m_sQueueSample.m_nFrequency / 64); @@ -5094,17 +5094,17 @@ cAudioManager::ProcessFires(int32) m_sQueueSample.m_nReleasingVolumeModificator = 8; } } else { - m_sQueueSample.m_fSoundIntensity = 50.0f; + m_sQueueSample.m_fSoundIntensity = 80.0f; m_sQueueSample.m_nSampleIndex = SFX_CAR_ON_FIRE; m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_CAR_ON_FIRE); - m_sQueueSample.m_nFrequency += i * (m_sQueueSample.m_nFrequency / 64); + //mb error in III emittingVol = 80; m_sQueueSample.m_nReleasingVolumeModificator = 8; } m_sQueueSample.m_vecPos = gFireManager.m_aFires[i].m_vecPos; distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); if (distSquared < SQR(m_sQueueSample.m_fSoundIntensity)) { - m_sQueueSample.m_fDistance = Sqrt(distSquared); + m_sQueueSample.m_fDistance = distSquared < 0.0f ? 0.0f : Sqrt(distSquared); m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = i; @@ -5122,6 +5122,30 @@ cAudioManager::ProcessFires(int32) AddSampleToRequestedQueue(); } } + if (gFireManager.m_aFires[i].m_bExtinguishedWithWater) { + gFireManager.m_aFires[i].m_bExtinguishedWithWater = false; + emittingVol = 100.0f * gFireManager.m_aFires[i].m_fWaterExtinguishCountdown; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI; + m_sQueueSample.m_nFrequency = 19591; + m_sQueueSample.m_nFrequency += i * (m_sQueueSample.m_nFrequency / 64); + m_sQueueSample.m_nReleasingVolumeModificator = 9; + m_sQueueSample.m_nCounter = i + 40; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_fSpeedMultiplier = 2.0f; + m_sQueueSample.m_nReleasingVolumeDivider = 10; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bReleasingSoundFlag = false; + m_sQueueSample.m_nEmittingVolume = emittingVol; + m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_bReverbFlag = true; + m_sQueueSample.m_bRequireReflection = false; + AddSampleToRequestedQueue(); + } + } } } } @@ -6144,7 +6168,7 @@ cAudioManager::ProcessGarages() void cAudioManager::ProcessFireHydrant() { - const int SOUND_INTENSITY = 35; + const float SOUND_INTENSITY = 35; float distSquared; diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index daa65470..5d6b4f9f 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -320,7 +320,7 @@ public: void ProcessEntity(int32 sound); // done void ProcessExplosions(int32 explosion); // done void ProcessFireHydrant(); // done - void ProcessFires(int32 entity); // + void ProcessFires(int32 entity); // done void ProcessFrontEnd(); // void ProcessGarages(); // void ProcessCarHeli(cVehicleParams* params); // done From a9db60a1d9e8060920c23e1304a49a8fb8bbc7a7 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 24 Oct 2020 20:47:03 +0300 Subject: [PATCH 10/45] jumbo --- src/audio/AudioLogic.cpp | 62 ++++++++++++++++++---------------------- src/audio/AudioManager.h | 14 ++++----- 2 files changed, 35 insertions(+), 41 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index d999dfed..78cebf0e 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -3704,38 +3704,34 @@ DoJumboVolOffset() } void -cAudioManager::ProcessJumbo(cVehicleParams *params) +cAudioManager::ProcessJumbo(cVehicleParams* params) { - CPlane *plane; + CPlane* plane; float position; - if (params->m_fDistance < SQR(440)) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - plane = (CPlane *)params->m_pVehicle; - DoJumboVolOffset(); - position = PlanePathPosition[plane->m_nPlaneId]; - if (position <= TakeOffPoint) { - if (plane->m_fSpeed <= 0.103344f) { - ProcessJumboTaxi(); - return; - } + if (params->m_fDistance >= SQR(440)) + return; + CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + plane = (CPlane*)params->m_pVehicle; + DoJumboVolOffset(); + position = PlanePathPosition[plane->m_nPlaneId]; + if (position <= TakeOffPoint) { + if (plane->m_fSpeed > 0.103344f) { ProcessJumboAccel(plane); - } else if (300.0f + TakeOffPoint >= position) { - ProcessJumboTakeOff(plane); - } else if (LandingPoint - 350.0f >= position) { - ProcessJumboFlying(); } else { - if (position > LandingPoint) { - if (plane->m_fSpeed > 0.103344f) { - ProcessJumboDecel(plane); - return; - } - ProcessJumboTaxi(); - return; - } - ProcessJumboLanding(plane); + ProcessJumboTaxi(); } + } else if (position <= TakeOffPoint + 300.0f) { + ProcessJumboTakeOff(plane); + } else if (position <= LandingPoint - 350.0f) { + ProcessJumboFlying(); + } else if (position <= LandingPoint) { + ProcessJumboLanding(plane); + } else if (plane->m_fSpeed > 0.103344f) { + ProcessJumboDecel(plane); + } else { + ProcessJumboTaxi(); } } @@ -3753,25 +3749,23 @@ cAudioManager::ProcessJumboAccel(CPlane *plane) { int32 engineFreq; int32 vol; - float whineSoundFreq; float modificator; + float freqModifier; if (SetupJumboFlySound(20)) { - modificator = (plane->m_fSpeed - 0.103344f) * 1.6760077f; - if (modificator > 1.0f) - modificator = 1.0f; + modificator = Min(1.0f, (plane->m_fSpeed - 0.103344f) * 1.6760077f); if (SetupJumboRumbleSound(MAX_VOLUME * modificator) && SetupJumboTaxiSound((1.0f - modificator) * 75.f)) { if (modificator < 0.2f) { - whineSoundFreq = modificator * 5.f * 14600.0f + 29500; - vol = modificator * 5.f * MAX_VOLUME; - engineFreq = modificator * 5.f * 6050.f + 16000; + freqModifier = modificator * 5.0f; + vol = MAX_VOLUME * freqModifier; + engineFreq = 6050.0f * freqModifier + 16000; } else { - whineSoundFreq = 44100; + freqModifier = 1.0f; engineFreq = 22050; vol = MAX_VOLUME; } SetupJumboEngineSound(vol, engineFreq); - SetupJumboWhineSound(18, whineSoundFreq); + SetupJumboWhineSound(18, 14600.0f * freqModifier + 29500); } } } diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 5d6b4f9f..57293442 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -325,13 +325,13 @@ public: void ProcessGarages(); // void ProcessCarHeli(cVehicleParams* params); // done void ProcessVehicleFlatTyre(cVehicleParams* params); // done - void ProcessJumbo(cVehicleParams *); // - void ProcessJumboAccel(CPlane *plane); // - void ProcessJumboDecel(CPlane *plane); // - void ProcessJumboFlying(); // - void ProcessJumboLanding(CPlane *plane); // - void ProcessJumboTakeOff(CPlane *plane); // - void ProcessJumboTaxi(); // + void ProcessJumbo(cVehicleParams *); // done + void ProcessJumboAccel(CPlane *plane); // done + void ProcessJumboDecel(CPlane *plane); // done + void ProcessJumboFlying(); // done + void ProcessJumboLanding(CPlane *plane); // done + void ProcessJumboTakeOff(CPlane *plane); // done + void ProcessJumboTaxi(); // done void ProcessLoopingScriptObject(uint8 sound); // void ProcessMissionAudio(); // void ProcessMissionAudioSlot(uint8 slot); // From c4707fe8875a0155725171d060313a52898f3dfe Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 24 Oct 2020 22:06:45 +0300 Subject: [PATCH 11/45] fix merging errors --- src/audio/AudioLogic.cpp | 20 ++++++++++---------- src/audio/AudioManager.h | 4 ++-- src/audio/PoliceRadio.cpp | 1 + 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 78cebf0e..d7f20aec 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -307,7 +307,7 @@ cAudioManager::ProcessPlayerMood() if (m_nPlayerMoodTimer <= curTime) { playerPed = FindPlayerPed(); if (playerPed != nil) { -#ifdef 0 +/* if (playerPed->m_pWanted->m_nWantedLevel > 3) { m_nPlayerMood = 2; return; @@ -316,7 +316,7 @@ cAudioManager::ProcessPlayerMood() m_nPlayerMood = 1; return; } -#endif +*/ if (playerPed->m_pWanted->m_nWantedLevel > 1) { m_nPlayerMood = (playerPed->m_pWanted->m_nWantedLevel > 3) ? 2 : 1; return; @@ -6165,29 +6165,29 @@ cAudioManager::ProcessFireHydrant() const float SOUND_INTENSITY = 35; float distSquared; + bool distCalculated = 0; m_sQueueSample.m_vecPos = ((CEntity *)m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_pEntity)->GetPosition(); distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); if (distSquared < SQR(SOUND_INTENSITY)) { - m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared); + CalculateDistance(distCalculated, distSquared); m_sQueueSample.m_nVolume = ComputeVolume(40, 35.0f, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 0; m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = false; m_sQueueSample.m_nReleasingVolumeModificator = 4; m_sQueueSample.m_nFrequency = 15591; - m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nCounter = 0; m_sQueueSample.m_nEmittingVolume = 40; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = false; + m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_fSpeedMultiplier = 2.0f; m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; m_sQueueSample.m_bReleasingSoundFlag = false; - m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_bReverbFlag = true; m_sQueueSample.m_bRequireReflection = false; + m_sQueueSample.m_nReleasingVolumeDivider = 3; + m_sQueueSample.m_fSpeedMultiplier = 2.0f; AddSampleToRequestedQueue(); } } diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 57293442..a7d987da 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -342,7 +342,7 @@ public: void ProcessPedOneShots(cPedParams *params); // void ProcessPhysical(int32 id); // done void ProcessPlane(cVehicleParams *params); // done - void ProcessPlayerMood(); // done(need redo pointer) + void ProcessPlayerMood(); // done void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done void ProcessProjectiles(); // done void ProcessRainOnVehicle(cVehicleParams *params); // done @@ -373,7 +373,7 @@ public: void ReacquireDigitalHandle() const; // done void ReleaseDigitalHandle() const; // done void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2); // done - void ReportCrime(int32 crime, const CVector *pos); // done + void ReportCrime(eCrimeType crime, const CVector &pos); // done void ResetAudioLogicTimers(uint32 timer); // done void ResetPoliceRadio(); // done void ResetTimers(uint32 time); // done diff --git a/src/audio/PoliceRadio.cpp b/src/audio/PoliceRadio.cpp index 2f0c7fc3..781040d6 100644 --- a/src/audio/PoliceRadio.cpp +++ b/src/audio/PoliceRadio.cpp @@ -686,6 +686,7 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z) float halfY; float quarterX; float quarterY; + int32 sample; bool processed = false; CVector vec = CVector(x, y, z); From 63c7df9f0908e27f9394f7668e520cc87e09f483 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sat, 24 Oct 2020 22:26:45 +0300 Subject: [PATCH 12/45] mark reflections done --- src/audio/AudioManager.cpp | 2 -- src/audio/AudioManager.h | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index d89f7891..516cc8af 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -624,7 +624,6 @@ cAudioManager::AddDetailsToRequestedOrderList(uint8 sample) m_abSampleQueueIndexTable[m_nActiveSampleQueue][i] = sample; } -// --MIAMI: Done void cAudioManager::AddReflectionsToRequestedQueue() { @@ -686,7 +685,6 @@ cAudioManager::AddReflectionsToRequestedQueue() m_sQueueSample.m_fDistance = oldDist; } -// --MIAMI: Done void cAudioManager::UpdateReflections() { diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index a7d987da..e03c77fa 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -410,9 +410,9 @@ public: void Terminate(); //done void TranslateEntity(Const CVector *v1, CVector *v2) const; //done - void UpdateReflections(); - bool UsesReverseWarning(int32 model) const; //done - bool UsesSiren(cVehicleParams *params) const; //done + void UpdateReflections(); //done + bool UsesReverseWarning(int32 model) const; //done + bool UsesSiren(cVehicleParams *params) const; //done bool UsesSirenSwitching(cVehicleParams* params) const; //done CVehicle *FindVehicleOfPlayer(); //done From 211ab16ddb0cfbb32f74bf8b16dab4faa91309da Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 25 Oct 2020 16:14:29 +0300 Subject: [PATCH 13/45] skiding --- src/audio/AudioLogic.cpp | 62 +++++++++++++++++++++++++++++----------- src/audio/AudioManager.h | 7 +++-- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index d7f20aec..9231d448 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2055,6 +2055,13 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) const float SOUND_INTENSITY = 40.0f; CAutomobile *automobile; + CBike *bike; + uint8 numWheels; + uint8 wheelsOnGround; + float gasPedalAudio; + tWheelState* wheelStateArr; + + cTransmission *transmission; int32 emittingVol; float newSkidVal = 0.0f; @@ -2062,29 +2069,48 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) if (params->m_fDistance >= SQR(SOUND_INTENSITY)) return false; - automobile = (CAutomobile *)params->m_pVehicle; - if (automobile->m_nWheelsOnGround == 0) + switch (params->m_VehicleType) { + case VEHICLE_TYPE_CAR: + automobile = (CAutomobile*)params->m_pVehicle; + numWheels = 4; + wheelStateArr = automobile->m_aWheelState; + wheelsOnGround = automobile->m_nWheelsOnGround; + gasPedalAudio = automobile->m_fGasPedalAudio; + break; + case VEHICLE_TYPE_BIKE: + bike = (CBike*)params->m_pVehicle; + numWheels = 2; + wheelStateArr = bike->m_aWheelState; + wheelsOnGround = bike->m_nWheelsOnGround; + gasPedalAudio = bike->m_fGasPedalAudio; + break; + default: + debug("\n * AUDIOLOG: ProcessVehicleSkidding() Unsupported vehicle type %d * \n", params->m_VehicleType); + return true; + } + if (wheelsOnGround == 0) return true; CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - for (int32 i = 0; i < ARRAY_SIZE(automobile->m_aWheelState); i++) { - if (automobile->m_aWheelState[i] == WHEEL_STATE_NORMAL || automobile->Damage.GetWheelStatus(i) == WHEEL_STATUS_MISSING) + + for (int32 i = 0; i < numWheels; i++) { + if (wheelStateArr[i] == WHEEL_STATE_NORMAL) continue; transmission = params->m_pTransmission; switch (transmission->nDriveType) { case '4': - newSkidVal = GetVehicleDriveWheelSkidValue(i, automobile, transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange); break; case 'F': if (i == CARWHEEL_FRONT_LEFT || i == CARWHEEL_FRONT_RIGHT) - newSkidVal = GetVehicleDriveWheelSkidValue(i, automobile, transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange); else - newSkidVal = GetVehicleNonDriveWheelSkidValue(i, automobile, transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleNonDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], transmission, params->m_fVelocityChange); break; case 'R': if (i == CARWHEEL_REAR_LEFT || i == CARWHEEL_REAR_RIGHT) - newSkidVal = GetVehicleDriveWheelSkidValue(i, automobile, transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange); else - newSkidVal = GetVehicleNonDriveWheelSkidValue(i, automobile, transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleNonDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], transmission, params->m_fVelocityChange); break; default: break; @@ -2111,6 +2137,7 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) case SURFACE_MUD_DRY: case SURFACE_SAND: case SURFACE_WATER: + case SURFACE_SAND_BEACH: m_sQueueSample.m_nSampleIndex = SFX_GRAVEL_SKID; m_sQueueSample.m_nFrequency = 6000.f * skidVal + 10000.f; break; @@ -2118,6 +2145,8 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) default: m_sQueueSample.m_nSampleIndex = SFX_SKID; m_sQueueSample.m_nFrequency = 5000.f * skidVal + 11000.f; + if (params->m_VehicleType == VEHICLE_TYPE_BIKE) + m_sQueueSample.m_nFrequency += 2000; break; } @@ -2141,18 +2170,17 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) } float -cAudioManager::GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange) +cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange) { float relativeVelChange = 0.0f; - float gasPedalAudio = automobile->m_fGasPedalAudio; float velChange; float relativeVel; - switch (automobile->m_aWheelState[wheel]) + switch (wheelState) { case WHEEL_STATE_SPINNING: if (gasPedalAudio > 0.4f) - relativeVelChange = (gasPedalAudio - 0.4f) * (5.0f / 3.0f) / (4.0f / 3.0f); + relativeVelChange = (gasPedalAudio - 0.4f) * (5.0f / 3.0f) * 0.75f; break; case WHEEL_STATE_SKIDDING: relativeVelChange = Min(1.0f, Abs(velocityChange) / transmission->fMaxVelocity); @@ -2173,18 +2201,18 @@ cAudioManager::GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobil break; } - return Max(relativeVelChange, Min(1.0f, Abs(automobile->m_vecTurnSpeed.z) * 20.0f)); + return Max(relativeVelChange, Min(1.0f, Abs(veh->m_vecTurnSpeed.z) * 20.0f)); } float -cAudioManager::GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange) +cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, cTransmission *transmission, float velocityChange) { float relativeVelChange = 0.0f; - if (automobile->m_aWheelState[wheel] == WHEEL_STATE_SKIDDING) + if (wheelState == WHEEL_STATE_SKIDDING) relativeVelChange = Min(1.0f, Abs(velocityChange) / transmission->fMaxVelocity); - return Max(relativeVelChange, Min(1.0f, Abs(automobile->m_vecTurnSpeed.z) * 20.0f)); + return Max(relativeVelChange, Min(1.0f, Abs(veh->m_vecTurnSpeed.z) * 20.0f)); } bool diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index e03c77fa..c3890817 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -4,6 +4,7 @@ #include "AudioCollision.h" #include "PoliceRadio.h" #include "VehicleModelInfo.h" +#include "vehicle.h" class tSound { @@ -277,8 +278,8 @@ public: uint8 GetNum3DProvidersAvailable() const; // done int32 GetPedCommentSfx(CPed *ped, int32 sound); void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample, uint32 maxOffset) const; - float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange); - float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange); + float GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange); // done + float GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange); // done bool HasAirBrakes(int32 model) const; // done @@ -362,7 +363,7 @@ public: bool ProcessVehicleReverseWarning(cVehicleParams *params); // done bool ProcessVehicleRoadNoise(cVehicleParams *params); // done bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); // done - bool ProcessVehicleSkidding(cVehicleParams *params); // + bool ProcessVehicleSkidding(cVehicleParams *params); // done void ProcessWaterCannon(int32); // done void ProcessWeather(int32 id); // done bool ProcessWetRoadNoise(cVehicleParams *params); // done From 04b841c71992e564c18635a9a4af33d74dcdd4a0 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Mon, 26 Oct 2020 00:11:04 +0300 Subject: [PATCH 14/45] processVehicleOneShots --- src/audio/AudioLogic.cpp | 237 +++++++++++++++++++++++++++--------- src/audio/AudioManager.h | 2 +- src/audio/soundlist.h | 2 +- src/vehicles/Automobile.cpp | 2 +- 4 files changed, 182 insertions(+), 61 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 9231d448..9626cefc 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2613,11 +2613,17 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) float relVol; float vol; bool noReflections; + bool isHeli; float maxDist; cPedParams pedParams; + static uint8 GunIndex = 53; + pedParams.m_pPed = nil; + pedParams.m_bDistanceCalculated = false; + pedParams.m_fDistance = 0.0f; for (int i = 0; i < m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_AudioEvents; i++) { - noReflections = 0; + noReflections = false; + isHeli = false; m_sQueueSample.m_bRequireReflection = false; event = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i]; switch (event) { @@ -2634,20 +2640,22 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) case OLD_DOOR: m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_CLOSE; break; - case NEW_DOOR: - default: - m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_CLOSE; - break; case TRUCK_DOOR: m_sQueueSample.m_nSampleIndex = SFX_TRUCK_DOOR_CLOSE; break; case BUS_DOOR: m_sQueueSample.m_nSampleIndex = SFX_AIR_BRAKES; break; + default: + m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_CLOSE; + break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 22; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) + m_sQueueSample.m_nFrequency = 28062; + else + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 32); m_sQueueSample.m_nReleasingVolumeModificator = 3; m_sQueueSample.m_fSpeedMultiplier = 0.0f; @@ -2668,20 +2676,22 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) case OLD_DOOR: m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_OPEN; break; - case NEW_DOOR: - default: - m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_OPEN; - break; case TRUCK_DOOR: m_sQueueSample.m_nSampleIndex = SFX_TRUCK_DOOR_OPEN; break; case BUS_DOOR: m_sQueueSample.m_nSampleIndex = SFX_AIR_BRAKES; break; + default: + m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_OPEN; + break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 10; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) + m_sQueueSample.m_nFrequency = 23459; + else + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 32); m_sQueueSample.m_nReleasingVolumeModificator = 3; m_sQueueSample.m_fSpeedMultiplier = 0.0f; @@ -2690,40 +2700,64 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) break; } case SOUND_CAR_WINDSHIELD_CRACK: { - const float SOUND_INTENSITY = 30.0f; + const float SOUND_INTENSITY = 40.0f; maxDist = SQR(SOUND_INTENSITY); m_sQueueSample.m_nSampleIndex = SFX_GLASS_CRACK; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = 68; - emittingVol = m_anRandomTable[1] % 30 + 60; + emittingVol = m_anRandomTable[1] % 30 + 80; //GetRandomNumberInRange(1, 80, 109) m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_GLASS_CRACK); m_sQueueSample.m_nReleasingVolumeModificator = 5; m_sQueueSample.m_fSpeedMultiplier = 0.0f; m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; } break; - case SOUND_CAR_JUMP: { + case SOUND_CAR_JUMP: + case SOUND_CAR_JUMP_2: { const float SOUND_INTENSITY = 35.0f; static uint8 WheelIndex = 82; - emittingVol = Max(80.f, 2 * (100.f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i])); maxDist = SQR(SOUND_INTENSITY); - m_sQueueSample.m_nSampleIndex = SFX_TYRE_BUMP; + if (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] == SOUND_CAR_JUMP_2) { + m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B; + emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i])); + } else { + m_sQueueSample.m_nSampleIndex = SFX_TYRE_BUMP; + emittingVol = Max(80.f, 2 * (100.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i])); + } m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = WheelIndex++; if (WheelIndex > 85) WheelIndex = 82; m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TYRE_BUMP); m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16); - if (params->m_nIndex == RCBANDIT) { + if (params->m_VehicleType == VEHICLE_TYPE_BIKE) m_sQueueSample.m_nFrequency *= 2; - emittingVol /= 2; - } m_sQueueSample.m_nReleasingVolumeModificator = 6; m_sQueueSample.m_fSpeedMultiplier = 2.0f; m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; break; } + case SOUND_CAR_TYRE_POP: { + const float SOUND_INTENSITY = 60.0f; + static uint8 WheelIndex = 91; + m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nCounter = WheelIndex++; + if (WheelIndex > 94) + WheelIndex = 91; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TYRE_BURST); + m_sQueueSample.m_nFrequency += RandomDisplacement(2000); + m_sQueueSample.m_nReleasingVolumeModificator = 2; + m_sQueueSample.m_fSpeedMultiplier = 0.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + maxDist = SQR(SOUND_INTENSITY); + emittingVol = m_anRandomTable[4] % 10 + 117; + break; + } case SOUND_CAR_ENGINE_START: { const float SOUND_INTENSITY = 40.0f; + if (params->m_pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR + || params->m_pVehicle->m_modelIndex == MI_CADDY) + continue; emittingVol = 60; maxDist = SQR(SOUND_INTENSITY); m_sQueueSample.m_nSampleIndex = SFX_CAR_STARTER; @@ -2798,24 +2832,24 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) break; } case SOUND_CAR_SPLASH: { - const float SOUND_INTENSITY = 40.0f; + const float SOUND_INTENSITY = 60.0f; static uint8 WaveIndex = 41; vol = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]; - if (vol <= 300.f) + if (vol <= 150.0f) continue; - if (vol > 1200.f) - m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i] = 1200.0f; - relVol = (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i] - 300.f) / 900.f; + if (vol > 800.0f) + m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i] = 800.0f; + relVol = (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i] - 150.0f) / 650.0f; m_sQueueSample.m_nSampleIndex = (m_anRandomTable[0] & 1) + SFX_BOAT_SPLASH_1; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = WaveIndex++; if (WaveIndex > 46) WaveIndex = 41; - m_sQueueSample.m_nFrequency = (7000.f * relVol) + 6000; + m_sQueueSample.m_nFrequency = (7000.0f * relVol) + 6000; m_sQueueSample.m_nReleasingVolumeModificator = 3; m_sQueueSample.m_fSpeedMultiplier = 2.0f; m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - emittingVol = (55.f * relVol); + emittingVol = (35.0f * relVol); maxDist = SQR(SOUND_INTENSITY); break; } @@ -2832,6 +2866,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) maxDist = SQR(SOUND_INTENSITY); break; }*/ +#ifdef GTA_TRAIN case SOUND_TRAIN_DOOR_CLOSE: case SOUND_TRAIN_DOOR_OPEN: { const float SOUND_INTENSITY = 35.0f; @@ -2846,20 +2881,21 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) emittingVol = m_anRandomTable[1] % 20 + 70; break; } +#endif case SOUND_CAR_TANK_TURRET_ROTATE: { const float SOUND_INTENSITY = 40.0f; vol = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]; - if (vol > 96.0f / 2500.0f) - vol = 96.0f / 2500.0f; + if (vol > 24.0f / 625.0f) + vol = 24.0f / 625.0f; m_sQueueSample.m_nSampleIndex = SFX_TANK_TURRET; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = 79; - m_sQueueSample.m_nFrequency = (3000.f * vol * 2500.0f / 96.0f) + 9000; + m_sQueueSample.m_nFrequency = (3000.0f * vol * 625.0f / 24.0f) + 9000; m_sQueueSample.m_nReleasingVolumeModificator = 2; m_sQueueSample.m_fSpeedMultiplier = 2.0f; m_sQueueSample.m_nReleasingVolumeDivider = 3; m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - emittingVol = (37.f * vol * 2500.0f / 96.0f) + 90; + emittingVol = (37.0f * vol * 625.0f / 24.0f) + 90; maxDist = SQR(SOUND_INTENSITY); noReflections = true; break; @@ -2891,9 +2927,9 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) emittingVol = m_anRandomTable[4] % 25 + 75; break; } - case SOUND_31:{ + case SOUND_HELI_BLADE:{ const float SOUND_INTENSITY = 35.0f; - static uint8 HeliIndex = 0; + static uint8 HeliIndex = 89; relVol = ((CAutomobile*)params->m_pVehicle)->m_aWheelSpeed[1] * 50.0f / 11.0f; if (relVol < 0.2f || relVol == 1.0f) continue; @@ -2901,8 +2937,9 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) maxDist = SQR(SOUND_INTENSITY); m_sQueueSample.m_nSampleIndex = SFX_CAR_HELI_ROT; m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = HeliIndex + 89; - HeliIndex = HeliIndex != 1 ? HeliIndex + 1 : 0; //maybe better use 1 and 0, to avoid extreme values + m_sQueueSample.m_nCounter = HeliIndex++; + if (HeliIndex > 90) + HeliIndex = 89; m_sQueueSample.m_nFrequency = (8000.0f * relVol) + 16000; m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 32); m_sQueueSample.m_nReleasingVolumeModificator = 2; @@ -2912,20 +2949,68 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) } case SOUND_WEAPON_SHOT_FIRED: { const float SOUND_INTENSITY = 120.0f; - static uint8 GunIndex = 53; - emittingVol = m_anRandomTable[2]; - maxDist = SQR(SOUND_INTENSITY); - m_sQueueSample.m_nSampleIndex = SFX_UZI_LEFT; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = GunIndex++; - emittingVol = emittingVol % 15 + 65; - if (GunIndex > 58) - GunIndex = 53; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_UZI_LEFT); - m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16); - m_sQueueSample.m_nReleasingVolumeModificator = 3; - m_sQueueSample.m_fSpeedMultiplier = 0.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + CVehicle* playerVeh; + CPlayerPed* playerPed; + + switch (params->m_pVehicle->m_modelIndex) { + case MI_HUNTER: + case MI_CHOPPER: + case MI_SEASPAR: + case MI_SPARROW: + case MI_MAVERICK: + case MI_VCNMAV: + if (params->m_pVehicle->m_modelIndex == MI_HUNTER) { + if (Pads[0].GetHandBrake() == 0) { + playerVeh = FindPlayerVehicle(); + playerPed = FindPlayerPed(); + if (playerVeh == 0 && playerPed != 0) { + if (playerPed->m_attachedTo != nil && playerPed->m_attachedTo->GetType() == ENTITY_TYPE_VEHICLE) + playerVeh = (CVehicle*)playerPed->m_attachedTo; + } + if (playerVeh != params->m_pVehicle) { + m_sQueueSample.m_nSampleIndex = SFX_M60_LEFT; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + } else { + m_sQueueSample.m_nSampleIndex = SFX_ROCKET_LEFT; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + } + } else { + m_sQueueSample.m_nSampleIndex = SFX_M60_LEFT; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + } + } else { + m_sQueueSample.m_nSampleIndex = SFX_M60_LEFT; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + } + maxDist = SQR(SOUND_INTENSITY); + m_sQueueSample.m_nCounter = GunIndex++; + emittingVol = MAX_VOLUME; + if (GunIndex > 58) + GunIndex = 53; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_M60_LEFT); + m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16); + m_sQueueSample.m_nReleasingVolumeModificator = 2; + m_sQueueSample.m_fSpeedMultiplier = 0.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bRequireReflection = true; + isHeli = true; + break; + default: + maxDist = SQR(SOUND_INTENSITY); + m_sQueueSample.m_nSampleIndex = SFX_UZI_LEFT; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nCounter = GunIndex++; + emittingVol = m_anRandomTable[2] % 15 + 65; + if (GunIndex > 58) + GunIndex = 53; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_UZI_LEFT); + m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16); + m_sQueueSample.m_nReleasingVolumeModificator = 3; + m_sQueueSample.m_fSpeedMultiplier = 0.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bRequireReflection = true; + break; + } break; } case SOUND_WEAPON_HIT_VEHICLE: { @@ -2959,14 +3044,12 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) maxDist = SQR(SOUND_INTENSITY); break; } - case SOUND_PED_HELI_PLAYER_FOUND: - pedParams.m_pPed = nil; - pedParams.m_bDistanceCalculated = false; - pedParams.m_fDistance = 0.0f; + case SOUND_PED_HELI_PLAYER_FOUND: { pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated; pedParams.m_fDistance = params->m_fDistance; SetupPedComments(&pedParams, SOUND_PED_HELI_PLAYER_FOUND); continue; + } /* case SOUND_PED_BODYCAST_HIT: pedParams.m_pPed = nil; pedParams.m_bDistanceCalculated = false; @@ -2975,8 +3058,17 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) pedParams.m_fDistance = params->m_fDistance; SetupPedComments(&pedParams, SOUND_PED_BODYCAST_HIT); continue; */ + case SOUND_115: { + pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated; + pedParams.m_fDistance = params->m_fDistance; + SetupPedComments(&pedParams, SOUND_115); + } case SOUND_WATER_FALL: { const float SOUND_INTENSITY = 40.0f; + static uint32 WaterFallFrame = 0; + if (m_FrameCounter <= WaterFallFrame) + continue; + WaterFallFrame = m_FrameCounter + 6; m_sQueueSample.m_nSampleIndex = SFX_SPLASH_1; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = 15; @@ -2995,10 +3087,10 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) m_sQueueSample.m_nSampleIndex = CrunchOffset + SFX_PED_CRUNCH_1; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = 48; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_PED_CRUNCH_1) + RandomDisplacement(600); + m_sQueueSample.m_nFrequency = RandomDisplacement(6000) + 16000; m_sQueueSample.m_nReleasingVolumeModificator = 1; m_sQueueSample.m_fSpeedMultiplier = 0.0f; - m_sQueueSample.m_fSoundIntensity = 40.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; ++CrunchOffset; maxDist = SQR(SOUND_INTENSITY); emittingVol = m_anRandomTable[4] % 20 + 55; @@ -3009,14 +3101,15 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) case SOUND_CAR_PED_COLLISION: { const float SOUND_INTENSITY = 40.0f; vol = Min(20.0f, m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]); - emittingVol = (vol / 20.0f * 127.f); - if (!emittingVol) + emittingVol = Min(127, (3 * (vol / 20.0f * 127.f)) / 2); + if (emittingVol == 0) continue; - m_sQueueSample.m_nSampleIndex = (m_anRandomTable[2] & 3) + SFX_FIGHT_1; + m_sQueueSample.m_nSampleIndex = SFX_FIGHT_1; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = 50; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex) / 2; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16); m_sQueueSample.m_nReleasingVolumeModificator = 1; m_sQueueSample.m_fSpeedMultiplier = 0.0f; m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; @@ -3041,8 +3134,36 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nEmittingVolume = emittingVol; m_sQueueSample.m_bReverbFlag = true; + if (isHeli) { + if (0.2f * m_sQueueSample.m_fSoundIntensity > m_sQueueSample.m_fDistance) { + m_sQueueSample.m_bIs2D = true; + m_sQueueSample.m_nOffset = 0; + AddSampleToRequestedQueue(); + m_sQueueSample.m_nOffset = 127; + m_sQueueSample.m_nSampleIndex++; + m_sQueueSample.m_nCounter = GunIndex++; + if (GunIndex > 58) + GunIndex = 53; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + continue; + } + isHeli = false; + } m_sQueueSample.m_bIs2D = false; AddSampleToRequestedQueue(); +/* looks like this code ca't be reached(originaly it exist bcs used goto) + if (isHeli) { + m_sQueueSample.m_nOffset = 127; + m_sQueueSample.m_nSampleIndex++; + m_sQueueSample.m_nCounter = GunIndex++; + if (GunIndex > 58) + GunIndex = 53; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + }*/ + continue; + } } } diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index c3890817..3c4b2116 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -359,7 +359,7 @@ public: void ProcessVehicleEngine(cVehicleParams *params); // done void UpdateGasPedalAudio(CVehicle* veh, int vehType); // done bool ProcessVehicleHorn(cVehicleParams *params); // done - void ProcessVehicleOneShots(cVehicleParams *params); // + void ProcessVehicleOneShots(cVehicleParams *params); // done bool ProcessVehicleReverseWarning(cVehicleParams *params); // done bool ProcessVehicleRoadNoise(cVehicleParams *params); // done bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); // done diff --git a/src/audio/soundlist.h b/src/audio/soundlist.h index 973a1585..44056d55 100644 --- a/src/audio/soundlist.h +++ b/src/audio/soundlist.h @@ -33,7 +33,7 @@ enum eSound : uint16 SOUND_CAR_TANK_TURRET_ROTATE, SOUND_CAR_BOMB_TICK, SOUND_PLANE_ON_GROUND, - SOUND_31, + SOUND_HELI_BLADE, SOUND_32, SOUND_STEP_START, SOUND_STEP_END, diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index d1a7505e..ddfc1441 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -1494,7 +1494,7 @@ CAutomobile::ProcessControl(void) blade = Multiply3x3(blade, GetMatrix()); camDist /= Max(Sqrt(distSq), 0.01f); if(Abs(DotProduct(camDist, blade)) > 0.95f){ - DMAudio.PlayOneShot(m_audioEntityId, SOUND_31, 0.0f); + DMAudio.PlayOneShot(m_audioEntityId, SOUND_HELI_BLADE, 0.0f); m_fPropellerRotation = m_aWheelRotation[1]; } } From 96ccb1333b2d8cabe914c4a9f65a640f3db81c56 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Mon, 26 Oct 2020 00:14:59 +0300 Subject: [PATCH 15/45] cleanup processVehicleOneShots, processVehicleX done --- src/audio/AudioLogic.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 9626cefc..436c5ba9 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2651,7 +2651,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 22; + m_sQueueSample.m_nCounter = event + 22; if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 28062; else @@ -2687,7 +2687,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 10; + m_sQueueSample.m_nCounter = event + 10; if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 23459; else @@ -2716,7 +2716,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) const float SOUND_INTENSITY = 35.0f; static uint8 WheelIndex = 82; maxDist = SQR(SOUND_INTENSITY); - if (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] == SOUND_CAR_JUMP_2) { + if (event == SOUND_CAR_JUMP_2) { m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B; emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i])); } else { From 4bcd1769442b0b410bc3b14867ee23a2f18b78bf Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Mon, 26 Oct 2020 00:17:21 +0300 Subject: [PATCH 16/45] fix merge --- src/audio/AudioManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index eb8c0bf2..9a7c754d 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -321,7 +321,7 @@ public: void ProcessEntity(int32 sound); // done void ProcessExplosions(int32 explosion); // done void ProcessFireHydrant(); // done - void ProcessFires(int32 entity); // + void ProcessFires(int32 entity); // done void ProcessFrontEnd(); // done void ProcessGarages(); // void ProcessCarHeli(cVehicleParams* params); // done From c3cbf4353d284b1f0f6280a0495085d8221f30e8 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Mon, 26 Oct 2020 14:02:11 +0300 Subject: [PATCH 17/45] Fix build and use enum in ProcessPlayerMood --- src/audio/AudioLogic.cpp | 16 ++++++---------- src/audio/AudioManager.h | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 40e0ba6c..1fdba82a 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -307,20 +307,16 @@ cAudioManager::ProcessPlayerMood() if (m_nPlayerMoodTimer <= curTime) { playerPed = FindPlayerPed(); if (playerPed != nil) { -/* + if (playerPed->m_pWanted->m_nWantedLevel > 3) { - m_nPlayerMood = 2; + m_nPlayerMood = PLAYER_MOOD_ANGRY; return; } if (playerPed->m_pWanted->m_nWantedLevel > 1) { - m_nPlayerMood = 1; - return; - } -*/ - if (playerPed->m_pWanted->m_nWantedLevel > 1) { - m_nPlayerMood = (playerPed->m_pWanted->m_nWantedLevel > 3) ? 2 : 1; + m_nPlayerMood = PLAYER_MOOD_PISSED_OFF; return; } + lastMisstonPassedTime = CTheScripts::GetLastMissionPassedTime(); if (*lastMisstonPassedTime != -1) { if (curTime < *lastMisstonPassedTime) { @@ -328,11 +324,11 @@ cAudioManager::ProcessPlayerMood() return; } if (curTime < *lastMisstonPassedTime + 180000) { - m_nPlayerMood = 3; + m_nPlayerMood = PLAYER_MOOD_WISECRACKING; return; } } - m_nPlayerMood = 0; + m_nPlayerMood = PLAYER_MOOD_CALM; } } } diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 9a7c754d..97c332a2 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -4,7 +4,7 @@ #include "AudioCollision.h" #include "PoliceRadio.h" #include "VehicleModelInfo.h" -#include "vehicle.h" +#include "Vehicle.h" class tSound { @@ -304,19 +304,19 @@ public: void PreloadMissionAudio(uint8 slot, Const char *name); // done void PreTerminateGameSpecificShutdown(); // done /// processX - main logic of adding new sounds - void ProcessActiveQueues(); // done - bool ProcessAirBrakes(cVehicleParams *params); // done - bool ProcessBoatEngine(cVehicleParams *params); - bool ProcessBoatMovingOverWater(cVehicleParams *params); + void ProcessActiveQueues(); // done + bool ProcessAirBrakes(cVehicleParams *params); // done + bool ProcessBoatEngine(cVehicleParams *params); + bool ProcessBoatMovingOverWater(cVehicleParams *params); #ifdef GTA_BRIDGE - void ProcessBridge(); - void ProcessBridgeMotor(); - void ProcessBridgeOneShots(); - void ProcessBridgeWarning(); + void ProcessBridge(); // done(bcs not exists in VC) + void ProcessBridgeMotor(); // done(bcs not exists in VC) + void ProcessBridgeOneShots(); // done(bcs not exists in VC) + void ProcessBridgeWarning(); // done(bcs not exists in VC) #endif bool ProcessCarBombTick(cVehicleParams *params); // done void ProcessCesna(cVehicleParams *params); // - //void ProcessCrane(); // + //void ProcessCrane(); // done(bcs not exists in VC) bool ProcessEngineDamage(cVehicleParams *params); // done void ProcessEntity(int32 sound); // done void ProcessExplosions(int32 explosion); // done @@ -352,7 +352,7 @@ public: void ProcessScriptObject(int32 id); // done void ProcessSpecial(); // done #ifdef GTA_TRAIN - bool ProcessTrainNoise(cVehicleParams *params); + bool ProcessTrainNoise(cVehicleParams *params); //done(bcs not exists in VC) #endif void ProcessVehicle(CVehicle *vehicle); // done bool ProcessVehicleDoors(cVehicleParams *params); // done From 5ea9285c5ba3720e9f227b61cc88fcdf2359d91b Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 1 Nov 2020 22:42:45 +0300 Subject: [PATCH 18/45] changes in switch, and mark code --- src/audio/AudioLogic.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 1fdba82a..8bc9c880 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2636,6 +2636,9 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) case OLD_DOOR: m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_CLOSE; break; + case NEW_DOOR: + m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_CLOSE; + break; case TRUCK_DOOR: m_sQueueSample.m_nSampleIndex = SFX_TRUCK_DOOR_CLOSE; break; @@ -2647,7 +2650,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = event + 22; + m_sQueueSample.m_nCounter = event + 22; //originaly used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i], which is same if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 28062; else @@ -3867,7 +3870,7 @@ cAudioManager::ProcessJumbo(cVehicleParams* params) } else { ProcessJumboTaxi(); } - } else if (position <= TakeOffPoint + 300.0f) { + } else if (position <= TakeOffPoint + 300.0f) { ProcessJumboTakeOff(plane); } else if (position <= LandingPoint - 350.0f) { ProcessJumboFlying(); From cebf32c46c43b55caa96ada3dece3473b6db7785 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 1 Nov 2020 23:38:45 +0300 Subject: [PATCH 19/45] mark code --- src/audio/AudioLogic.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 8bc9c880..44ca4b65 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2686,7 +2686,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = event + 10; + m_sQueueSample.m_nCounter = event + 10; //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 23459; else @@ -2715,7 +2715,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) const float SOUND_INTENSITY = 35.0f; static uint8 WheelIndex = 82; maxDist = SQR(SOUND_INTENSITY); - if (event == SOUND_CAR_JUMP_2) { + if (event == SOUND_CAR_JUMP_2) { //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B; emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i])); } else { From 174424c5206100e442342b2e9b0cff5c16b239db Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Mon, 2 Nov 2020 12:05:23 +0300 Subject: [PATCH 20/45] fix serviceSoundEffects an cleanup --- src/audio/AudioLogic.cpp | 14 ++------------ src/audio/AudioManager.cpp | 1 - 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 44ca4b65..3c95273a 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -179,7 +179,7 @@ cAudioManager::PostInitialiseGameSpecificSetup() ResetAudioLogicTimers(CTimer::GetTimeInMilliseconds()); m_bIsPlayerShutUp = false; - m_nPlayerMood = 0; + m_nPlayerMood = PLAYER_MOOD_CALM; m_nPlayerMoodTimer = 0; } @@ -863,7 +863,7 @@ void cAudioManager::ProcessVehicle(CVehicle* veh) } void -cAudioManager::ProcessRainOnVehicle(cVehicleParams* params) +cAudioManager::ProcessRainOnVehicle(cVehicleParams *params) { const int SOUND_INTENSITY = 22.0f; @@ -3151,16 +3151,6 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) } m_sQueueSample.m_bIs2D = false; AddSampleToRequestedQueue(); -/* looks like this code ca't be reached(originaly it exist bcs used goto) - if (isHeli) { - m_sQueueSample.m_nOffset = 127; - m_sQueueSample.m_nSampleIndex++; - m_sQueueSample.m_nCounter = GunIndex++; - if (GunIndex > 58) - GunIndex = 53; - m_sQueueSample.m_bRequireReflection = 0; - AddSampleToRequestedQueue(); - }*/ continue; } diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index 516cc8af..c9bd6c17 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -438,7 +438,6 @@ cAudioManager::IsAudioInitialised() const void cAudioManager::ServiceSoundEffects() { - m_FrameCounter++; m_bFifthFrameFlag = (m_FrameCounter++ % 5) == 0; if (m_nUserPause && !m_nPreviousUserPause) { for (int32 i = 0; i < allChannels; i++) From 3c5bb4e8f34bebd14447a4166a24264a56e7ff3a Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 3 Nov 2020 20:33:07 +0100 Subject: [PATCH 21/45] new LCS-style renderer --- src/core/config.h | 1 + src/core/main.cpp | 134 +++++++++ src/core/main.h | 5 + src/core/re3.cpp | 22 ++ src/render/Renderer.cpp | 559 ++++++++++++++++++++++++++++++++++- src/render/Renderer.h | 15 + src/render/SpecialFX.cpp | 3 + src/rw/VisibilityPlugins.cpp | 21 +- src/rw/VisibilityPlugins.h | 3 + vendor/librw | 2 +- 10 files changed, 749 insertions(+), 16 deletions(-) diff --git a/src/core/config.h b/src/core/config.h index ce77391c..01d63f89 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -245,6 +245,7 @@ enum Config { //#define CUTSCENE_BORDERS_SWITCH //#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) //#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) +//#define NEW_RENDERER // leeds-like world rendering, needs librw //#define MULTISAMPLING // adds MSAA option TODO #ifdef LIBRW diff --git a/src/core/main.cpp b/src/core/main.cpp index 64b3a63f..0b3bb549 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -107,6 +107,10 @@ void TheGame(void); void DebugMenuPopulate(void); #endif +#ifdef NEW_RENDERER +bool gbNewRenderer; +#endif + void ValidateVersion() { @@ -849,9 +853,128 @@ DisplayGameDebugText() } #endif +bool gbRenderRoads = true; +bool gbRenderEverythingBarRoads = true; +bool gbRenderFadingInUnderwaterEntities = true; +bool gbRenderFadingInEntities = true; +bool gbRenderWater = true; +bool gbRenderBoats = true; +bool gbRenderVehicles = true; +bool gbRenderWorld0 = true; +bool gbRenderWorld1 = true; +bool gbRenderWorld2 = true; + +#ifdef NEW_RENDERER +void +MattRenderScene(void) +{ + // this calls CMattRenderer::Render + CWorld::AdvanceCurrentScanCode(); + // CMattRenderer::ResetRenderStates + CRenderer::ClearForFrame(); + // CClock::CalcEnvMapTimeMultiplicator +if(gbRenderWater) + CWaterLevel::RenderWater(); // actually CMattRenderer::RenderWater + // CClock::ms_EnvMapTimeMultiplicator = 1.0f; + // cWorldStream::ClearDynamics + CRenderer::ConstructRenderList(); +if(gbRenderWorld0) + CRenderer::RenderWorld(0); // roads + // CMattRenderer::ResetRenderStates + CRenderer::PreRender(); + CCoronas::RenderReflections(); +if(gbRenderWorld1) + CRenderer::RenderWorld(1); // opaque +if(gbRenderRoads) + CRenderer::RenderRoads(); + + // not sure where to put these since LCS has no underwater entities +if(gbRenderFadingInUnderwaterEntities) + CRenderer::RenderFadingInUnderwaterEntities(); +if(gbRenderWater) + CWaterLevel::RenderTransparentWater(); + +if(gbRenderEverythingBarRoads) + CRenderer::RenderEverythingBarRoads(); + // get env map here? + // moved this: + // CRenderer::RenderFadingInEntities(); +} + +void +RenderScene_new(void) +{ + CClouds::Render(); + DoRWRenderHorizon(); + + MattRenderScene(); + DefinedState(); + // CMattRenderer::ResetRenderStates +if(gbRenderBoats) + CRenderer::RenderBoats(); +} + +// TODO +bool FredIsInFirstPersonCam(void) { return false; } + +void +RenderEffects_new(void) +{ + CShadows::RenderStaticShadows(); + // CRenderer::GenerateEnvironmentMap + CShadows::RenderStoredShadows(); + CSkidmarks::Render(); + CRubbish::Render(); + + // these aren't really effects + DefinedState(); + if(FredIsInFirstPersonCam()){ + DefinedState(); + C3dMarkers::Render(); // normally rendered in CSpecialFX::Render() +if(gbRenderWorld2) + CRenderer::RenderWorld(2); // transparent +if(gbRenderVehicles) + CRenderer::RenderVehiclesAndPeds(); + }else{ +if(gbRenderVehicles) + CRenderer::RenderVehiclesAndPeds(); +if(gbRenderWorld2) + CRenderer::RenderWorld(2); // transparent + } + // better render these after transparent world +if(gbRenderFadingInEntities) + CRenderer::RenderFadingInEntities(); + + // actual effects here + CGlass::Render(); + // CMattRenderer::ResetRenderStates + DefinedState(); + CCoronas::RenderSunReflection(); + CWeather::RenderRainStreaks(); + // CWeather::AddSnow + CWaterCannons::Render(); + CAntennas::Render(); + CSpecialFX::Render(); + CRopes::Render(); + CCoronas::Render(); + CParticle::Render(); + CPacManPickups::Render(); + CWeaponEffects::Render(); + CPointLights::RenderFogEffect(); + CMovingThings::Render(); + CRenderer::RenderFirstPersonVehicle(); +} +#endif + void RenderScene(void) { +#ifdef NEW_RENDERER + if(gbNewRenderer){ + RenderScene_new(); + return; + } +#endif CClouds::Render(); DoRWRenderHorizon(); CRenderer::RenderRoads(); @@ -885,6 +1008,12 @@ RenderDebugShit(void) void RenderEffects(void) { +#ifdef NEW_RENDERER + if(gbNewRenderer){ + RenderEffects_new(); + return; + } +#endif CGlass::Render(); CWaterCannons::Render(); CSpecialFX::Render(); @@ -1061,6 +1190,10 @@ Idle(void *arg) pos.y = SCREEN_HEIGHT / 2.0f; RsMouseSetPos(&pos); #endif +#ifdef NEW_RENDERER + if(!gbNewRenderer) +#endif +{ tbStartTimer(0, "CnstrRenderList"); #ifdef PC_WATER CWaterLevel::PreCalcWaterGeometry(); @@ -1071,6 +1204,7 @@ Idle(void *arg) tbStartTimer(0, "PreRender"); CRenderer::PreRender(); tbEndTimer("PreRender"); +} #ifdef FIX_BUGS RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)FALSE); // TODO: temp? this fixes OpenGL render but there should be a better place for this diff --git a/src/core/main.h b/src/core/main.h index 8bf06c30..f428224e 100644 --- a/src/core/main.h +++ b/src/core/main.h @@ -38,3 +38,8 @@ void ResetLoadingScreenBar(void); #ifndef MASTER void TheModelViewer(void); #endif + +#ifdef NEW_RENDERER +extern bool gbNewRenderer; +bool FredIsInFirstPersonCam(void); +#endif diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 318b1d47..d40ad728 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -422,6 +422,28 @@ DebugMenuPopulate(void) DebugMenuAddVarBool8("Render", "Frame limiter", &FrontEndMenuManager.m_PrefsFrameLimiter, nil); DebugMenuAddVarBool8("Render", "VSynch", &FrontEndMenuManager.m_PrefsVsync, nil); DebugMenuAddVar("Render", "Max FPS", &RsGlobal.maxFPS, nil, 1, 1, 1000, nil); + DebugMenuAddVarBool8("Render", "new renderer", &gbNewRenderer, nil); +extern bool gbRenderRoads; +extern bool gbRenderEverythingBarRoads; +extern bool gbRenderFadingInUnderwaterEntities; +extern bool gbRenderFadingInEntities; +extern bool gbRenderWater; +extern bool gbRenderBoats; +extern bool gbRenderVehicles; +extern bool gbRenderWorld0; +extern bool gbRenderWorld1; +extern bool gbRenderWorld2; + DebugMenuAddVarBool8("Render", "gbRenderRoads", &gbRenderRoads, nil); + DebugMenuAddVarBool8("Render", "gbRenderEverythingBarRoads", &gbRenderEverythingBarRoads, nil); + DebugMenuAddVarBool8("Render", "gbRenderFadingInUnderwaterEntities", &gbRenderFadingInUnderwaterEntities, nil); + DebugMenuAddVarBool8("Render", "gbRenderFadingInEntities", &gbRenderFadingInEntities, nil); + DebugMenuAddVarBool8("Render", "gbRenderWater", &gbRenderWater, nil); + DebugMenuAddVarBool8("Render", "gbRenderBoats", &gbRenderBoats, nil); + DebugMenuAddVarBool8("Render", "gbRenderVehicles", &gbRenderVehicles, nil); + DebugMenuAddVarBool8("Render", "gbRenderWorld0", &gbRenderWorld0, nil); + DebugMenuAddVarBool8("Render", "gbRenderWorld1", &gbRenderWorld1, nil); + DebugMenuAddVarBool8("Render", "gbRenderWorld2", &gbRenderWorld2, nil); + #ifdef EXTENDED_COLOURFILTER static const char *filternames[] = { "None", "Simple", "Normal", "Mobile" }; e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_MOBILE, filternames); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 3b996b55..5ff5aa22 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1,3 +1,4 @@ +#define WITH_D3D #include "common.h" #include "main.h" @@ -47,12 +48,27 @@ int32 CRenderer::ms_nNoOfVisibleEntities; CEntity *CRenderer::ms_aVisibleEntityPtrs[NUMVISIBLEENTITIES]; CEntity *CRenderer::ms_aInVisibleEntityPtrs[NUMINVISIBLEENTITIES]; int32 CRenderer::ms_nNoOfInVisibleEntities; +#ifdef NEW_RENDERER +int32 CRenderer::ms_nNoOfVisibleVehicles; +CEntity *CRenderer::ms_aVisibleVehiclePtrs[NUMVISIBLEENTITIES]; +int32 CRenderer::ms_nNoOfVisibleBuildings; +CEntity *CRenderer::ms_aVisibleBuildingPtrs[NUMVISIBLEENTITIES]; +#endif CVector CRenderer::ms_vecCameraPosition; CVehicle *CRenderer::m_pFirstPersonVehicle; bool CRenderer::m_loadingPriority; float CRenderer::ms_lodDistScale = 1.2f; +#ifdef FIX_BUGS +#define LOD_DISTANCE (300.0f*TheCamera.LODDistMultiplier) +#else +#define LOD_DISTANCE 300.0f +#endif +#define FADE_DISTANCE 20.0f +#define STREAM_DISTANCE 30.0f + + void CRenderer::Init(void) { @@ -75,6 +91,20 @@ CRenderer::PreRender(void) for(i = 0; i < ms_nNoOfVisibleEntities; i++) ms_aVisibleEntityPtrs[i]->PreRender(); +#ifdef NEW_RENDERER + if(gbNewRenderer){ + for(i = 0; i < ms_nNoOfVisibleVehicles; i++) + ms_aVisibleVehiclePtrs[i]->PreRender(); + // How is this done with cWorldStream? + for(i = 0; i < ms_nNoOfVisibleBuildings; i++) + ms_aVisibleBuildingPtrs[i]->PreRender(); + for(node = CVisibilityPlugins::m_alphaBuildingList.head.next; + node != &CVisibilityPlugins::m_alphaBuildingList.tail; + node = node->next) + ((CEntity*)node->item.entity)->PreRender(); + } +#endif + for (i = 0; i < ms_nNoOfInVisibleEntities; i++) { #ifdef SQUEEZE_PERFORMANCE if (ms_aInVisibleEntityPtrs[i]->IsVehicle() && ((CVehicle*)ms_aInVisibleEntityPtrs[i])->IsHeli()) @@ -230,7 +260,6 @@ CRenderer::RenderEverythingBarRoads(void) { int i; CEntity *e; - CVector dist; EntityInfo ei; RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); @@ -253,12 +282,10 @@ CRenderer::RenderEverythingBarRoads(void) e->IsPed() && CVisibilityPlugins::GetClumpAlpha((RpClump*)e->m_rwObject) != 255){ if(e->IsVehicle() && PutIntoSortedVehicleList((CVehicle*)e)){ ei.ent = e; - dist = ms_vecCameraPosition - e->GetPosition(); - ei.sort = dist.MagnitudeSqr(); + ei.sort = (ms_vecCameraPosition - e->GetPosition()).MagnitudeSqr(); gSortedVehiclesAndPeds.InsertSorted(ei); }else{ - dist = ms_vecCameraPosition - e->GetPosition(); - if(!CVisibilityPlugins::InsertEntityIntoSortedList(e, dist.Magnitude())){ + if(!CVisibilityPlugins::InsertEntityIntoSortedList(e, (ms_vecCameraPosition - e->GetPosition()).Magnitude())){ printf("Ran out of space in alpha entity list"); RenderOneNonRoad(e); } @@ -277,6 +304,24 @@ CRenderer::RenderBoats(void) RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); SetCullMode(rwCULLMODECULLBACK); +#ifdef NEW_RENDERER + int i; + CEntity *e; + EntityInfo ei; + if(gbNewRenderer){ + gSortedVehiclesAndPeds.Clear(); + // not the real thing + for(i = 0; i < ms_nNoOfVisibleVehicles; i++){ + e = ms_aVisibleVehiclePtrs[i]; + if(e->IsVehicle() && PutIntoSortedVehicleList((CVehicle*)e)){ + ei.ent = e; + ei.sort = (ms_vecCameraPosition - e->GetPosition()).MagnitudeSqr(); + gSortedVehiclesAndPeds.InsertSorted(ei); + } + } + } +#endif + for(node = gSortedVehiclesAndPeds.tail.prev; node != &gSortedVehiclesAndPeds.head; node = node->prev){ @@ -285,6 +330,464 @@ CRenderer::RenderBoats(void) } } +#ifdef NEW_RENDERER +#ifndef LIBRW +#error "Need librw for EXTENDED_PIPELINES" +#endif + +enum { + // blend passes + PASS_NOZ, // no z-write + PASS_ADD, // additive + PASS_BLEND // normal blend +}; + +static RwRGBAReal black; + +#ifdef RW_D3D9 +struct BuildingInst +{ + rw::RawMatrix combinedMat; + rw::d3d9::InstanceDataHeader *instHeader; + uint8 fadeAlpha; + bool lighting; +}; +static BuildingInst blendInsts[3][2000]; +static int numBlendInsts[3]; + +static void +SetMatrix(BuildingInst *building, rw::Matrix *worldMat) +{ + using namespace rw; + RawMatrix world, worldview; + Camera *cam = engine->currentCamera; + convMatrix(&world, worldMat); + RawMatrix::mult(&worldview, &world, &cam->devView); + RawMatrix::mult(&building->combinedMat, &worldview, &cam->devProj); +} + +static bool +IsTextureTransparent(RwTexture *tex) +{ + if(tex == nil || tex->raster == nil) + return false; + return PLUGINOFFSET(rw::d3d::D3dRaster, tex->raster, rw::d3d::nativeRasterOffset)->hasAlpha; +} + +// Render all opaque meshes and put atomics that needs blending +// into the deferred list. +static void +AtomicFirstPass(RpAtomic *atomic, int pass) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_D3D9); + building->fadeAlpha = 255; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + + bool setupDone = false; + bool defer = false; + SetMatrix(building, atomic->getFrame()->getLTM()); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ + Material *m = inst->material; + + if(inst->vertexAlpha || m->color.alpha != 255 || + IsTextureTransparent(m->texture)){ + defer = true; + continue; + } + + // alright we're rendering this atomic + if(!setupDone){ + setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); + setIndices(building->instHeader->indexBuffer); + setVertexDeclaration(building->instHeader->vertexDeclaration); + setVertexShader(default_amb_VS); + d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); + if(building->lighting) + setAmbient(pAmbient->color); + else + setAmbient(black); + setupDone = true; + } + + setMaterial(m->color, m->surfaceProps); + + if(m->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); + + drawInst(building->instHeader, inst); + } + if(defer) + numBlendInsts[pass]++; +} + +static void +AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_D3D9); + building->fadeAlpha = fadeAlpha; + SetMatrix(building, atomic->getFrame()->getLTM()); + numBlendInsts[pass]++; +} + +static void +RenderBlendPass(int pass) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + setVertexShader(default_amb_VS); + + int i; + for(i = 0; i < numBlendInsts[pass]; i++){ + BuildingInst *building = &blendInsts[pass][i]; + + setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); + setIndices(building->instHeader->indexBuffer); + setVertexDeclaration(building->instHeader->vertexDeclaration); + d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); + if(building->lighting) + setAmbient(pAmbient->color); + else + setAmbient(black); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ + Material *m = inst->material; + if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) + continue; // already done this one + + rw::RGBA color = m->color; + color.alpha = (color.alpha * building->fadeAlpha)/255; + setMaterial(color, m->surfaceProps); + + if(m->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); + + drawInst(building->instHeader, inst); + } + } +} +#endif +#ifdef RW_GL3 +struct BuildingInst +{ + rw::Matrix matrix; + rw::gl3::InstanceDataHeader *instHeader; + uint8 fadeAlpha; + bool lighting; +}; +static BuildingInst blendInsts[3][2000]; +static int numBlendInsts[3]; + +static bool +IsTextureTransparent(RwTexture *tex) +{ + if(tex == nil || tex->raster == nil) + return false; + return PLUGINOFFSET(rw::gl3::Gl3Raster, tex->raster, rw::gl3::nativeRasterOffset)->hasAlpha; +} + +// Render all opaque meshes and put atomics that needs blending +// into the deferred list. +static void +AtomicFirstPass(RpAtomic *atomic, int pass) +{ + using namespace rw; + using namespace rw::gl3; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_GL3); + building->fadeAlpha = 255; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + + WorldLights lights; + lights.numAmbients = 1; + lights.numDirectionals = 0; + lights.numLocals = 0; + if(building->lighting) + lights.ambient = pAmbient->color; + else + lights.ambient = black; + + bool setupDone = false; + bool defer = false; + building->matrix = *atomic->getFrame()->getLTM(); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ + Material *m = inst->material; + + if(inst->vertexAlpha || m->color.alpha != 255 || + IsTextureTransparent(m->texture)){ + defer = true; + continue; + } + + // alright we're rendering this atomic + if(!setupDone){ + defaultShader->use(); + setWorldMatrix(&building->matrix); +#ifdef RW_GL_USE_VAOS + glBindVertexArray(building->instHeader->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); + glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); + setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + setLights(&lights); + setupDone = true; + } + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + drawInst(building->instHeader, inst); + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + if(defer) + numBlendInsts[pass]++; +} + +static void +AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) +{ + using namespace rw; + using namespace rw::gl3; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_GL3); + building->fadeAlpha = fadeAlpha; + building->matrix = *atomic->getFrame()->getLTM(); + numBlendInsts[pass]++; +} + +static void +RenderBlendPass(int pass) +{ + using namespace rw; + using namespace rw::gl3; + + defaultShader->use(); + WorldLights lights; + lights.numAmbients = 1; + lights.numDirectionals = 0; + lights.numLocals = 0; + + int i; + for(i = 0; i < numBlendInsts[pass]; i++){ + BuildingInst *building = &blendInsts[pass][i]; + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(building->instHeader->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); + glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); + setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + setWorldMatrix(&building->matrix); + if(building->lighting) + lights.ambient = pAmbient->color; + else + lights.ambient = black; + setLights(&lights); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ + Material *m = inst->material; + if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) + continue; // already done this one + + rw::RGBA color = m->color; + color.alpha = (color.alpha * building->fadeAlpha)/255; + setMaterial(color, m->surfaceProps); + + setTexture(0, m->texture); + + drawInst(building->instHeader, inst); + } + } +} +#endif + +void +CRenderer::RenderOneBuilding(CEntity *ent, float camdist) +{ + if(ent->m_rwObject == nil) + return; + assert(RwObjectGetType(ent->m_rwObject) == rpATOMIC); + RpAtomic *atomic = (RpAtomic*)ent->m_rwObject; + CSimpleModelInfo *mi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(ent->GetModelIndex()); + + ent->bImBeingRendered = true; // TODO: this seems wrong, but do we even need it? + + int pass = PASS_BLEND; + if(mi->m_additive) // very questionable + pass = PASS_ADD; + if(mi->m_noZwrite) + pass = PASS_NOZ; + + if(ent->bDistanceFade){ + RpAtomic *lodatm; + float fadefactor; + uint32 alpha; + + lodatm = mi->GetAtomicFromDistance(camdist - FADE_DISTANCE); + fadefactor = (mi->GetLargestLodDistance() - (camdist - FADE_DISTANCE))/FADE_DISTANCE; + if(fadefactor > 1.0f) + fadefactor = 1.0f; + alpha = mi->m_alpha * fadefactor; + + if(alpha == 255) + AtomicFirstPass(atomic, pass); + else{ + // not quite sure what this is about, do we have to do that? + RpGeometry *geo = RpAtomicGetGeometry(lodatm); + if(geo != RpAtomicGetGeometry(atomic)) + RpAtomicSetGeometry(atomic, geo, rpATOMICSAMEBOUNDINGSPHERE); + AtomicFullyTransparent(atomic, pass, alpha); + } + }else + AtomicFirstPass(atomic, pass); + + ent->bImBeingRendered = false; // TODO: this seems wrong, but do we even need it? +} + +void +CRenderer::RenderWorld(int pass) +{ + int i; + CEntity *e; + CLink *node; + + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); + SetCullMode(rwCULLMODECULLBACK); + DeActivateDirectional(); + SetAmbientColours(); + + // Temporary...have to figure out sorting better + switch(pass){ + case 0: + // Roads + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); + for(i = 0; i < ms_nNoOfVisibleBuildings; i++){ + e = ms_aVisibleBuildingPtrs[i]; + if(e->bIsBIGBuilding || IsRoad(e)) + RenderOneBuilding(e); + } + for(node = CVisibilityPlugins::m_alphaBuildingList.tail.prev; + node != &CVisibilityPlugins::m_alphaBuildingList.head; + node = node->prev){ + e = node->item.entity; + if(e->bIsBIGBuilding || IsRoad(e)) + RenderOneBuilding(e, node->item.sort); + } + break; + case 1: + // Opaque + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); + for(i = 0; i < ms_nNoOfVisibleBuildings; i++){ + e = ms_aVisibleBuildingPtrs[i]; + if(!(e->bIsBIGBuilding || IsRoad(e))) + RenderOneBuilding(e); + } + for(node = CVisibilityPlugins::m_alphaBuildingList.tail.prev; + node != &CVisibilityPlugins::m_alphaBuildingList.head; + node = node->prev){ + e = node->item.entity; + if(!(e->bIsBIGBuilding || IsRoad(e))) + RenderOneBuilding(e, node->item.sort); + } + // Now we have iterated through all visible buildings (unsorted and sorted) + // and the transparency list is done. + + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE); + RenderBlendPass(PASS_NOZ); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); + break; + case 2: + // Transparent + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); + RenderBlendPass(PASS_ADD); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + RenderBlendPass(PASS_BLEND); + break; + } +} + +void +CRenderer::RenderVehiclesAndPeds(void) +{ + int i; + CEntity *e; + + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); + //CVisibilityPlugins::InitAlphaEntityList(); // not safe yet + + // not the real thing + for(i = 0; i < ms_nNoOfVisibleVehicles; i++){ + e = ms_aVisibleVehiclePtrs[i]; + if(e->IsVehicle() && PutIntoSortedVehicleList((CVehicle*)e)) + continue; + RenderOneNonRoad(e); + } +// RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); +} + +void +CRenderer::ClearForFrame(void) +{ + ms_nNoOfVisibleEntities = 0; + ms_nNoOfVisibleVehicles = 0; + ms_nNoOfVisibleBuildings = 0; + ms_nNoOfInVisibleEntities = 0; + gSortedVehiclesAndPeds.Clear(); + + numBlendInsts[PASS_NOZ] = 0; + numBlendInsts[PASS_ADD] = 0; + numBlendInsts[PASS_BLEND] = 0; +} +#endif + void CRenderer::RenderFadingInEntities(void) { @@ -327,14 +830,6 @@ enum Visbility VIS_STREAMME }; -#ifdef FIX_BUGS -#define LOD_DISTANCE (300.0f*TheCamera.LODDistMultiplier) -#else -#define LOD_DISTANCE 300.0f -#endif -#define FADE_DISTANCE 20.0f -#define STREAM_DISTANCE 30.0f - // Time Objects can be time culled if // other == -1 || CModelInfo::GetModelInfo(other)->GetRwObject() // i.e. we have to draw even at the wrong time if @@ -640,9 +1135,13 @@ void CRenderer::ConstructRenderList(void) { COcclusion::ProcessBeforeRendering(); - +#ifdef NEW_RENDERER + if(!gbNewRenderer) +#endif +{ ms_nNoOfVisibleEntities = 0; ms_nNoOfInVisibleEntities = 0; +} ms_vecCameraPosition = TheCamera.GetPosition(); // TODO: blocked ranges, but unused ScanWorld(); @@ -1058,6 +1557,14 @@ CRenderer::ScanBigBuildingList(CPtrList &list) vis = VIS_VISIBLE; switch(vis){ case VIS_VISIBLE: +#ifdef NEW_RENDERER + // TODO: this isn't quite right... + if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) + ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; + else if(gbNewRenderer && ent->IsBuilding()) + ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; + else +#endif ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; ent->bOffscreen = false; break; @@ -1089,6 +1596,14 @@ CRenderer::ScanSectorList(CPtrList *lists) switch(SetupEntityVisibility(ent)){ case VIS_VISIBLE: +#ifdef NEW_RENDERER + // TODO: this isn't quite right... + if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) + ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; + else if(gbNewRenderer && ent->IsBuilding()) + ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; + else +#endif ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; break; case VIS_INVISIBLE: @@ -1134,6 +1649,14 @@ CRenderer::ScanSectorList_Priority(CPtrList *lists) switch(SetupEntityVisibility(ent)){ case VIS_VISIBLE: +#ifdef NEW_RENDERER + // TODO: this isn't quite right... + if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) + ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; + else if(gbNewRenderer && ent->IsBuilding()) + ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; + else +#endif ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; break; case VIS_INVISIBLE: @@ -1181,6 +1704,14 @@ CRenderer::ScanSectorList_Subway(CPtrList *lists) ent->bOffscreen = false; switch(SetupEntityVisibility(ent)){ case VIS_VISIBLE: +#ifdef NEW_RENDERER + // TODO: this isn't quite right... + if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) + ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; + else if(gbNewRenderer && ent->IsBuilding()) + ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; + else +#endif ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; break; case VIS_OFFSCREEN: diff --git a/src/render/Renderer.h b/src/render/Renderer.h index e9f82078..814d3105 100644 --- a/src/render/Renderer.h +++ b/src/render/Renderer.h @@ -21,6 +21,13 @@ class CRenderer static CEntity *ms_aVisibleEntityPtrs[NUMVISIBLEENTITIES]; static int32 ms_nNoOfInVisibleEntities; static CEntity *ms_aInVisibleEntityPtrs[NUMINVISIBLEENTITIES]; +#ifdef NEW_RENDERER + static int32 ms_nNoOfVisibleVehicles; + static CEntity *ms_aVisibleVehiclePtrs[NUMVISIBLEENTITIES]; + // for cWorldStream emulation + static int32 ms_nNoOfVisibleBuildings; + static CEntity *ms_aVisibleBuildingPtrs[NUMVISIBLEENTITIES]; +#endif static CVector ms_vecCameraPosition; static CVehicle *m_pFirstPersonVehicle; @@ -63,4 +70,12 @@ public: static bool ShouldModelBeStreamed(CEntity *ent, const CVector &campos); static void RemoveVehiclePedLights(CEntity *ent, bool reset); + + +#ifdef NEW_RENDERER + static void ClearForFrame(void); + static void RenderVehiclesAndPeds(void); // just called RenderVehicles in LCS + static void RenderOneBuilding(CEntity *ent, float camdist = 0.0f); + static void RenderWorld(int pass); // like cWorldStream::Render(int) +#endif }; diff --git a/src/render/SpecialFX.cpp b/src/render/SpecialFX.cpp index 7864b0f0..7125bda8 100644 --- a/src/render/SpecialFX.cpp +++ b/src/render/SpecialFX.cpp @@ -169,6 +169,9 @@ CSpecialFX::Render(void) CBrightLights::Render(); CShinyTexts::Render(); CMoneyMessages::Render(); +#ifdef NEW_RENDERER + if(!(gbNewRenderer && FredIsInFirstPersonCam())) +#endif C3dMarkers::Render(); } diff --git a/src/rw/VisibilityPlugins.cpp b/src/rw/VisibilityPlugins.cpp index 36a60117..c79cb52b 100644 --- a/src/rw/VisibilityPlugins.cpp +++ b/src/rw/VisibilityPlugins.cpp @@ -1,6 +1,7 @@ #include "common.h" #include "templates.h" +#include "main.h" #include "Entity.h" #include "ModelInfo.h" #include "Lights.h" @@ -19,6 +20,9 @@ CLinkList CVisibilityPlugins::m_alphaList; CLinkList CVisibilityPlugins::m_alphaBoatAtomicList; CLinkList CVisibilityPlugins::m_alphaEntityList; CLinkList CVisibilityPlugins::m_alphaUnderwaterEntityList; +#ifdef NEW_RENDERER +CLinkList CVisibilityPlugins::m_alphaBuildingList; +#endif int32 CVisibilityPlugins::ms_atomicPluginOffset = -1; int32 CVisibilityPlugins::ms_framePluginOffset = -1; @@ -59,6 +63,11 @@ CVisibilityPlugins::Initialise(void) m_alphaUnderwaterEntityList.head.item.sort = 0.0f; m_alphaUnderwaterEntityList.tail.item.sort = 100000000.0f; +#ifdef NEW_RENDERER + m_alphaBuildingList.Init(NUMALPHAENTITYLIST); + m_alphaBuildingList.head.item.sort = 0.0f; + m_alphaBuildingList.tail.item.sort = 100000000.0f; +#endif } void @@ -68,6 +77,9 @@ CVisibilityPlugins::Shutdown(void) m_alphaBoatAtomicList.Shutdown(); m_alphaEntityList.Shutdown(); m_alphaUnderwaterEntityList.Shutdown(); +#ifdef NEW_RENDERER + m_alphaBuildingList.Shutdown(); +#endif } void @@ -76,6 +88,9 @@ CVisibilityPlugins::InitAlphaEntityList(void) m_alphaEntityList.Clear(); m_alphaBoatAtomicList.Clear(); m_alphaUnderwaterEntityList.Clear(); +#ifdef NEW_RENDERER + m_alphaBuildingList.Clear(); +#endif } bool @@ -84,6 +99,10 @@ CVisibilityPlugins::InsertEntityIntoSortedList(CEntity *e, float dist) AlphaObjectInfo item; item.entity = e; item.sort = dist; +#ifdef NEW_RENDERER + if(gbNewRenderer && e->IsBuilding()) + return !!m_alphaBuildingList.InsertSorted(item); +#endif if(e->bUnderwater && m_alphaUnderwaterEntityList.InsertSorted(item)) return true; return !!m_alphaEntityList.InsertSorted(item); @@ -308,7 +327,7 @@ CVisibilityPlugins::RenderFadingAtomic(RpAtomic *atomic, float camdist) mi = GetAtomicModelInfo(atomic); lodatm = mi->GetAtomicFromDistance(camdist - FADE_DISTANCE); if(mi->m_additive) - AtomicDefaultRenderCallBack(atomic); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); fadefactor = (mi->GetLargestLodDistance() - (camdist - FADE_DISTANCE))/FADE_DISTANCE; if(fadefactor > 1.0f) diff --git a/src/rw/VisibilityPlugins.h b/src/rw/VisibilityPlugins.h index f277565d..03833c9c 100644 --- a/src/rw/VisibilityPlugins.h +++ b/src/rw/VisibilityPlugins.h @@ -24,6 +24,9 @@ public: static CLinkList m_alphaBoatAtomicList; static CLinkList m_alphaEntityList; static CLinkList m_alphaUnderwaterEntityList; +#ifdef NEW_RENDERER + static CLinkList m_alphaBuildingList; +#endif static RwCamera *ms_pCamera; static RwV3d *ms_pCameraPosn; static float ms_cullCompsDist; diff --git a/vendor/librw b/vendor/librw index e68ef137..8c00f787 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit e68ef1374d20071887348e9031f5fa38a2e4f7ed +Subproject commit 8c00f787cb8f53781c4335ecbc9d28fb9c664ba7 From e1279b01bc2398ac46596d77cad84faf67fb6172 Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 3 Nov 2020 20:40:33 +0100 Subject: [PATCH 22/45] forget ifdef --- src/core/re3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/re3.cpp b/src/core/re3.cpp index d40ad728..ebfa8de5 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -422,6 +422,7 @@ DebugMenuPopulate(void) DebugMenuAddVarBool8("Render", "Frame limiter", &FrontEndMenuManager.m_PrefsFrameLimiter, nil); DebugMenuAddVarBool8("Render", "VSynch", &FrontEndMenuManager.m_PrefsVsync, nil); DebugMenuAddVar("Render", "Max FPS", &RsGlobal.maxFPS, nil, 1, 1, 1000, nil); +#ifdef NEW_RENDERER DebugMenuAddVarBool8("Render", "new renderer", &gbNewRenderer, nil); extern bool gbRenderRoads; extern bool gbRenderEverythingBarRoads; @@ -443,6 +444,7 @@ extern bool gbRenderWorld2; DebugMenuAddVarBool8("Render", "gbRenderWorld0", &gbRenderWorld0, nil); DebugMenuAddVarBool8("Render", "gbRenderWorld1", &gbRenderWorld1, nil); DebugMenuAddVarBool8("Render", "gbRenderWorld2", &gbRenderWorld2, nil); +#endif #ifdef EXTENDED_COLOURFILTER static const char *filternames[] = { "None", "Simple", "Normal", "Mobile" }; From 89b622eea861f5566dc61d8d35fc72ea4bcb8f1d Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Wed, 4 Nov 2020 11:37:17 +0300 Subject: [PATCH 23/45] FORMAT --- src/audio/AudioLogic.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 3c95273a..be9758e4 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -300,7 +300,7 @@ CVehicle *cAudioManager::FindVehicleOfPlayer() void cAudioManager::ProcessPlayerMood() { - CPlayerPed* playerPed; + CPlayerPed *playerPed; uint32* lastMisstonPassedTime; uint32 curTime = CTimer::GetTimeInMilliseconds(); @@ -336,7 +336,7 @@ cAudioManager::ProcessPlayerMood() void cAudioManager::ProcessSpecial() { - CPlayerPed* playerPed; + CPlayerPed *playerPed; if (m_nUserPause) { if (!m_nPreviousUserPause) { @@ -867,7 +867,7 @@ cAudioManager::ProcessRainOnVehicle(cVehicleParams *params) { const int SOUND_INTENSITY = 22.0f; - CVehicle* veh; + CVehicle *veh; uint8 emittingVol; if (params->m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain()) @@ -1147,7 +1147,7 @@ cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params) } bool -cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params) +cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params) { const float SOUND_INTENSITY = 95.0f; @@ -1215,7 +1215,7 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params) } bool -cAudioManager::ProcessWetRoadNoise(cVehicleParams* params) +cAudioManager::ProcessWetRoadNoise(cVehicleParams *params) { const float SOUND_INTENSITY = 30.0f; @@ -2166,7 +2166,7 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) } float -cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange) +cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange) { float relativeVelChange = 0.0f; float velChange; @@ -2201,7 +2201,7 @@ cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelSta } float -cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, cTransmission *transmission, float velocityChange) +cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange) { float relativeVelChange = 0.0f; @@ -2212,7 +2212,7 @@ cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheel } bool -cAudioManager::ProcessVehicleHorn(cVehicleParams* params) +cAudioManager::ProcessVehicleHorn(cVehicleParams *params) { const float SOUND_INTENSITY = 40.0f; @@ -2288,11 +2288,11 @@ cAudioManager::UsesSirenSwitching(cVehicleParams *params) const } bool -cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams* params) +cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams *params) { const float SOUND_INTENSITY = 110.0f; - CVehicle* veh; + CVehicle *veh; uint8 volume; if (params->m_fDistance >= SQR(SOUND_INTENSITY)) @@ -2948,8 +2948,8 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) } case SOUND_WEAPON_SHOT_FIRED: { const float SOUND_INTENSITY = 120.0f; - CVehicle* playerVeh; - CPlayerPed* playerPed; + CVehicle *playerVeh; + CPlayerPed *playerPed; switch (params->m_pVehicle->m_modelIndex) { case MI_HUNTER: @@ -2962,7 +2962,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) if (Pads[0].GetHandBrake() == 0) { playerVeh = FindPlayerVehicle(); playerPed = FindPlayerPed(); - if (playerVeh == 0 && playerPed != 0) { + if (playerVeh == nil && playerPed != nil) { if (playerPed->m_attachedTo != nil && playerPed->m_attachedTo->GetType() == ENTITY_TYPE_VEHICLE) playerVeh = (CVehicle*)playerPed->m_attachedTo; } @@ -3842,9 +3842,9 @@ DoJumboVolOffset() } void -cAudioManager::ProcessJumbo(cVehicleParams* params) +cAudioManager::ProcessJumbo(cVehicleParams *params) { - CPlane* plane; + CPlane *plane; float position; if (params->m_fDistance >= SQR(440)) From 244b91ee80217ed220338c7cb0e4e98cc9fe085a Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 4 Nov 2020 16:22:15 +0100 Subject: [PATCH 24/45] fixed boats for new renderer --- src/core/main.cpp | 22 +++--- src/render/Renderer.cpp | 144 ++++++++++++++++++++++++++++++---------- src/render/Renderer.h | 2 + src/vehicles/Boat.cpp | 20 ++++++ src/vehicles/Boat.h | 3 +- vendor/librw | 2 +- 6 files changed, 146 insertions(+), 47 deletions(-) diff --git a/src/core/main.cpp b/src/core/main.cpp index 0b3bb549..a057e55b 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -109,6 +109,9 @@ void DebugMenuPopulate(void); #ifdef NEW_RENDERER bool gbNewRenderer; +#define CLEARMODE (rwCAMERACLEARZ | rwCAMERACLEARSTENCIL) +#else +#define CLEARMODE (rwCAMERACLEARZ) #endif void @@ -155,7 +158,7 @@ DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomR CDraw::CalculateAspectRatio(); CameraSize(Scene.camera, nil, SCREEN_VIEWWINDOW, SCREEN_ASPECT_RATIO); CVisibilityPlugins::SetRenderWareCamera(Scene.camera); - RwCameraClear(Scene.camera, &TopColor.rwRGBA, rwCAMERACLEARZ); + RwCameraClear(Scene.camera, &TopColor.rwRGBA, CLEARMODE); if(!RsCameraBeginUpdate(Scene.camera)) return false; @@ -174,7 +177,7 @@ DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 CDraw::CalculateAspectRatio(); CameraSize(Scene.camera, nil, SCREEN_VIEWWINDOW, SCREEN_ASPECT_RATIO); CVisibilityPlugins::SetRenderWareCamera(Scene.camera); - RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ); + RwCameraClear(Scene.camera, &gColourTop, CLEARMODE); if(!RsCameraBeginUpdate(Scene.camera)) return false; @@ -873,7 +876,7 @@ MattRenderScene(void) // CMattRenderer::ResetRenderStates CRenderer::ClearForFrame(); // CClock::CalcEnvMapTimeMultiplicator -if(gbRenderWater) +//if(gbRenderWater) CWaterLevel::RenderWater(); // actually CMattRenderer::RenderWater // CClock::ms_EnvMapTimeMultiplicator = 1.0f; // cWorldStream::ClearDynamics @@ -889,10 +892,12 @@ if(gbRenderRoads) CRenderer::RenderRoads(); // not sure where to put these since LCS has no underwater entities +if(gbRenderBoats) + CRenderer::RenderBoats(); if(gbRenderFadingInUnderwaterEntities) CRenderer::RenderFadingInUnderwaterEntities(); if(gbRenderWater) - CWaterLevel::RenderTransparentWater(); + CRenderer::RenderTransparentWater(); if(gbRenderEverythingBarRoads) CRenderer::RenderEverythingBarRoads(); @@ -910,8 +915,7 @@ RenderScene_new(void) MattRenderScene(); DefinedState(); // CMattRenderer::ResetRenderStates -if(gbRenderBoats) - CRenderer::RenderBoats(); + // moved CRenderer::RenderBoats to before transparent water } // TODO @@ -1259,7 +1263,7 @@ Idle(void *arg) CameraSize(Scene.camera, nil, SCREEN_VIEWWINDOW, DEFAULT_ASPECT_RATIO); #endif CVisibilityPlugins::SetRenderWareCamera(Scene.camera); - RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ); + RwCameraClear(Scene.camera, &gColourTop, CLEARMODE); if(!RsCameraBeginUpdate(Scene.camera)) return; } @@ -1308,7 +1312,7 @@ FrontendIdle(void) CameraSize(Scene.camera, nil, SCREEN_VIEWWINDOW, SCREEN_ASPECT_RATIO); CVisibilityPlugins::SetRenderWareCamera(Scene.camera); - RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ); + RwCameraClear(Scene.camera, &gColourTop, CLEARMODE); if(!RsCameraBeginUpdate(Scene.camera)) return; @@ -1584,7 +1588,7 @@ void TheGame(void) { CameraSize(Scene.camera, NULL, SCREEN_VIEWWINDOW, SCREEN_ASPECT_RATIO); CVisibilityPlugins::SetRenderWareCamera(Scene.camera); - RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ); + RwCameraClear(Scene.camera, &gColourTop, CLEARMODE); if (!RsCameraBeginUpdate(Scene.camera)) break; } diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 5ff5aa22..01600c0d 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -7,6 +7,7 @@ #include "Treadable.h" #include "Ped.h" #include "Vehicle.h" +#include "Boat.h" #include "Heli.h" #include "Bike.h" #include "Object.h" @@ -334,6 +335,7 @@ CRenderer::RenderBoats(void) #ifndef LIBRW #error "Need librw for EXTENDED_PIPELINES" #endif +#include "WaterLevel.h" enum { // blend passes @@ -355,6 +357,34 @@ struct BuildingInst static BuildingInst blendInsts[3][2000]; static int numBlendInsts[3]; +static void +SetStencilState(int state) +{ + switch(state){ + // disable stencil + case 0: + rw::d3d::setRenderState(D3DRS_STENCILENABLE, FALSE); + break; + // test against stencil + case 1: + rw::d3d::setRenderState(D3DRS_STENCILENABLE, TRUE); + rw::d3d::setRenderState(D3DRS_STENCILFUNC, D3DCMP_NOTEQUAL); + rw::d3d::setRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); + rw::d3d::setRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); + rw::d3d::setRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); + rw::d3d::setRenderState(D3DRS_STENCILMASK, 0xFF); + rw::d3d::setRenderState(D3DRS_STENCILREF, 0xFF); + break; + // write to stencil + case 2: + rw::d3d::setRenderState(D3DRS_STENCILENABLE, TRUE); + rw::d3d::setRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); + rw::d3d::setRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); + rw::d3d::setRenderState(D3DRS_STENCILREF, 0xFF); + break; + } +} + static void SetMatrix(BuildingInst *building, rw::Matrix *worldMat) { @@ -448,6 +478,7 @@ AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) assert(building->instHeader != nil); assert(building->instHeader->platform == PLATFORM_D3D9); building->fadeAlpha = fadeAlpha; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); SetMatrix(building, atomic->getFrame()->getLTM()); numBlendInsts[pass]++; } @@ -506,6 +537,30 @@ struct BuildingInst static BuildingInst blendInsts[3][2000]; static int numBlendInsts[3]; +static void +SetStencilState(int state) +{ + switch(state){ + // disable stencil + case 0: + glDisable(GL_STENCIL_TEST); + break; + // test against stencil + case 1: + glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_NOTEQUAL, 0xFF, 0xFF); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + glStencilMask(0xFF); + break; + // write to stencil + case 2: + glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_ALWAYS, 0xFF, 0xFF); + glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); + break; + } +} + static bool IsTextureTransparent(RwTexture *tex) { @@ -595,6 +650,7 @@ AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) assert(building->instHeader != nil); assert(building->instHeader->platform == PLATFORM_GL3); building->fadeAlpha = fadeAlpha; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); building->matrix = *atomic->getFrame()->getLTM(); numBlendInsts[pass]++; } @@ -643,6 +699,9 @@ RenderBlendPass(int pass) drawInst(building->instHeader, inst); } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif } } #endif @@ -773,6 +832,37 @@ CRenderer::RenderVehiclesAndPeds(void) // RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); } +void +CRenderer::RenderTransparentWater(void) +{ + int i; + CEntity *e; + + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); + RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDZERO); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); + SetStencilState(2); + + for(i = 0; i < ms_nNoOfVisibleVehicles; i++){ + e = ms_aVisibleVehiclePtrs[i]; + if(e->IsVehicle() && ((CVehicle*)e)->IsBoat()) + ((CBoat*)e)->RenderWaterOutPolys(); + } + + RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); + SetStencilState(1); + + CWaterLevel::RenderTransparentWater(); + + SetStencilState(0); +} + void CRenderer::ClearForFrame(void) { @@ -1540,6 +1630,20 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL } } +void +CRenderer::InsertEntityIntoList(CEntity *ent) +{ +#ifdef NEW_RENDERER + // TODO: there are more flags being checked here + if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) + ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; + else if(gbNewRenderer && ent->IsBuilding()) + ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; + else +#endif + ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; +} + void CRenderer::ScanBigBuildingList(CPtrList &list) { @@ -1557,15 +1661,7 @@ CRenderer::ScanBigBuildingList(CPtrList &list) vis = VIS_VISIBLE; switch(vis){ case VIS_VISIBLE: -#ifdef NEW_RENDERER - // TODO: this isn't quite right... - if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) - ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; - else if(gbNewRenderer && ent->IsBuilding()) - ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; - else -#endif - ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; + InsertEntityIntoList(ent); ent->bOffscreen = false; break; case VIS_STREAMME: @@ -1596,15 +1692,7 @@ CRenderer::ScanSectorList(CPtrList *lists) switch(SetupEntityVisibility(ent)){ case VIS_VISIBLE: -#ifdef NEW_RENDERER - // TODO: this isn't quite right... - if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) - ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; - else if(gbNewRenderer && ent->IsBuilding()) - ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; - else -#endif - ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; + InsertEntityIntoList(ent); break; case VIS_INVISIBLE: if(!IsGlass(ent->GetModelIndex())) @@ -1649,15 +1737,7 @@ CRenderer::ScanSectorList_Priority(CPtrList *lists) switch(SetupEntityVisibility(ent)){ case VIS_VISIBLE: -#ifdef NEW_RENDERER - // TODO: this isn't quite right... - if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) - ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; - else if(gbNewRenderer && ent->IsBuilding()) - ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; - else -#endif - ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; + InsertEntityIntoList(ent); break; case VIS_INVISIBLE: if(!IsGlass(ent->GetModelIndex())) @@ -1704,15 +1784,7 @@ CRenderer::ScanSectorList_Subway(CPtrList *lists) ent->bOffscreen = false; switch(SetupEntityVisibility(ent)){ case VIS_VISIBLE: -#ifdef NEW_RENDERER - // TODO: this isn't quite right... - if(gbNewRenderer && (ent->IsVehicle() || ent->IsPed())) - ms_aVisibleVehiclePtrs[ms_nNoOfVisibleVehicles++] = ent; - else if(gbNewRenderer && ent->IsBuilding()) - ms_aVisibleBuildingPtrs[ms_nNoOfVisibleBuildings++] = ent; - else -#endif - ms_aVisibleEntityPtrs[ms_nNoOfVisibleEntities++] = ent; + InsertEntityIntoList(ent); break; case VIS_OFFSCREEN: ent->bOffscreen = true; diff --git a/src/render/Renderer.h b/src/render/Renderer.h index 814d3105..ec9d9023 100644 --- a/src/render/Renderer.h +++ b/src/render/Renderer.h @@ -77,5 +77,7 @@ public: static void RenderVehiclesAndPeds(void); // just called RenderVehicles in LCS static void RenderOneBuilding(CEntity *ent, float camdist = 0.0f); static void RenderWorld(int pass); // like cWorldStream::Render(int) + static void RenderTransparentWater(void); // keep-out polys and transparent water #endif + static void InsertEntityIntoList(CEntity *ent); }; diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index 8b5de929..bf42f2a8 100644 --- a/src/vehicles/Boat.cpp +++ b/src/vehicles/Boat.cpp @@ -1,5 +1,6 @@ #include "common.h" +#include "main.h" #include "General.h" #include "Timecycle.h" #include "Weather.h" @@ -1100,6 +1101,15 @@ CBoat::Render() m_nSetPieceExtendedRangeTime = CTimer::GetTimeInMilliseconds() + 3000; if (!CVehicle::bWheelsOnlyCheat) CEntity::Render(); +#ifdef NEW_RENDERER + if(!gbNewRenderer) +#endif + RenderWaterOutPolys(); // not separate function in VC +} + +void +CBoat::RenderWaterOutPolys(void) +{ if(GetModelIndex() == MI_SKIMMER) return; KeepWaterOutIndices[0] = 0; @@ -1178,11 +1188,16 @@ CBoat::Render() KeepWaterOutVertices[2].v = 1.0f; KeepWaterOutVertices[3].u = 1.0f; KeepWaterOutVertices[3].v = 1.0f; +#ifdef NEW_RENDERER + if(!gbNewRenderer) +#endif +{ RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpWaterRaster); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDZERO); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); +} if (!CVehicle::bWheelsOnlyCheat && RwIm3DTransform(KeepWaterOutVertices, 4, GetMatrix().m_attachment, rwIM3D_VERTEXUV)) { RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, KeepWaterOutIndices, 6); RwIm3DEnd(); @@ -1209,10 +1224,15 @@ CBoat::Render() RwIm3DEnd(); } } +#ifdef NEW_RENDERER + if(!gbNewRenderer) +#endif +{ RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); } +} void CBoat::Teleport(CVector v) diff --git a/src/vehicles/Boat.h b/src/vehicles/Boat.h index 5f8cc8a8..5d866c48 100644 --- a/src/vehicles/Boat.h +++ b/src/vehicles/Boat.h @@ -62,7 +62,8 @@ public: virtual void GetComponentWorldPosition(int32 component, CVector &pos); virtual bool IsComponentPresent(int32 component) { return true; } virtual void BlowUpCar(CEntity *ent); - + + void RenderWaterOutPolys(void); void ApplyWaterResistance(void); void SetupModelNodes(); void PruneWakeTrail(void); diff --git a/vendor/librw b/vendor/librw index 8c00f787..5ef54dcb 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit 8c00f787cb8f53781c4335ecbc9d28fb9c664ba7 +Subproject commit 5ef54dcb78ea01171e2c0d690e5a64c2ed2ceb3b From 0662de53234d331663d74c85e56d4c21633c2503 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 4 Nov 2020 22:45:01 +0100 Subject: [PATCH 25/45] fixed vehicle and ped sorting for new renderer --- src/render/Renderer.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 01600c0d..58311574 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -818,6 +818,8 @@ CRenderer::RenderVehiclesAndPeds(void) { int i; CEntity *e; + EntityInfo ei; + CLink *node; RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); //CVisibilityPlugins::InitAlphaEntityList(); // not safe yet @@ -826,9 +828,21 @@ CRenderer::RenderVehiclesAndPeds(void) for(i = 0; i < ms_nNoOfVisibleVehicles; i++){ e = ms_aVisibleVehiclePtrs[i]; if(e->IsVehicle() && PutIntoSortedVehicleList((CVehicle*)e)) - continue; - RenderOneNonRoad(e); + continue; // boats handled elsewhere + if(e->IsPed()) + RenderOneNonRoad(e); + else{ + ei.ent = e; + ei.sort = (ms_vecCameraPosition - e->GetPosition()).MagnitudeSqr(); + gSortedVehiclesAndPeds.InsertSorted(ei); + } } + + for(node = gSortedVehiclesAndPeds.tail.prev; + node != &gSortedVehiclesAndPeds.head; + node = node->prev) + RenderOneNonRoad(node->item.ent); + // RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); } From 67c894cda9b1415b73a5fafd155c149d53681ad1 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 4 Nov 2020 23:11:27 +0100 Subject: [PATCH 26/45] more fixes to new renderer --- src/core/main.cpp | 9 +++++---- src/render/Renderer.cpp | 34 ++++++++++++++++++++-------------- src/render/Renderer.h | 3 ++- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/core/main.cpp b/src/core/main.cpp index a057e55b..92e939ad 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -876,7 +876,6 @@ MattRenderScene(void) // CMattRenderer::ResetRenderStates CRenderer::ClearForFrame(); // CClock::CalcEnvMapTimeMultiplicator -//if(gbRenderWater) CWaterLevel::RenderWater(); // actually CMattRenderer::RenderWater // CClock::ms_EnvMapTimeMultiplicator = 1.0f; // cWorldStream::ClearDynamics @@ -919,11 +918,13 @@ RenderScene_new(void) } // TODO -bool FredIsInFirstPersonCam(void) { return false; } +bool FredIsInFirstPersonCam(void) { return true; } // this seems to give the best result in all cases void RenderEffects_new(void) { + CRenderer::RenderPeds(); + CShadows::RenderStaticShadows(); // CRenderer::GenerateEnvironmentMap CShadows::RenderStoredShadows(); @@ -938,10 +939,10 @@ RenderEffects_new(void) if(gbRenderWorld2) CRenderer::RenderWorld(2); // transparent if(gbRenderVehicles) - CRenderer::RenderVehiclesAndPeds(); + CRenderer::RenderVehicles(); }else{ if(gbRenderVehicles) - CRenderer::RenderVehiclesAndPeds(); + CRenderer::RenderVehicles(); if(gbRenderWorld2) CRenderer::RenderWorld(2); // transparent } diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 58311574..c2982d6d 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -814,36 +814,42 @@ CRenderer::RenderWorld(int pass) } void -CRenderer::RenderVehiclesAndPeds(void) +CRenderer::RenderPeds(void) +{ + int i; + CEntity *e; + + for(i = 0; i < ms_nNoOfVisibleVehicles; i++){ + e = ms_aVisibleVehiclePtrs[i]; + if(e->IsPed()) + RenderOneNonRoad(e); + } +} + +void +CRenderer::RenderVehicles(void) { int i; CEntity *e; EntityInfo ei; CLink *node; - RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); - //CVisibilityPlugins::InitAlphaEntityList(); // not safe yet - // not the real thing for(i = 0; i < ms_nNoOfVisibleVehicles; i++){ e = ms_aVisibleVehiclePtrs[i]; - if(e->IsVehicle() && PutIntoSortedVehicleList((CVehicle*)e)) + if(!e->IsVehicle()) + continue; + if(PutIntoSortedVehicleList((CVehicle*)e)) continue; // boats handled elsewhere - if(e->IsPed()) - RenderOneNonRoad(e); - else{ - ei.ent = e; - ei.sort = (ms_vecCameraPosition - e->GetPosition()).MagnitudeSqr(); - gSortedVehiclesAndPeds.InsertSorted(ei); - } + ei.ent = e; + ei.sort = (ms_vecCameraPosition - e->GetPosition()).MagnitudeSqr(); + gSortedVehiclesAndPeds.InsertSorted(ei); } for(node = gSortedVehiclesAndPeds.tail.prev; node != &gSortedVehiclesAndPeds.head; node = node->prev) RenderOneNonRoad(node->item.ent); - -// RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE); } void diff --git a/src/render/Renderer.h b/src/render/Renderer.h index ec9d9023..b579bb4c 100644 --- a/src/render/Renderer.h +++ b/src/render/Renderer.h @@ -74,7 +74,8 @@ public: #ifdef NEW_RENDERER static void ClearForFrame(void); - static void RenderVehiclesAndPeds(void); // just called RenderVehicles in LCS + static void RenderPeds(void); + static void RenderVehicles(void); // also renders peds in LCS static void RenderOneBuilding(CEntity *ent, float camdist = 0.0f); static void RenderWorld(int pass); // like cWorldStream::Render(int) static void RenderTransparentWater(void); // keep-out polys and transparent water From 092f32ba673b010ad3232b513319bdbbf2952f08 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 5 Nov 2020 12:19:36 +0100 Subject: [PATCH 27/45] move stuff into define --- src/core/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/main.cpp b/src/core/main.cpp index 92e939ad..6560cbda 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -856,6 +856,7 @@ DisplayGameDebugText() } #endif +#ifdef NEW_RENDERER bool gbRenderRoads = true; bool gbRenderEverythingBarRoads = true; bool gbRenderFadingInUnderwaterEntities = true; @@ -867,7 +868,6 @@ bool gbRenderWorld0 = true; bool gbRenderWorld1 = true; bool gbRenderWorld2 = true; -#ifdef NEW_RENDERER void MattRenderScene(void) { From f8cc86c227b63f0bf45a9a152935b765a3b4a953 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 8 Nov 2020 16:23:20 +0300 Subject: [PATCH 28/45] fix merge --- src/audio/AudioManager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 9f833a6c..992b21a0 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -374,8 +374,8 @@ public: uint8 GetNum3DProvidersAvailable() const; // done uint32 GetPedCommentSfx(CPed *ped, int32 sound); void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const; - float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange); - float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange); + float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange); //done + float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);//done bool HasAirBrakes(int32 model) const; // done From a553ac87161e8caff7f890ebb79b38e9cac7b5c8 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 8 Nov 2020 17:49:10 +0300 Subject: [PATCH 29/45] fix for merge fix --- src/audio/AudioLogic.cpp | 4 ++-- src/audio/AudioManager.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 140981b9..53302f16 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -3057,10 +3057,10 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) pedParams.m_fDistance = params->m_fDistance; SetupPedComments(&pedParams, SOUND_PED_BODYCAST_HIT); continue; */ - case SOUND_115: { + case SOUND_PED_VCPA_PLAYER_FOUND: { pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated; pedParams.m_fDistance = params->m_fDistance; - SetupPedComments(&pedParams, SOUND_115); + SetupPedComments(&pedParams, SOUND_PED_VCPA_PLAYER_FOUND); } case SOUND_WATER_FALL: { const float SOUND_INTENSITY = 40.0f; diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 992b21a0..cdb59412 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -374,8 +374,8 @@ public: uint8 GetNum3DProvidersAvailable() const; // done uint32 GetPedCommentSfx(CPed *ped, int32 sound); void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const; - float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange); //done - float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);//done + float GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, float gasPedalAudio, cTransmission* transmission, float velocityChange); // done + float GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, cTransmission* transmission, float velocityChange); // done bool HasAirBrakes(int32 model) const; // done From 95bd5b073a9e05a362d8fd8f64a0a1abba597253 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 8 Nov 2020 20:31:24 +0300 Subject: [PATCH 30/45] pointers into referencies! --- src/audio/AudioLogic.cpp | 622 +++++++++++++++++++-------------------- src/audio/AudioManager.h | 54 ++-- src/control/Script.h | 2 +- 3 files changed, 339 insertions(+), 339 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 53302f16..6270e6d8 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -301,7 +301,7 @@ void cAudioManager::ProcessPlayerMood() { CPlayerPed *playerPed; - uint32* lastMisstonPassedTime; + uint32& lastMissionPassedTime = CTheScripts::GetLastMissionPassedTime(); uint32 curTime = CTimer::GetTimeInMilliseconds(); if (m_nPlayerMoodTimer <= curTime) { @@ -317,13 +317,13 @@ cAudioManager::ProcessPlayerMood() return; } - lastMisstonPassedTime = CTheScripts::GetLastMissionPassedTime(); - if (*lastMisstonPassedTime != -1) { - if (curTime < *lastMisstonPassedTime) { - *lastMisstonPassedTime = curTime; + //lastMissionPassedTime = CTheScripts::GetLastMissionPassedTime(); + if (lastMissionPassedTime != -1) { + if (curTime < lastMissionPassedTime) { + lastMissionPassedTime = curTime; return; } - if (curTime < *lastMisstonPassedTime + 180000) { + if (curTime < lastMissionPassedTime + 180000) { m_nPlayerMood = PLAYER_MOOD_WISECRACKING; return; } @@ -349,7 +349,7 @@ cAudioManager::ProcessSpecial() playerPed = FindPlayerPed(); if (playerPed != nil) { if (playerPed->m_audioEntityId >= 0 && m_asAudioEntities[playerPed->m_audioEntityId].m_bIsUsed) { - if (playerPed->m_nPedState != PED_ENTER_CAR && playerPed->m_nPedState != PED_CARJACK) { + if (playerPed->EnteringCar()) { if(!playerPed->bInVehicle&& CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == nil) SampleManager.StopChannel(m_nActiveSamples); } @@ -772,9 +772,9 @@ void cAudioManager::ProcessVehicle(CVehicle* veh) params.m_VehicleType = veh->m_vehType; if (CGame::currArea == AREA_MALL && playerVeh != veh) { - ProcessVehicleOneShots(¶ms); - ProcessVehicleSirenOrAlarm(¶ms); - ProcessEngineDamage(¶ms); + ProcessVehicleOneShots(params); + ProcessVehicleSirenOrAlarm(params); + ProcessEngineDamage(params); return; } switch (params.m_VehicleType) { @@ -782,102 +782,102 @@ void cAudioManager::ProcessVehicle(CVehicle* veh) automobile = (CAutomobile*)veh; UpdateGasPedalAudio(veh, params.m_VehicleType); if (veh->m_modelIndex == MI_RCBANDIT || veh->m_modelIndex == MI_RCBARON) { - ProcessModelVehicle(¶ms); - ProcessEngineDamage(¶ms); + ProcessModelVehicle(params); + ProcessEngineDamage(params); } else if (veh->m_modelIndex == MI_RCRAIDER || veh->m_modelIndex == MI_RCGOBLIN) { - ProcessModelHeliVehicle(¶ms); - ProcessEngineDamage(¶ms); + ProcessModelHeliVehicle(params); + ProcessEngineDamage(params); } else { switch (veh->GetVehicleAppearance()) { case VEHICLE_APPEARANCE_HELI: - ProcessCarHeli(¶ms); - ProcessVehicleFlatTyre(¶ms); - ProcessEngineDamage(¶ms); + ProcessCarHeli(params); + ProcessVehicleFlatTyre(params); + ProcessEngineDamage(params); break; case VEHICLE_APPEARANCE_BOAT: case VEHICLE_APPEARANCE_PLANE: break; default: - if (ProcessVehicleRoadNoise(¶ms)) { - ProcessReverseGear(¶ms); + if (ProcessVehicleRoadNoise(params)) { + ProcessReverseGear(params); if (CWeather::WetRoads > 0.0f) - ProcessWetRoadNoise(¶ms); - ProcessVehicleSkidding(¶ms); - ProcessVehicleFlatTyre(¶ms); - ProcessVehicleHorn(¶ms); - ProcessVehicleSirenOrAlarm(¶ms); + ProcessWetRoadNoise(params); + ProcessVehicleSkidding(params); + ProcessVehicleFlatTyre(params); + ProcessVehicleHorn(params); + ProcessVehicleSirenOrAlarm(params); if (UsesReverseWarning(params.m_nIndex)) - ProcessVehicleReverseWarning(¶ms); + ProcessVehicleReverseWarning(params); if(HasAirBrakes(params.m_nIndex)) - ProcessAirBrakes(¶ms); - ProcessCarBombTick(¶ms); - ProcessVehicleEngine(¶ms); - ProcessEngineDamage(¶ms); - ProcessVehicleDoors(¶ms); + ProcessAirBrakes(params); + ProcessCarBombTick(params); + ProcessVehicleEngine(params); + ProcessEngineDamage(params); + ProcessVehicleDoors(params); } break; } } - ProcessVehicleOneShots(¶ms); + ProcessVehicleOneShots(params); automobile->m_fVelocityChangeForAudio = params.m_fVelocityChange; break; case VEHICLE_TYPE_BOAT: if (veh->m_modelIndex == MI_SKIMMER) - ProcessCarHeli(¶ms); + ProcessCarHeli(params); else - ProcessBoatEngine(¶ms); - ProcessBoatMovingOverWater(¶ms); - ProcessVehicleOneShots(¶ms); + ProcessBoatEngine(params); + ProcessBoatMovingOverWater(params); + ProcessVehicleOneShots(params); break; case VEHICLE_TYPE_HELI: - ProcessCarHeli(¶ms); - ProcessVehicleOneShots(¶ms); + ProcessCarHeli(params); + ProcessVehicleOneShots(params); break; case VEHICLE_TYPE_PLANE: - ProcessPlane(¶ms); - ProcessVehicleOneShots(¶ms); - ProcessVehicleFlatTyre(¶ms); + ProcessPlane(params); + ProcessVehicleOneShots(params); + ProcessVehicleFlatTyre(params); break; case VEHICLE_TYPE_BIKE: bike = (CBike*)veh; UpdateGasPedalAudio(veh, params.m_VehicleType); - if (ProcessVehicleRoadNoise(¶ms)) { + if (ProcessVehicleRoadNoise(params)) { if (CWeather::WetRoads > 0.0f) - ProcessWetRoadNoise(¶ms); - ProcessVehicleSkidding(¶ms); - ProcessVehicleHorn(¶ms); - ProcessVehicleSirenOrAlarm(¶ms); - ProcessCarBombTick(¶ms); - ProcessEngineDamage(¶ms); - ProcessVehicleEngine(¶ms); - ProcessVehicleFlatTyre(¶ms); + ProcessWetRoadNoise(params); + ProcessVehicleSkidding(params); + ProcessVehicleHorn(params); + ProcessVehicleSirenOrAlarm(params); + ProcessCarBombTick(params); + ProcessEngineDamage(params); + ProcessVehicleEngine(params); + ProcessVehicleFlatTyre(params); } - ProcessVehicleOneShots(¶ms); + ProcessVehicleOneShots(params); bike->m_fVelocityChangeForAudio = params.m_fVelocityChange; break; default: break; } - ProcessRainOnVehicle(¶ms); + ProcessRainOnVehicle(params); } } void -cAudioManager::ProcessRainOnVehicle(cVehicleParams *params) +cAudioManager::ProcessRainOnVehicle(cVehicleParams& params) { const int SOUND_INTENSITY = 22.0f; CVehicle *veh; uint8 emittingVol; - if (params->m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain()) + if (params.m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain()) return; - veh = params->m_pVehicle; + veh = params.m_pVehicle; veh->m_bRainAudioCounter++; if (veh->m_bRainAudioCounter >= 2) { veh->m_bRainAudioCounter = 0; - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); emittingVol = 30.0f * CWeather::Rain; m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { @@ -904,7 +904,7 @@ cAudioManager::ProcessRainOnVehicle(cVehicleParams *params) } bool -cAudioManager::ProcessReverseGear(cVehicleParams *params) +cAudioManager::ProcessReverseGear(cVehicleParams& params) { const int reverseGearIntensity = 30; @@ -912,15 +912,15 @@ cAudioManager::ProcessReverseGear(cVehicleParams *params) float modificator; uint8 emittingVolume; - if (params->m_fDistance >= SQR(reverseGearIntensity)) + if (params.m_fDistance >= SQR(reverseGearIntensity)) return false; - automobile = (CAutomobile*)params->m_pVehicle; + automobile = (CAutomobile*)params.m_pVehicle; if (automobile->m_modelIndex == MI_CADDY) return true; if (automobile->bEngineOn && (automobile->m_fGasPedal < 0.0f || automobile->m_nCurrentGear == 0)) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); if (automobile->m_nDriveWheelsOnGround != 0) { - modificator = params->m_fVelocityChange / params->m_pTransmission->fMaxReverseVelocity; + modificator = params.m_fVelocityChange / params.m_pTransmission->fMaxReverseVelocity; } else { if (automobile->m_nDriveWheelsOnGroundPrev != 0) automobile->m_fGasPedalAudio *= 0.4f; @@ -931,7 +931,7 @@ cAudioManager::ProcessReverseGear(cVehicleParams *params) m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, reverseGearIntensity, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { - if (params->m_pVehicle->m_fGasPedal >= 0.0f) { + if (params.m_pVehicle->m_fGasPedal >= 0.0f) { m_sQueueSample.m_nCounter = 62; m_sQueueSample.m_nSampleIndex = SFX_REVERSE_GEAR_2; } else { @@ -959,7 +959,7 @@ cAudioManager::ProcessReverseGear(cVehicleParams *params) } void -cAudioManager::ProcessModelVehicle(cVehicleParams *params) +cAudioManager::ProcessModelVehicle(cVehicleParams& params) { const float SOUND_INTENSITY = 35.0f; @@ -973,21 +973,21 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params) bool isPlayerVeh; bool vehSlowdown; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return; - if (FindPlayerVehicle() == params->m_pVehicle) + if (FindPlayerVehicle() == params.m_pVehicle) isPlayerVeh = true; else #ifdef FIX_BUGS - isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params->m_pVehicle; + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params.m_pVehicle; #else isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; #endif - if (params->m_pVehicle->m_modelIndex == MI_RCBANDIT) { - if (((CAutomobile*)params->m_pVehicle)->m_nDriveWheelsOnGround != 0) { - volume = Min(127, 127.0f * Abs(params->m_fVelocityChange) * 3.0f); - freq = 8000.0f * Abs(params->m_fVelocityChange) + 14000; + if (params.m_pVehicle->m_modelIndex == MI_RCBANDIT) { + if (((CAutomobile*)params.m_pVehicle)->m_nDriveWheelsOnGround != 0) { + volume = Min(127, 127.0f * Abs(params.m_fVelocityChange) * 3.0f); + freq = 8000.0f * Abs(params.m_fVelocityChange) + 14000; } else { volume = 127; freq = 25000; @@ -997,7 +997,7 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params) freq = clamp2(freq, prevFreq, 800); } if (volume > 0) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 2; @@ -1023,13 +1023,13 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params) prevFreq = freq; prevVolume = volume; } - } else if (params->m_pVehicle != nil) { + } else if (params.m_pVehicle != nil) { if (isPlayerVeh) { acceletateState = Pads[0].GetAccelerate(); brakeState = Pads[0].GetBrake(); } else { - acceletateState = 255.0f * params->m_pVehicle->m_fGasPedal; - brakeState = 255.0f * params->m_pVehicle->m_fBrakePedal; + acceletateState = 255.0f * params.m_pVehicle->m_fGasPedal; + brakeState = 255.0f * params.m_pVehicle->m_fBrakePedal; } if (acceletateState < brakeState) acceletateState = brakeState; @@ -1039,19 +1039,19 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params) freq = 18000; } else { vehSlowdown = false; - volume = Min(127, (127 * acceletateState / 255) * 3.0f * Abs(params->m_fVelocityChange)); - freq = Min(22000, (8000 * acceletateState / 255 + 14000) * 3.0f * Abs(params->m_fVelocityChange)); + volume = Min(127, (127 * acceletateState / 255) * 3.0f * Abs(params.m_fVelocityChange)); + freq = Min(22000, (8000 * acceletateState / 255 + 14000) * 3.0f * Abs(params.m_fVelocityChange)); } if (isPlayerVeh && !vehSlowdown) { volume = clamp2(volume, prevVolume, 7); freq = clamp2(freq, prevFreq, 800); } if (!vehSlowdown) - freq += 8000.0f * Abs(params->m_pVehicle->GetUp().y); - if (params->m_pVehicle->bIsDrowning) + freq += 8000.0f * Abs(params.m_pVehicle->GetUp().y); + if (params.m_pVehicle->bIsDrowning) volume /= 4; if (volume > 0) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { if (vehSlowdown) { @@ -1089,7 +1089,7 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params) } void -cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params) +cAudioManager::ProcessModelHeliVehicle(cVehicleParams& params) { const float SOUND_INTENSITY = 35.0f; @@ -1100,14 +1100,14 @@ cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params) int16 acceletateState; int16 brakeState; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return; - if (FindPlayerVehicle() == params->m_pVehicle) + if (FindPlayerVehicle() == params.m_pVehicle) isPlayerVeh = true; else #ifdef FIX_BUGS - isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params->m_pVehicle; + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params.m_pVehicle; #else isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; #endif @@ -1115,13 +1115,13 @@ cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params) brakeState = Pads[0].GetBrake(); acceletateState = Max(Pads[0].GetAccelerate(), Abs(Pads[0].GetCarGunUpDown()) * 2); } else { - acceletateState = 255.0f * params->m_pVehicle->m_fGasPedal; - brakeState = 255.0f * params->m_pVehicle->m_fBrakePedal; + acceletateState = 255.0f * params.m_pVehicle->m_fGasPedal; + brakeState = 255.0f * params.m_pVehicle->m_fBrakePedal; } if (acceletateState < brakeState) acceletateState = brakeState; freq = clamp2(5 * acceletateState + 22050, prevFreq, 30); - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(70, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 2; @@ -1147,7 +1147,7 @@ cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params) } bool -cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params) +cAudioManager::ProcessVehicleRoadNoise(cVehicleParams& params) { const float SOUND_INTENSITY = 95.0f; @@ -1158,36 +1158,36 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params) float velocity; uint8 wheelsOnGround; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - switch (params->m_VehicleType) { + switch (params.m_VehicleType) { case VEHICLE_TYPE_CAR: - wheelsOnGround = ((CAutomobile*)params->m_pVehicle)->m_nWheelsOnGround; + wheelsOnGround = ((CAutomobile*)params.m_pVehicle)->m_nWheelsOnGround; break; case VEHICLE_TYPE_BIKE: - wheelsOnGround = ((CBike*)params->m_pVehicle)->m_nWheelsOnGround; + wheelsOnGround = ((CBike*)params.m_pVehicle)->m_nWheelsOnGround; break; default: wheelsOnGround = 4; break; } - if (params->m_pTransmission == nil || wheelsOnGround == 0) + if (params.m_pTransmission == nil || wheelsOnGround == 0) return true; - velocity = Abs(params->m_fVelocityChange); + velocity = Abs(params.m_fVelocityChange); if (velocity > 0.0f) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - emittingVol = 30.f * Min(1.f, velocity / (0.5f * params->m_pTransmission->fMaxVelocity)); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + emittingVol = 30.f * Min(1.f, velocity / (0.5f * params.m_pTransmission->fMaxVelocity)); m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 0; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = false; m_sQueueSample.m_nReleasingVolumeModificator = 3; - if (params->m_pVehicle->m_nSurfaceTouched == SURFACE_WATER) { + if (params.m_pVehicle->m_nSurfaceTouched == SURFACE_WATER) { m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP; freq = 6050 * emittingVol / 30 + 16000; } else { @@ -1215,7 +1215,7 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params) } bool -cAudioManager::ProcessWetRoadNoise(cVehicleParams *params) +cAudioManager::ProcessWetRoadNoise(cVehicleParams& params) { const float SOUND_INTENSITY = 30.0f; @@ -1226,26 +1226,26 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams *params) float velocity; uint8 wheelsOnGround; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - switch (params->m_VehicleType) { + switch (params.m_VehicleType) { case VEHICLE_TYPE_CAR: - wheelsOnGround = ((CAutomobile*)params->m_pVehicle)->m_nWheelsOnGround; + wheelsOnGround = ((CAutomobile*)params.m_pVehicle)->m_nWheelsOnGround; break; case VEHICLE_TYPE_BIKE: - wheelsOnGround = ((CBike*)params->m_pVehicle)->m_nWheelsOnGround; + wheelsOnGround = ((CBike*)params.m_pVehicle)->m_nWheelsOnGround; break; default: wheelsOnGround = 4; break; } - if (params->m_pTransmission == nil || wheelsOnGround == 0) + if (params.m_pTransmission == nil || wheelsOnGround == 0) return true; - velocity = Abs(params->m_fVelocityChange); + velocity = Abs(params.m_fVelocityChange); if (velocity > 0.0f) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - relativeVelocity = Min(1.0f, velocity / (0.5f * params->m_pTransmission->fMaxVelocity)); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + relativeVelocity = Min(1.0f, velocity / (0.5f * params.m_pTransmission->fMaxVelocity)); emittingVol = 23.0f * relativeVelocity * CWeather::WetRoads; m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { @@ -1275,7 +1275,7 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams *params) } void -cAudioManager::ProcessVehicleEngine(cVehicleParams* params) +cAudioManager::ProcessVehicleEngine(cVehicleParams& params) { const float SOUND_INTENSITY = 50.0f; @@ -1302,22 +1302,22 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) pizzaFaggBool = false; caddyBool = false; traction = 0.0f; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return; playerVeh = FindPlayerVehicle(); - veh = params->m_pVehicle; + veh = params.m_pVehicle; if (playerVeh == veh && veh->GetStatus() == STATUS_WRECKED) { SampleManager.StopChannel(m_nActiveSamples); return; } if (!veh->bEngineOn) return; - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); if (playerVeh == veh && veh->m_modelIndex != MI_CADDY) { - ProcessPlayersVehicleEngine(params, params->m_pVehicle); + ProcessPlayersVehicleEngine(params, params.m_pVehicle); return; } - transmission = params->m_pTransmission; + transmission = params.m_pTransmission; if (transmission != nil) { switch (veh->m_modelIndex) { case MI_PIZZABOY: @@ -1333,7 +1333,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) currentGear = veh->m_nCurrentGear; break; } - switch (params->m_VehicleType) { + switch (params.m_VehicleType) { case VEHICLE_TYPE_CAR: automobile = (CAutomobile*)veh; wheelsOnGround = automobile->m_nDriveWheelsOnGround; @@ -1349,7 +1349,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) gasPedalAudioPtr = &bike->m_fGasPedalAudio; break; default: - debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params->m_VehicleType); + debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType); return; } @@ -1360,7 +1360,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) } else { switch (transmission->nDriveType) { case '4': - if (params->m_VehicleType == VEHICLE_TYPE_BIKE) { + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { for (int i = 0; i < 2; i++) if (wheelState[i] == WHEEL_STATE_SPINNING) traction += 0.1f; @@ -1371,7 +1371,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) } break; case 'F': - if (params->m_VehicleType == VEHICLE_TYPE_BIKE) { + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { if (wheelState[BIKEWHEEL_FRONT] == WHEEL_STATE_SPINNING) traction += 0.2f; } else { @@ -1382,7 +1382,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) } break; case 'R': - if (params->m_VehicleType == VEHICLE_TYPE_BIKE) { + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { if (wheelState[BIKEWHEEL_REAR] == WHEEL_STATE_SPINNING) traction += 0.2f; } else { @@ -1396,7 +1396,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) break; } } - } else if (params->m_fVelocityChange == 0.0f) { + } else if (params.m_fVelocityChange == 0.0f) { traction = 0.9f; } if (transmission->fMaxVelocity <= 0.0) { @@ -1406,18 +1406,18 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) if (!pizzaFaggBool && !caddyBool) { if (currentGear != 0) { relativeGearChange = Min(1.0f, - params->m_fVelocityChange - transmission->Gears[currentGear].fShiftDownVelocity) / transmission->fMaxVelocity * 2.5f; + params.m_fVelocityChange - transmission->Gears[currentGear].fShiftDownVelocity) / transmission->fMaxVelocity * 2.5f; if (traction == 0.0f && veh->GetStatus() != STATUS_SIMPLE && - params->m_fVelocityChange < transmission->Gears[1].fShiftUpVelocity) + params.m_fVelocityChange < transmission->Gears[1].fShiftUpVelocity) traction = 0.7f; relativeChange = traction * *gasPedalAudioPtr * 0.95f + (1.0f - traction) * relativeGearChange; } else { relativeChange = Min(1.0f, - 1.0f - Abs((params->m_fVelocityChange - transmission->Gears[0].fShiftDownVelocity) / transmission->fMaxReverseVelocity)); + 1.0f - Abs((params.m_fVelocityChange - transmission->Gears[0].fShiftDownVelocity) / transmission->fMaxReverseVelocity)); } modificator = relativeChange; } else { - modificator = Min(1.0, Abs(params->m_fVelocityChange / transmission->fMaxVelocity > 1.0f)); + modificator = Min(1.0, Abs(params.m_fVelocityChange / transmission->fMaxVelocity > 1.0f)); } } } else { @@ -1428,7 +1428,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) } if (currentGear != 0 || wheelsOnGround == 0) freq = 1200 * currentGear + 18000.0f * modificator + 14000; - else if (params->m_VehicleType == VEHICLE_TYPE_BIKE) + else if (params.m_VehicleType == VEHICLE_TYPE_BIKE) freq = 22050; else freq = 13000.0f * modificator + 14000; @@ -1452,26 +1452,26 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params) if (!caddyBool) { if (veh->GetStatus() == STATUS_SIMPLE) { if (modificator < 0.02f) { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nBank - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nBank - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1; m_sQueueSample.m_nCounter = 52; freq = 10000.0f * modificator + 22050; } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nAccelerationSampleIndex; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nAccelerationSampleIndex; m_sQueueSample.m_nCounter = 2; } } else { if (veh->m_fGasPedal < 0.02f) { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nBank - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nBank - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1; m_sQueueSample.m_nCounter = 52; freq = 10000.0f * modificator + 22050; } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nAccelerationSampleIndex; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nAccelerationSampleIndex; m_sQueueSample.m_nCounter = 2; } } m_sQueueSample.m_nFrequency = freq + 100 * m_sQueueSample.m_nBankIndex % 1000; } else { - if (FindVehicleOfPlayer() == params->m_pVehicle) + if (FindVehicleOfPlayer() == params.m_pVehicle) m_sQueueSample.m_nSampleIndex = SFX_CAR_AFTER_ACCEL_12; else m_sQueueSample.m_nSampleIndex = SFX_CAR_REV_12; @@ -1564,14 +1564,14 @@ cAudioManager::AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sampl } void -cAudioManager::ProcessCesna(cVehicleParams *params) +cAudioManager::ProcessCesna(cVehicleParams& params) { static uint8 nAccel = 0; - //((CAutomobile *)params->m_pVehicle)->Damage.GetEngineStatus(); + //((CAutomobile *)params.m_pVehicle)->Damage.GetEngineStatus(); - if (FindPlayerVehicle() == params->m_pVehicle) { - if (params->m_nIndex == DODO) { + if (FindPlayerVehicle() == params.m_pVehicle) { + if (params.m_nIndex == DODO) { if (Pads[0].GetAccelerate() <= 0) { if (nAccel != 0) --nAccel; @@ -1581,10 +1581,10 @@ cAudioManager::ProcessCesna(cVehicleParams *params) AddPlayerCarSample(85 * (60 - nAccel) / 60 + 20, 8500 * nAccel / 60 + 17000, SFX_CESNA_IDLE, SFX_BANK_0, 52, true); AddPlayerCarSample(85 * nAccel / 60 + 20, 8500 * nAccel / 60 + 17000, SFX_CESNA_REV, SFX_BANK_0, 2, true); } - } else if (params->m_nIndex == DODO) { + } else if (params.m_nIndex == DODO) { AddPlayerCarSample(105, 17000, SFX_CESNA_IDLE, SFX_BANK_0, 52, true); - } else if (params->m_fDistance < SQR(200)) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + } else if (params.m_fDistance < SQR(200)) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(80, 200.f, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 52; @@ -1605,7 +1605,7 @@ cAudioManager::ProcessCesna(cVehicleParams *params) m_sQueueSample.m_bRequireReflection = false; AddSampleToRequestedQueue(); } - if (params->m_fDistance < SQR(90)) { + if (params.m_fDistance < SQR(90)) { m_sQueueSample.m_nVolume = ComputeVolume(80, 90.f, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 2; @@ -1631,7 +1631,7 @@ cAudioManager::ProcessCesna(cVehicleParams *params) } void -cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh) +cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh) { static int32 GearFreqAdj[] = { 6000, 6000, 3400, 1200, 0, -1000 }; @@ -1676,7 +1676,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh static bool bAccelSampleStopped = true; lostTraction = false; - PizzaFaggBool = params->m_pVehicle->m_modelIndex == MI_PIZZABOY || params->m_pVehicle->m_modelIndex == MI_FAGGIO; + PizzaFaggBool = params.m_pVehicle->m_modelIndex == MI_PIZZABOY || params.m_pVehicle->m_modelIndex == MI_FAGGIO; processedAccelSampleStopped = false; if (bPlayerJustEnteredCar) { bAccelSampleStopped = true; @@ -1688,17 +1688,17 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh bHandbrakeOnLastFrame = false; } if (CReplay::IsPlayingBack()) { - accelerateState = (255.0f * clamp(params->m_pVehicle->m_fGasPedal, 0.0f, 1.0f)); - brakeState = (255.0f * clamp(params->m_pVehicle->m_fBrakePedal, 0.0f, 1.0f)); + accelerateState = (255.0f * clamp(params.m_pVehicle->m_fGasPedal, 0.0f, 1.0f)); + brakeState = (255.0f * clamp(params.m_pVehicle->m_fBrakePedal, 0.0f, 1.0f)); } else { accelerateState = Pads[0].GetAccelerate(); brakeState = Pads[0].GetBrake(); } channelUsed = SampleManager.GetChannelUsedFlag(m_nActiveSamples); if (PizzaFaggBool) { - CurrentPretendGear = params->m_pTransmission->nNumberOfGears; + CurrentPretendGear = params.m_pTransmission->nNumberOfGears; currentGear = CurrentPretendGear; - if (params->m_pVehicle->bIsHandbrakeOn) { + if (params.m_pVehicle->bIsHandbrakeOn) { brakeState = 0; nCruising = 0; LastAccel = 0; @@ -1707,12 +1707,12 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh nCruising = 1; } } else { - currentGear = params->m_pVehicle->m_nCurrentGear; + currentGear = params.m_pVehicle->m_nCurrentGear; } - switch (params->m_VehicleType) { + switch (params.m_VehicleType) { case VEHICLE_TYPE_CAR: - automobile = (CAutomobile*)params->m_pVehicle; + automobile = (CAutomobile*)params.m_pVehicle; wheelsOnGround = automobile->m_nDriveWheelsOnGround; wheelsOnGroundPrev = automobile->m_nDriveWheelsOnGroundPrev; gasPedalAudioPtr = &automobile->m_fGasPedalAudio; @@ -1720,7 +1720,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh velocityChangeForAudio = automobile->m_fVelocityChangeForAudio; break; case VEHICLE_TYPE_BIKE: - bike = (CBike*)params->m_pVehicle; + bike = (CBike*)params.m_pVehicle; wheelsOnGround = bike->m_nDriveWheelsOnGround; wheelsOnGroundPrev = bike->m_nDriveWheelsOnGroundPrev; gasPedalAudioPtr = &bike->m_fGasPedalAudio; @@ -1728,13 +1728,13 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh velocityChangeForAudio = bike->m_fVelocityChangeForAudio; break; default: - debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params->m_VehicleType); + debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType); return; } if (!PizzaFaggBool) { - switch (params->m_pTransmission->nDriveType) { + switch (params.m_pTransmission->nDriveType) { case '4': - if (params->m_VehicleType != VEHICLE_TYPE_BIKE) { + if (params.m_VehicleType != VEHICLE_TYPE_BIKE) { wheelInUseCounter = 0; for (uint8 i = 0; i < 4; i++) { if (wheelState[i] != WHEEL_STATE_NORMAL) @@ -1745,7 +1745,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh } break; case 'F': - if (params->m_VehicleType == VEHICLE_TYPE_BIKE) { + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { if (wheelState[BIKEWHEEL_FRONT] != WHEEL_STATE_NORMAL) lostTraction = true; } else { @@ -1755,7 +1755,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh } break; case 'R': - if (params->m_VehicleType == VEHICLE_TYPE_BIKE) { + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { if (wheelState[BIKEWHEEL_REAR] != WHEEL_STATE_NORMAL) lostTraction = true; } else { @@ -1767,20 +1767,20 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh break; } } - if (params->m_fVelocityChange != 0.0f) { - time = params->m_pVehicle->m_vecMoveSpeed.z / params->m_fVelocityChange; + if (params.m_fVelocityChange != 0.0f) { + time = params.m_pVehicle->m_vecMoveSpeed.z / params.m_fVelocityChange; if (time > 0.0f) freqModifier = -(Min(0.2f, time) * 3000.0f * 5.0f); else freqModifier = -(Max(-0.2f, time) * 3000.0f * 5.0f); - if (params->m_fVelocityChange < -0.001f) + if (params.m_fVelocityChange < -0.001f) freqModifier = -freqModifier; } else freqModifier = 0; - if (params->m_VehicleType == VEHICLE_TYPE_BIKE && bike->bExtraSpeed) + if (params.m_VehicleType == VEHICLE_TYPE_BIKE && bike->bExtraSpeed) freqModifier += 1400; gearSoundLength = 0; - engineSoundType = aVehicleSettings[params->m_nIndex].m_nBank; + engineSoundType = aVehicleSettings[params.m_nIndex].m_nBank; soundOffset = 3 * (engineSoundType - CAR_SFX_BANKS_OFFSET); noGearBox = false; switch (engineSoundType) { @@ -1839,7 +1839,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh gearSoundStartTime = CTimer::GetTimeInMilliseconds(); } } - relativeVelocityChange = 2.0f * params->m_fVelocityChange / params->m_pTransmission->fMaxVelocity; + relativeVelocityChange = 2.0f * params.m_fVelocityChange / params.m_pTransmission->fMaxVelocity; accelerationMultipler = clamp(relativeVelocityChange, 0.0f, 1.0f); gasPedalAudio = accelerationMultipler; switch (engineSoundType) { @@ -1856,17 +1856,17 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh break; } if (accelerateState <= 0) { - if (params->m_fVelocityChange < -0.001f) { + if (params.m_fVelocityChange < -0.001f) { if (channelUsed) { SampleManager.StopChannel(m_nActiveSamples); bAccelSampleStopped = true; } - if (wheelsOnGround == 0 || params->m_pVehicle->bIsHandbrakeOn || lostTraction) + if (wheelsOnGround == 0 || params.m_pVehicle->bIsHandbrakeOn || lostTraction) gasPedalAudio = *gasPedalAudioPtr; - else if (params->m_VehicleType == VEHICLE_TYPE_BIKE) + else if (params.m_VehicleType == VEHICLE_TYPE_BIKE) gasPedalAudio = 0.0f; else - gasPedalAudio = Min(1.0f, params->m_fVelocityChange / params->m_pTransmission->fMaxReverseVelocity); + gasPedalAudio = Min(1.0f, params.m_fVelocityChange / params.m_pTransmission->fMaxReverseVelocity); *gasPedalAudioPtr = Max(0.0f, gasPedalAudio); } else if (LastAccel > 0) { if (channelUsed) { @@ -1875,9 +1875,9 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh } nCruising = 0; if (wheelsOnGround == 0 - || params->m_pVehicle->bIsHandbrakeOn + || params.m_pVehicle->bIsHandbrakeOn || lostTraction - || params->m_fVelocityChange < 0.01f && *gasPedalAudioPtr > 0.2f) { + || params.m_fVelocityChange < 0.01f && *gasPedalAudioPtr > 0.2f) { if (PizzaFaggBool) { gasPedalAudio = 0.0f; } else { @@ -1888,7 +1888,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh if (gasPedalAudio > 0.05f) { freq = (5000.f * (gasPedalAudio - 0.05f) * 20.f / 19) + 19000; vol = (25.0f * (gasPedalAudio - 0.05f) * 20.f / 19) + 40; - if (params->m_pVehicle->bIsDrowning) + if (params.m_pVehicle->bIsDrowning) vol /= 4; if (engineSoundType == SFX_BANK_TRUCK) freq /= 2; @@ -1899,7 +1899,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh vol = 110 - (40.0f * gasPedalAudio); if (engineSoundType == SFX_BANK_TRUCK) freq /= 2; - if (params->m_pVehicle->bIsDrowning) + if (params.m_pVehicle->bIsDrowning) vol /= 4; AddPlayerCarSample(vol, freq, engineSoundType - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1, SFX_BANK_0, 52, true); @@ -1907,16 +1907,16 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh } else { if (nCruising == 0){ - stuckInSand = params->m_VehicleType == VEHICLE_TYPE_CAR && ((CAutomobile*)params->m_pVehicle)->bStuckInSand; - if (accelerateState < 150 || wheelsOnGround == 0 || params->m_pVehicle->bIsHandbrakeOn || lostTraction - || (currentGear < 2 && params->m_fVelocityChange - velocityChangeForAudio < 0.01f) || brakeState > 0) { + stuckInSand = params.m_VehicleType == VEHICLE_TYPE_CAR && ((CAutomobile*)params.m_pVehicle)->bStuckInSand; + if (accelerateState < 150 || wheelsOnGround == 0 || params.m_pVehicle->bIsHandbrakeOn || lostTraction + || (currentGear < 2 && params.m_fVelocityChange - velocityChangeForAudio < 0.01f) || brakeState > 0) { - if (((wheelsOnGround && !params->m_pVehicle->bIsHandbrakeOn && !lostTraction ) || stuckInSand) && brakeState <= 0) { + if (((wheelsOnGround && !params.m_pVehicle->bIsHandbrakeOn && !lostTraction ) || stuckInSand) && brakeState <= 0) { baseFreq = (8000.0f * accelerationMultipler) + 16000; vol = (25.0f * accelerationMultipler) + 60; *gasPedalAudioPtr = accelerationMultipler; } else { - if (wheelsOnGround == 0 && wheelsOnGroundPrev != 0 || (params->m_pVehicle->bIsHandbrakeOn && !bHandbrakeOnLastFrame || lostTraction && !bLostTractionLastFrame) + if (wheelsOnGround == 0 && wheelsOnGroundPrev != 0 || (params.m_pVehicle->bIsHandbrakeOn && !bHandbrakeOnLastFrame || lostTraction && !bLostTractionLastFrame) && wheelsOnGround != 0) { *gasPedalAudioPtr *= 0.6f; } @@ -1934,7 +1934,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh SampleManager.StopChannel(m_nActiveSamples); bAccelSampleStopped = true; } - if (params->m_pVehicle->bIsDrowning) + if (params.m_pVehicle->bIsDrowning) vol /= 4; AddPlayerCarSample(vol, freq, engineSoundType - CAR_SFX_BANKS_OFFSET + SFX_CAR_REV_1, SFX_BANK_0, 2, true); } else { @@ -1959,7 +1959,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh } } else if (processedAccelSampleStopped) { gearSoundStartTime = CTimer::GetTimeInMilliseconds(); - params->m_pVehicle->bAudioChangingGear = true; + params.m_pVehicle->bAudioChangingGear = true; if (!SampleManager.InitialiseChannel(m_nActiveSamples, soundOffset + SFX_CAR_ACCEL_1, SFX_BANK_0)) return; SampleManager.SetChannelLoopCount(m_nActiveSamples, 1); @@ -1976,10 +1976,10 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh SampleManager.SetChannelReverbFlag(m_nActiveSamples, m_bDynamicAcousticModelingStatus != false); SampleManager.StartChannel(m_nActiveSamples); } - } else if (CurrentPretendGear < params->m_pTransmission->nNumberOfGears - 1) { + } else if (CurrentPretendGear < params.m_pTransmission->nNumberOfGears - 1) { ++CurrentPretendGear; gearSoundStartTime = CTimer::GetTimeInMilliseconds(); - params->m_pVehicle->bAudioChangingGear = true; + params.m_pVehicle->bAudioChangingGear = true; if (!SampleManager.InitialiseChannel(m_nActiveSamples, soundOffset + SFX_CAR_ACCEL_1, SFX_BANK_0)) return; SampleManager.SetChannelLoopCount(m_nActiveSamples, 1); @@ -1998,12 +1998,12 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh } } else { nCruising = 1; - params->m_pVehicle->bAudioChangingGear = true; + params.m_pVehicle->bAudioChangingGear = true; bAccelSampleStopped = true; SampleManager.StopChannel(m_nActiveSamples); - if (PizzaFaggBool || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params->m_pVehicle->bIsHandbrakeOn - && !lostTraction && currentGear >= params->m_pTransmission->nNumberOfGears - 1) { - if (accelerateState >= 220 && params->m_fVelocityChange + 0.001f >= velocityChangeForAudio) { + if (PizzaFaggBool || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params.m_pVehicle->bIsHandbrakeOn + && !lostTraction && currentGear >= params.m_pTransmission->nNumberOfGears - 1) { + if (accelerateState >= 220 && params.m_fVelocityChange + 0.001f >= velocityChangeForAudio) { if (nCruising < 800) ++nCruising; } else if (nCruising > 3) { @@ -2019,12 +2019,12 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh } } } else { - params->m_pVehicle->bAudioChangingGear = true; + params.m_pVehicle->bAudioChangingGear = true; bAccelSampleStopped = true; SampleManager.StopChannel(m_nActiveSamples); - if (PizzaFaggBool || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params->m_pVehicle->bIsHandbrakeOn - && !lostTraction && currentGear >= params->m_pTransmission->nNumberOfGears - 1) { - if (accelerateState >= 220 && params->m_fVelocityChange + 0.001f >= velocityChangeForAudio) { + if (PizzaFaggBool || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params.m_pVehicle->bIsHandbrakeOn + && !lostTraction && currentGear >= params.m_pTransmission->nNumberOfGears - 1) { + if (accelerateState >= 220 && params.m_fVelocityChange + 0.001f >= velocityChangeForAudio) { if (nCruising < 800) ++nCruising; } else if (nCruising > 3) { @@ -2040,13 +2040,13 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh } } LastAccel = accelerateState; - bHandbrakeOnLastFrame = params->m_pVehicle->bIsHandbrakeOn; + bHandbrakeOnLastFrame = params.m_pVehicle->bIsHandbrakeOn; bLostTractionLastFrame = lostTraction; return; } bool -cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) +cAudioManager::ProcessVehicleSkidding(cVehicleParams& params) { const float SOUND_INTENSITY = 40.0f; @@ -2063,50 +2063,50 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) float newSkidVal = 0.0f; float skidVal = 0.0f; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - switch (params->m_VehicleType) { + switch (params.m_VehicleType) { case VEHICLE_TYPE_CAR: - automobile = (CAutomobile*)params->m_pVehicle; + automobile = (CAutomobile*)params.m_pVehicle; numWheels = 4; wheelStateArr = automobile->m_aWheelState; wheelsOnGround = automobile->m_nWheelsOnGround; gasPedalAudio = automobile->m_fGasPedalAudio; break; case VEHICLE_TYPE_BIKE: - bike = (CBike*)params->m_pVehicle; + bike = (CBike*)params.m_pVehicle; numWheels = 2; wheelStateArr = bike->m_aWheelState; wheelsOnGround = bike->m_nWheelsOnGround; gasPedalAudio = bike->m_fGasPedalAudio; break; default: - debug("\n * AUDIOLOG: ProcessVehicleSkidding() Unsupported vehicle type %d * \n", params->m_VehicleType); + debug("\n * AUDIOLOG: ProcessVehicleSkidding() Unsupported vehicle type %d * \n", params.m_VehicleType); return true; } if (wheelsOnGround == 0) return true; - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); for (int32 i = 0; i < numWheels; i++) { if (wheelStateArr[i] == WHEEL_STATE_NORMAL) continue; - transmission = params->m_pTransmission; + transmission = params.m_pTransmission; switch (transmission->nDriveType) { case '4': - newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); break; case 'F': if (i == CARWHEEL_FRONT_LEFT || i == CARWHEEL_FRONT_RIGHT) - newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); else - newSkidVal = GetVehicleNonDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleNonDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], transmission, params.m_fVelocityChange); break; case 'R': if (i == CARWHEEL_REAR_LEFT || i == CARWHEEL_REAR_RIGHT) - newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); else - newSkidVal = GetVehicleNonDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], transmission, params->m_fVelocityChange); + newSkidVal = GetVehicleNonDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], transmission, params.m_fVelocityChange); break; default: break; @@ -2119,7 +2119,7 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 3; - switch (params->m_pVehicle->m_nSurfaceTouched) { + switch (params.m_pVehicle->m_nSurfaceTouched) { case SURFACE_GRASS: case SURFACE_HEDGE: m_sQueueSample.m_nSampleIndex = SFX_RAIN; @@ -2141,7 +2141,7 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params) default: m_sQueueSample.m_nSampleIndex = SFX_SKID; m_sQueueSample.m_nFrequency = 5000.f * skidVal + 11000.f; - if (params->m_VehicleType == VEHICLE_TYPE_BIKE) + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) m_sQueueSample.m_nFrequency += 2000; break; } @@ -2212,17 +2212,17 @@ cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheel } bool -cAudioManager::ProcessVehicleHorn(cVehicleParams *params) +cAudioManager::ProcessVehicleHorn(cVehicleParams& params) { const float SOUND_INTENSITY = 40.0f; CVehicle *veh; uint8 volume; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - veh = params->m_pVehicle; + veh = params.m_pVehicle; if (veh->m_bSirenOrAlarm && UsesSirenSwitching(params)) return true; @@ -2243,16 +2243,16 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams *params) return true; } - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); volume = veh->bIsDrowning ? 20 : 80; m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 4; - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nHornSample; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nHornSample; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = false; m_sQueueSample.m_nReleasingVolumeModificator = 2; - m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nHornFrequency; + m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nHornFrequency; m_sQueueSample.m_nLoopCount = 0; #ifdef FIX_BUGS m_sQueueSample.m_nEmittingVolume = volume; @@ -2274,31 +2274,31 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams *params) } bool -cAudioManager::UsesSiren(cVehicleParams *params) const +cAudioManager::UsesSiren(cVehicleParams& params) const { - return params->m_pVehicle->UsesSiren(); + return params.m_pVehicle->UsesSiren(); } bool -cAudioManager::UsesSirenSwitching(cVehicleParams *params) const +cAudioManager::UsesSirenSwitching(cVehicleParams& params) const { - if (params->m_nIndex == FIRETRUK || params->m_nIndex == MRWHOOP) + if (params.m_nIndex == FIRETRUK || params.m_nIndex == MRWHOOP) return false; return UsesSiren(params); } bool -cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams *params) +cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams& params) { const float SOUND_INTENSITY = 110.0f; CVehicle *veh; uint8 volume; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - veh = params->m_pVehicle; + veh = params.m_pVehicle; if (!veh->m_bSirenOrAlarm && !veh->IsAlarmOn()) return true; @@ -2310,31 +2310,31 @@ cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams *params) return true; } - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); volume = veh->bIsDrowning ? 20 : 80; m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 5; if (UsesSiren(params)) { - if (params->m_pVehicle->GetStatus() == STATUS_ABANDONED) + if (params.m_pVehicle->GetStatus() == STATUS_ABANDONED) return true; - if (veh->m_nCarHornTimer != 0 && params->m_nIndex != FIRETRUK && params->m_nIndex != MRWHOOP) { + if (veh->m_nCarHornTimer != 0 && params.m_nIndex != FIRETRUK && params.m_nIndex != MRWHOOP) { m_sQueueSample.m_nSampleIndex = SFX_SIREN_FAST; - if (params->m_nIndex == FBIRANCH) + if (params.m_nIndex == FBIRANCH) m_sQueueSample.m_nFrequency = 12668; else m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_SIREN_FAST); m_sQueueSample.m_nCounter = 60; - } else if (params->m_nIndex == VICECHEE) { + } else if (params.m_nIndex == VICECHEE) { m_sQueueSample.m_nSampleIndex = SFX_POLICE_SIREN_SLOW; m_sQueueSample.m_nFrequency = 11440; } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nSirenOrAlarmSample; - m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nSirenOrAlarmFrequency; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nSirenOrAlarmSample; + m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nSirenOrAlarmFrequency; } } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nHornSample; - m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nHornFrequency; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nHornSample; + m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nHornFrequency; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = false; @@ -2361,18 +2361,18 @@ cAudioManager::UsesReverseWarning(int32 model) const } bool -cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params) +cAudioManager::ProcessVehicleReverseWarning(cVehicleParams& params) { const float SOUND_INTENSITY = 50.0f; - CVehicle *veh = params->m_pVehicle; + CVehicle *veh = params.m_pVehicle; uint8 volume; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; if (veh->bEngineOn && veh->m_fGasPedal < 0.0f) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); volume = veh->bIsDrowning ? 15 : 60; m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { @@ -2403,7 +2403,7 @@ cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params) } bool -cAudioManager::ProcessVehicleDoors(cVehicleParams *params) +cAudioManager::ProcessVehicleDoors(cVehicleParams& params) { const float SOUND_INTENSITY = 40.0f; @@ -2412,11 +2412,11 @@ cAudioManager::ProcessVehicleDoors(cVehicleParams *params) int32 emittingVol; float velocity; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - automobile = (CAutomobile *)params->m_pVehicle; - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + automobile = (CAutomobile *)params.m_pVehicle; + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); for (int32 i = 0; i < ARRAY_SIZE(automobile->Doors); i++) { if (automobile->Damage.GetDoorStatus(i) == DOOR_STATUS_SWINGING) { doorState = automobile->Doors[i].m_nDoorState; @@ -2451,23 +2451,23 @@ cAudioManager::ProcessVehicleDoors(cVehicleParams *params) } bool -cAudioManager::ProcessAirBrakes(cVehicleParams *params) +cAudioManager::ProcessAirBrakes(cVehicleParams& params) { const float SOUND_INTENSITY = 30.0f; CAutomobile *automobile; uint8 volume; - if (params->m_fDistance > SQR(SOUND_INTENSITY)) + if (params.m_fDistance > SQR(SOUND_INTENSITY)) return false; - automobile = (CAutomobile *)params->m_pVehicle; + automobile = (CAutomobile *)params.m_pVehicle; if (!automobile->bEngineOn) return true; - if ((automobile->m_fVelocityChangeForAudio < 0.025f || params->m_fVelocityChange >= 0.025f) && - (automobile->m_fVelocityChangeForAudio > -0.025f || params->m_fVelocityChange <= 0.025f)) + if ((automobile->m_fVelocityChangeForAudio < 0.025f || params.m_fVelocityChange >= 0.025f) && + (automobile->m_fVelocityChangeForAudio > -0.025f || params.m_fVelocityChange <= 0.025f)) return true; - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); volume = m_anRandomTable[0] % 10 + 70; m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { @@ -2501,20 +2501,20 @@ cAudioManager::HasAirBrakes(int32 model) const } bool -cAudioManager::ProcessEngineDamage(cVehicleParams *params) +cAudioManager::ProcessEngineDamage(cVehicleParams& params) { const float SOUND_INTENSITY = 40.0f; float health; uint8 emittingVolume; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - if (params->m_pVehicle->m_modelIndex == MI_CADDY) + if (params.m_pVehicle->m_modelIndex == MI_CADDY) return true; - if (params->m_pVehicle->GetStatus() == STATUS_WRECKED) + if (params.m_pVehicle->GetStatus() == STATUS_WRECKED) return true; - health = params->m_pVehicle->m_fHealth; + health = params.m_pVehicle->m_fHealth; if (health < 390.0f) { if (health < 250.0f) { emittingVolume = 60; @@ -2527,8 +2527,8 @@ cAudioManager::ProcessEngineDamage(cVehicleParams *params) m_sQueueSample.m_nReleasingVolumeModificator = 7; m_sQueueSample.m_nFrequency = 27000; } - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - if (params->m_pVehicle->bIsDrowning) + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + if (params.m_pVehicle->bIsDrowning) emittingVolume /= 2; m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { @@ -2552,30 +2552,30 @@ cAudioManager::ProcessEngineDamage(cVehicleParams *params) } bool -cAudioManager::ProcessCarBombTick(cVehicleParams *params) +cAudioManager::ProcessCarBombTick(cVehicleParams& params) { const float SOUND_INTENSITY = 40.0f; const uint8 EMITTING_VOLUME = 60; uint8 bombType; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return false; - if (params->m_pVehicle->bEngineOn) { - switch (params->m_VehicleType) { + if (params.m_pVehicle->bEngineOn) { + switch (params.m_VehicleType) { case VEHICLE_TYPE_CAR: - bombType = params->m_pVehicle->m_bombType; + bombType = params.m_pVehicle->m_bombType; break; case VEHICLE_TYPE_BIKE: - bombType = params->m_pVehicle->m_bombType; + bombType = params.m_pVehicle->m_bombType; break; default: - debug("\n * AUDIOLOG: ProcessCarBombTick() Unsupported vehicle type %d * \n", params->m_VehicleType); + debug("\n * AUDIOLOG: ProcessCarBombTick() Unsupported vehicle type %d * \n", params.m_VehicleType); return true; break; } if (bombType == CARBOMB_TIMEDACTIVE) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(EMITTING_VOLUME, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 35; @@ -2602,7 +2602,7 @@ cAudioManager::ProcessCarBombTick(cVehicleParams *params) } void -cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) +cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) { int16 event; uint8 emittingVol; @@ -2632,7 +2632,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) const float SOUND_INTENSITY = 50.0f; maxDist = SQR(SOUND_INTENSITY); emittingVol = m_anRandomTable[2] % 5 + 122; - switch (aVehicleSettings[params->m_nIndex].m_bDoorType) { + switch (aVehicleSettings[params.m_nIndex].m_bDoorType) { case OLD_DOOR: m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_CLOSE; break; @@ -2651,7 +2651,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) } m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = event + 22; //originaly used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i], which is same - if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) + if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 28062; else m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); @@ -2671,7 +2671,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) const float SOUND_INTENSITY = 50.0f; maxDist = SQR(SOUND_INTENSITY); emittingVol = m_anRandomTable[1] % 10 + 117; - switch (aVehicleSettings[params->m_nIndex].m_bDoorType) { + switch (aVehicleSettings[params.m_nIndex].m_bDoorType) { case OLD_DOOR: m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_OPEN; break; @@ -2687,7 +2687,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) } m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_nCounter = event + 10; //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] - if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) + if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 23459; else m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); @@ -2728,7 +2728,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) WheelIndex = 82; m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TYRE_BUMP); m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16); - if (params->m_VehicleType == VEHICLE_TYPE_BIKE) + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) m_sQueueSample.m_nFrequency *= 2; m_sQueueSample.m_nReleasingVolumeModificator = 6; m_sQueueSample.m_fSpeedMultiplier = 2.0f; @@ -2754,8 +2754,8 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) } case SOUND_CAR_ENGINE_START: { const float SOUND_INTENSITY = 40.0f; - if (params->m_pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR - || params->m_pVehicle->m_modelIndex == MI_CADDY) + if (params.m_pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR + || params.m_pVehicle->m_modelIndex == MI_CADDY) continue; emittingVol = 60; maxDist = SQR(SOUND_INTENSITY); @@ -2929,7 +2929,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) case SOUND_HELI_BLADE:{ const float SOUND_INTENSITY = 35.0f; static uint8 HeliIndex = 89; - relVol = ((CAutomobile*)params->m_pVehicle)->m_aWheelSpeed[1] * 50.0f / 11.0f; + relVol = ((CAutomobile*)params.m_pVehicle)->m_aWheelSpeed[1] * 50.0f / 11.0f; if (relVol < 0.2f || relVol == 1.0f) continue; emittingVol = (1.0f - relVol) * 70.0f; @@ -2951,14 +2951,14 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) CVehicle *playerVeh; CPlayerPed *playerPed; - switch (params->m_pVehicle->m_modelIndex) { + switch (params.m_pVehicle->m_modelIndex) { case MI_HUNTER: case MI_CHOPPER: case MI_SEASPAR: case MI_SPARROW: case MI_MAVERICK: case MI_VCNMAV: - if (params->m_pVehicle->m_modelIndex == MI_HUNTER) { + if (params.m_pVehicle->m_modelIndex == MI_HUNTER) { if (Pads[0].GetHandBrake() == 0) { playerVeh = FindPlayerVehicle(); playerPed = FindPlayerPed(); @@ -2966,7 +2966,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) if (playerPed->m_attachedTo != nil && playerPed->m_attachedTo->GetType() == ENTITY_TYPE_VEHICLE) playerVeh = (CVehicle*)playerPed->m_attachedTo; } - if (playerVeh != params->m_pVehicle) { + if (playerVeh != params.m_pVehicle) { m_sQueueSample.m_nSampleIndex = SFX_M60_LEFT; m_sQueueSample.m_nBankIndex = SFX_BANK_0; } else { @@ -3044,8 +3044,8 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) break; } case SOUND_PED_HELI_PLAYER_FOUND: { - pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated; - pedParams.m_fDistance = params->m_fDistance; + pedParams.m_bDistanceCalculated = params.m_bDistanceCalculated; + pedParams.m_fDistance = params.m_fDistance; SetupPedComments(&pedParams, SOUND_PED_HELI_PLAYER_FOUND); continue; } @@ -3053,13 +3053,13 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) pedParams.m_pPed = nil; pedParams.m_bDistanceCalculated = false; pedParams.m_fDistance = 0.0f; - pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated; - pedParams.m_fDistance = params->m_fDistance; + pedParams.m_bDistanceCalculated = params.m_bDistanceCalculated; + pedParams.m_fDistance = params.m_fDistance; SetupPedComments(&pedParams, SOUND_PED_BODYCAST_HIT); continue; */ case SOUND_PED_VCPA_PLAYER_FOUND: { - pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated; - pedParams.m_fDistance = params->m_fDistance; + pedParams.m_bDistanceCalculated = params.m_bDistanceCalculated; + pedParams.m_fDistance = params.m_fDistance; SetupPedComments(&pedParams, SOUND_PED_VCPA_PLAYER_FOUND); } case SOUND_WATER_FALL: { @@ -3118,8 +3118,8 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params) default: continue; } - if (params->m_fDistance < maxDist) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + if (params.m_fDistance < maxDist) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { if (noReflections) { @@ -3226,7 +3226,7 @@ cAudioManager::ProcessTrainNoise(cVehicleParams *params) } #endif bool -cAudioManager::ProcessBoatEngine(cVehicleParams *params) +cAudioManager::ProcessBoatEngine(cVehicleParams& params) { CBoat *boat; float padRelativeAccerate; @@ -3240,10 +3240,10 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params) static const int intensity = 50; - if (params->m_fDistance < SQR(intensity)) { - boat = (CBoat *)params->m_pVehicle; - if (params->m_nIndex == REEFER) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + if (params.m_fDistance < SQR(intensity)) { + boat = (CBoat *)params.m_pVehicle; + if (params.m_nIndex == REEFER) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(80, 50.f, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 39; @@ -3265,7 +3265,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params) m_sQueueSample.m_bRequireReflection = false; AddSampleToRequestedQueue(); } - if (FindPlayerVehicle() == params->m_pVehicle) { + if (FindPlayerVehicle() == params.m_pVehicle) { padAccelerate = Max(Pads[0].GetAccelerate(), Pads[0].GetBrake()); padRelativeAccerate = padAccelerate / 255; emittingVol = (100.f * padRelativeAccerate) + 15; @@ -3304,7 +3304,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params) m_sQueueSample.m_bReverbFlag = true; m_sQueueSample.m_bRequireReflection = false; } else { - if (FindPlayerVehicle() == params->m_pVehicle) { + if (FindPlayerVehicle() == params.m_pVehicle) { padAccelerate = Max(Pads[0].GetAccelerate(), Pads[0].GetBrake()); if (padAccelerate <= 20) { emittingVol = 45 - 45 * padAccelerate / 40; @@ -3341,7 +3341,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params) m_sQueueSample.m_nSampleIndex = SFX_FISHING_BOAT_IDLE; } } - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 50.f, m_sQueueSample.m_fDistance); if (!m_sQueueSample.m_nVolume) return true; @@ -3367,22 +3367,22 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params) } bool -cAudioManager::ProcessBoatMovingOverWater(cVehicleParams *params) +cAudioManager::ProcessBoatMovingOverWater(cVehicleParams& params) { float velocityChange; int32 vol; float multiplier; - if (params->m_fDistance > SQR(50)) + if (params.m_fDistance > SQR(50)) return false; - velocityChange = Abs(params->m_fVelocityChange); - if (velocityChange <= 0.0005f && ((CBoat*)params->m_pVehicle)->bBoatInWater) + velocityChange = Abs(params.m_fVelocityChange); + if (velocityChange <= 0.0005f && ((CBoat*)params.m_pVehicle)->bBoatInWater) return true; velocityChange = Min(0.75f, velocityChange); multiplier = (velocityChange - 0.0005f) / (1499.0f / 2000.0f); - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); vol = (30.f * multiplier); m_sQueueSample.m_nVolume = ComputeVolume(vol, 50.f, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { @@ -3409,7 +3409,7 @@ cAudioManager::ProcessBoatMovingOverWater(cVehicleParams *params) } void -cAudioManager::ProcessCarHeli(cVehicleParams* params) +cAudioManager::ProcessCarHeli(cVehicleParams& params) { const float SOUND_INTENSITY = 250.0f; @@ -3440,11 +3440,11 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params) automobile = nil; hunterBool = false; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return; playerVeh = FindPlayerVehicle(); - veh = params->m_pVehicle; + veh = params.m_pVehicle; if (playerVeh == veh) { accelerateState = Pads[0].GetAccelerate(); brakeState = Pads[0].GetBrake(); @@ -3457,7 +3457,7 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params) if (veh->m_modelIndex == MI_SKIMMER) { boat = (CBoat*)veh; propellerSpeed = boat->m_fMovingSpeed * 50.0f / 11.0f; - } else if (params->m_VehicleType == VEHICLE_TYPE_HELI) { + } else if (params.m_VehicleType == VEHICLE_TYPE_HELI) { propellerSpeed = 1.0f; } else { automobile = (CAutomobile*)veh; @@ -3468,7 +3468,7 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params) return; propellerSpeed = Min(1.0f, propellerSpeed); - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); //sound on long distances @@ -3510,7 +3510,7 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params) } } - if (params->m_fDistance >= SQR(140.0f)) + if (params.m_fDistance >= SQR(140.0f)) return; if (propellerSpeed >= 0.4f) @@ -3640,7 +3640,7 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params) //engine starting sound - if (boat == nil && params->m_VehicleType != VEHICLE_TYPE_HELI && m_sQueueSample.m_fDistance < 30.0f) { //strange way to check if automobile != nil + if (boat == nil && params.m_VehicleType != VEHICLE_TYPE_HELI && m_sQueueSample.m_fDistance < 30.0f) { //strange way to check if automobile != nil if (automobile->bEngineOn) { if (propellerSpeed < 1.0f) { emittingVol = (1.0f - propellerSpeed / 2.0f) * 70.0f; @@ -3711,18 +3711,18 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params) } else { //vacuum cleaner sound vecPosOld = m_sQueueSample.m_vecPos; - distanceCalculatedOld = params->m_bDistanceCalculated; - distanceOld = params->m_fDistance; + distanceCalculatedOld = params.m_bDistanceCalculated; + distanceOld = params.m_fDistance; if (automobile != nil) automobile->GetComponentWorldPosition(CAR_BOOT, m_sQueueSample.m_vecPos); - else if (params->m_VehicleType == VEHICLE_TYPE_HELI) + else if (params.m_VehicleType == VEHICLE_TYPE_HELI) m_sQueueSample.m_vecPos = CVector(0.0f, -10.0f, 0.0f); //this is from android, but for real it's not used - params->m_bDistanceCalculated = false; - params->m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); - if (params->m_fDistance < SQR(27.0f)) { - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + params.m_bDistanceCalculated = false; + params.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); + if (params.m_fDistance < SQR(27.0f)) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(volumeModifier * 25.0f, 27.0f, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume) { m_sQueueSample.m_nCounter = 2; @@ -3746,13 +3746,13 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params) } m_sQueueSample.m_vecPos = vecPosOld; - params->m_bDistanceCalculated = distanceCalculatedOld; - params->m_fDistance = distanceOld; + params.m_bDistanceCalculated = distanceCalculatedOld; + params.m_fDistance = distanceOld; } } void -cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params) +cAudioManager::ProcessVehicleFlatTyre(cVehicleParams& params) { const float SOUND_INTENSITY = 60.0f; @@ -3763,12 +3763,12 @@ cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params) float modifier; - if (params->m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return; - switch (params->m_VehicleType) { + switch (params.m_VehicleType) { case VEHICLE_TYPE_CAR: - automobile = (CAutomobile*)params->m_pVehicle; + automobile = (CAutomobile*)params.m_pVehicle; wheelBurst = false; for (int i = 0; i < 4; i++) if (automobile->Damage.GetWheelStatus(i) == WHEEL_STATUS_BURST && automobile->m_aWheelTimer[i] > 0.0f) @@ -3777,7 +3777,7 @@ cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params) return; break; case VEHICLE_TYPE_BIKE: - bike = (CBike*)params->m_pVehicle; + bike = (CBike*)params.m_pVehicle; wheelBurst = false; for(int i = 0; i < 2; i++) if (bike->m_wheelStatus[i] == WHEEL_STATUS_BURST && bike->m_aWheelTimer[i] > 0.0f) @@ -3788,10 +3788,10 @@ cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params) default: return; } - modifier = Min(1.0f, Abs(params->m_fVelocityChange) / (0.3f * params->m_pTransmission->fMaxVelocity)); + modifier = Min(1.0f, Abs(params.m_fVelocityChange) / (0.3f * params.m_pTransmission->fMaxVelocity)); if (modifier > 0.01f) { //mb can be replaced by (emittingVol > 1) emittingVol = (100.0f * modifier); - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume) { m_sQueueSample.m_nCounter = 95; @@ -3817,9 +3817,9 @@ cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params) //TODO use it in ProcessVehicle void -cAudioManager::ProcessPlane(cVehicleParams *params) +cAudioManager::ProcessPlane(cVehicleParams& params) { - switch (params->m_nIndex) { + switch (params.m_nIndex) { case AIRTRAIN: ProcessJumbo(params); break; @@ -3842,16 +3842,16 @@ DoJumboVolOffset() } void -cAudioManager::ProcessJumbo(cVehicleParams *params) +cAudioManager::ProcessJumbo(cVehicleParams& params) { CPlane *plane; float position; - if (params->m_fDistance >= SQR(440)) - return; + //if (params.m_fDistance >= SQR(440)) + // return; - CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance); - plane = (CPlane*)params->m_pVehicle; + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + plane = (CPlane*)params.m_pVehicle; DoJumboVolOffset(); position = PlanePathPosition[plane->m_nPlaneId]; if (position <= TakeOffPoint) { diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index cdb59412..35bb877c 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -401,28 +401,27 @@ public: void PreTerminateGameSpecificShutdown(); // done /// processX - main logic of adding new sounds void ProcessActiveQueues(); // done - bool ProcessAirBrakes(cVehicleParams *params); // done - bool ProcessBoatEngine(cVehicleParams *params); - bool ProcessBoatMovingOverWater(cVehicleParams *params); + bool ProcessAirBrakes(cVehicleParams& params); // done + bool ProcessBoatEngine(cVehicleParams& params); + bool ProcessBoatMovingOverWater(cVehicleParams& params); #ifdef GTA_BRIDGE void ProcessBridge(); // done(bcs not exists in VC) void ProcessBridgeMotor(); // done(bcs not exists in VC) void ProcessBridgeOneShots(); // done(bcs not exists in VC) void ProcessBridgeWarning(); // done(bcs not exists in VC) #endif - bool ProcessCarBombTick(cVehicleParams *params); // done - void ProcessCesna(cVehicleParams *params); // + bool ProcessCarBombTick(cVehicleParams& params); // done + void ProcessCarHeli(cVehicleParams& params); // done + void ProcessCesna(cVehicleParams& params); // //void ProcessCrane(); // done(bcs not exists in VC) - bool ProcessEngineDamage(cVehicleParams *params); // done + bool ProcessEngineDamage(cVehicleParams& params); // done void ProcessEntity(int32 sound); // done void ProcessExplosions(int32 explosion); // done void ProcessFireHydrant(); // done void ProcessFires(int32 entity); // done void ProcessFrontEnd(); // done void ProcessGarages(); // - void ProcessCarHeli(cVehicleParams* params); // done - void ProcessVehicleFlatTyre(cVehicleParams* params); // done - void ProcessJumbo(cVehicleParams *); // done + void ProcessJumbo(cVehicleParams& params); // done void ProcessJumboAccel(CPlane *plane); // done void ProcessJumboDecel(CPlane *plane); // done void ProcessJumboFlying(); // done @@ -432,37 +431,37 @@ public: void ProcessLoopingScriptObject(uint8 sound); // void ProcessMissionAudio(); // void ProcessMissionAudioSlot(uint8 slot); // - void ProcessModelHeliVehicle(cVehicleParams* params); // done - void ProcessModelVehicle(cVehicleParams *params); // done + void ProcessModelHeliVehicle(cVehicleParams& params); // done + void ProcessModelVehicle(cVehicleParams& params); // done void ProcessOneShotScriptObject(uint8 sound); // void ProcessPed(CPhysical *ped); // done void ProcessPedOneShots(cPedParams *params); // void ProcessPhysical(int32 id); // done - void ProcessPlane(cVehicleParams *params); // done + void ProcessPlane(cVehicleParams& params); // done void ProcessPlayerMood(); // done - void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done + void ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh); // done void ProcessProjectiles(); // done - void ProcessRainOnVehicle(cVehicleParams *params); // done + void ProcessRainOnVehicle(cVehicleParams& params); // done void ProcessReverb() const; // done - bool ProcessReverseGear(cVehicleParams *params); // done + bool ProcessReverseGear(cVehicleParams& params); // done void ProcessScriptObject(int32 id); // done void ProcessSpecial(); // done #ifdef GTA_TRAIN bool ProcessTrainNoise(cVehicleParams *params); //done(bcs not exists in VC) #endif void ProcessVehicle(CVehicle *vehicle); // done - bool ProcessVehicleDoors(cVehicleParams *params); // done - void ProcessVehicleEngine(cVehicleParams *params); // done - void UpdateGasPedalAudio(CVehicle* veh, int vehType); // done - bool ProcessVehicleHorn(cVehicleParams *params); // done - void ProcessVehicleOneShots(cVehicleParams *params); // done - bool ProcessVehicleReverseWarning(cVehicleParams *params); // done - bool ProcessVehicleRoadNoise(cVehicleParams *params); // done - bool ProcessVehicleSirenOrAlarm(cVehicleParams *params); // done - bool ProcessVehicleSkidding(cVehicleParams *params); // done + bool ProcessVehicleDoors(cVehicleParams& params); // done + void ProcessVehicleEngine(cVehicleParams& params); // done + void ProcessVehicleFlatTyre(cVehicleParams& params); // done + bool ProcessVehicleHorn(cVehicleParams& params); // done + void ProcessVehicleOneShots(cVehicleParams& params); // done + bool ProcessVehicleReverseWarning(cVehicleParams& params); // done + bool ProcessVehicleRoadNoise(cVehicleParams& params); // done + bool ProcessVehicleSirenOrAlarm(cVehicleParams& params); // done + bool ProcessVehicleSkidding(cVehicleParams& params); // done void ProcessWaterCannon(int32); // done void ProcessWeather(int32 id); // done - bool ProcessWetRoadNoise(cVehicleParams *params); // done + bool ProcessWetRoadNoise(cVehicleParams& params); // done void ProcessEscalators(); // done void ProcessExtraSounds(); // done @@ -507,10 +506,11 @@ public: void Terminate(); //done void TranslateEntity(Const CVector *v1, CVector *v2) const; //done + void UpdateGasPedalAudio(CVehicle* veh, int vehType); // done void UpdateReflections(); //done bool UsesReverseWarning(int32 model) const; //done - bool UsesSiren(cVehicleParams *params) const; //done - bool UsesSirenSwitching(cVehicleParams* params) const; //done + bool UsesSiren(cVehicleParams& params) const; //done + bool UsesSirenSwitching(cVehicleParams& params) const; //done CVehicle *FindVehicleOfPlayer(); //done void SetPedTalkingStatus(CPed *ped, uint8 status); diff --git a/src/control/Script.h b/src/control/Script.h index 8949fe05..c6ece50f 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -381,7 +381,7 @@ private: public: static void RemoveThisPed(CPed* pPed); - static uint32* GetLastMissionPassedTime() { return &LastMissionPassedTime; } + static uint32& GetLastMissionPassedTime() { return LastMissionPassedTime; } #ifdef MISSION_SWITCHER static void SwitchToMission(int32 mission); #endif From 0853a47a3f521684a4c9c9890b65fc638e41cb07 Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 8 Nov 2020 21:23:29 +0300 Subject: [PATCH 31/45] returned bad code, becouse no one knows what to do with it --- src/audio/AudioLogic.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 6270e6d8..72ca6655 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2650,7 +2650,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = event + 22; //originaly used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i], which is same + m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 22; if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 28062; else @@ -2686,7 +2686,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = event + 10; //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 10; if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 23459; else @@ -2715,7 +2715,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) const float SOUND_INTENSITY = 35.0f; static uint8 WheelIndex = 82; maxDist = SQR(SOUND_INTENSITY); - if (event == SOUND_CAR_JUMP_2) { //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + if (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] == SOUND_CAR_JUMP_2) { m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B; emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i])); } else { From 363a2c6098c6be9296406a1511a6183f921f929a Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 8 Nov 2020 22:26:14 +0300 Subject: [PATCH 32/45] marked stupied code(dotProduct and AudioEvents) --- src/audio/AudioLogic.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 72ca6655..725149a2 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -1047,7 +1047,11 @@ cAudioManager::ProcessModelVehicle(cVehicleParams& params) freq = clamp2(freq, prevFreq, 800); } if (!vehSlowdown) +#ifdef THIS_IS_STUPID + freq += 8000.0f * Abs(DotProduct(params.m_pVehicle->GetUp(), CVector(0.0f, 1.0f, 0.0f))); +#else freq += 8000.0f * Abs(params.m_pVehicle->GetUp().y); +#endif if (params.m_pVehicle->bIsDrowning) volume /= 4; if (volume > 0) { @@ -2650,7 +2654,11 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; +#ifdef THIS_IS_STUPID m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 22; +#else + m_sQueueSample.m_nCounter = event + 22; +#endif if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 28062; else @@ -2686,7 +2694,11 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) break; } m_sQueueSample.m_nBankIndex = SFX_BANK_0; +#ifdef THIS_IS_STUPID m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 10; +#else + m_sQueueSample.m_nCounter = event + 10; +#endif if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI) m_sQueueSample.m_nFrequency = 23459; else @@ -2715,7 +2727,11 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) const float SOUND_INTENSITY = 35.0f; static uint8 WheelIndex = 82; maxDist = SQR(SOUND_INTENSITY); +#ifdef THIS_IS_STUPID if (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] == SOUND_CAR_JUMP_2) { +#else + if (event == SOUND_CAR_JUMP_2) { +#endif m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B; emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i])); } else { @@ -7698,7 +7714,6 @@ cAudioManager::ProcessFires(int32) m_sQueueSample.m_fSoundIntensity = 80.0f; m_sQueueSample.m_nSampleIndex = SFX_CAR_ON_FIRE; m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_CAR_ON_FIRE); - //mb error in III emittingVol = 80; m_sQueueSample.m_nReleasingVolumeModificator = 8; } From fb2173c3964dcb6916399dffb9ff44c81863d11d Mon Sep 17 00:00:00 2001 From: Roman Masanin <36927roma@gmail.com> Date: Sun, 8 Nov 2020 22:33:30 +0300 Subject: [PATCH 33/45] to make Serge and _R4K_ happy --- src/audio/AudioLogic.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 725149a2..f51064aa 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -3153,6 +3153,9 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) if (0.2f * m_sQueueSample.m_fSoundIntensity > m_sQueueSample.m_fDistance) { m_sQueueSample.m_bIs2D = true; m_sQueueSample.m_nOffset = 0; +#ifdef THIS_IS_STUPID + goto AddSample; +#else AddSampleToRequestedQueue(); m_sQueueSample.m_nOffset = 127; m_sQueueSample.m_nSampleIndex++; @@ -3162,11 +3165,26 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) m_sQueueSample.m_bRequireReflection = 0; AddSampleToRequestedQueue(); continue; +#endif } isHeli = false; } m_sQueueSample.m_bIs2D = false; +#ifdef THIS_IS_STUPID +AddSample: AddSampleToRequestedQueue(); + if (isHeli) { + m_sQueueSample.m_nOffset = 127; + m_sQueueSample.m_nSampleIndex++; + m_sQueueSample.m_nCounter = GunIndex++; + if (GunIndex > 58) + GunIndex = 53; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } +#else + AddSampleToRequestedQueue(); +#endif continue; } From 23d294fef51d468dcdf0b2744a2974ede9792fa3 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 8 Nov 2020 21:59:13 +0200 Subject: [PATCH 34/45] Possibly fix pickup money text --- src/objects/Object.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index 293e5274..93b6d581 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -38,7 +38,7 @@ CObject::CObject(void) m_colour2 = 0; m_colour1 = m_colour2; m_nBonusValue = 0; - // m_nCostValue = 0; // TODO(Miami) + m_nCostValue = 0; bIsPickup = false; bPickupObjWithMessage = false; bOutOfStock = false; @@ -444,7 +444,7 @@ CObject::Init(void) m_colour2 = 0; m_nBonusValue = 0; bIsWeapon = false; -// TODO(MIAMI): some new field here + m_nCostValue = 0; m_pCollidingEntity = nil; CColPoint point; CEntity* outEntity = nil; From 51e7f444337c59ce24ad9aecca252e1dd7d91b2e Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 8 Nov 2020 22:40:05 +0200 Subject: [PATCH 35/45] Pickup fix --- src/control/Pickups.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp index 3d76fe5b..7e7ef321 100644 --- a/src/control/Pickups.cpp +++ b/src/control/Pickups.cpp @@ -369,7 +369,7 @@ CPickup::Update(CPlayerPed *player, CVehicle *vehicle, int playerId) if (weaponType < WEAPONTYPE_TOTALWEAPONS && CDarkel::FrenzyOnGoing()) { isPickupTouched = false; m_bWasControlMessageShown = false; - } else if (weaponType != WEAPONTYPE_UNARMED) { + } else if (weaponType < WEAPONTYPE_TOTALWEAPONS && weaponType != WEAPONTYPE_UNARMED) { uint32 slot = CWeaponInfo::GetWeaponInfo(weaponType)->m_nWeaponSlot; eWeaponType plrWeaponSlot = FindPlayerPed()->GetWeapon(slot).m_eWeaponType; if (plrWeaponSlot != weaponType) { From cf6a9a8341d27abb9b4936912e8cdd5e8379d373 Mon Sep 17 00:00:00 2001 From: majestic Date: Mon, 9 Nov 2020 06:18:49 -0800 Subject: [PATCH 36/45] CGlass indices fix --- src/render/Glass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render/Glass.cpp b/src/render/Glass.cpp index 426fa7f1..536d94e0 100644 --- a/src/render/Glass.cpp +++ b/src/render/Glass.cpp @@ -967,7 +967,7 @@ CGlass::BreakGlassPhysically(CVector pos, float radius) for ( int32 j = 0; j < col->numTriangles; j++ ) { if ( CCollision::TestSphereTriangle(sphere, - col->vertices, col->triangles[i], col->trianglePlanes[i]) ) + col->vertices, col->triangles[j], col->trianglePlanes[j]) ) { hit = true; } From ef2089cafbdbd37589d17a4af9e1989f04672777 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Wed, 11 Nov 2020 00:08:32 +0300 Subject: [PATCH 37/45] CWorld done --- src/control/Pickups.cpp | 14 ++ src/control/Pickups.h | 1 + src/core/World.cpp | 248 ++++++++++++++++++++++----------- src/core/World.h | 20 ++- src/vehicles/Automobile.cpp | 12 +- src/weapons/ProjectileInfo.cpp | 4 +- vendor/librw | 2 +- vendor/ogg | 2 +- vendor/opus | 2 +- 9 files changed, 213 insertions(+), 92 deletions(-) diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp index 2a5863f1..acfb1fbb 100644 --- a/src/control/Pickups.cpp +++ b/src/control/Pickups.cpp @@ -1410,6 +1410,20 @@ CPickups::DetonateMinesHitByGunShot(CVector *vec1, CVector *vec2) } } +void +CPickups::RemoveUnnecessaryPickups(const CVector& center, float radius) +{ + for (int i = 0; i < NUMPICKUPS; i++) { + if (aPickUps[i].m_eType == PICKUP_ONCE_TIMEOUT || aPickUps[i].m_eType == PICKUP_MONEY) { + if ((aPickUps[i].m_vecPos - center).Magnitude() < radius) { + aPickUps[i].GetRidOfObjects(); + aPickUps[i].m_bRemoved = true; + aPickUps[i].m_eType = PICKUP_NONE; + } + } + } +} + void CPickups::Load(uint8 *buf, uint32 size) { diff --git a/src/control/Pickups.h b/src/control/Pickups.h index e48ae3b7..36179f66 100644 --- a/src/control/Pickups.h +++ b/src/control/Pickups.h @@ -103,6 +103,7 @@ public: static bool TryToMerge_WeaponType(CVector pos, eWeaponType weapon, uint8 type, uint32 quantity, bool unused); static void CreateSomeMoney(CVector, int); static void DetonateMinesHitByGunShot(CVector *vec1, CVector *vec2); + static void RemoveUnnecessaryPickups(const CVector& center, float radius); static void Load(uint8 *buf, uint32 size); static void Save(uint8 *buf, uint32 *size); diff --git a/src/core/World.cpp b/src/core/World.cpp index 14c06a81..e3b8837f 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -15,6 +15,7 @@ #include "Object.h" #include "ParticleObject.h" #include "Ped.h" +#include "Pickups.h" #include "PlayerPed.h" #include "Population.h" #include "ProjectileInfo.h" @@ -28,6 +29,7 @@ #include "WaterLevel.h" #include "World.h" +// --MIAMI: file done #define OBJECT_REPOSITION_OFFSET_Z 2.0f @@ -157,6 +159,7 @@ CWorld::ClearExcitingStuffFromArea(const CVector &pos, float radius, bool bRemov CProjectileInfo::RemoveAllProjectiles(); CShadows::TidyUpShadows(); } + CPickups::RemoveUnnecessaryPickups(pos, radius); } bool @@ -333,11 +336,24 @@ CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColP { bool deadPeds = false; bool bikers = false; + bool carTyres = false; float mindist = dist; CPtrNode *node; CEntity *e; CColModel *colmodel; + CColModel tyreCol; + CColSphere tyreSpheres[6]; + CColPoint tyreColPoint; + float tyreDist; + if(bIncludeCarTyres && list.first && ((CEntity*)list.first->item)->IsVehicle()){ + carTyres = true; + tyreCol.numTriangles = 0; + tyreCol.numBoxes = 0; + tyreCol.numLines = 0; + tyreCol.spheres = tyreSpheres; + tyreCol.numSpheres = ARRAY_SIZE(tyreSpheres); + } if(list.first && bIncludeDeadPeds && ((CEntity *)list.first->item)->IsPed()) deadPeds = true; if(list.first && bIncludeBikers && ((CEntity *)list.first->item)->IsPed()) bikers = true; @@ -346,10 +362,11 @@ CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColP if(e->m_scanCode != GetCurrentScanCode() && e != pIgnoreEntity && (e->bUsesCollision || deadPeds || bikers) && !(ignoreSomeObjects && CameraToIgnoreThisObject(e))) { colmodel = nil; + tyreDist = mindist; e->m_scanCode = GetCurrentScanCode(); if(e->IsPed()) { - if(e->bUsesCollision || deadPeds && ((CPed *)e)->m_nPedState == PED_DEAD || bikers) { + if(e->bUsesCollision || deadPeds && ((CPed *)e)->m_nPedState == PED_DEAD || bikers && ((CPed*)e)->InVehicle() && (((CPed*)e)->m_pMyVehicle->IsBike() || ((CPed*)e)->m_pMyVehicle->IsBoat())) { colmodel = ((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()))->AnimatePedColModelSkinned(e->GetClump()); } else colmodel = nil; @@ -360,8 +377,18 @@ CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColP if(colmodel && CCollision::ProcessLineOfSight(line, e->GetMatrix(), *colmodel, point, dist, ignoreSeeThrough, ignoreShootThrough)) entity = e; + if(carTyres && ((CVehicle*)e)->SetUpWheelColModel(&tyreCol) && CCollision::ProcessLineOfSight(line, e->GetMatrix(), tyreCol, tyreColPoint, tyreDist, false, ignoreShootThrough)){ + float dp1 = DotProduct(line.p1 - line.p0, e->GetRight()); + float dp2 = DotProduct(point.point - e->GetPosition(), e->GetRight()); + if(tyreDist < mindist || dp1 < -0.85f && dp2 > 0.0f || dp1 > 0.85f && dp2 < 0.0f){ + mindist = tyreDist; + point = tyreColPoint; + entity = e; + } + } } } + tyreCol.spheres = nil; if(mindist < dist) { dist = mindist; @@ -695,18 +722,10 @@ CWorld::FindObjectsInRange(Const CVector ¢re, float radius, bool ignoreZ, in if(minY <= 0) minY = 0; int maxX = GetSectorIndexX(centre.x + radius); -#ifdef FIX_BUGS if(maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X - 1; -#else - if(maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X; -#endif int maxY = GetSectorIndexY(centre.y + radius); -#ifdef FIX_BUGS if(maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y - 1; -#else - if(maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y; -#endif AdvanceCurrentScanCode(); @@ -781,13 +800,18 @@ CWorld::FindObjectsOfTypeInRange(uint32 modelId, const CVector &position, float *nEntitiesFound = 0; const CVector2D vecSectorStartPos(position.x - radius, position.y - radius); const CVector2D vecSectorEndPos(position.x + radius, position.y + radius); - const int32 nStartX = Max(CWorld::GetSectorIndexX(vecSectorStartPos.x), 0); - const int32 nStartY = Max(CWorld::GetSectorIndexY(vecSectorStartPos.y), 0); - const int32 nEndX = Min(CWorld::GetSectorIndexX(vecSectorEndPos.x), NUMSECTORS_X - 1); - const int32 nEndY = Min(CWorld::GetSectorIndexY(vecSectorEndPos.y), NUMSECTORS_Y - 1); + const int32 nStartX = Max(GetSectorIndexX(vecSectorStartPos.x), 0); + const int32 nStartY = Max(GetSectorIndexY(vecSectorStartPos.y), 0); +#ifdef FIX_BUGS + const int32 nEndX = Min(GetSectorIndexX(vecSectorEndPos.x), NUMSECTORS_X - 1); + const int32 nEndY = Min(GetSectorIndexY(vecSectorEndPos.y), NUMSECTORS_Y - 1); +#else + const int32 nEndX = Min(GetSectorIndexX(vecSectorEndPos.x), NUMSECTORS_X); + const int32 nEndY = Min(GetSectorIndexY(vecSectorEndPos.y), NUMSECTORS_Y); +#endif for(int32 y = nStartY; y <= nEndY; y++) { for(int32 x = nStartX; x <= nEndX; x++) { - CSector *pSector = CWorld::GetSector(x, y); + CSector *pSector = GetSector(x, y); if(bBuildings) { CWorld::FindObjectsOfTypeInRangeSectorList( modelId, pSector->m_lists[ENTITYLIST_BUILDINGS], position, radius, bCheck2DOnly, @@ -1050,13 +1074,18 @@ CWorld::FindObjectsKindaColliding(const CVector &position, float radius, bool bC *nCollidingEntities = 0; const CVector2D vecSectorStartPos(position.x - radius, position.y - radius); const CVector2D vecSectorEndPos(position.x + radius, position.y + radius); - const int32 nStartX = Max(CWorld::GetSectorIndexX(vecSectorStartPos.x), 0); - const int32 nStartY = Max(CWorld::GetSectorIndexY(vecSectorStartPos.y), 0); - const int32 nEndX = Min(CWorld::GetSectorIndexX(vecSectorEndPos.x), NUMSECTORS_X - 1); - const int32 nEndY = Min(CWorld::GetSectorIndexY(vecSectorEndPos.y), NUMSECTORS_Y - 1); + const int32 nStartX = Max(GetSectorIndexX(vecSectorStartPos.x), 0); + const int32 nStartY = Max(GetSectorIndexY(vecSectorStartPos.y), 0); +#ifdef FIX_BUGS + const int32 nEndX = Min(GetSectorIndexX(vecSectorEndPos.x), NUMSECTORS_X - 1); + const int32 nEndY = Min(GetSectorIndexY(vecSectorEndPos.y), NUMSECTORS_Y - 1); +#else + const int32 nEndX = Min(GetSectorIndexX(vecSectorEndPos.x), NUMSECTORS_X); + const int32 nEndY = Min(GetSectorIndexY(vecSectorEndPos.y), NUMSECTORS_Y); +#endif for(int32 y = nStartY; y <= nEndY; y++) { for(int32 x = nStartX; x <= nEndX; x++) { - CSector *pSector = CWorld::GetSector(x, y); + CSector *pSector = GetSector(x, y); if(bBuildings) { CWorld::FindObjectsKindaCollidingSectorList( pSector->m_lists[ENTITYLIST_BUILDINGS], position, radius, bCheck2DOnly, @@ -1129,13 +1158,18 @@ CWorld::FindObjectsIntersectingCube(const CVector &vecStartPos, const CVector &v { CWorld::AdvanceCurrentScanCode(); *nIntersecting = 0; - const int32 nStartX = Max(CWorld::GetSectorIndexX(vecStartPos.x), 0); - const int32 nStartY = Max(CWorld::GetSectorIndexY(vecStartPos.y), 0); - const int32 nEndX = Min(CWorld::GetSectorIndexX(vecEndPos.x), NUMSECTORS_X - 1); - const int32 nEndY = Min(CWorld::GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y - 1); + const int32 nStartX = Max(GetSectorIndexX(vecStartPos.x), 0); + const int32 nStartY = Max(GetSectorIndexY(vecStartPos.y), 0); +#ifdef FIX_BUGS + const int32 nEndX = Min(GetSectorIndexX(vecStartPos.x), NUMSECTORS_X - 1); + const int32 nEndY = Min(GetSectorIndexY(vecStartPos.y), NUMSECTORS_Y - 1); +#else + const int32 nEndX = Min(GetSectorIndexX(vecSectorPos.x), NUMSECTORS_X); + const int32 nEndY = Min(GetSectorIndexY(vecSectorPos.y), NUMSECTORS_Y); +#endif for(int32 y = nStartY; y <= nEndY; y++) { for(int32 x = nStartX; x <= nEndX; x++) { - CSector *pSector = CWorld::GetSector(x, y); + CSector *pSector = GetSector(x, y); if(bBuildings) { CWorld::FindObjectsIntersectingCubeSectorList(pSector->m_lists[ENTITYLIST_BUILDINGS], vecStartPos, vecEndPos, nIntersecting, @@ -1210,13 +1244,18 @@ CWorld::FindObjectsIntersectingAngledCollisionBox(const CBox &boundingBox, const { CWorld::AdvanceCurrentScanCode(); *nEntitiesFound = 0; - const int32 nStartX = Max(CWorld::GetSectorIndexX(fStartX), 0); - const int32 nStartY = Max(CWorld::GetSectorIndexY(fStartY), 0); - const int32 nEndX = Min(CWorld::GetSectorIndexX(fEndX), NUMSECTORS_X - 1); - const int32 nEndY = Min(CWorld::GetSectorIndexY(fEndY), NUMSECTORS_Y - 1); + const int32 nStartX = Max(GetSectorIndexX(fStartX), 0); + const int32 nStartY = Max(GetSectorIndexY(fStartY), 0); +#ifdef FIX_BUGS + const int32 nEndX = Min(GetSectorIndexX(fEndX), NUMSECTORS_X - 1); + const int32 nEndY = Min(GetSectorIndexY(fEndY), NUMSECTORS_Y - 1); +#else + const int32 nEndX = Min(GetSectorIndexX(fEndX), NUMSECTORS_X); + const int32 nEndY = Min(GetSectorIndexY(fEndY), NUMSECTORS_Y); +#endif for(int32 y = nStartY; y <= nEndY; y++) { for(int32 x = nStartX; x <= nEndX; x++) { - CSector *pSector = CWorld::GetSector(x, y); + CSector *pSector = GetSector(x, y); if(bBuildings) { CWorld::FindObjectsIntersectingAngledCollisionBoxSectorList( pSector->m_lists[ENTITYLIST_BUILDINGS], boundingBox, matrix, position, @@ -1290,13 +1329,18 @@ CWorld::FindMissionEntitiesIntersectingCube(const CVector &vecStartPos, const CV { CWorld::AdvanceCurrentScanCode(); *nIntersecting = 0; - const int32 nStartX = Max(CWorld::GetSectorIndexX(vecStartPos.x), 0); - const int32 nStartY = Max(CWorld::GetSectorIndexY(vecStartPos.y), 0); - const int32 nEndX = Min(CWorld::GetSectorIndexX(vecEndPos.x), NUMSECTORS_X - 1); - const int32 nEndY = Min(CWorld::GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y - 1); + const int32 nStartX = Max(GetSectorIndexX(vecStartPos.x), 0); + const int32 nStartY = Max(GetSectorIndexY(vecStartPos.y), 0); +#ifdef FIX_BUGS + const int32 nEndX = Min(GetSectorIndexX(vecEndPos.x), NUMSECTORS_X - 1); + const int32 nEndY = Min(GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y - 1); +#else + const int32 nEndX = Min(GetSectorIndexX(vecEndPos.x), NUMSECTORS_X); + const int32 nEndY = Min(GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y); +#endif for(int32 y = nStartY; y <= nEndY; y++) { for(int32 x = nStartX; x <= nEndX; x++) { - CSector *pSector = CWorld::GetSector(x, y); + CSector *pSector = GetSector(x, y); if(bVehicles) { CWorld::FindMissionEntitiesIntersectingCubeSectorList( pSector->m_lists[ENTITYLIST_VEHICLES], vecStartPos, vecEndPos, nIntersecting, @@ -1504,13 +1548,18 @@ CWorld::CallOffChaseForArea(float x1, float y1, float x2, float y2) float fStartY = y1 - 10.0f; float fEndX = x2 + 10.0f; float fEndY = y2 + 10.0f; - const int32 nStartX = Max(CWorld::GetSectorIndexX(fStartX), 0); - const int32 nStartY = Max(CWorld::GetSectorIndexY(fStartY), 0); - const int32 nEndX = Min(CWorld::GetSectorIndexX(fEndX), NUMSECTORS_X - 1); - const int32 nEndY = Min(CWorld::GetSectorIndexY(fEndY), NUMSECTORS_Y - 1); + const int32 nStartX = Max(GetSectorIndexX(fStartX), 0); + const int32 nStartY = Max(GetSectorIndexY(fStartY), 0); +#ifdef FIX_BUGS + const int32 nEndX = Min(GetSectorIndexX(fEndX), NUMSECTORS_X - 1); + const int32 nEndY = Min(GetSectorIndexY(fEndY), NUMSECTORS_Y - 1); +#else + const int32 nEndX = Min(GetSectorIndexX(fEndX), NUMSECTORS_X); + const int32 nEndY = Min(GetSectorIndexY(fEndY), NUMSECTORS_Y); +#endif for(int32 y = nStartY; y <= nEndY; y++) { for(int32 x = nStartX; x <= nEndX; x++) { - CSector *pSector = CWorld::GetSector(x, y); + CSector *pSector = GetSector(x, y); CWorld::CallOffChaseForAreaSectorListVehicles(pSector->m_lists[ENTITYLIST_VEHICLES], x1, y1, x2, y2, fStartX, fStartY, fEndX, fEndY); CWorld::CallOffChaseForAreaSectorListVehicles(pSector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], x1, @@ -1638,7 +1687,7 @@ CWorld::RemoveFallenCars(void) CVehicle *veh = CPools::GetVehiclePool()->GetSlot(poolIndex); if(veh) { if(veh->GetPosition().z < MAP_Z_LOW_LIMIT) { - if(veh->VehicleCreatedBy == MISSION_VEHICLE || veh == FindPlayerVehicle() || + if(veh->VehicleCreatedBy == MISSION_VEHICLE && !veh->bRenderScorched || veh == FindPlayerVehicle() || (veh->pDriver && veh->pDriver->IsPlayer())) { int closestNode = ThePaths.FindNodeClosestToCoors(veh->GetPosition(), PATH_CAR, 999999.9f, false, false); @@ -1825,37 +1874,55 @@ CWorld::RepositionOneObject(CEntity *pEntity) { int16 modelId = pEntity->GetModelIndex(); if (modelId == MI_PARKINGMETER || modelId == MI_PHONEBOOTH1 || modelId == MI_WASTEBIN || - modelId == MI_BIN || modelId == MI_POSTBOX1 || modelId == MI_NEWSSTAND || modelId == MI_TRAFFICCONE || - modelId == MI_DUMP1 || modelId == MI_ROADWORKBARRIER1 || modelId == MI_BUSSIGN1 || modelId == MI_NOPARKINGSIGN1 || - modelId == MI_PHONESIGN || modelId == MI_FIRE_HYDRANT || modelId == MI_BOLLARDLIGHT || - modelId == MI_PARKTABLE || modelId == MI_PARKINGMETER2 || modelId == MI_TELPOLE02 || - modelId == MI_PARKBENCH || modelId == MI_BARRIER1 || IsTreeModel(modelId) || - IsLightThatNeedsRepositioning(modelId) + modelId == MI_BIN || modelId == MI_POSTBOX1 || modelId == MI_NEWSSTAND || modelId == MI_TRAFFICCONE || + modelId == MI_DUMP1 || modelId == MI_ROADWORKBARRIER1 || modelId == MI_BUSSIGN1 || modelId == MI_NOPARKINGSIGN1 || + modelId == MI_PHONESIGN || modelId == MI_FIRE_HYDRANT || modelId == MI_BOLLARDLIGHT || + modelId == MI_PARKTABLE || modelId == MI_PARKINGMETER2 || modelId == MI_TELPOLE02 || + modelId == MI_PARKBENCH || modelId == MI_BARRIER1 || IsTreeModel(modelId) ) { - CVector &position = pEntity->GetMatrix().GetPosition(); - CColModel *pColModel = pEntity->GetColModel(); + CVector& position = pEntity->GetMatrix().GetPosition(); + CColModel* pColModel = pEntity->GetColModel(); float fBoundingBoxMinZ = pColModel->boundingBox.min.z; float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; - if(fHeight < OBJECT_REPOSITION_OFFSET_Z) fHeight = OBJECT_REPOSITION_OFFSET_Z; + if (fHeight < OBJECT_REPOSITION_OFFSET_Z) fHeight = OBJECT_REPOSITION_OFFSET_Z; position.z = CWorld::FindGroundZFor3DCoord(position.x, position.y, - position.z + fHeight, nil) - - fBoundingBoxMinZ; + position.z + fHeight, nil) - + fBoundingBoxMinZ; pEntity->m_matrix.UpdateRW(); pEntity->UpdateRwFrame(); - } else if(modelId == MI_BUOY) { - float fWaterLevel = 0.0f; + } else if(IsLightThatNeedsRepositioning(modelId)) { + CVector position = pEntity->GetMatrix().GetPosition(); + CColModel* pColModel = pEntity->GetColModel(); + float fBoundingBoxMinZ = pColModel->boundingBox.min.z; + float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; + if (fHeight < OBJECT_REPOSITION_OFFSET_Z) fHeight = OBJECT_REPOSITION_OFFSET_Z; + if (pColModel->numBoxes == 1) + position = pEntity->GetMatrix() * CVector( + (pColModel->boxes[0].min.x + pColModel->boxes[0].max.x) / 2, + (pColModel->boxes[0].min.y + pColModel->boxes[0].max.y) / 2, + pColModel->boxes[0].min.z); + else if (pColModel->numSpheres > 0) { + position.z = 1000.0f; + for (int i = 0; i < pColModel->numSpheres; i++) { + if (pColModel->spheres[i].center.z < position.z) + position = pColModel->spheres[i].center; + } + if (position.z < 1000.0f) + position = pEntity->GetMatrix() * position; + } + pEntity->GetMatrix().GetPosition().z = FindGroundZFor3DCoord(position.x, position.y, pEntity->GetMatrix().GetPosition().z + fHeight, nil) - fBoundingBoxMinZ; + pEntity->GetMatrix().UpdateRW(); + pEntity->UpdateRwFrame(); + + } + if(modelId == MI_BUOY) { bool bFound = true; const CVector &position = pEntity->GetPosition(); float fGroundZ = CWorld::FindGroundZFor3DCoord(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, &bFound); - if(CWaterLevel::GetWaterLevelNoWaves(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, - &fWaterLevel)) { - if(!bFound || fWaterLevel > fGroundZ) { - CColModel *pColModel = pEntity->GetColModel(); - float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; - pEntity->GetMatrix().GetPosition().z = 0.2f * fHeight + fWaterLevel - 0.5f * fHeight; - } - } + CColModel *pColModel = pEntity->GetColModel(); + float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; + pEntity->GetMatrix().GetPosition().z = 0.2f * fHeight + 6.0f - 0.5f * fHeight; } } @@ -1873,6 +1940,27 @@ CWorld::SetCarsOnFire(float x, float y, float z, float radius, CEntity *reason) } } +void +CWorld::SetPedsChoking(float x, float y, float z, float radius, CEntity* reason) +{ + int32 poolSize = CPools::GetPedPool()->GetSize(); + for (int32 i = poolSize - 1; i >= 0; i--) { + CPed* pPed = CPools::GetPedPool()->GetSlot(i); + if (pPed && pPed->m_nPedState != PED_DEAD && !pPed->bInVehicle && !pPed->m_pFire && !pPed->bFireProof && pPed->CharCreatedBy != MISSION_CHAR) { + if (Abs(pPed->GetPosition().z - z) < 5.0f && Abs(pPed->GetPosition().x - x) < radius && + Abs(pPed->GetPosition().y - y) < radius) { + if (!pPed->IsPlayer()) + pPed->SetFlee(CVector2D(x, y), 10000); +#ifdef FIX_BUGS + pPed->InflictDamage(reason, WEAPONTYPE_TEARGAS, 1.0f, PEDPIECE_TORSO, 0); +#else + pPed->InflictDamage(nil, WEAPONTYPE_TEARGAS, 1.0f, PEDPIECE_TORSO, 0); +#endif + } + } + } +} + void CWorld::SetPedsOnFire(float x, float y, float z, float radius, CEntity *reason) { @@ -1925,11 +2013,12 @@ CWorld::Process(void) if(csObj && csObj->m_entryInfoList.first) { if(csObj->m_rwObject && RwObjectGetType(csObj->m_rwObject) == rpCLUMP && RpAnimBlendClumpGetFirstAssociation(csObj->GetClump())) { -// TODO(MIAMI): doRender argument - RpAnimBlendClumpUpdateAnimations(csObj->GetClump(), - 0.02f * (csObj->IsObject() - ? CTimer::GetTimeStepNonClipped() - : CTimer::GetTimeStep())); + if (csObj->IsObject()) + RpAnimBlendClumpUpdateAnimations(csObj->GetClump(), 0.02f * CTimer::GetTimeStepNonClipped()); + else { + csObj->bOffscreen = !csObj->GetIsOnScreen(); + RpAnimBlendClumpUpdateAnimations(csObj->GetClump(), 0.02f * CTimer::GetTimeStep(), !csObj->bOffscreen); + } } csObj->ProcessControl(); csObj->ProcessCollision(); @@ -1949,11 +2038,12 @@ CWorld::Process(void) #endif if(movingEnt->m_rwObject && RwObjectGetType(movingEnt->m_rwObject) == rpCLUMP && RpAnimBlendClumpGetFirstAssociation(movingEnt->GetClump())) { -// TODO(MIAMI): doRender argument - RpAnimBlendClumpUpdateAnimations(movingEnt->GetClump(), - 0.02f * (movingEnt->IsObject() - ? CTimer::GetTimeStepNonClipped() - : CTimer::GetTimeStep())); + if (movingEnt->IsObject()) + RpAnimBlendClumpUpdateAnimations(movingEnt->GetClump(), 0.02f * CTimer::GetTimeStepNonClipped()); + else { + movingEnt->bOffscreen = !movingEnt->GetIsOnScreen(); + RpAnimBlendClumpUpdateAnimations(movingEnt->GetClump(), 0.02f * CTimer::GetTimeStep(), !movingEnt->bOffscreen); + } } } for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) { @@ -2037,7 +2127,7 @@ CWorld::Process(void) movingEnt->bIsStuck = true; if(movingEnt->GetStatus() == STATUS_PLAYER) { printf("STUCK: Final Step: Player Entity %d Is Stuck\n", movingEnt->GetModelIndex()); - movingEnt->m_vecMoveSpeed *= 0.3f; + movingEnt->m_vecMoveSpeed *= Pow(0.707f, CTimer::GetTimeStep()); movingEnt->ApplyMoveSpeed(); movingEnt->ApplyTurnSpeed(); } @@ -2102,13 +2192,13 @@ CWorld::TriggerExplosion(const CVector &position, float fRadius, float fPower, C { CVector2D vecStartPos(position.x - fRadius, position.y - fRadius); CVector2D vecEndPos(position.x + fRadius, position.y + fRadius); - const int32 nStartX = Max(CWorld::GetSectorIndexX(vecStartPos.x), 0); - const int32 nStartY = Max(CWorld::GetSectorIndexY(vecStartPos.y), 0); - const int32 nEndX = Min(CWorld::GetSectorIndexX(vecEndPos.x), NUMSECTORS_X - 1); - const int32 nEndY = Min(CWorld::GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y - 1); + const int32 nStartX = Max(GetSectorIndexX(vecStartPos.x), 0); + const int32 nStartY = Max(GetSectorIndexY(vecStartPos.y), 0); + const int32 nEndX = Min(GetSectorIndexX(vecEndPos.x), NUMSECTORS_X - 1); + const int32 nEndY = Min(GetSectorIndexY(vecEndPos.y), NUMSECTORS_Y - 1); for(int32 y = nStartY; y <= nEndY; y++) { for(int32 x = nStartX; x <= nEndX; x++) { - CSector *pSector = CWorld::GetSector(x, y); + CSector *pSector = GetSector(x, y); CWorld::TriggerExplosionSectorList(pSector->m_lists[ENTITYLIST_VEHICLES], position, fRadius, fPower, pCreator, bProcessVehicleBombTimer); CWorld::TriggerExplosionSectorList(pSector->m_lists[ENTITYLIST_PEDS], position, fRadius, fPower, @@ -2146,7 +2236,7 @@ CWorld::TriggerExplosionSectorList(CPtrList &list, const CVector &position, floa pObject->bHasBeenDamaged) { if(pEntity->IsObject() && modelId != MI_EXPLODINGBARREL && - modelId != MI_PETROLPUMP) + modelId != MI_PETROLPUMP && modelId != MI_PETROLPUMP2) pObject->bHasBeenDamaged = true; } else { CVector pos = pEntity->GetPosition(); @@ -2171,7 +2261,7 @@ CWorld::TriggerExplosionSectorList(CPtrList &list, const CVector &position, floa if(!pEntity->GetIsStatic()) { float fDamageMultiplier = Min((fRadius - fMagnitude) * 2.0f / fRadius, 1.0f); CVector vecForceDir = - vecDistance * (fPower * pEntity->m_fMass * 0.00071429f * fDamageMultiplier / + vecDistance * (fPower * pEntity->m_fMass / 14000.0f * fDamageMultiplier / Max(fMagnitude, 0.01f)); vecForceDir.z = Max(vecForceDir.z, 0.0f); if(pEntity == FindPlayerPed()) vecForceDir.z = Min(vecForceDir.z, 1.0f); diff --git a/src/core/World.h b/src/core/World.h index 606a3466..cfdafedd 100644 --- a/src/core/World.h +++ b/src/core/World.h @@ -77,7 +77,7 @@ public: static void Remove(CEntity *entity); static void Add(CEntity *entity); - static CSector *GetSector(int x, int y) { return &ms_aSectors[y][x]; } + static CSector *GetSector(int x, int y) { if (x > NUMSECTORS_X || y > NUMSECTORS_Y) return &ms_aSectors[0][0]; return &ms_aSectors[y][x]; } static CPtrList &GetBigBuildingList(eLevelName i) { return ms_bigBuildingsList[i]; } static CPtrList &GetMovingEntityList(void) { return ms_listMovingEntityPtrs; } static uint16 GetCurrentScanCode(void) { return ms_nCurrentScanCode; } @@ -144,6 +144,7 @@ public: static void SetAllCarsCanBeDamaged(bool); static void ExtinguishAllCarFiresInArea(CVector, float); static void SetCarsOnFire(float x, float y, float z, float radius, CEntity* reason); + static void SetPedsChoking(float x, float y, float z, float radius, CEntity* reason); static void SetPedsOnFire(float x, float y, float z, float radius, CEntity* reason); static void Initialise(); @@ -157,6 +158,23 @@ public: static void TriggerExplosion(const CVector& position, float fRadius, float fPower, CEntity* pCreator, bool bProcessVehicleBombTimer); static void TriggerExplosionSectorList(CPtrList& list, const CVector& position, float fRadius, float fPower, CEntity* pCreator, bool bProcessVehicleBombTimer); static void UseDetonator(CEntity *pEntity); + + // NB: following functions are unused (TODO?) + static void CastShadow(float, float, float, float); + static void CastShadowSectorList(CPtrList&, float, float, float, float); + static void FindLowestZForCoord(float, float); + static void CheckBlockListIntegrity(void); + static void ProcessVerticalLineSectorList_FillGlobeColPoints(CPtrList&, const CColLine&, CEntity*&, bool, CStoredCollPoly*); + static void ProcessVerticalLineSector_FillGlobeColPoints(CSector&, const CColLine&, CEntity*&, bool, bool, bool, bool, bool, bool, CStoredCollPoly*); + static void ProcessVerticalLine_FillGlobeColPoints(const CVector&, float, CEntity*&, bool, bool, bool, bool, bool, bool, CStoredCollPoly*); + static void PrintCarChanges(void); + static void TestForBuildingsOnTopOfEachOther(CPtrList&); + static void TestForBuildingsOnTopOfEachOther(void); + static void TestForUnusedModels(CPtrList&, int*); + static void TestForUnusedModels(void); + static void HandleCollisionZoneChange(eLevelName, eLevelName); + static void DoZoneTestForChaser(class CPhysical*); + static void FindPlayerSlotWithPedPointer(void*); }; extern CColPoint gaTempSphereColPoints[MAX_COLLISION_POINTS]; diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index d1a7505e..881dbf4b 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -4834,19 +4834,19 @@ CAutomobile::SetUpWheelColModel(CColModel *colModel) CMatrix mat; mat.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_WHEEL_LF])); - colModel->spheres[0].Set(mi->m_wheelScale, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_LF); + colModel->spheres[0].Set(mi->m_wheelScale / 2, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_LF); mat.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_WHEEL_LB])); - colModel->spheres[1].Set(mi->m_wheelScale, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_LR); + colModel->spheres[1].Set(mi->m_wheelScale / 2, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_LR); mat.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_WHEEL_RF])); - colModel->spheres[2].Set(mi->m_wheelScale, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_RF); + colModel->spheres[2].Set(mi->m_wheelScale / 2, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_RF); mat.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_WHEEL_RB])); - colModel->spheres[3].Set(mi->m_wheelScale, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_RR); + colModel->spheres[3].Set(mi->m_wheelScale / 2, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_RR); if(m_aCarNodes[CAR_WHEEL_LM] != nil && m_aCarNodes[CAR_WHEEL_RM] != nil){ mat.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_WHEEL_LM])); - colModel->spheres[4].Set(mi->m_wheelScale, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_LR); + colModel->spheres[4].Set(mi->m_wheelScale / 2, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_LR); mat.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_WHEEL_RM])); - colModel->spheres[5].Set(mi->m_wheelScale, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_RR); + colModel->spheres[5].Set(mi->m_wheelScale / 2, mat.GetPosition(), SURFACE_RUBBER, CAR_PIECE_WHEEL_RR); colModel->numSpheres = 6; }else colModel->numSpheres = 4; diff --git a/src/weapons/ProjectileInfo.cpp b/src/weapons/ProjectileInfo.cpp index 71cd9cfb..754da5f7 100644 --- a/src/weapons/ProjectileInfo.cpp +++ b/src/weapons/ProjectileInfo.cpp @@ -296,10 +296,8 @@ CProjectileInfo::Update() CParticle::AddParticle(PARTICLE_TEARGAS, projectilePos, CVector(-0.2f, tearGasOffset, 0.0f), 0, 0.0f, 0, 0, 0, 0); CParticle::AddParticle(PARTICLE_TEARGAS, projectilePos, CVector(tearGasOffset, tearGasOffset, 0.0f), 0, 0.0f, 0, 0, 0, 0); - // TODO(Miami): SetPedsChoking - /*if ( CTimer::GetTimeInMilliseconds() & 0x200 ) + if ( CTimer::GetTimeInMilliseconds() & 0x200 ) CWorld::SetPedsChoking(projectilePos.x, projectilePos.y, projectilePos.z, 6.0f, gaProjectileInfo[i].m_pSource); - */ } if (gaProjectileInfo[i].m_eWeaponType == WEAPONTYPE_ROCKET) { diff --git a/vendor/librw b/vendor/librw index e68ef137..3e2080ad 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit e68ef1374d20071887348e9031f5fa38a2e4f7ed +Subproject commit 3e2080ad566ded9c44ecc3e0bbccc020dbb8f116 diff --git a/vendor/ogg b/vendor/ogg index 36f969bb..31bd3f27 160000 --- a/vendor/ogg +++ b/vendor/ogg @@ -1 +1 @@ -Subproject commit 36f969bb37559345ee03796ed625a9abd42c6db9 +Subproject commit 31bd3f2707fb7dbae539a7093ba1fc4b2b37d84e diff --git a/vendor/opus b/vendor/opus index 034c1b61..c2b542b6 160000 --- a/vendor/opus +++ b/vendor/opus @@ -1 +1 @@ -Subproject commit 034c1b61a250457649d788bbf983b3f0fb63f02e +Subproject commit c2b542b6c02bafbe7a83b2eeec6cb5a0bfa3ed0d From be929573289792f048fa5337489e39176b7691be Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Wed, 11 Nov 2020 12:21:30 +0300 Subject: [PATCH 38/45] fixed top gear --- src/audio/AudioLogic.cpp | 27 +++++++++++++-------------- src/core/World.cpp | 1 + 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index f51064aa..a7d33938 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -1300,10 +1300,10 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams& params) float relativeChange; float modificator; float traction; - bool pizzaFaggBool; + bool isMoped; bool caddyBool; - pizzaFaggBool = false; + isMoped = false; caddyBool = false; traction = 0.0f; if (params.m_fDistance >= SQR(SOUND_INTENSITY)) @@ -1326,7 +1326,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams& params) switch (veh->m_modelIndex) { case MI_PIZZABOY: case MI_FAGGIO: - pizzaFaggBool = true; + isMoped = true; currentGear = transmission->nNumberOfGears; break; case MI_CADDY: @@ -1358,8 +1358,8 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams& params) } if (wheelsOnGround != 0) { - if (!veh->bIsHandbrakeOn || pizzaFaggBool && caddyBool) { //mb bug, bcs it's can't be true together - if (veh->GetStatus() == STATUS_SIMPLE || pizzaFaggBool || caddyBool) { + if (!veh->bIsHandbrakeOn || isMoped && caddyBool) { //mb bug, bcs it's can't be true together + if (veh->GetStatus() == STATUS_SIMPLE || isMoped || caddyBool) { traction = 0.0f; } else { switch (transmission->nDriveType) { @@ -1407,7 +1407,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams& params) relativeChange = 0.0f; modificator = 0.0f; } else { - if (!pizzaFaggBool && !caddyBool) { + if (!isMoped && !caddyBool) { if (currentGear != 0) { relativeGearChange = Min(1.0f, params.m_fVelocityChange - transmission->Gears[currentGear].fShiftDownVelocity) / transmission->fMaxVelocity * 2.5f; @@ -1669,7 +1669,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh bool noGearBox; bool stuckInSand; bool processedAccelSampleStopped; - bool PizzaFaggBool; + bool isMoped; static uint32 gearSoundStartTime = CTimer::GetTimeInMilliseconds(); static int32 nCruising = 0; @@ -1680,7 +1680,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh static bool bAccelSampleStopped = true; lostTraction = false; - PizzaFaggBool = params.m_pVehicle->m_modelIndex == MI_PIZZABOY || params.m_pVehicle->m_modelIndex == MI_FAGGIO; + isMoped = params.m_pVehicle->m_modelIndex == MI_PIZZABOY || params.m_pVehicle->m_modelIndex == MI_FAGGIO; processedAccelSampleStopped = false; if (bPlayerJustEnteredCar) { bAccelSampleStopped = true; @@ -1699,7 +1699,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh brakeState = Pads[0].GetBrake(); } channelUsed = SampleManager.GetChannelUsedFlag(m_nActiveSamples); - if (PizzaFaggBool) { + if (isMoped) { CurrentPretendGear = params.m_pTransmission->nNumberOfGears; currentGear = CurrentPretendGear; if (params.m_pVehicle->bIsHandbrakeOn) { @@ -1735,7 +1735,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType); return; } - if (!PizzaFaggBool) { + if (!isMoped) { switch (params.m_pTransmission->nDriveType) { case '4': if (params.m_VehicleType != VEHICLE_TYPE_BIKE) { @@ -1882,7 +1882,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh || params.m_pVehicle->bIsHandbrakeOn || lostTraction || params.m_fVelocityChange < 0.01f && *gasPedalAudioPtr > 0.2f) { - if (PizzaFaggBool) { + if (isMoped) { gasPedalAudio = 0.0f; } else { *gasPedalAudioPtr *= 0.6f; @@ -2005,7 +2005,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh params.m_pVehicle->bAudioChangingGear = true; bAccelSampleStopped = true; SampleManager.StopChannel(m_nActiveSamples); - if (PizzaFaggBool || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params.m_pVehicle->bIsHandbrakeOn + if (isMoped || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params.m_pVehicle->bIsHandbrakeOn && !lostTraction && currentGear >= params.m_pTransmission->nNumberOfGears - 1) { if (accelerateState >= 220 && params.m_fVelocityChange + 0.001f >= velocityChangeForAudio) { if (nCruising < 800) @@ -2023,10 +2023,9 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh } } } else { - params.m_pVehicle->bAudioChangingGear = true; bAccelSampleStopped = true; SampleManager.StopChannel(m_nActiveSamples); - if (PizzaFaggBool || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params.m_pVehicle->bIsHandbrakeOn + if (isMoped || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params.m_pVehicle->bIsHandbrakeOn && !lostTraction && currentGear >= params.m_pTransmission->nNumberOfGears - 1) { if (accelerateState >= 220 && params.m_fVelocityChange + 0.001f >= velocityChangeForAudio) { if (nCruising < 800) diff --git a/src/core/World.cpp b/src/core/World.cpp index e3b8837f..4c700f10 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -1946,6 +1946,7 @@ CWorld::SetPedsChoking(float x, float y, float z, float radius, CEntity* reason) int32 poolSize = CPools::GetPedPool()->GetSize(); for (int32 i = poolSize - 1; i >= 0; i--) { CPed* pPed = CPools::GetPedPool()->GetSlot(i); + // suspicious copypaste if (pPed && pPed->m_nPedState != PED_DEAD && !pPed->bInVehicle && !pPed->m_pFire && !pPed->bFireProof && pPed->CharCreatedBy != MISSION_CHAR) { if (Abs(pPed->GetPosition().z - z) < 5.0f && Abs(pPed->GetPosition().x - x) < radius && Abs(pPed->GetPosition().y - y) < radius) { From 35874b5fd2b55e92a5033524178aa3bbcabdf8d7 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Wed, 11 Nov 2020 12:27:40 +0300 Subject: [PATCH 39/45] fix --- src/core/World.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/World.h b/src/core/World.h index cfdafedd..be32db20 100644 --- a/src/core/World.h +++ b/src/core/World.h @@ -77,7 +77,7 @@ public: static void Remove(CEntity *entity); static void Add(CEntity *entity); - static CSector *GetSector(int x, int y) { if (x > NUMSECTORS_X || y > NUMSECTORS_Y) return &ms_aSectors[0][0]; return &ms_aSectors[y][x]; } + static CSector *GetSector(int x, int y) { if (x > NUMSECTORS_X - 1 || y > NUMSECTORS_Y - 1) return &ms_aSectors[0][0]; return &ms_aSectors[y][x]; } static CPtrList &GetBigBuildingList(eLevelName i) { return ms_bigBuildingsList[i]; } static CPtrList &GetMovingEntityList(void) { return ms_listMovingEntityPtrs; } static uint16 GetCurrentScanCode(void) { return ms_nCurrentScanCode; } From a8b530320738516aaf7c3b06faa495afbf36b430 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Wed, 11 Nov 2020 13:19:21 +0300 Subject: [PATCH 40/45] Update src/control/Pickups.cpp Co-authored-by: Sergeanur --- src/control/Pickups.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp index c658fcb8..e53f1ecb 100644 --- a/src/control/Pickups.cpp +++ b/src/control/Pickups.cpp @@ -1416,7 +1416,7 @@ CPickups::RemoveUnnecessaryPickups(const CVector& center, float radius) { for (int i = 0; i < NUMPICKUPS; i++) { if (aPickUps[i].m_eType == PICKUP_ONCE_TIMEOUT || aPickUps[i].m_eType == PICKUP_MONEY) { - if ((aPickUps[i].m_vecPos - center).Magnitude() < radius) { + if (Distance(center, aPickUps[i].m_vecPos) < radius) { aPickUps[i].GetRidOfObjects(); aPickUps[i].m_bRemoved = true; aPickUps[i].m_eType = PICKUP_NONE; From 984708dfd3629b49527117223aac0d1ed1bb7c97 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Wed, 11 Nov 2020 13:36:10 +0300 Subject: [PATCH 41/45] damn --- src/control/Script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 6aa314f2..10dee77d 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -11232,7 +11232,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bNoCriticalHits = (ScriptParams[0] == 0); + pPed->bNoCriticalHits = (ScriptParams[1] == 0); return 0; } /* From a76c6b230757df63ea77a4007b715a08b8025ea2 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Wed, 11 Nov 2020 13:36:10 +0300 Subject: [PATCH 42/45] damn --- src/control/Script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 6aa314f2..10dee77d 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -11232,7 +11232,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); script_assert(pPed); - pPed->bNoCriticalHits = (ScriptParams[0] == 0); + pPed->bNoCriticalHits = (ScriptParams[1] == 0); return 0; } /* From ff44f296168892f70595fcd87d7d747313b64530 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 11 Nov 2020 14:42:02 +0100 Subject: [PATCH 43/45] ped fix for new renderer --- src/core/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/main.cpp b/src/core/main.cpp index 6560cbda..48e0ff76 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -890,6 +890,8 @@ if(gbRenderWorld1) if(gbRenderRoads) CRenderer::RenderRoads(); + CRenderer::RenderPeds(); + // not sure where to put these since LCS has no underwater entities if(gbRenderBoats) CRenderer::RenderBoats(); @@ -923,8 +925,6 @@ bool FredIsInFirstPersonCam(void) { return true; } // this seems to give the bes void RenderEffects_new(void) { - CRenderer::RenderPeds(); - CShadows::RenderStaticShadows(); // CRenderer::GenerateEnvironmentMap CShadows::RenderStoredShadows(); From 0115b0827b7b689f31defb5528cee6619f9a3ec0 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 11 Nov 2020 19:10:22 +0100 Subject: [PATCH 44/45] fix wrong blend mode (original bug) --- src/render/Hud.cpp | 4 ++++ src/weapons/WeaponEffects.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp index ed78ac4c..239d0de4 100644 --- a/src/render/Hud.cpp +++ b/src/render/Hud.cpp @@ -360,7 +360,11 @@ void CHud::Draw() RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); +#ifdef FIX_BUGS + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); +#else RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVDESTALPHA); +#endif RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpLaserDotTex)); #ifdef FIX_BUGS int intensity = CGeneral::GetRandomNumberInRange(0, 37); diff --git a/src/weapons/WeaponEffects.cpp b/src/weapons/WeaponEffects.cpp index 7a5be722..42d4f52c 100644 --- a/src/weapons/WeaponEffects.cpp +++ b/src/weapons/WeaponEffects.cpp @@ -94,7 +94,11 @@ CWeaponEffects::Render(void) RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)FALSE); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE); RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA); +#ifdef FIX_BUGS + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA); +#else RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVDESTALPHA); +#endif RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)gpCrossHairRaster); RwV3d pos; From 55c9a8192212f26fb61f15efe7773214ed19f3ee Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Thu, 12 Nov 2020 17:32:16 +0300 Subject: [PATCH 45/45] fixed zone bug --- src/core/Zones.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/core/Zones.cpp b/src/core/Zones.cpp index 45fe6fff..8abe0f1e 100644 --- a/src/core/Zones.cpp +++ b/src/core/Zones.cpp @@ -532,14 +532,14 @@ CTheZones::SetZonePedInfo(uint16 zoneid, uint8 day, int16 pedDensity, info->gangPedThreshold[8] = gang8Density; info->gangPedThreshold[0] += info->copPedThreshold; - info->gangPedThreshold[1] = info->gangPedThreshold[0]; - info->gangPedThreshold[2] = info->gangPedThreshold[1]; - info->gangPedThreshold[3] = info->gangPedThreshold[2]; - info->gangPedThreshold[4] = info->gangPedThreshold[3]; - info->gangPedThreshold[5] = info->gangPedThreshold[4]; - info->gangPedThreshold[6] = info->gangPedThreshold[5]; - info->gangPedThreshold[7] = info->gangPedThreshold[6]; - info->gangPedThreshold[8] = info->gangPedThreshold[7]; + info->gangPedThreshold[1] += info->gangPedThreshold[0]; + info->gangPedThreshold[2] += info->gangPedThreshold[1]; + info->gangPedThreshold[3] += info->gangPedThreshold[2]; + info->gangPedThreshold[4] += info->gangPedThreshold[3]; + info->gangPedThreshold[5] += info->gangPedThreshold[4]; + info->gangPedThreshold[6] += info->gangPedThreshold[5]; + info->gangPedThreshold[7] += info->gangPedThreshold[6]; + info->gangPedThreshold[8] += info->gangPedThreshold[7]; } //--MIAMI: unused