19 private ref array<ref SCR_RandomPositionalSoundsDef> m_aRandomPositionalSoundsDef;
31 private ref array<ref SCR_SoundGroup> m_aSoundGroup = {};
32 private ref array<ref SCR_SpawnDef> m_aSpawnDef = {};
33 private ref array<ref SCR_TerrainDef> m_aTerrainDef;
34 private ref array<ref SCR_DayTimeCurveDef> m_aDayTimeCurve;
35 private ref array<ref SCR_WindCurveDef> m_aWindModifier;
38 private GameSignalsManager m_GlobalSignalsManager;
44 private const int GLOBAL_MODIFIERS_UPDATE_TIME = 10000;
45 private const string SUN_ANGLE_SIGNAL_NAME =
"SunAngle";
46 private const string SOUND_NAME_SIGNAL_NAME =
"SoundName";
48 private const string RAIN_INTENSITY_SIGNAL_NAME =
"RainIntensity";
49 private const string WIND_SPEED_SIGNAL_NAME =
"WindSpeed";
50 private const string ENVIRONMENT_TYPE_SIGNAL_NAME =
"EnvironmentType";
53 private int m_iSunAngleSignalIdx;
54 private int m_iSoundNameSignalIdx;
56 private int m_iRainIntensitySignalIdx;
57 private int m_iWindSpeedSignalIdx;
58 private int m_iEnvironmentTypeSignalIdx;
60 private int m_iUpdatedSoundGroupIdx;
61 private float m_fGlobalModifiersTimer;
62 private ref array<int> m_aDensity = {};
63 private ref array<float> m_aDensityModifier = {};
64 private ref array<int> m_aAngleOffset = {};
68 private ref array<ref SCR_SoundHandle> m_aSoundHandle = {};
71 ChimeraWorld GetWorld()
79 foreach(SCR_TerrainDef terrainDef : m_aTerrainDef)
81 if (soundInfo >= terrainDef.m_iRangeMin && soundInfo < terrainDef.m_iRangeMax)
82 return terrainDef.m_eTerrainType;
90 override void Update(
float worldTime, vector cameraPos,
bool forceUpdate)
92 ProcessSoundGroups(worldTime, cameraPos);
93 UpdateSoundSequence(worldTime, cameraPos);
95 if (worldTime > m_fGlobalModifiersTimer)
97 UpdateGlobalModifiers();
98 RemoveSoundsBasedOnTimeAndWeather();
99 m_fGlobalModifiersTimer = worldTime + GLOBAL_MODIFIERS_UPDATE_TIME;
107 if (DiagMenu.GetBool(
SCR_DebugMenuID.DEBUGUI_SOUNDS_RANDOM_POSITIONAL_SOUNDS))
109 AmbientSignalsDebug();
110 RandomPositionalSoundDebug(worldTime);
118 private void ProcessSoundGroups(
float worldTime, vector cameraPos)
120 UpdateSoundGroup(worldTime, cameraPos, m_iUpdatedSoundGroupIdx);
122 m_iUpdatedSoundGroupIdx ++;
123 if (m_iUpdatedSoundGroupIdx < m_aSoundGroup.Count())
126 m_iUpdatedSoundGroupIdx = 0;
128 RemoveOutOfRangeSound(cameraPos);
134 private void RemoveSoundsBasedOnTimeAndWeather()
136 for (
int i = m_aSoundHandle.Count() - 1; i >= 0; i--)
138 SCR_SoundHandle soundHandle = m_aSoundHandle[i];
140 if (m_aDayTimeCurveValue[soundHandle.m_SoundDef.m_eDayTimeCurve] == 0 || m_aDensityModifier[soundHandle.m_iSoundGroup] == 0)
141 m_aSoundHandle.Remove(i);
147 private void UpdateGlobalModifiers()
150 float windSpeedScaled = Interpolate01(m_GlobalSignalsManager.GetSignalValue(m_iWindSpeedSignalIdx), SCR_AmbientSoundsComponent.WINDSPEED_MIN, SCR_AmbientSoundsComponent.WINDSPEED_MAX);
153 m_aWindCurveValue[i] = SCR_AmbientSoundsComponent.GetPoint(windSpeedScaled, m_aWindModifier[i].m_Curve);
158 foreach (
int i, SCR_SpawnDef spawnDef : m_aSpawnDef)
160 float modifier = SCR_AmbientSoundsComponent.GetPoint(timeOfDay, spawnDef.m_TimeModifier);
161 modifier = modifier * SCR_AmbientSoundsComponent.GetPoint(m_GlobalSignalsManager.GetSignalValue(m_iRainIntensitySignalIdx), spawnDef.m_RainModifier);
162 m_aDensityModifier[i] = modifier * m_aWindCurveValue[spawnDef.m_eWindModifier];
168 m_aDayTimeCurveValue[i] = SCR_AmbientSoundsComponent.GetPoint(timeOfDay, m_aDayTimeCurve[i].m_Curve);
173 private int GetDensityMax(
int soundGroup)
175 return m_aSpawnDef[soundGroup].m_iDensity;
179 private void UpdateSoundSequence(
float worldTime, vector cameraPos)
181 for (
int i = m_aSoundHandle.Count() - 1; i >= 0; i--)
183 SCR_SoundHandle soundHandle = m_aSoundHandle[i];
185 if (worldTime > soundHandle.m_aRepTime[soundHandle.m_iRepTimeIdx])
188 if (m_iSoundNameSignalIdx !=
INVALID)
196 m_AmbientSoundsComponent.SoundEventTransform(m_aSoundGroup[soundHandle.m_iSoundGroup].m_sSoundEvent, soundHandle.m_aMat);
199 soundHandle.m_SoundDef.m_iCount++;
203 soundHandle.m_iRepTimeIdx ++;
204 if (soundHandle.m_aRepTime.Count() == soundHandle.m_iRepTimeIdx)
205 m_aSoundHandle.Remove(i);
211 private void RemoveOutOfRangeSound(vector cameraPos)
213 for (
int i = m_aSoundHandle.Count() - 1; i >= 0; i--)
215 SCR_SoundHandle soundHandle = m_aSoundHandle[i];
216 SCR_SpawnDef spawnDef = m_aSpawnDef[soundHandle.m_iSoundGroup];
218 if (!Math.IsInRange(vector.Distance(cameraPos, soundHandle.m_aMat[3]), spawnDef.m_iPlayDistMin, spawnDef.m_iPlayDistMax))
219 m_aSoundHandle.Remove(i);
228 private void UpdateSoundGroup(
float worldTime, vector camPos,
int soundGroup)
231 if (m_aDensity[soundGroup] >= GetDensityMax(soundGroup) * m_aDensityModifier[soundGroup])
238 m_aSoundGroup[soundGroup].GetSoundTypeAndPosition(
this, camPos, m_aSpawnDef[soundGroup].m_iSpawnDist, soundType, vPos);
244 int soundDef = GetRandomSoundDef(m_aSoundGroup[soundGroup].
m_aSoundType[soundType], worldTime);
251 Math3D.MatrixIdentity4(mat);
254 SCR_SoundHandle soundHandle =
new SCR_SoundHandle(soundGroup, soundType, soundDef, mat, m_aSoundGroup, worldTime);
255 m_aSoundHandle.Insert(soundHandle);
258 float timeOfDayFactor = m_aDayTimeCurveValue[soundHandle.m_SoundDef.m_eDayTimeCurve];
259 timeOfDayFactor = (1 - Math.Clamp(timeOfDayFactor, 0, 1));
260 timeOfDayFactor = Math.Pow(timeOfDayFactor, 3) * 4 + 1;
262 if (soundHandle.m_SoundDef.m_bAddSequenceLength)
263 soundHandle.m_SoundDef.m_fCoolDownEnd = worldTime + soundHandle.GetSequenceLenght(worldTime) + soundHandle.m_SoundDef.m_iCoolDown * timeOfDayFactor;
265 soundHandle.m_SoundDef.m_fCoolDownEnd = worldTime + soundHandle.m_SoundDef.m_iCoolDown * timeOfDayFactor;
269 private int GetRandomSoundDef(SCR_SoundType soundType,
float worldTime)
271 int size = soundType.m_aSoundDef.Count();
275 int offset = Math.RandomIntInclusive(0,
size - 1);
277 for (
int i = 0; i <
size; i++)
279 int idx = i + offset;
283 if (m_aDayTimeCurveValue[soundType.m_aSoundDef[
idx].m_eDayTimeCurve] > 0 && soundType.m_aSoundDef[
idx].m_fCoolDownEnd < worldTime)
291 private void UpdateDensity()
294 const int count = m_aDensity.Count();
295 for (
int i = 0; i < count; i++)
301 foreach (SCR_SoundHandle soundHandle : m_aSoundHandle)
303 const int soundGroup = soundHandle.m_iSoundGroup;
304 const int soundType = soundHandle.m_iSoundType;
306 const float densityMultiplier = m_aSoundGroup[soundGroup].m_aSoundType[soundType].m_fDensityMultiplier;
307 m_aDensity[soundGroup] = m_aDensity[soundGroup] + densityMultiplier * soundHandle.m_fDensity;
312 private float Interpolate01(
float in,
float Xmin,
float Xmax)
320 return (in - Xmin) / (Xmax - Xmin);
324 private void UpdateSignlsIdx()
331 m_iRainIntensitySignalIdx = m_GlobalSignalsManager.AddOrFindSignal(RAIN_INTENSITY_SIGNAL_NAME);
332 m_iWindSpeedSignalIdx = m_GlobalSignalsManager.AddOrFindSignal(WIND_SPEED_SIGNAL_NAME);
336 private void LoadConfigs(SCR_AmbientSoundsComponent ambientSoundsComponent)
338 foreach (SCR_RandomPositionalSoundsDef def: m_aRandomPositionalSoundsDef)
340 SCR_SoundGroup soundGrop;
341 if (def.m_SoundGroupResource !=
string.Empty)
343 Resource holder = BaseContainerTools.LoadContainer(def.m_SoundGroupResource);
345 soundGrop = SCR_SoundGroup.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
350 ambientSoundsComponent.SetScriptedMethodsCall(
false);
351 Print(
"AUDIO: SCR_AmbientSoundsComponent: Missing Ambience Sound Gropu Config",
LogLevel.WARNING);
355 m_aSoundGroup.Insert(soundGrop);
358 SCR_SpawnDef spawnDef;
359 if (def.m_SpawnDefResource !=
string.Empty)
361 Resource holder = BaseContainerTools.LoadContainer(def.m_SpawnDefResource);
363 spawnDef = SCR_SpawnDef.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
368 ambientSoundsComponent.SetScriptedMethodsCall(
false);
369 Print(
"AUDIO: SCR_AmbientSoundsComponent: Missing Spawn Definition Config",
LogLevel.WARNING);
373 m_aSpawnDef.Insert(spawnDef);
377 SCR_TerrainDefConfig soundTerrainDefinitionConfig;
378 if (m_TerrainDefinitionResource !=
string.Empty)
380 Resource holder = BaseContainerTools.LoadContainer(m_TerrainDefinitionResource);
382 soundTerrainDefinitionConfig = SCR_TerrainDefConfig.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
385 if (!soundTerrainDefinitionConfig)
387 ambientSoundsComponent.SetScriptedMethodsCall(
false);
388 Print(
"AUDIO: SCR_AmbientSoundsComponent: Missing Sound Definition Terrain Config",
LogLevel.WARNING);
392 m_aTerrainDef = soundTerrainDefinitionConfig.m_aTerrainDef;
395 SCR_DayTimeCurveDefConfig ambientSoundsDayTimeCurveDefinitionConfig;
396 if (m_DayTimeCurveResource !=
string.Empty)
398 Resource holder = BaseContainerTools.LoadContainer(m_DayTimeCurveResource);
400 ambientSoundsDayTimeCurveDefinitionConfig = SCR_DayTimeCurveDefConfig.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
403 if (!ambientSoundsDayTimeCurveDefinitionConfig)
405 ambientSoundsComponent.SetScriptedMethodsCall(
false);
406 Print(
"AUDIO: SCR_AmbientSoundsComponent: Missing Daytime Curve Deffinition Config",
LogLevel.WARNING);
410 m_aDayTimeCurve = ambientSoundsDayTimeCurveDefinitionConfig.m_aDayTimeCurve;
413 SCR_WindCurveDefConfig ambientSoundsWindDefinitionConfig;
414 if (m_WindCurveResource !=
string.Empty)
416 Resource holder = BaseContainerTools.LoadContainer(m_WindCurveResource);
418 ambientSoundsWindDefinitionConfig = SCR_WindCurveDefConfig.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
421 if (!ambientSoundsWindDefinitionConfig)
423 ambientSoundsComponent.SetScriptedMethodsCall(
false);
424 Print(
"AUDIO: SCR_AmbientSoundsComponent: Missing Wind Curve Definition Config",
LogLevel.WARNING);
428 m_aWindModifier = ambientSoundsWindDefinitionConfig.m_aWindModifier;
433 private const int STRING_LENGTH = 20;
434 private const int PANEL_WIDTH = 20;
435 private const int PANEL_HEIGHT = 20;
437 ref array<bool> m_soundGroupCheck;
438 ref array<ref array<bool>> m_soundTypeCheck;
442 void AmbientSignalsDebug()
444 DbgUI.Begin(
"Ambient Sounds Signals", 178, 0);
445 DbgUI.Text(SUN_ANGLE_SIGNAL_NAME +
": " +
m_LocalSignalsManager.GetSignalValue(m_iSunAngleSignalIdx).ToString());
446 DbgUI.Text(SOUND_NAME_SIGNAL_NAME +
": " +
m_LocalSignalsManager.GetSignalValue(m_iSoundNameSignalIdx).ToString());
455 DbgUI.Begin(
"Density", 420, 0);
456 for (
int i = 0, count = m_aSpawnDef.Count(); i < count; i++)
458 DbgUI.Text(m_aSoundGroup[i].
m_sSoundEvent +
": " + m_aDensity[i].
ToString() +
" / " + (Math.Round(GetDensityMax(i) * m_aDensityModifier[i])).
ToString());
466 void RandomPositionalSoundDebug(
float worldTime)
468 int defaultColor =
ARGB(255, 50, 50, 50);
469 int blackColor =
ARGB(255, 0, 0, 0);
470 int availableColor =
ARGB(255, 0, 0, 255);
471 int playingColor =
ARGB(255, 255, 255, 0);
472 int wrongTimeColor =
ARGB(255, 125, 125, 125);
473 int inCooldownColor =
ARGB(255, 255, 0, 255);
475 DbgUI.Begin(
"Random Ambient Sounds", 0, 185);
477 DbgUI.Panel(
"av", PANEL_WIDTH, PANEL_HEIGHT, availableColor);
479 DbgUI.Text(
"Available");
481 DbgUI.Panel(
"pl", PANEL_WIDTH, PANEL_HEIGHT, playingColor);
483 DbgUI.Text(
"Playing");
485 DbgUI.Panel(
"wt", PANEL_WIDTH, PANEL_HEIGHT, wrongTimeColor);
487 DbgUI.Text(
"WrongTime");
489 DbgUI.Panel(
"in", PANEL_WIDTH, PANEL_HEIGHT, inCooldownColor);
491 DbgUI.Text(
"InCooldown");
494 if (!m_soundGroupCheck)
496 m_soundGroupCheck = {};
497 m_soundGroupCheck.Resize(m_aSpawnDef.Count());
499 if (!m_soundTypeCheck)
501 m_soundTypeCheck = {};
502 m_soundTypeCheck.Resize(m_aSpawnDef.Count());
504 for (
int soundGroup = 0; soundGroup < m_aSpawnDef.Count(); soundGroup++)
506 m_soundTypeCheck[soundGroup] = {};
507 int soundTypeCount = m_aSoundGroup[soundGroup].m_aSoundType.Count();
508 m_soundTypeCheck[soundGroup].Resize(soundTypeCount);
512 for (
int soundGroup = 0; soundGroup < m_aSpawnDef.Count(); soundGroup++)
515 string name = m_aSoundGroup[soundGroup].m_sSoundEvent;
516 name = NormalizeLength(name);
517 name = soundGroup.ToString() +
". " + name;
520 const int limitCount = 8;
521 int playingCount = 0;
523 bool bSoundTypeChecked = m_soundGroupCheck[soundGroup];
524 DbgUI.Check(name, bSoundTypeChecked);
525 m_soundGroupCheck[soundGroup] = bSoundTypeChecked;
527 for (
int i = 0; i < m_aSoundHandle.Count(); i++)
529 if (m_aSoundHandle[i].m_iSoundGroup == soundGroup)
533 for (
int i = 0; i < limitCount; i++)
535 int color = defaultColor;
537 if (i < playingCount)
539 color = playingColor;
543 DbgUI.Panel(soundGroup.ToString() +
"." + i.ToString(), PANEL_WIDTH, PANEL_HEIGHT, color);
546 if (bSoundTypeChecked)
548 int soundTypeCount = m_aSoundGroup[soundGroup].m_aSoundType.Count();
551 for (
int soundType = 0; soundType < soundTypeCount; soundType++)
554 string soundTypeName;
555 if (SCR_TreeSoundGroup.Cast(m_aSoundGroup[soundGroup]))
558 soundTypeName =
"CONIFER";
560 soundTypeName =
"LEAFY";
562 else if (SCR_TerrainSoundGroup.Cast(m_aSoundGroup[soundGroup]))
563 soundTypeName =
typename.EnumToString(
ETerrainType, soundType);
565 soundTypeName =
typename.EnumToString(
ESoundMapType, soundType);
567 soundTypeName = NormalizeLength(soundTypeName);
569 DbgUI.Panel(soundGroup.ToString() + soundType.ToString(), PANEL_WIDTH, PANEL_HEIGHT, blackColor);
572 bool bSoundGroupChecked = m_soundTypeCheck[soundGroup][soundType];
573 DbgUI.Check(soundGroup.ToString() +
"." + soundType.ToString() +
". " + soundTypeName, bSoundGroupChecked);
574 m_soundTypeCheck[soundGroup][soundType] = bSoundGroupChecked;
578 int size = m_aSoundGroup[soundGroup].m_aSoundType[soundType].m_aSoundDef.Count();
582 if (m_aDayTimeCurveValue[m_aSoundGroup[soundGroup].
m_aSoundType[soundType].m_aSoundDef[
idx].m_eDayTimeCurve] > 0 && m_aSoundGroup[soundGroup].
m_aSoundType[soundType].m_aSoundDef[
idx].m_fCoolDownEnd < worldTime)
586 DbgUI.Text(soundGroup.ToString() +
"." + soundType.ToString() +
". " +
"Available :" + available.ToString() +
" of (" + m_aSoundGroup[soundGroup].m_aSoundType[soundType].m_aSoundDef.Count() +
")");
588 if (bSoundGroupChecked)
590 int soundDefCount = m_aSoundGroup[soundGroup].m_aSoundType[soundType].m_aSoundDef.Count();
592 for (
int soundDef = 0; soundDef < soundDefCount; soundDef++)
594 int color = defaultColor;
595 string aditionalInfo =
"";
602 if (m_aSoundGroup[soundGroup].
m_aSoundType[soundType].m_aSoundDef[soundDef].m_fCoolDownEnd > worldTime)
604 color = inCooldownColor;
605 aditionalInfo =
" | Coldown ends in : " + Math.Round((m_aSoundGroup[soundGroup].
m_aSoundType[soundType].m_aSoundDef[soundDef].m_fCoolDownEnd - worldTime) * 0.001).ToString();
607 float timeOfDayFactor = m_aDayTimeCurveValue[m_aSoundGroup[soundGroup].m_aSoundType[soundType].m_aSoundDef[soundDef].m_eDayTimeCurve];
608 timeOfDayFactor = (1 - Math.Clamp(timeOfDayFactor, 0, 1));
609 timeOfDayFactor = Math.Pow(timeOfDayFactor, 3) * 4 + 1;
610 timeOfDayFactor = Math.Round(timeOfDayFactor * 100) * 0.01;
612 aditionalInfo = aditionalInfo +
" | TFactor : " + timeOfDayFactor.ToString();
615 EDayTimeCurve m_eDayTimeCurve = m_aSoundGroup[soundGroup].m_aSoundType[soundType].m_aSoundDef[soundDef].m_eDayTimeCurve;
618 if (m_aDayTimeCurveValue[m_eDayTimeCurve] <= 0)
619 color = wrongTimeColor;
622 if (m_aDayTimeCurveValue[m_eDayTimeCurve] > 0 && m_aSoundGroup[soundGroup].
m_aSoundType[soundType].m_aSoundDef[soundDef].m_fCoolDownEnd <= worldTime)
623 color = availableColor;
625 DbgUI.Panel(soundGroup.ToString() +
"." + soundType.ToString() +
"." + soundDef.ToString(), PANEL_WIDTH * 2 + 5, PANEL_HEIGHT, color);
631 string soundDefinitionName =
typename.EnumToString(
ESoundName, m_aSoundGroup[soundGroup].
m_aSoundType[soundType].m_aSoundDef[soundDef].m_eSoundName);
632 soundDefinitionName = NormalizeLength(soundDefinitionName);
634 DbgUI.Text(soundGroup.ToString() +
"." + soundType.ToString() +
"." + soundDef.ToString() +
". " + soundDefinitionName +
" ");
640 int instanceCount = 0;
641 float playbackEnd = 0;
643 foreach (SCR_SoundHandle sh: m_aSoundHandle)
645 if (sh.m_iSoundGroup == soundGroup && sh.m_iSoundType == soundType && sh.m_iSoundDef == soundDef)
649 if (playbackEnd < Math.Round(sh.m_aRepTime[sh.m_aRepTime.Count() - 1] - worldTime))
651 playbackEnd = Math.Round(sh.m_aRepTime[sh.m_aRepTime.Count() - 1] - worldTime);
656 playbackEnd = Math.Round(playbackEnd * 0.001);
660 aditionalInfo = aditionalInfo +
" | Playback ends in : " + playbackEnd.ToString();
663 for (
int j = 0; j < instanceCount; j++)
666 DbgUI.Panel(soundGroup.ToString() +
"." + soundType.ToString() +
"." + soundDef.ToString() +
"Play" + j.ToString(), PANEL_WIDTH, PANEL_HEIGHT, playingColor);
674 DbgUI.Text(aditionalInfo);
685 private string NormalizeLength(
string name)
687 int length = name.Length();
690 if (length <= STRING_LENGTH)
692 for (
int i = 0; i < (STRING_LENGTH - length); i++)
698 s = s.Substring(0, STRING_LENGTH * 0.5 - 2) +
"...." + s.Substring(length - STRING_LENGTH * 0.5, STRING_LENGTH * 0.5);
704 override void ReloadConfig()
706 super.ReloadConfig();
708 m_aSoundGroup.Clear();
711 foreach (SCR_RandomPositionalSoundsDef def: m_aRandomPositionalSoundsDef)
713 SCR_SoundGroup soundGrop;
714 if (def.m_SoundGroupResource !=
string.Empty)
716 Resource holder = BaseContainerTools.LoadContainer(def.m_SoundGroupResource);
718 soundGrop = SCR_SoundGroup.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
722 m_aSoundGroup.Insert(soundGrop);
725 SCR_SpawnDef spawnDef;
726 if (def.m_SpawnDefResource !=
string.Empty)
728 Resource holder = BaseContainerTools.LoadContainer(def.m_SpawnDefResource);
730 spawnDef = SCR_SpawnDef.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
734 m_aSpawnDef.Insert(spawnDef);
738 SCR_TerrainDefConfig soundTerrainDefinitionConfig;
739 if (m_TerrainDefinitionResource !=
string.Empty)
741 Resource holder = BaseContainerTools.LoadContainer(m_TerrainDefinitionResource);
743 soundTerrainDefinitionConfig = SCR_TerrainDefConfig.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
746 if (soundTerrainDefinitionConfig)
747 m_aTerrainDef = soundTerrainDefinitionConfig.m_aTerrainDef;
750 SCR_DayTimeCurveDefConfig ambientSoundsDayTimeCurveDefinitionConfig;
751 if (m_DayTimeCurveResource !=
string.Empty)
753 Resource holder = BaseContainerTools.LoadContainer(m_DayTimeCurveResource);
755 ambientSoundsDayTimeCurveDefinitionConfig = SCR_DayTimeCurveDefConfig.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
758 if (!ambientSoundsDayTimeCurveDefinitionConfig)
759 m_aDayTimeCurve = ambientSoundsDayTimeCurveDefinitionConfig.m_aDayTimeCurve;
762 SCR_WindCurveDefConfig ambientSoundsWindDefinitionConfig;
763 if (m_WindCurveResource !=
string.Empty)
765 Resource holder = BaseContainerTools.LoadContainer(m_WindCurveResource);
767 ambientSoundsWindDefinitionConfig = SCR_WindCurveDefConfig.Cast(BaseContainerTools.CreateInstanceFromContainer(holder.GetResource().ToBaseContainer()));
770 if (ambientSoundsWindDefinitionConfig)
771 m_aWindModifier = ambientSoundsWindDefinitionConfig.m_aWindModifier;
773 m_aSoundHandle.Clear();
779 DbgUI.Begin(
"Play Sound", 0, 0);
784 float distanceFactor = 0.15;
785 DbgUI.InputInt(
"Sound Group:", soundGroup, 50);
786 DbgUI.InputInt(
"Sound Type :", soundType, 50);
787 DbgUI.InputInt(
"Sound Def :", soundDef, 50);
788 DbgUI.InputFloat(
"Dist Factor:", distanceFactor, 50);
790 bool play = DbgUI.Button(
"Play");
792 bool clear = DbgUI.Button(
"Clear");
797 if (soundGroup >= m_aSoundGroup.Count() || soundType >= m_aSoundGroup[soundGroup].m_aSoundType.Count() || soundDef >= m_aSoundGroup[soundGroup].m_aSoundType[soundType].m_aSoundDef.Count())
802 GetGame().GetCameraManager().CurrentCamera().GetTransform(mat);
806 float angle = yaw.ToYaw();
808 yaw = vector.FromYaw(angle);
811 float dist = Math.Lerp(m_aSpawnDef[soundGroup].m_iPlayDistMin, m_aSpawnDef[soundGroup].m_iPlayDistMax, distanceFactor);
812 mat[3] = mat[3] + yaw * dist;
815 SCR_SoundHandle soundHandle =
new SCR_SoundHandle(soundGroup, soundType, soundDef, mat, m_aSoundGroup, worldTime);
816 m_aSoundHandle.Insert(soundHandle);
820 m_aSoundHandle.Clear();
828 override void OnPostInit(SCR_AmbientSoundsComponent ambientSoundsComponent, SignalsManagerComponent signalsManagerComponent)
830 super.OnPostInit(ambientSoundsComponent, signalsManagerComponent);
832 LoadConfigs(ambientSoundsComponent);
835 m_GlobalSignalsManager =
GetGame().GetSignalsManager();
838 int count = m_aSpawnDef.Count();
839 m_aDensity.Resize(count);
840 m_aAngleOffset.Resize(count);
841 m_aDensityModifier.Resize(count);
847 DiagMenu.RegisterBool(
SCR_DebugMenuID.DEBUGUI_SOUNDS_RANDOM_POSITIONAL_SOUNDS,
"",
"Random Ambient Sounds",
"Sounds");
856 UpdateGlobalModifiers();
861 void ~SCR_RandomPositionalSounds()
864 if (DiagMenu.GetBool(
SCR_DebugMenuID.DEBUGUI_SOUNDS_RANDOM_POSITIONAL_SOUNDS))
866 foreach (SCR_SoundGroup soundGroup : m_aSoundGroup)
868 foreach (SCR_SoundType soundType : soundGroup.m_aSoundType)
870 foreach (SCR_SoundDef soundDef : soundType.m_aSoundDef)
878 DiagMenu.Unregister(
SCR_DebugMenuID.DEBUGUI_SOUNDS_RANDOM_POSITIONAL_SOUNDS);