31#include <OgreResourceGroupManager.h>
45 , max_distance(500.0f)
46 , rolloff_factor(1.0f)
47 , reference_distance(7.5f)
48 , sound_manager(nullptr)
80 LOG(
"SoundScriptManager: Failed to create the Sound Manager");
88 LOG(
"SoundScriptManager: Sound Manager is disabled");
94 ResourceGroupManager::getSingleton()._registerScriptLoader(
this);
149 state_map[linkType][linkItemID][actor_id][trig] =
true;
177 if (!
getTrigState(actor_id, trig, linkType, linkItemID))
180 state_map[linkType][linkItemID][actor_id][trig] =
false;
207 if (!
getTrigState(actor_id, trig, linkType, linkItemID))
210 state_map[linkType][linkItemID][actor_id][trig] =
false;
239 trigStop(actor_id, trig, linkType, linkItemID);
241 trigStart(actor_id, trig, linkType, linkItemID);
260 return state_map[linkType][linkItemID][actor_id][trig];
289 gain = std::max(0.0f, gain);
290 gain = std::min(gain, 1.0f);
302 pitch = std::max(0.0f, pitch);
314 static Vector3 last_camera_position;
315 Ogre::Vector3 camera_position = camera_node->getPosition();
316 Vector3 camera_velocity = (camera_position - last_camera_position) / dt;
317 last_camera_position = camera_position;
318 Ogre::Vector3 camera_up = camera_node->getOrientation() * Ogre::Vector3::UNIT_Y;
320 Ogre::Vector3 camera_direction = camera_node->getOrientation() * -Ogre::Vector3::UNIT_Z;
322 this->
SetListener(camera_position, camera_direction, camera_up, camera_velocity);
351 LOG(
"SoundScriptManager::createTemplate(): SoundScript with name [" + name +
"] already exists, skipping...");
464 if (pitchesPos != -1)
482 std::vector<String> vecparams;
484 LOG(
"SoundScriptManager: Parsing script "+stream->getName());
486 while (!stream->eof())
490 if (!(line.length() == 0 || line.substr(0, 2) ==
"//"))
496 LOG(
"SoundScriptManager: creating template "+line);
501 LOG(
"SoundScriptManager: Error, this sound script is already defined: "+line);
521 Ogre::StringVector veclineparams = StringUtil::split(line,
"\t ", 0);
525 LOG(
"Bad SoundScript attribute line: '" + line +
"' in " + stream->getName());
537 while (!stream->eof() && line !=
"}")
539 line = stream->getLine();
547 while (!stream->eof() && line !=
"{")
549 line = stream->getLine();
564 base_template(baseTemplate)
565 , file_name(filename)
566 , group_name(groupname)
568 , gain_multiplier(1.0f)
572 , has_start_sound(false)
573 , has_stop_sound(false)
575 , pitch_multiplier(1.0f)
579 , start_sound_pitch(0.0f)
580 , stop_sound_pitch(0.0f)
591 if (vec[0] == String(
"trigger_source"))
595 if (vec[1] == String(
"engine"))
600 if (vec[1] == String(
"aeroengine1"))
605 if (vec[1] == String(
"aeroengine2"))
610 if (vec[1] == String(
"aeroengine3"))
615 if (vec[1] == String(
"aeroengine4"))
620 if (vec[1] == String(
"aeroengine5"))
625 if (vec[1] == String(
"aeroengine6"))
630 if (vec[1] == String(
"aeroengine7"))
635 if (vec[1] == String(
"aeroengine8"))
640 if (vec[1] == String(
"horn"))
645 if (vec[1] == String(
"brake"))
650 if (vec[1] == String(
"pump"))
655 if (vec[1] == String(
"starter"))
660 if (vec[1] == String(
"turbo_BOV"))
665 if (vec[1] == String(
"turbo_waste_gate"))
670 if (vec[1] == String(
"turbo_back_fire"))
675 if (vec[1] == String(
"always_on"))
680 if (vec[1] == String(
"repair"))
685 if (vec[1] == String(
"air"))
690 if (vec[1] == String(
"gpws_ap_disconnect"))
695 if (vec[1] == String(
"gpws_10"))
700 if (vec[1] == String(
"gpws_20"))
705 if (vec[1] == String(
"gpws_30"))
710 if (vec[1] == String(
"gpws_40"))
715 if (vec[1] == String(
"gpws_50"))
720 if (vec[1] == String(
"gpws_100"))
725 if (vec[1] == String(
"gpws_pull_up"))
730 if (vec[1] == String(
"gpws_minimums"))
735 if (vec[1] == String(
"air_purge"))
740 if (vec[1] == String(
"shift"))
745 if (vec[1] == String(
"gear_slide"))
755 if (vec[1] == String(
"break"))
760 if (vec[1] == String(
"screetch"))
765 if (vec[1] == String(
"parking_brake"))
770 if (vec[1] == String(
"antilock"))
775 if (vec[1] == String(
"tractioncontrol"))
780 if (vec[1] == String(
"afterburner1"))
785 if (vec[1] == String(
"afterburner2"))
790 if (vec[1] == String(
"afterburner3"))
795 if (vec[1] == String(
"afterburner4"))
800 if (vec[1] == String(
"afterburner5"))
805 if (vec[1] == String(
"afterburner6"))
810 if (vec[1] == String(
"afterburner7"))
815 if (vec[1] == String(
"afterburner8"))
820 if (vec[1] == String(
"avionic_chat_01"))
825 if (vec[1] == String(
"avionic_chat_02"))
830 if (vec[1] == String(
"avionic_chat_03"))
835 if (vec[1] == String(
"avionic_chat_04"))
840 if (vec[1] == String(
"avionic_chat_05"))
845 if (vec[1] == String(
"avionic_chat_06"))
850 if (vec[1] == String(
"avionic_chat_07"))
855 if (vec[1] == String(
"avionic_chat_08"))
860 if (vec[1] == String(
"avionic_chat_09"))
865 if (vec[1] == String(
"avionic_chat_10"))
870 if (vec[1] == String(
"avionic_chat_11"))
875 if (vec[1] == String(
"avionic_chat_12"))
880 if (vec[1] == String(
"avionic_chat_13"))
885 if (vec[1] == String(
"aoa_horn"))
890 if (vec[1] == String(
"ignition"))
895 if (vec[1] == String(
"reverse_gear"))
900 if (vec[1] == String(
"turn_signal"))
905 if (vec[1] == String(
"turn_signal_tick"))
910 if (vec[1] == String(
"turn_signal_warn_tick"))
915 if (vec[1] == String(
"linked_command"))
920 if (vec[1] == String(
"main_menu"))
929 if (vec[0] == String(
"pitch_source"))
942 if (vec[0] == String(
"pitch_factors"))
955 if (vec[0] == String(
"gain_source"))
968 if (vec[0] == String(
"gain_factors"))
981 if (vec[0] == String(
"start_sound"))
991 if (vec[0] == String(
"stop_sound"))
1001 if (vec[0] == String(
"sound"))
1029 if (str == String(
"none"))
1031 if (str == String(
"engine_rpm"))
1033 if (str == String(
"turbo_rpm"))
1035 if (str == String(
"aeroengine1_rpm"))
1037 if (str == String(
"aeroengine2_rpm"))
1039 if (str == String(
"aeroengine3_rpm"))
1041 if (str == String(
"aeroengine4_rpm"))
1043 if (str == String(
"aeroengine5_rpm"))
1045 if (str == String(
"aeroengine6_rpm"))
1047 if (str == String(
"aeroengine7_rpm"))
1049 if (str == String(
"aeroengine8_rpm"))
1051 if (str == String(
"wheel_speed_kmph"))
1053 if (str == String(
"injector_ratio"))
1055 if (str == String(
"torque_nm"))
1057 if (str == String(
"gearbox_rpm"))
1059 if (str == String(
"creak"))
1061 if (str == String(
"break"))
1063 if (str == String(
"screetch"))
1065 if (str == String(
"pump_rpm"))
1067 if (str == String(
"aeroengine1_throttle"))
1069 if (str == String(
"aeroengine2_throttle"))
1071 if (str == String(
"aeroengine3_throttle"))
1073 if (str == String(
"aeroengine4_throttle"))
1075 if (str == String(
"aeroengine5_throttle"))
1077 if (str == String(
"aeroengine6_throttle"))
1079 if (str == String(
"aeroengine7_throttle"))
1081 if (str == String(
"aeroengine8_throttle"))
1083 if (str == String(
"air_speed_knots"))
1085 if (str == String(
"angle_of_attack_degree"))
1087 if (str == String(
"linked_command_rate"))
1089 if (str == String(
"music_volume"))
1099 , instance_name(instancename)
1101 , sound_manager(sound_manager)
1102 , sound_link_type(soundLinkType)
1103 , sound_link_item_id(soundLinkItemId)
1105 , start_sound_pitchgain(0.0f)
1107 , stop_sound_pitchgain(0.0f)
1129 LOG(
"SoundScriptInstance: instance created: "+instancename);
1208 for (
int i = 0; i < low; i++)
1272 if (sourcepitch == 0.0f)
1371 if (
sounds[i]->isPlaying())
void LOG(const char *msg)
Legacy alias - formerly a macro.
ActorInstanceID_t ar_instance_id
Static attr; session-unique ID.
Ogre::SceneNode * GetCameraNode()
void setVelocity(Ogre::Vector3 vel)
void setPitch(float pitch)
void setPosition(Ogre::Vector3 pos)
void Update(const float dt)
Does the per-frame update of sounds and listener environment.
int getNumHardwareSources()
Returns the number of currently used hardware sources.
void pauseAllSounds()
Unlike the name suggests, this sets the listener's gain to 0, essentially muting all sounds.
SoundPtr createSound(Ogre::String filename, Ogre::String resource_group_name="")
void resumeAllSounds()
Unlike the name suggests, this sets the listener's gain to the value of the CVar audio_master_volume.
void SetListener(Ogre::Vector3 position, Ogre::Vector3 direction, Ogre::Vector3 up, Ogre::Vector3 velocity)
Sets position and speed of the listener.
void setPitch(float value)
float stop_sound_pitchgain
static const float PITCHDOWN_CUTOFF_FACTOR
SoundScriptTemplatePtr templ
void setGain(float value)
SoundScriptInstance(int actor_id, SoundScriptTemplatePtr templ, SoundManager *sm, Ogre::String instancename, int soundLinkType=SL_DEFAULT, int soundLinkItemId=-1)
void setPosition(Ogre::Vector3 pos)
float start_sound_pitchgain
static const float PITCHDOWN_FADE_FACTOR
SoundManager * sound_manager
float sounds_pitchgain[MAX_SOUNDS_PER_SCRIPT]
void setVelocity(Ogre::Vector3 velo)
float pitchgain_cutoff(float sourcepitch, float targetpitch)
SoundPtr sounds[MAX_SOUNDS_PER_SCRIPT]
static const SoundPtr SOUNDPTR_NULL
void trigToggle(int actor_id, int trig, int linkType=SL_DEFAULT, int linkItemID=-1)
std::map< int, std::map< int, std::map< int, std::map< int, bool > > > > state_map
std::array< int, SS_MAX_MOD > free_pitches
SoundScriptTemplatePtr createTemplate(Ogre::String name, Ogre::String groupname, Ogre::String filename)
Ogre::StringVector script_patterns
const Ogre::StringVector & getScriptPatterns(void) const
void skipToNextCloseBrace(Ogre::DataStreamPtr &chunk)
std::array< int, SS_MAX_MOD > free_gains
void parseScript(Ogre::DataStreamPtr &stream, const Ogre::String &groupName)
void modulate(int actor_id, int mod, float value, int linkType=SL_DEFAULT, int linkItemID=-1)
void skipToNextOpenBrace(Ogre::DataStreamPtr &chunk)
bool getTrigState(int actor_id, int trig, int linkType=SL_DEFAULT, int linkItemID=-1)
std::map< Ogre::String, SoundScriptTemplatePtr > templates
std::array< SoundScriptInstancePtr, SS_MAX_TRIG *MAX_INSTANCES_PER_GROUP > trigs
void removeInstance(const SoundScriptInstancePtr &ssi)
void trigOnce(int actor_id, int trig, int linkType=SL_DEFAULT, int linkItemID=-1)
SoundManager * sound_manager
void trigKill(int actor_id, int trig, int linkType=SL_DEFAULT, int linkItemID=-1)
std::array< int, SS_MAX_TRIG > free_trigs
void setEnabled(bool state)
void trigStart(int actor_id, int trig, int linkType=SL_DEFAULT, int linkItemID=-1)
std::vector< SoundScriptInstancePtr > instances
SoundScriptInstancePtr createInstance(Ogre::String templatename, int actor_id, int soundLinkType=SL_DEFAULT, int soundLinkItemId=-1)
std::array< SoundScriptInstancePtr, SS_MAX_MOD *MAX_INSTANCES_PER_GROUP > pitches
void trigStop(int actor_id, int trig, int linkType=SL_DEFAULT, int linkItemID=-1)
void SetListener(Ogre::Vector3 position, Ogre::Vector3 direction, Ogre::Vector3 up, Ogre::Vector3 velocity)
std::array< SoundScriptInstancePtr, SS_MAX_MOD *MAX_INSTANCES_PER_GROUP > gains
Ogre::Real getLoadingOrder(void) const
bool setParameter(Ogre::StringVector vec)
Ogre::String start_sound_name
int parseModulation(Ogre::String str)
float sound_pitches[MAX_SOUNDS_PER_SCRIPT]
Ogre::String stop_sound_name
SoundScriptTemplate(Ogre::String name, Ogre::String groupname, Ogre::String filename, bool baseTemplate)
Ogre::String sound_names[MAX_SOUNDS_PER_SCRIPT]
@ SS_TRIG_GPWS_APDISCONNECT
@ SS_TRIG_TURN_SIGNAL_WARN_TICK
@ SS_TRIG_TURN_SIGNAL_TICK
@ MAX_INSTANCES_PER_GROUP
@ SS_MOD_LINKED_COMMANDRATE
@ EDITOR_MODE
Hacky, but whatever... added by Ulteq, 2016.
CameraManager * GetCameraManager()
CVar * audio_enable_creak
void EraseIf(std::vector< T, A > &c, Predicate pred)
std::string SanitizeUtf8String(std::string const &str_in)