diff --git a/source/main/audio/SoundScriptManager.cpp b/source/main/audio/SoundScriptManager.cpp index 779526e30a..50bb726774 100644 --- a/source/main/audio/SoundScriptManager.cpp +++ b/source/main/audio/SoundScriptManager.cpp @@ -98,18 +98,18 @@ SoundScriptManager::SoundScriptManager() : ResourceGroupManager::getSingleton()._registerScriptLoader(this); } -void SoundScriptManager::trigOnce(Beam* truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigOnce(Beam* truck, int trig) { if (disabled) return; if (truck) { - trigOnce(truck->trucknum, trig, linkType, linkItemID); + this->trigOnce(truck->trucknum, trig); } } -void SoundScriptManager::trigOnce(int truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigOnce(int truck, int trig) { if (disabled) return; @@ -119,157 +119,148 @@ void SoundScriptManager::trigOnce(int truck, int trig, int linkType, int linkIte // cycle through all instance groups SoundScriptInstance* inst = trigs[trig + i * SS_MAX_TRIG]; - if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID) + if (inst && inst->truck_id == truck) { inst->runOnce(); } } } -void SoundScriptManager::trigStart(Beam* truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigStart(Beam* truck, int trig) { if (disabled) return; if (truck) { - trigStart(truck->trucknum, trig, linkType, linkItemID); + this->trigStart(truck->trucknum, trig); } } -void SoundScriptManager::trigStart(int truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigStart(int truck, int trig) { if (disabled) return; - if (getTrigState(truck, trig, linkType, linkItemID)) + if (this->getTrigState(truck, trig)) return; - state_map[linkType][linkItemID][truck][trig] = true; + state_map[truck][trig] = true; for (int i = 0; i < free_trigs[trig]; i++) { SoundScriptInstance* inst = trigs[trig + i * SS_MAX_TRIG]; - if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID) + if (inst && inst->truck_id == truck) { inst->start(); } } } -void SoundScriptManager::trigStop(Beam* truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigStop(Beam* truck, int trig) { if (disabled) return; if (truck) { - trigStop(truck->trucknum, trig, linkType, linkItemID); + this->trigStop(truck->trucknum, trig); } } -void SoundScriptManager::trigStop(int truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigStop(int truck, int trig) { if (disabled) return; - if (!getTrigState(truck, trig, linkType, linkItemID)) + if (!this->getTrigState(truck, trig)) return; - state_map[linkType][linkItemID][truck][trig] = false; + state_map[truck][trig] = false; for (int i = 0; i < free_trigs[trig]; i++) { SoundScriptInstance* inst = trigs[trig + i * SS_MAX_TRIG]; - if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID) + if (inst && inst->truck_id == truck) { inst->stop(); } } } -void SoundScriptManager::trigKill(Beam* truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigKill(int truck, int trig) { if (disabled) return; - - if (truck) - { - trigKill(truck->trucknum, trig, linkType, linkItemID); - } -} - -void SoundScriptManager::trigKill(int truck, int trig, int linkType, int linkItemID) -{ - if (disabled) - return; - if (!getTrigState(truck, trig, linkType, linkItemID)) + if (!this->getTrigState(truck, trig)) return; - state_map[linkType][linkItemID][truck][trig] = false; + state_map[truck][trig] = false; for (int i = 0; i < free_trigs[trig]; i++) { SoundScriptInstance* inst = trigs[trig + i * SS_MAX_TRIG]; - if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID) + if (inst && inst->truck_id == truck) { inst->kill(); } } } -void SoundScriptManager::trigToggle(Beam* truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigToggle(Beam* truck, int trig) { if (disabled) return; if (truck) { - trigToggle(truck->trucknum, trig, linkType, linkItemID); + this->trigToggle(truck->trucknum, trig); } } -void SoundScriptManager::trigToggle(int truck, int trig, int linkType, int linkItemID) +void SoundScriptManager::trigToggle(int truck, int trig) { if (disabled) return; - if (getTrigState(truck, trig, linkType, linkItemID)) - trigStop(truck, trig, linkType, linkItemID); + if (this->getTrigState(truck, trig)) + this->trigStop(truck, trig); else - trigStart(truck, trig, linkType, linkItemID); + this->trigStart(truck, trig); } -bool SoundScriptManager::getTrigState(Beam* truck, int trig, int linkType, int linkItemID) +bool SoundScriptManager::getTrigState(Beam* truck, int trig) { if (disabled) return false; if (truck) - return getTrigState(truck->trucknum, trig, linkType, linkItemID); + return this->getTrigState(truck->trucknum, trig); else return false; } -bool SoundScriptManager::getTrigState(int truck, int trig, int linkType, int linkItemID) +bool SoundScriptManager::getTrigState(int truck, int trig) { if (disabled) return false; - return state_map[linkType][linkItemID][truck][trig]; + return state_map[truck][trig]; } -void SoundScriptManager::modulate(Beam* truck, int mod, float value, int linkType, int linkItemID) +void SoundScriptManager::modulate(Beam* truck, int mod, float value) { if (disabled) return; if (truck) { - modulate(truck->trucknum, mod, value, linkType, linkItemID); + this->modulate(truck->trucknum, mod, value); } } -void SoundScriptManager::modulate(int truck, int mod, float value, int linkType, int linkItemID) +// TIGHT-LOOP +// -- BeamEngine +void SoundScriptManager::modulate(int truck, int mod, float value) { if (disabled) return; @@ -280,7 +271,7 @@ void SoundScriptManager::modulate(int truck, int mod, float value, int linkType, for (int i = 0; i < free_gains[mod]; i++) { SoundScriptInstance* inst = gains[mod + i * SS_MAX_MOD]; - if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID) + if (inst && inst->truck_id == truck) { // this one requires modulation float gain = value * value * inst->templ->gain_square + value * inst->templ->gain_multiplier + inst->templ->gain_offset; @@ -293,7 +284,7 @@ void SoundScriptManager::modulate(int truck, int mod, float value, int linkType, for (int i = 0; i < free_pitches[mod]; i++) { SoundScriptInstance* inst = pitches[mod + i * SS_MAX_MOD]; - if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID) + if (inst && inst->truck_id == truck) { // this one requires modulation float pitch = value * value * inst->templ->pitch_square + value * inst->templ->pitch_multiplier + inst->templ->pitch_offset; @@ -361,7 +352,7 @@ void SoundScriptManager::clearNonBaseTemplates() } } -SoundScriptInstance* SoundScriptManager::createInstance(Ogre::String templatename, int truck, Ogre::SceneNode* toAttach, int soundLinkType, int soundLinkItemId) +SoundScriptInstance* SoundScriptManager::createInstance(Ogre::String templatename, int truck, Ogre::SceneNode* toAttach) { //first, search template SoundScriptTemplate* templ = NULL; @@ -386,7 +377,7 @@ SoundScriptInstance* SoundScriptManager::createInstance(Ogre::String templatenam return NULL; // reached limit! } - SoundScriptInstance* inst = new SoundScriptInstance(truck, templ, sound_manager, templ->file_name + "-" + TOSTRING(truck) + "-" + TOSTRING(instance_counter), soundLinkType, soundLinkItemId); + SoundScriptInstance* inst = new SoundScriptInstance(truck, templ, sound_manager, templ->file_name + "-" + TOSTRING(truck) + "-" + TOSTRING(instance_counter)); instance_counter++; // register to lookup tables @@ -1031,12 +1022,10 @@ int SoundScriptTemplate::parseModulation(String str) //==================================================================== -SoundScriptInstance::SoundScriptInstance(int truck, SoundScriptTemplate* templ, SoundManager* sound_manager, String instancename, int soundLinkType, int soundLinkItemId) : - truck(truck) +SoundScriptInstance::SoundScriptInstance(int truck, SoundScriptTemplate* templ, SoundManager* sound_manager, String instancename) : + truck_id(truck) , templ(templ) , sound_manager(sound_manager) - , sound_link_type(soundLinkType) - , sound_link_item_id(soundLinkItemId) , start_sound(NULL) , start_sound_pitchgain(0.0f) , stop_sound(NULL) diff --git a/source/main/audio/SoundScriptManager.h b/source/main/audio/SoundScriptManager.h index 6d6de30e17..e7f48ffccf 100644 --- a/source/main/audio/SoundScriptManager.h +++ b/source/main/audio/SoundScriptManager.h @@ -139,24 +139,6 @@ enum ModulationSources { SS_MAX_MOD }; -enum SoundLinkTypes { - SL_DEFAULT, - SL_COMMAND, - SL_HYDRO, - SL_COLLISION, - SL_SHOCKS, - SL_BRAKES, - SL_ROPES, - SL_TIES, - SL_PARTICLES, - SL_AXLES, - SL_FLARES, - SL_FLEXBODIES, - SL_EXHAUSTS, - SL_VIDEOCAMERA, - SL_MAX -}; - class Sound; class SoundManager; @@ -210,11 +192,9 @@ class SoundScriptInstance : public ZeroedMemoryAllocator public: - SoundScriptInstance(int truck, SoundScriptTemplate* templ, SoundManager* sm, Ogre::String instancename, int soundLinkType=SL_DEFAULT, int soundLinkItemId=-1); + SoundScriptInstance(int truck, SoundScriptTemplate* templ, SoundManager* sm, Ogre::String instancename); void runOnce(); void setEnabled(bool e); - void setGain(float value); - void setPitch(float value); void setPosition(Ogre::Vector3 pos, Ogre::Vector3 velocity); void start(); void stop(); @@ -225,6 +205,9 @@ class SoundScriptInstance : public ZeroedMemoryAllocator private: + void setGain(float value); // Used by SSI::ctor(), SSM::modulate(), SSI::setPitch() + void setPitch(float value); // Used by SSI::ctor(), SSM::modulate() + float pitchgain_cutoff(float sourcepitch, float targetpitch); SoundScriptTemplate* templ; @@ -237,9 +220,7 @@ class SoundScriptInstance : public ZeroedMemoryAllocator float sounds_pitchgain[MAX_SOUNDS_PER_SCRIPT]; float lastgain; - int truck; // holds the number of the truck this is for. important - int sound_link_type; // holds the SL_ type this is bound to - int sound_link_item_id; // holds the item number this is for + int truck_id; }; class SoundScriptManager : public Ogre::ScriptLoader, public RoRSingleton, public ZeroedMemoryAllocator @@ -253,24 +234,21 @@ class SoundScriptManager : public Ogre::ScriptLoader, public RoRSingleton > > > state_map; + // state map: [trucks][triggers] + std::map > state_map; SoundManager* sound_manager; }; diff --git a/source/main/physics/BeamForcesEuler.cpp b/source/main/physics/BeamForcesEuler.cpp index 82ad9eb41e..a179e6bb5b 100644 --- a/source/main/physics/BeamForcesEuler.cpp +++ b/source/main/physics/BeamForcesEuler.cpp @@ -905,9 +905,10 @@ void Beam::calcForcesEulerCompute(int doUpdate, Real dt, int step, int maxsteps) // commands if (hascommands) { - int active = 0; - int requested = 0; - float work = 0.0; + bool use_engine_priming = 0; + float hydropump_work = 0.f; + float hydropump_work_audio = 0.f; + size_t audio_num_hydropumps = 0; // canwork if (engine) @@ -1073,30 +1074,6 @@ void Beam::calcForcesEulerCompute(int doUpdate, Real dt, int step, int maxsteps) if (v > 0.0f && beams[bbeam].commandEngineCoupling > 0.0f) requestpower = true; -#ifdef USE_OPENAL - if (beams[bbeam].playsSound) - { - // command sounds - if (vst == 1) - { - // just started - SoundScriptManager::getSingleton().trigStop(trucknum, SS_TRIG_LINKED_COMMAND, SL_COMMAND, -i); - SoundScriptManager::getSingleton().trigStart(trucknum, SS_TRIG_LINKED_COMMAND, SL_COMMAND, i); - vst = 0; - } - else if (vst == -1) - { - // just stopped - SoundScriptManager::getSingleton().trigStop(trucknum, SS_TRIG_LINKED_COMMAND, SL_COMMAND, i); - vst = 0; - } - else if (vst == 0) - { - // already running, modulate - SoundScriptManager::getSingleton().modulate(trucknum, SS_MOD_LINKED_COMMANDRATE, v, SL_COMMAND, i); - } - } -#endif //USE_OPENAL float cf = 1.0f; if (beams[bbeam].commandEngineCoupling > 0) @@ -1110,8 +1087,13 @@ void Beam::calcForcesEulerCompute(int doUpdate, Real dt, int step, int maxsteps) dl = fabs(dl - beams[bbeam].L); if (requestpower) { - active++; - work += fabs(beams[bbeam].stress) * dl * beams[bbeam].commandEngineCoupling; + const float extra_work = fabs(beams[bbeam].stress) * dl * beams[bbeam].commandEngineCoupling; + hydropump_work += extra_work; + if (beams[bbeam].playsSound) + { + hydropump_work_audio += extra_work; + audio_num_hydropumps++; + } } } else if (beams[bbeam].isOnePressMode > 0 && bbeam_dir * beams[bbeam].autoMovingMode > 0) @@ -1148,23 +1130,23 @@ void Beam::calcForcesEulerCompute(int doUpdate, Real dt, int step, int maxsteps) else rotators[rota].angle -= rotators[rota].rate * v * cf * dt; } - if (requestpower) - requested++; + + use_engine_priming = (use_engine_priming || requestpower); } if (engine) { - engine->setHydroPumpWork(work); - engine->setPrime(requested); + engine->setHydroPumpWork(hydropump_work); + engine->setPrime(use_engine_priming); } if (doUpdate && this == BeamFactory::getSingleton().getCurrentTruck()) { #ifdef USE_OPENAL - if (active > 0) + if (audio_num_hydropumps != 0) { SoundScriptManager::getSingleton().trigStart(trucknum, SS_TRIG_PUMP); - float pump_rpm = 660.0f * (1.0f - (work / (float)active) / 100.0f); + const float pump_rpm = 660.0f * (1.0f - (hydropump_work_audio / static_cast(audio_num_hydropumps)) / 100.0f); SoundScriptManager::getSingleton().modulate(trucknum, SS_MOD_PUMP, pump_rpm); } else diff --git a/source/main/physics/RigSpawner.cpp b/source/main/physics/RigSpawner.cpp index 49a8a1dbfd..de28cd4885 100644 --- a/source/main/physics/RigSpawner.cpp +++ b/source/main/physics/RigSpawner.cpp @@ -7177,13 +7177,6 @@ void RigSpawner::SetupDefaultSoundSources(Beam *vehicle) } } - // linked sounds - for (int i=0; ifree_commands; i++) - { - AddSoundSource(vehicle, SoundScriptManager::getSingleton().createInstance(Ogre::String("tracks/linked/default_command/extend"), trucknum, NULL, SL_COMMAND, i), 0); - AddSoundSource(vehicle, SoundScriptManager::getSingleton().createInstance(Ogre::String("tracks/linked/default_command/retract"), trucknum, NULL, SL_COMMAND, -i), 0); - } - #endif //OPENAL }