mirror of
https://github.com/GTAmodding/re3.git
synced 2024-12-25 05:55:40 +00:00
More work
This commit is contained in:
parent
12ee71e4f7
commit
003ac856c6
6 changed files with 270 additions and 155 deletions
|
@ -1,5 +1,5 @@
|
||||||
version: 1.0.{build}
|
version: 1.0.{build}
|
||||||
image: Visual Studio 2019
|
image: Visual Studio 2017
|
||||||
configuration:
|
configuration:
|
||||||
- Debug
|
- Debug
|
||||||
- Release
|
- Release
|
||||||
|
@ -10,7 +10,7 @@ install:
|
||||||
- cmd: >-
|
- cmd: >-
|
||||||
git submodule update --init --recursive
|
git submodule update --init --recursive
|
||||||
|
|
||||||
premake-vs2019.cmd
|
premake-vs2017.cmd
|
||||||
build:
|
build:
|
||||||
project: build/re3.sln
|
project: build/re3.sln
|
||||||
verbosity: minimal
|
verbosity: minimal
|
||||||
|
@ -29,12 +29,10 @@ after_build:
|
||||||
|
|
||||||
$url = "$releases/download/$latestVersion/$name"
|
$url = "$releases/download/$latestVersion/$name"
|
||||||
|
|
||||||
|
|
||||||
Start-FileDownload $url -FileName 'C:\Ultimate-ASI-Loader.zip'
|
Start-FileDownload $url -FileName 'C:\Ultimate-ASI-Loader.zip'
|
||||||
|
|
||||||
7z e c:\Ultimate-ASI-Loader.zip -oc:\Projects\re3\bin\${env:CONFIGURATION}
|
7z e c:\Ultimate-ASI-Loader.zip -oc:\Projects\re3\bin\${env:CONFIGURATION}
|
||||||
|
|
||||||
|
|
||||||
cd "bin\${env:CONFIGURATION}"
|
cd "bin\${env:CONFIGURATION}"
|
||||||
|
|
||||||
copy re3.dll re3.asi
|
copy re3.dll re3.asi
|
||||||
|
|
|
@ -41,6 +41,7 @@ bool &bPlayerJustEnteredCar = *(bool *)0x6508C4;
|
||||||
bool &g_bMissionAudioLoadFailed = *(bool *)0x95CD8E;
|
bool &g_bMissionAudioLoadFailed = *(bool *)0x95CD8E;
|
||||||
uint32 *gMinTimeToNextReport = (uint32 *)0x8E2828;
|
uint32 *gMinTimeToNextReport = (uint32 *)0x8E2828;
|
||||||
uint8 &gSpecialSuspectLastSeenReport = *(uint8 *)0x95CD4D;
|
uint8 &gSpecialSuspectLastSeenReport = *(uint8 *)0x95CD4D;
|
||||||
|
uint32 *gOneShotCol = (uint32 *)0x604BD0;
|
||||||
|
|
||||||
constexpr int totalAudioEntitiesSlots = 200;
|
constexpr int totalAudioEntitiesSlots = 200;
|
||||||
constexpr int maxVolume = 127;
|
constexpr int maxVolume = 127;
|
||||||
|
@ -3136,9 +3137,9 @@ cAudioManager::Initialise()
|
||||||
void
|
void
|
||||||
cAudioManager::InitialisePoliceRadio()
|
cAudioManager::InitialisePoliceRadio()
|
||||||
{
|
{
|
||||||
unk2 = 0;
|
policeChannelTimer = 0;
|
||||||
unk3 = 0;
|
unk3 = 0;
|
||||||
unk4 = 0;
|
policeChannelCounterSeconds = 0;
|
||||||
for(int32 i = 0; i < 10; i++) { crimes[i].type = 0; }
|
for(int32 i = 0; i < 10; i++) { crimes[i].type = 0; }
|
||||||
|
|
||||||
SampleManager.SetChannelReverbFlag(28, 0);
|
SampleManager.SetChannelReverbFlag(28, 0);
|
||||||
|
@ -8170,9 +8171,7 @@ cAudioManager::ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface
|
||||||
void
|
void
|
||||||
cAudioManager::ReportCrime(int32 type, const CVector *pos)
|
cAudioManager::ReportCrime(int32 type, const CVector *pos)
|
||||||
{
|
{
|
||||||
int32 lastCrime;
|
int32 lastCrime = 10;
|
||||||
|
|
||||||
lastCrime = 10;
|
|
||||||
if(m_bIsInitialised && MusicManager.m_nMusicMode != 2 &&
|
if(m_bIsInitialised && MusicManager.m_nMusicMode != 2 &&
|
||||||
FindPlayerPed()->m_pWanted->m_nWantedLevel > 0 && (type > 0 || type < 17) &&
|
FindPlayerPed()->m_pWanted->m_nWantedLevel > 0 && (type > 0 || type < 17) &&
|
||||||
m_nTimeOfRecentCrime >= gMinTimeToNextReport[type]) {
|
m_nTimeOfRecentCrime >= gMinTimeToNextReport[type]) {
|
||||||
|
@ -8257,10 +8256,22 @@ cAudioManager::ResetTimers(uint32 time)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER void
|
void
|
||||||
cAudioManager::Service()
|
cAudioManager::Service()
|
||||||
{
|
{
|
||||||
EAXJMP(0x57A2A0);
|
GenerateIntegerRandomNumberTable();
|
||||||
|
if(m_bTimerJustReset) {
|
||||||
|
ResetAudioLogicTimers(m_nTimer);
|
||||||
|
MusicManager.ResetTimers(m_nTimer);
|
||||||
|
m_bTimerJustReset = 0;
|
||||||
|
}
|
||||||
|
if(m_bIsInitialised) {
|
||||||
|
m_bPreviousUserPause = m_bUserPause;
|
||||||
|
m_bUserPause = CTimer::GetIsUserPaused();
|
||||||
|
UpdateReflections();
|
||||||
|
ServiceSoundEffects();
|
||||||
|
MusicManager.Service();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER
|
WRAPPER
|
||||||
|
@ -8273,7 +8284,7 @@ cAudioManager::ServiceCollisions()
|
||||||
void
|
void
|
||||||
cAudioManager::ServicePoliceRadio()
|
cAudioManager::ServicePoliceRadio()
|
||||||
{
|
{
|
||||||
int wantedLevel = 0; // bug?;
|
int32 wantedLevel = 0; // bug?;
|
||||||
static uint32 nLastSeen = 300;
|
static uint32 nLastSeen = 300;
|
||||||
|
|
||||||
if(m_bIsInitialised) {
|
if(m_bIsInitialised) {
|
||||||
|
@ -8298,7 +8309,6 @@ cAudioManager::ServicePoliceRadio()
|
||||||
void
|
void
|
||||||
cAudioManager::ServicePoliceRadioChannel(int32 wantedLevel)
|
cAudioManager::ServicePoliceRadioChannel(int32 wantedLevel)
|
||||||
{
|
{
|
||||||
|
|
||||||
bool processed = false;
|
bool processed = false;
|
||||||
uint32 sample;
|
uint32 sample;
|
||||||
int32 freq;
|
int32 freq;
|
||||||
|
@ -8322,12 +8332,12 @@ cAudioManager::ServicePoliceRadioChannel(int32 wantedLevel)
|
||||||
bMissionAudioPhysicalPlayingStatus == 1) {
|
bMissionAudioPhysicalPlayingStatus == 1) {
|
||||||
SampleManager.PauseStream(0, 1u);
|
SampleManager.PauseStream(0, 1u);
|
||||||
}
|
}
|
||||||
if(!unk2) bChannelOpen = 0;
|
if(!policeChannelTimer) bChannelOpen = 0;
|
||||||
if(cWait) {
|
if(cWait) {
|
||||||
--cWait;
|
--cWait;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(g_nMissionAudioSfx != 3032 && !bChannelOpen) {
|
if(g_nMissionAudioSfx != TOTAL_AUDIO_SAMPLES && !bChannelOpen) {
|
||||||
if(g_nMissionAudioPlayingStatus) {
|
if(g_nMissionAudioPlayingStatus) {
|
||||||
if(g_nMissionAudioPlayingStatus == 1 &&
|
if(g_nMissionAudioPlayingStatus == 1 &&
|
||||||
!bMissionAudioPhysicalPlayingStatus &&
|
!bMissionAudioPhysicalPlayingStatus &&
|
||||||
|
@ -8358,11 +8368,12 @@ cAudioManager::ServicePoliceRadioChannel(int32 wantedLevel)
|
||||||
if(bChannelOpen) DoPoliceRadioCrackle();
|
if(bChannelOpen) DoPoliceRadioCrackle();
|
||||||
if((g_nMissionAudioSfx == TOTAL_AUDIO_SAMPLES ||
|
if((g_nMissionAudioSfx == TOTAL_AUDIO_SAMPLES ||
|
||||||
g_nMissionAudioPlayingStatus != 1) &&
|
g_nMissionAudioPlayingStatus != 1) &&
|
||||||
!SampleManager.GetChannelUsedFlag(policeChannel) && unk2) {
|
!SampleManager.GetChannelUsedFlag(policeChannel) && policeChannelTimer) {
|
||||||
if(unk2) {
|
if(policeChannelTimer) {
|
||||||
sample = *(uint32 *)&stuff[4 * unk4];
|
sample = *(uint32 *)&stuff[4 * policeChannelCounterSeconds];
|
||||||
--unk2;
|
--policeChannelTimer;
|
||||||
unk4 = (unk4 + 1) % 60;
|
policeChannelCounterSeconds =
|
||||||
|
(policeChannelCounterSeconds + 1) % 60;
|
||||||
} else {
|
} else {
|
||||||
sample = TOTAL_AUDIO_SAMPLES;
|
sample = TOTAL_AUDIO_SAMPLES;
|
||||||
}
|
}
|
||||||
|
@ -8403,15 +8414,6 @@ cAudioManager::ServicePoliceRadioChannel(int32 wantedLevel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 1
|
|
||||||
WRAPPER
|
|
||||||
void
|
|
||||||
cAudioManager::ServiceSoundEffects()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cAudioManager::ServiceSoundEffects()
|
cAudioManager::ServiceSoundEffects()
|
||||||
|
@ -8460,7 +8462,7 @@ cAudioManager::ServiceSoundEffects()
|
||||||
}
|
}
|
||||||
m_nScriptObjectEntityTotal = 0;
|
m_nScriptObjectEntityTotal = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
int8
|
int8
|
||||||
cAudioManager::SetCurrent3DProvider(uint8 which)
|
cAudioManager::SetCurrent3DProvider(uint8 which)
|
||||||
{
|
{
|
||||||
|
@ -8502,8 +8504,9 @@ cAudioManager::SetEffectsMasterVolume(uint8 volume) const
|
||||||
void
|
void
|
||||||
cAudioManager::SetEntityStatus(int32 id, bool status)
|
cAudioManager::SetEntityStatus(int32 id, bool status)
|
||||||
{
|
{
|
||||||
if(m_bIsInitialised && id >= 0 && id < totalAudioEntitiesSlots) {
|
if(m_bIsInitialised && id >= 0 && id < totalAudioEntitiesSlots &&
|
||||||
if(m_asAudioEntities[id].m_bIsUsed) { m_asAudioEntities[id].m_bStatus = status; }
|
m_asAudioEntities[id].m_bIsUsed) {
|
||||||
|
m_asAudioEntities[id].m_bStatus = status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8628,6 +8631,113 @@ cAudioManager::SetUpLoopingCollisionSound(cAudioCollision *col, uint8 counter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cAudioManager::SetUpOneShotCollisionSound(cAudioCollision *col)
|
||||||
|
{
|
||||||
|
int16 s1;
|
||||||
|
int16 s2;
|
||||||
|
|
||||||
|
int32 emittingVol;
|
||||||
|
float ratio;
|
||||||
|
|
||||||
|
static uint16 counter = 28;
|
||||||
|
|
||||||
|
for(int32 i = 0; i < 2; i++) {
|
||||||
|
if(i) {
|
||||||
|
s1 = col->m_bSurface2;
|
||||||
|
s2 = col->m_bSurface1;
|
||||||
|
} else {
|
||||||
|
s1 = col->m_bSurface1;
|
||||||
|
s2 = col->m_bSurface2;
|
||||||
|
}
|
||||||
|
ratio = GetCollisionOneShotRatio(s1, col->m_fIntensity1);
|
||||||
|
if(s1 == SURFACE_METAL6 && s2 == SURFACE_FLESH) ratio = 0.25f * ratio;
|
||||||
|
if(s1 == SURFACE_METAL6 && ratio < 0.6f) {
|
||||||
|
s1 = SURFACE_BILLBOARD;
|
||||||
|
ratio = min(1.f, 2.f * ratio);
|
||||||
|
}
|
||||||
|
emittingVol = 40.f * ratio;
|
||||||
|
if(emittingVol) {
|
||||||
|
m_sQueueSample.m_fDistance = Sqrt(col->m_fDistance);
|
||||||
|
m_sQueueSample.m_bVolume =
|
||||||
|
ComputeVolume(emittingVol, 60.f, m_sQueueSample.m_fDistance);
|
||||||
|
if(m_sQueueSample.m_bVolume) {
|
||||||
|
m_sQueueSample.m_nSampleIndex = gOneShotCol[s1];
|
||||||
|
switch(m_sQueueSample.m_nSampleIndex) {
|
||||||
|
case AUDIO_SAMPLE_COLLISION_PAVEMENT:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] % 5u;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_CAR_DOOR_MOVEMENT_1:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[0] % 6u;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_METAL_13:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[1] & 1;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_FENCE:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] & 3;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_FLESH:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] % 5u;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_WOOD:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[4] & 3;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_WOOD_BOX:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[1] & 3;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_HEDGE:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[2] % 5u;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_METAL_28:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[2] % 3u;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_METAL:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[1] % 5u;
|
||||||
|
break;
|
||||||
|
case AUDIO_SAMPLE_COLLISION_LOOSE:
|
||||||
|
m_sQueueSample.m_nSampleIndex += m_anRandomTable[3] & 1;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
switch(s1) {
|
||||||
|
case SURFACE_GLASS: m_sQueueSample.m_nFrequency = 13500; break;
|
||||||
|
case SURFACE_METAL15: m_sQueueSample.m_nFrequency = 8819; break;
|
||||||
|
case SURFACE_PUDDLE:
|
||||||
|
m_sQueueSample.m_nFrequency =
|
||||||
|
2 * SampleManager.GetSampleBaseFrequency(
|
||||||
|
m_sQueueSample.m_nSampleIndex);
|
||||||
|
break;
|
||||||
|
case SURFACE_TIRE: m_sQueueSample.m_nFrequency = 6000; break;
|
||||||
|
case SURFACE_HARD24: m_sQueueSample.m_nFrequency = 8000; break;
|
||||||
|
default:
|
||||||
|
m_sQueueSample.m_nFrequency =
|
||||||
|
SampleManager.GetSampleBaseFrequency(
|
||||||
|
m_sQueueSample.m_nSampleIndex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m_sQueueSample.m_nFrequency +=
|
||||||
|
RandomDisplacement(m_sQueueSample.m_nFrequency / 16);
|
||||||
|
m_sQueueSample.m_counter = counter++;
|
||||||
|
if(counter >= 255u) counter = 28;
|
||||||
|
m_sQueueSample.m_vecPos = col->m_vecPosition;
|
||||||
|
m_sQueueSample.m_bBankIndex = 0;
|
||||||
|
m_sQueueSample.m_bIsDistant = 0;
|
||||||
|
m_sQueueSample.field_16 = 11;
|
||||||
|
m_sQueueSample.m_nLoopCount = 1;
|
||||||
|
m_sQueueSample.m_bEmittingVolume = emittingVol;
|
||||||
|
m_sQueueSample.m_nLoopStart = 0;
|
||||||
|
m_sQueueSample.m_nLoopEnd = -1;
|
||||||
|
m_sQueueSample.field_48 = 4.0;
|
||||||
|
m_sQueueSample.m_fSoundIntensity = 60.0;
|
||||||
|
m_sQueueSample.field_56 = 1;
|
||||||
|
m_sQueueSample.m_bReverbFlag = 1;
|
||||||
|
m_sQueueSample.m_bRequireReflection = 0;
|
||||||
|
AddSampleToRequestedQueue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WRAPPER
|
WRAPPER
|
||||||
bool
|
bool
|
||||||
cAudioManager::SetupCrimeReport()
|
cAudioManager::SetupCrimeReport()
|
||||||
|
@ -8641,11 +8751,9 @@ bool cAudioManager::SetupJumboEngineSound(uint8, int32) { EAXJMP(0x56F140); }
|
||||||
bool
|
bool
|
||||||
cAudioManager::SetupJumboFlySound(uint8 emittingVol)
|
cAudioManager::SetupJumboFlySound(uint8 emittingVol)
|
||||||
{
|
{
|
||||||
int32 vol;
|
|
||||||
|
|
||||||
if(m_sQueueSample.m_fDistance >= 440.0f) return 0;
|
if(m_sQueueSample.m_fDistance >= 440.0f) return 0;
|
||||||
|
|
||||||
vol = ComputeVolume(emittingVol, 440.0f, m_sQueueSample.m_fDistance);
|
int32 vol = ComputeVolume(emittingVol, 440.0f, m_sQueueSample.m_fDistance);
|
||||||
m_sQueueSample.m_bVolume = vol;
|
m_sQueueSample.m_bVolume = vol;
|
||||||
if(m_sQueueSample.m_bVolume) {
|
if(m_sQueueSample.m_bVolume) {
|
||||||
m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_JUMBO_FLY_SOUND;
|
m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_JUMBO_FLY_SOUND;
|
||||||
|
@ -8712,11 +8820,9 @@ cAudioManager::SetupJumboRumbleSound(uint8 emittingVol)
|
||||||
bool
|
bool
|
||||||
cAudioManager::SetupJumboTaxiSound(uint8 vol)
|
cAudioManager::SetupJumboTaxiSound(uint8 vol)
|
||||||
{
|
{
|
||||||
uint8 emittingVol;
|
|
||||||
|
|
||||||
if(m_sQueueSample.m_fDistance >= 180.f) return 0;
|
if(m_sQueueSample.m_fDistance >= 180.f) return 0;
|
||||||
|
|
||||||
emittingVol = (vol + (vol * m_sQueueSample.m_fDistance / 180)) / 2;
|
uint8 emittingVol = (vol + (vol * m_sQueueSample.m_fDistance / 180)) / 2;
|
||||||
|
|
||||||
if(m_sQueueSample.m_fDistance / 180 < 0.7f)
|
if(m_sQueueSample.m_fDistance / 180 < 0.7f)
|
||||||
emittingVol -= emittingVol * gJumboVolOffsetPercentage / 100;
|
emittingVol -= emittingVol * gJumboVolOffsetPercentage / 100;
|
||||||
|
@ -8969,6 +9075,13 @@ cAudioManager::UpdateGasPedalAudio(CAutomobile *automobile)
|
||||||
automobile->m_fGasPedalAudio = newGasPedalAudio;
|
automobile->m_fGasPedalAudio = newGasPedalAudio;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
cAudioManager::UpdateReflections()
|
||||||
|
{
|
||||||
|
EAXJMP(0x57B470);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
cAudioManager::UsesReverseWarning(int32 model) const
|
cAudioManager::UsesReverseWarning(int32 model) const
|
||||||
{
|
{
|
||||||
|
@ -9210,19 +9323,23 @@ InjectHook(0x5803D0, &cAudioManager::ReportCrime, PATCH_JUMP);
|
||||||
InjectHook(0x569650, &cAudioManager::ResetAudioLogicTimers, PATCH_JUMP);
|
InjectHook(0x569650, &cAudioManager::ResetAudioLogicTimers, PATCH_JUMP);
|
||||||
InjectHook(0x57EFF0, &cAudioManager::ResetPoliceRadio, PATCH_JUMP);
|
InjectHook(0x57EFF0, &cAudioManager::ResetPoliceRadio, PATCH_JUMP);
|
||||||
InjectHook(0x57A7B0, &cAudioManager::ResetTimers, PATCH_JUMP);
|
InjectHook(0x57A7B0, &cAudioManager::ResetTimers, PATCH_JUMP);
|
||||||
|
InjectHook(0x57A2A0, &cAudioManager::Service, PATCH_JUMP);
|
||||||
InjectHook(0x57F110, &cAudioManager::ServicePoliceRadio, PATCH_JUMP);
|
InjectHook(0x57F110, &cAudioManager::ServicePoliceRadio, PATCH_JUMP);
|
||||||
InjectHook(0x57F1B0, &cAudioManager::ServicePoliceRadioChannel, PATCH_JUMP);
|
InjectHook(0x57F1B0, &cAudioManager::ServicePoliceRadioChannel, PATCH_JUMP);
|
||||||
//InjectHook(0x57AA60, &cAudioManager::ServiceSoundEffects, PATCH_JUMP);
|
InjectHook(0x57AA60, &cAudioManager::ServiceSoundEffects, PATCH_JUMP);
|
||||||
InjectHook(0x57A910, &cAudioManager::SetCurrent3DProvider, PATCH_JUMP);
|
InjectHook(0x57A910, &cAudioManager::SetCurrent3DProvider, PATCH_JUMP);
|
||||||
InjectHook(0x57AA00, &cAudioManager::SetDynamicAcousticModelingStatus, PATCH_JUMP);
|
InjectHook(0x57AA00, &cAudioManager::SetDynamicAcousticModelingStatus, PATCH_JUMP);
|
||||||
InjectHook(0x57A770, &cAudioManager::SetEffectsFadeVolume, PATCH_JUMP);
|
InjectHook(0x57A770, &cAudioManager::SetEffectsFadeVolume, PATCH_JUMP);
|
||||||
InjectHook(0x57A730, &cAudioManager::SetEffectsMasterVolume, PATCH_JUMP);
|
InjectHook(0x57A730, &cAudioManager::SetEffectsMasterVolume, PATCH_JUMP);
|
||||||
InjectHook(0x57A4C0, &cAudioManager::SetEntityStatus, PATCH_JUMP);
|
InjectHook(0x57A4C0, &cAudioManager::SetEntityStatus, PATCH_JUMP);
|
||||||
|
InjectHook(0x568E20, &cAudioManager::SetLoopingCollisionRequestedSfxFreqAndGetVol, PATCH_JUMP);
|
||||||
InjectHook(0x5795F0, &cAudioManager::SetMissionAudioLocation, PATCH_JUMP);
|
InjectHook(0x5795F0, &cAudioManager::SetMissionAudioLocation, PATCH_JUMP);
|
||||||
InjectHook(0x57F020, &cAudioManager::SetMissionScriptPoliceAudio, PATCH_JUMP);
|
InjectHook(0x57F020, &cAudioManager::SetMissionScriptPoliceAudio, PATCH_JUMP);
|
||||||
InjectHook(0x57A790, &cAudioManager::SetMusicFadeVolume, PATCH_JUMP);
|
InjectHook(0x57A790, &cAudioManager::SetMusicFadeVolume, PATCH_JUMP);
|
||||||
InjectHook(0x57A750, &cAudioManager::SetMusicMasterVolume, PATCH_JUMP);
|
InjectHook(0x57A750, &cAudioManager::SetMusicMasterVolume, PATCH_JUMP);
|
||||||
InjectHook(0x57A9A0, &cAudioManager::SetSpeakerConfig, PATCH_JUMP);
|
InjectHook(0x57A9A0, &cAudioManager::SetSpeakerConfig, PATCH_JUMP);
|
||||||
|
InjectHook(0x568D30, &cAudioManager::SetUpLoopingCollisionSound, PATCH_JUMP);
|
||||||
|
InjectHook(0x5689D0, &cAudioManager::SetUpOneShotCollisionSound, PATCH_JUMP);
|
||||||
InjectHook(0x56F230, &cAudioManager::SetupJumboFlySound, PATCH_JUMP);
|
InjectHook(0x56F230, &cAudioManager::SetupJumboFlySound, PATCH_JUMP);
|
||||||
InjectHook(0x56F310, &cAudioManager::SetupJumboRumbleSound, PATCH_JUMP);
|
InjectHook(0x56F310, &cAudioManager::SetupJumboRumbleSound, PATCH_JUMP);
|
||||||
InjectHook(0x56EF20, &cAudioManager::SetupJumboTaxiSound, PATCH_JUMP);
|
InjectHook(0x56EF20, &cAudioManager::SetupJumboTaxiSound, PATCH_JUMP);
|
||||||
|
@ -9238,4 +9355,5 @@ InjectHook(0x57C320, &cAudioManager::sub_57C320, PATCH_JUMP);
|
||||||
InjectHook(0x5755C0, &cPedComments::Add, PATCH_JUMP);
|
InjectHook(0x5755C0, &cPedComments::Add, PATCH_JUMP);
|
||||||
InjectHook(0x575730, &cPedComments::Process, PATCH_JUMP);
|
InjectHook(0x575730, &cPedComments::Process, PATCH_JUMP);
|
||||||
InjectHook(0x5685E0, &cAudioCollisionManager::AddCollisionToRequestedQueue, PATCH_JUMP);
|
InjectHook(0x5685E0, &cAudioCollisionManager::AddCollisionToRequestedQueue, PATCH_JUMP);
|
||||||
|
InjectHook(0x57C430, &cAudioScriptObject::Reset, PATCH_JUMP);
|
||||||
ENDPATCHES
|
ENDPATCHES
|
||||||
|
|
|
@ -200,7 +200,7 @@ public:
|
||||||
CVector Posn;
|
CVector Posn;
|
||||||
int32 AudioEntity;
|
int32 AudioEntity;
|
||||||
|
|
||||||
void Reset(); // todo hook
|
void Reset(); /// ok
|
||||||
|
|
||||||
static void *operator new(size_t);
|
static void *operator new(size_t);
|
||||||
static void *operator new(size_t, int);
|
static void *operator new(size_t, int);
|
||||||
|
@ -284,9 +284,9 @@ public:
|
||||||
int32 m_nPoliceChannelEntity;
|
int32 m_nPoliceChannelEntity;
|
||||||
uint8 stuff[239];
|
uint8 stuff[239];
|
||||||
uint8 unk1;
|
uint8 unk1;
|
||||||
uint8 unk2;
|
uint8 policeChannelTimer;
|
||||||
uint8 unk3;
|
uint8 unk3;
|
||||||
uint8 unk4;
|
uint8 policeChannelCounterSeconds;
|
||||||
uint8 unk5;
|
uint8 unk5;
|
||||||
Crime crimes[10];
|
Crime crimes[10];
|
||||||
int32 m_nFrontEndEntity;
|
int32 m_nFrontEndEntity;
|
||||||
|
@ -533,7 +533,7 @@ public:
|
||||||
void ResetPoliceRadio(); /// ok
|
void ResetPoliceRadio(); /// ok
|
||||||
void ResetTimers(uint32 time); /// ok
|
void ResetTimers(uint32 time); /// ok
|
||||||
|
|
||||||
void Service(); // todo
|
void Service(); /// ok
|
||||||
void ServiceCollisions(); // todo
|
void ServiceCollisions(); // todo
|
||||||
void ServicePoliceRadio(); /// ok
|
void ServicePoliceRadio(); /// ok
|
||||||
void ServicePoliceRadioChannel(int32 wantedLevel); /// ok
|
void ServicePoliceRadioChannel(int32 wantedLevel); /// ok
|
||||||
|
@ -543,15 +543,16 @@ public:
|
||||||
void SetEffectsFadeVolume(uint8 volume) const;
|
void SetEffectsFadeVolume(uint8 volume) const;
|
||||||
void SetEffectsMasterVolume(uint8 volume) const;
|
void SetEffectsMasterVolume(uint8 volume) const;
|
||||||
void SetEntityStatus(int32 id, bool status);
|
void SetEntityStatus(int32 id, bool status);
|
||||||
uint32 SetLoopingCollisionRequestedSfxFreqAndGetVol(cAudioCollision *audioCollision); // todo hook
|
uint32
|
||||||
|
SetLoopingCollisionRequestedSfxFreqAndGetVol(cAudioCollision *audioCollision); /// ok
|
||||||
void SetMissionAudioLocation(float x, float y, float z);
|
void SetMissionAudioLocation(float x, float y, float z);
|
||||||
void SetMissionScriptPoliceAudio(int32 sfx) const;
|
void SetMissionScriptPoliceAudio(int32 sfx) const;
|
||||||
void SetMonoMode(uint8); // todo (mobile)
|
void SetMonoMode(uint8); // todo (mobile)
|
||||||
void SetMusicFadeVolume(uint8 volume) const;
|
void SetMusicFadeVolume(uint8 volume) const;
|
||||||
void SetMusicMasterVolume(uint8 volume) const;
|
void SetMusicMasterVolume(uint8 volume) const;
|
||||||
void SetSpeakerConfig(int32 conf) const;
|
void SetSpeakerConfig(int32 conf) const;
|
||||||
void SetUpLoopingCollisionSound(cAudioCollision *col, uint8 counter); // todo hook
|
void SetUpLoopingCollisionSound(cAudioCollision *col, uint8 counter); /// ok
|
||||||
void SetUpOneShotCollisionSound(int a2); // todo
|
void SetUpOneShotCollisionSound(cAudioCollision *col); /// ok
|
||||||
bool SetupCrimeReport(); // todo
|
bool SetupCrimeReport(); // todo
|
||||||
bool SetupJumboEngineSound(uint8 a2, int32 a3); // todo
|
bool SetupJumboEngineSound(uint8 a2, int32 a3); // todo
|
||||||
bool SetupJumboFlySound(uint8 emittingVol); /// ok
|
bool SetupJumboFlySound(uint8 emittingVol); /// ok
|
||||||
|
@ -565,6 +566,7 @@ public:
|
||||||
void TranslateEntity(CVector *v1, CVector *v2) const;
|
void TranslateEntity(CVector *v1, CVector *v2) const;
|
||||||
|
|
||||||
void UpdateGasPedalAudio(CAutomobile *automobile);
|
void UpdateGasPedalAudio(CAutomobile *automobile);
|
||||||
|
void UpdateReflections(); // todo
|
||||||
bool UsesReverseWarning(int32 model) const;
|
bool UsesReverseWarning(int32 model) const;
|
||||||
bool UsesSiren(int32 model) const;
|
bool UsesSiren(int32 model) const;
|
||||||
bool UsesSirenSwitching(int32 model) const;
|
bool UsesSirenSwitching(int32 model) const;
|
||||||
|
|
|
@ -1,24 +1,28 @@
|
||||||
#include "common.h"
|
|
||||||
#include "patcher.h"
|
|
||||||
#include "MusicManager.h"
|
#include "MusicManager.h"
|
||||||
|
#include "Camera.h"
|
||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
#include "Hud.h"
|
#include "Hud.h"
|
||||||
|
#include "ModelIndices.h"
|
||||||
|
#include "Replay.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "Camera.h"
|
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "ModelIndices.h"
|
|
||||||
#include "sampman.h"
|
#include "sampman.h"
|
||||||
#include "Replay.h"
|
#include "patcher.h"
|
||||||
|
|
||||||
cMusicManager &MusicManager = *(cMusicManager *)0x8F3964;
|
cMusicManager &MusicManager = *(cMusicManager *)0x8F3964;
|
||||||
int32 &gNumRetunePresses = *(int32 *)0x650B80;
|
int32 &gNumRetunePresses = *(int32 *)0x650B80;
|
||||||
wchar *pCurrentStation = (wchar *)0x650B9C;
|
wchar *pCurrentStation = (wchar *)0x650B9C;
|
||||||
uint8 &cDisplay = *(uint8 *)0x650BA1;
|
uint8 &cDisplay = *(uint8 *)0x650BA1;
|
||||||
|
|
||||||
WRAPPER char* cMusicManager::Get3DProviderName(char) { EAXJMP(0x57A8C0); }
|
WRAPPER char *
|
||||||
|
cMusicManager::Get3DProviderName(char)
|
||||||
|
{
|
||||||
|
EAXJMP(0x57A8C0);
|
||||||
|
}
|
||||||
|
|
||||||
bool cMusicManager::PlayerInCar()
|
bool
|
||||||
|
cMusicManager::PlayerInCar()
|
||||||
{
|
{
|
||||||
if(!FindPlayerVehicle())
|
if(!FindPlayerVehicle())
|
||||||
return false;
|
return false;
|
||||||
|
@ -36,10 +40,8 @@ bool cMusicManager::PlayerInCar()
|
||||||
case MI_TRAIN:
|
case MI_TRAIN:
|
||||||
case MI_SPEEDER:
|
case MI_SPEEDER:
|
||||||
case MI_REEFER:
|
case MI_REEFER:
|
||||||
case MI_GHOST:
|
case MI_GHOST: return false;
|
||||||
return false;
|
default: return true;
|
||||||
default:
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,24 +49,25 @@ bool cMusicManager::PlayerInCar()
|
||||||
#if 0
|
#if 0
|
||||||
WRAPPER void cMusicManager::DisplayRadioStationName(void) { EAXJMP(0x57E6D0); }
|
WRAPPER void cMusicManager::DisplayRadioStationName(void) { EAXJMP(0x57E6D0); }
|
||||||
#else
|
#else
|
||||||
void cMusicManager::DisplayRadioStationName()
|
void
|
||||||
|
cMusicManager::DisplayRadioStationName()
|
||||||
{
|
{
|
||||||
int8 pRetune;
|
int8 pRetune;
|
||||||
int8 gStreamedSound;
|
int8 gStreamedSound;
|
||||||
int8 gRetuneCounter;
|
int8 gRetuneCounter;
|
||||||
|
|
||||||
if (!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && cMusicManager::PlayerInCar() && !CReplay::IsPlayingBack()) {
|
if(!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && cMusicManager::PlayerInCar() &&
|
||||||
|
!CReplay::IsPlayingBack()) {
|
||||||
if(MusicManager.m_bPlayerInCar && !MusicManager.m_bPreviousPlayerInCar)
|
if(MusicManager.m_bPlayerInCar && !MusicManager.m_bPreviousPlayerInCar)
|
||||||
pCurrentStation = nil;
|
pCurrentStation = nil;
|
||||||
|
|
||||||
if(SampleManager.IsMP3RadioChannelAvailable()) {
|
if(SampleManager.IsMP3RadioChannelAvailable()) {
|
||||||
gStreamedSound = MusicManager.m_nCurrentStreamedSound;
|
gStreamedSound = MusicManager.m_nCurrentStreamedSound;
|
||||||
|
|
||||||
if (gStreamedSound != STREAMED_SOUND_CITY_AMBIENT && gStreamedSound != STREAMED_SOUND_WATER_AMBIENT) {
|
if(gStreamedSound != STREAMED_SOUND_CITY_AMBIENT &&
|
||||||
if (gStreamedSound > STREAMED_SOUND_RADIO_MP3_PLAYER)
|
gStreamedSound != STREAMED_SOUND_WATER_AMBIENT) {
|
||||||
return;
|
if(gStreamedSound > STREAMED_SOUND_RADIO_MP3_PLAYER) return;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
gStreamedSound = STREAMED_SOUND_RADIO_POLICE;
|
gStreamedSound = STREAMED_SOUND_RADIO_POLICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,12 +75,10 @@ void cMusicManager::DisplayRadioStationName()
|
||||||
|
|
||||||
if(pRetune == POLICE_RADIO) {
|
if(pRetune == POLICE_RADIO) {
|
||||||
pRetune = RADIO_OFF;
|
pRetune = RADIO_OFF;
|
||||||
}
|
} else if(pRetune > POLICE_RADIO) {
|
||||||
else if (pRetune > POLICE_RADIO) {
|
|
||||||
pRetune = pRetune - 11;
|
pRetune = pRetune - 11;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
gStreamedSound = MusicManager.m_nCurrentStreamedSound;
|
gStreamedSound = MusicManager.m_nCurrentStreamedSound;
|
||||||
pRetune = gNumRetunePresses + gStreamedSound;
|
pRetune = gNumRetunePresses + gStreamedSound;
|
||||||
|
|
||||||
|
@ -91,12 +92,10 @@ void cMusicManager::DisplayRadioStationName()
|
||||||
while(gRetuneCounter) {
|
while(gRetuneCounter) {
|
||||||
if(pRetune == RADIO_OFF) {
|
if(pRetune == RADIO_OFF) {
|
||||||
pRetune = HEAD_RADIO;
|
pRetune = HEAD_RADIO;
|
||||||
}
|
} else if(pRetune < USERTRACK) {
|
||||||
else if (pRetune < USERTRACK) {
|
|
||||||
pRetune = pRetune + 1;
|
pRetune = pRetune + 1;
|
||||||
}
|
}
|
||||||
if (pRetune == USERTRACK)
|
if(pRetune == USERTRACK) pRetune = RADIO_OFF;
|
||||||
pRetune = RADIO_OFF;
|
|
||||||
|
|
||||||
--gRetuneCounter;
|
--gRetuneCounter;
|
||||||
}
|
}
|
||||||
|
@ -106,51 +105,28 @@ void cMusicManager::DisplayRadioStationName()
|
||||||
wchar *string = nil;
|
wchar *string = nil;
|
||||||
|
|
||||||
switch(pRetune) {
|
switch(pRetune) {
|
||||||
case HEAD_RADIO:
|
case HEAD_RADIO: string = TheText.Get("FEA_FM0"); break;
|
||||||
string = TheText.Get("FEA_FM0");
|
case DOUBLE_CLEF: string = TheText.Get("FEA_FM1"); break;
|
||||||
break;
|
case JAH_RADIO: string = TheText.Get("FEA_FM2"); break;
|
||||||
case DOUBLE_CLEF:
|
case RISE_FM: string = TheText.Get("FEA_FM3"); break;
|
||||||
string = TheText.Get("FEA_FM1");
|
case LIPS_106: string = TheText.Get("FEA_FM4"); break;
|
||||||
break;
|
case GAME_FM: string = TheText.Get("FEA_FM5"); break;
|
||||||
case JAH_RADIO:
|
case MSX_FM: string = TheText.Get("FEA_FM6"); break;
|
||||||
string = TheText.Get("FEA_FM2");
|
case FLASHBACK: string = TheText.Get("FEA_FM7"); break;
|
||||||
break;
|
case CHATTERBOX: string = TheText.Get("FEA_FM8"); break;
|
||||||
case RISE_FM:
|
case USERTRACK: string = TheText.Get("FEA_FM9"); break;
|
||||||
string = TheText.Get("FEA_FM3");
|
default: return;
|
||||||
break;
|
|
||||||
case LIPS_106:
|
|
||||||
string = TheText.Get("FEA_FM4");
|
|
||||||
break;
|
|
||||||
case GAME_FM:
|
|
||||||
string = TheText.Get("FEA_FM5");
|
|
||||||
break;
|
|
||||||
case MSX_FM:
|
|
||||||
string = TheText.Get("FEA_FM6");
|
|
||||||
break;
|
|
||||||
case FLASHBACK:
|
|
||||||
string = TheText.Get("FEA_FM7");
|
|
||||||
break;
|
|
||||||
case CHATTERBOX:
|
|
||||||
string = TheText.Get("FEA_FM8");
|
|
||||||
break;
|
|
||||||
case USERTRACK:
|
|
||||||
string = TheText.Get("FEA_FM9");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (pRetune > CHATTERBOX && !SampleManager.IsMP3RadioChannelAvailable()) {
|
if(pRetune > CHATTERBOX && !SampleManager.IsMP3RadioChannelAvailable()) { return; }
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string && pCurrentStation != string || MusicManager.m_nCurrentStreamedSound == STREAMED_SOUND_RADIO_MP3_PLAYER && MusicManager.m_nPreviousStreamedSound != STREAMED_SOUND_RADIO_MP3_PLAYER) {
|
if(string && pCurrentStation != string ||
|
||||||
|
MusicManager.m_nCurrentStreamedSound == STREAMED_SOUND_RADIO_MP3_PLAYER &&
|
||||||
|
MusicManager.m_nPreviousStreamedSound != STREAMED_SOUND_RADIO_MP3_PLAYER) {
|
||||||
pCurrentStation = string;
|
pCurrentStation = string;
|
||||||
cDisplay = 60;
|
cDisplay = 60;
|
||||||
}
|
} else {
|
||||||
else {
|
if(!cDisplay) return;
|
||||||
if (!cDisplay)
|
|
||||||
return;
|
|
||||||
--cDisplay;
|
--cDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,38 +179,44 @@ cMusicManager::StopFrontEndTrack()
|
||||||
EAXJMP(0x57E3D0);
|
EAXJMP(0x57E3D0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRAPPER void
|
||||||
WRAPPER void cMusicManager::PlayAnnouncement(unsigned char)
|
cMusicManager::PlayAnnouncement(unsigned char)
|
||||||
{
|
{
|
||||||
EAXJMP(0x57E430);
|
EAXJMP(0x57E430);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER void cMusicManager::PlayFrontEndTrack(unsigned char, unsigned char)
|
WRAPPER void
|
||||||
|
cMusicManager::PlayFrontEndTrack(unsigned char, unsigned char)
|
||||||
{
|
{
|
||||||
EAXJMP(0x57E2E0);
|
EAXJMP(0x57E2E0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER void cMusicManager::PreloadCutSceneMusic(unsigned char)
|
WRAPPER void
|
||||||
|
cMusicManager::PreloadCutSceneMusic(unsigned char)
|
||||||
{
|
{
|
||||||
EAXJMP(0x57E210);
|
EAXJMP(0x57E210);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER void cMusicManager::PlayPreloadedCutSceneMusic(void)
|
WRAPPER void
|
||||||
|
cMusicManager::PlayPreloadedCutSceneMusic(void)
|
||||||
{
|
{
|
||||||
EAXJMP(0x57E290);
|
EAXJMP(0x57E290);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER void cMusicManager::StopCutSceneMusic(void)
|
WRAPPER void
|
||||||
|
cMusicManager::StopCutSceneMusic(void)
|
||||||
{
|
{
|
||||||
EAXJMP(0x57E2B0);
|
EAXJMP(0x57E2B0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER int32 cMusicManager::GetRadioInCar(void)
|
WRAPPER int32
|
||||||
|
cMusicManager::GetRadioInCar(void)
|
||||||
{
|
{
|
||||||
EAXJMP(0x57D1D0);
|
EAXJMP(0x57D1D0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER void cMusicManager::SetRadioInCar(unsigned int)
|
WRAPPER void
|
||||||
|
cMusicManager::SetRadioInCar(unsigned int)
|
||||||
{
|
{
|
||||||
EAXJMP(0x57D2C0);
|
EAXJMP(0x57D2C0);
|
||||||
}
|
}
|
||||||
|
@ -251,3 +233,13 @@ cMusicManager::ResetMusicAfterReload()
|
||||||
{
|
{
|
||||||
EAXJMP(0x57CF30);
|
EAXJMP(0x57CF30);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void cMusicManager::ResetTimers(int32) { EAXJMP(0x57D420); }
|
||||||
|
|
||||||
|
WRAPPER
|
||||||
|
void
|
||||||
|
cMusicManager::Service()
|
||||||
|
{
|
||||||
|
EAXJMP(0x57D440);
|
||||||
|
}
|
|
@ -1,5 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
enum eRadioStation
|
enum eRadioStation
|
||||||
{
|
{
|
||||||
HEAD_RADIO,
|
HEAD_RADIO,
|
||||||
|
@ -297,6 +299,9 @@ public:
|
||||||
void SetRadioChannelByScript(unsigned char, int);
|
void SetRadioChannelByScript(unsigned char, int);
|
||||||
|
|
||||||
void ResetMusicAfterReload();
|
void ResetMusicAfterReload();
|
||||||
|
|
||||||
|
void ResetTimers(int32);
|
||||||
|
void Service();
|
||||||
};
|
};
|
||||||
|
|
||||||
static_assert(sizeof(cMusicManager) == 0x95C, "cMusicManager: error");
|
static_assert(sizeof(cMusicManager) == 0x95C, "cMusicManager: error");
|
||||||
|
|
|
@ -197,8 +197,8 @@ void re3_assert(const char *expr, const char *filename, unsigned int lineno, con
|
||||||
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
|
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
|
||||||
#define BIT(num) (1<<(num))
|
#define BIT(num) (1<<(num))
|
||||||
|
|
||||||
auto max = [](auto a, auto b) { return ((a) > (b)) ? (a) : (b); };
|
//auto max = [](auto a, auto b) { return ((a) > (b)) ? (a) : (b); };
|
||||||
auto min = [](auto a, auto b) { return ((a) < (b)) ? (a) : (b); };
|
//auto min = [](auto a, auto b) { return ((a) < (b)) ? (a) : (b); };
|
||||||
#define ABS(a) (((a) < 0) ? (-(a)) : (a))
|
#define ABS(a) (((a) < 0) ? (-(a)) : (a))
|
||||||
#define norm(value, min, max) (((value) < (min)) ? 0 : (((value) > (max)) ? 1 : (((value) - (min)) / ((max) - (min)))))
|
#define norm(value, min, max) (((value) < (min)) ? 0 : (((value) > (max)) ? 1 : (((value) - (min)) / ((max) - (min)))))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue