6class SCR_AmbientSoundsComponent : AmbientSoundsComponent
9 ref array<ref SCR_AmbientSoundsEffect> m_aAmbientSoundsEffect;
15 private const int QUERY_RADIUS = 25;
16 private const int QUERY_PROCESSING_INTERVAL = 2000;
17 private const int QUERY_MINIMUM_MOVE_DISTANCE_SQ = 2;
19 private const int UPDATE_PROCESSING_INTERVAL = 300;
20 private const int LOOPED_SOUND_MINIMUM_MOVE_DISTANCE_SQ = 2;
21 const int WINDSPEED_MIN = 2;
22 const int WINDSPEED_MAX = 12;
25 private float m_fQueryTimer;
26 private float m_fUpdateTimer;
27 private bool m_bQueryRefreshNeeded;
28 private bool m_bUpdateRefreshNeeded;
32 private float m_fWorldTime;
33 private vector m_vCameraPosFrame;
34 private vector m_vCameraPosQuery;
35 private vector m_vCameraPosLoopedSound;
38 private ref array<ref SCR_AudioHandleLoop> m_aAudioHandleLoop = {};
41 private ref array<int> m_aQueryTypeCount = {};
46 m_bQueryRefreshNeeded =
true;
52 m_bUpdateRefreshNeeded =
true;
57 private void HandleQueryEntities()
60 if (m_fWorldTime < m_fQueryTimer)
63 if (!m_bQueryRefreshNeeded && vector.DistanceSqXZ(m_vCameraPosQuery, m_vCameraPosFrame) < QUERY_MINIMUM_MOVE_DISTANCE_SQ)
66 m_bQueryRefreshNeeded =
false;
67 m_fQueryTimer = m_fWorldTime + QUERY_PROCESSING_INTERVAL;
68 m_vCameraPosQuery = m_vCameraPosFrame;
92 static float GetPoint(
float x, Curve curve)
97 int lastIdx = curve.Count() - 1;
99 if (x >= curve[lastIdx][0])
100 return curve[lastIdx][1];
103 for (i = 1; i < lastIdx; i++)
109 if (curve[i-1][1] == curve[i][1])
112 return Math.Lerp(curve[i-1][1], curve[i][1], (x - curve[i-1][0]) / (curve[i][0] - curve[i-1][0]));
120 SCR_AudioHandleLoop SoundEventLooped(
string soundEvent, vector transformation[4])
122 SCR_AudioHandleLoop audioHandleLoop =
new SCR_AudioHandleLoop;
124 audioHandleLoop.m_aMat = transformation;
125 audioHandleLoop.m_sSoundEvent = soundEvent;
127 m_aAudioHandleLoop.Insert(audioHandleLoop);
129 return audioHandleLoop;
135 void TerminateLooped(SCR_AudioHandleLoop audioHandleLoop)
137 if (!audioHandleLoop)
140 Terminate(audioHandleLoop.m_AudioHandle);
141 m_aAudioHandleLoop.RemoveItem(audioHandleLoop);
145 private void UpdateLoopedSounds()
147 foreach (SCR_AudioHandleLoop audioHandleLoop : m_aAudioHandleLoop)
150 audioHandleLoop.m_AudioHandle = SoundEventTransform(audioHandleLoop.m_sSoundEvent, audioHandleLoop.m_aMat);
155 override void UpdateSoundJob(
IEntity owner,
float timeSlice)
157 super.UpdateSoundJob(owner, timeSlice);
160 m_fWorldTime =
m_World.GetWorldTime();
163 if (m_bUpdateRefreshNeeded || m_fWorldTime > m_fUpdateTimer)
166 if (m_bUpdateRefreshNeeded || vector.DistanceSqXZ(m_vCameraPosLoopedSound, m_vCameraPosFrame) > LOOPED_SOUND_MINIMUM_MOVE_DISTANCE_SQ)
168 m_vCameraPosLoopedSound = m_vCameraPosFrame;
172 foreach (SCR_AmbientSoundsEffect ambientSoundsEffect : m_aAmbientSoundsEffect)
174 ambientSoundsEffect.Update(m_fWorldTime, m_vCameraPosFrame, m_bUpdateRefreshNeeded);
177 m_fUpdateTimer = m_fWorldTime + UPDATE_PROCESSING_INTERVAL;
179 if (m_bUpdateRefreshNeeded)
180 m_bUpdateRefreshNeeded =
false;
183 HandleQueryEntities();
186 foreach (SCR_AmbientSoundsEffect ambientSoundsEffect : m_aAmbientSoundsEffect)
188 ambientSoundsEffect.UpdateDebug(m_fWorldTime);
191 if (DiagMenu.GetBool(
SCR_DebugMenuID.DEBUGUI_SOUNDS_RELOAD_AMBIENT_SOUNDS_CONFIGS))
193 foreach (SCR_AmbientSoundsEffect ambientSoundsEffect : m_aAmbientSoundsEffect)
195 ambientSoundsEffect.ReloadConfig();
198 DiagMenu.SetValue(
SCR_DebugMenuID.DEBUGUI_SOUNDS_RELOAD_AMBIENT_SOUNDS_CONFIGS,
false);
206 super.OnPostInit(owner);
212 SetScriptedMethodsCall(
false);
220 SetScriptedMethodsCall(
false);
221 Print(
"AUDIO: SCR_AmbientSoundsComponent: Missing SignalsManagerComponent",
LogLevel.WARNING);
225 foreach (SCR_AmbientSoundsEffect ambientSoundsEffect : m_aAmbientSoundsEffect)
236 foreach (SCR_AmbientSoundsEffect ambientSoundsEffect : m_aAmbientSoundsEffect)
238 ambientSoundsEffect.OnInit();
247 void SCR_AmbientSoundsComponent(IEntityComponentSource src,
IEntity ent,
IEntity parent)
249 SetScriptedMethodsCall(
true);
255 DiagMenu.RegisterBool(
SCR_DebugMenuID.DEBUGUI_SOUNDS_RELOAD_AMBIENT_SOUNDS_CONFIGS,
"",
"Reload AmbientSounds Conf",
"Sounds");
261 void ~SCR_AmbientSoundsComponent()
264 DiagMenu.Unregister(
SCR_DebugMenuID.DEBUGUI_SOUNDS_RELOAD_AMBIENT_SOUNDS_CONFIGS);
void Terminate(bool fadeOut=true)
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
SignalsManagerComponent m_LocalSignalsManager
enum EVehicleType IEntity
proto external Managed FindComponent(typename typeName)
proto external BaseWorld GetWorld()
proto external bool IsFinishedPlaying(AudioHandle handle)
event void OnQueryFinished()
Triggered when the result of QueryAmbientSoundsBySphere query becomes available.
AmbientSoundsComponentClass SoundComponentClass QueryAmbientSoundsBySphere(float radius, EQueryEntitiesFlags queryFlags=EQueryEntitiesFlags.ALL)
event void OnRefreshNeeded()
Triggered when a big-enough change in the surrounding area is detected that would require an update.
proto external void GetAmbientSoundsCountPerType(out notnull array< int > count)
proto external vector GetCameraOrigin()
Returns the last camera position.
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute
@ INVALID
Missing components, or obstruction test was not possible.