Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_LoopedPositionalSounds.c
Go to the documentation of this file.
1
2[BaseContainerProps(configRoot: true)]
4{
5 private const int MINIMUM_MOVE_DISTANCE_SQ = 2;
6 private const int INVALID = -1;
7 private const int LOOP_SOUND_HEIGHT_LIMIT = 25;
8 private const int LOOP_SOUND_COUNT = 9;
9 private const float BOUNDING_BOX_CROP_FACTOR = 0.3;
10 private const float BOUNDING_BOX_CROP_FACTOR_HEIGHT = 0.9;
11 private const int BUSH_LOOP_SOUND_COUNT_LIMIT = 4;
12 private const string ENTITY_SIZE_SIGNAL_NAME = "EntitySize";
13 private const string SEED_SIGNAL_NAME = "Seed";
14
15 [Attribute("0.3", desc: "Ratio of bushes with insect sounds vs without")]
16 private float m_fBushCricketThreshold;
17
18 private int m_iEntitySizeSignalIdx;
19 private int m_iSeedSignalIdx;
20
22 private vector m_vCameraPosLooped;
23
25 private ref array<IEntity> m_aClosestEntityID = {};
26
28 private ref array<IEntity> m_aLoopedSoundID = {};
29
31 private ref array<AudioHandle> m_aLoopedSoundAudioHandle = {};
32
33 //------------------------------------------------------------------------------------------------
34 // Called by SCR_AmbientSoundComponent in UpdateSoundJob()
35 override void Update(float worldTime, vector cameraPos, bool forceUpdate)
36 {
37 if (!forceUpdate && vector.DistanceSqXZ(m_vCameraPosLooped, cameraPos) < MINIMUM_MOVE_DISTANCE_SQ)
38 return;
39
40 m_vCameraPosLooped = cameraPos;
41
42 // Update closest entities array
43 UpdateClosestEntitiesArray();
44
45 // Stop sounds that are no longer among closest entities
46 StopLoopedSounds();
47
48 // Play sounds on entities, that become closest
49 PlayLoopedSounds(cameraPos);
50 }
51
52 //------------------------------------------------------------------------------------------------
53 private void StopLoopedSounds()
54 {
55 for (int i = m_aLoopedSoundID.Count() - 1; i >= 0; i--)
56 {
57 int index = m_aClosestEntityID.Find(m_aLoopedSoundID[i]);
58
59 if (index == INVALID)
60 {
61 m_aLoopedSoundID.Remove(i);
62 m_AmbientSoundsComponent.Terminate(m_aLoopedSoundAudioHandle[i]);
63 m_aLoopedSoundAudioHandle.Remove(i);
64 }
65 }
66 }
67
68 //------------------------------------------------------------------------------------------------
69 private void PlayLoopedSounds(vector cameraPos)
70 {
71 foreach(IEntity entity: m_aClosestEntityID)
72 {
73 if (entity == null)
74 continue;
75
76 int index = m_aLoopedSoundID.Find(entity);
77
78 if (index != INVALID)
79 continue;
80
81 float foliageHight;
82 ETreeSoundTypes treeSoundType
83 GetTreeProperties(entity, treeSoundType, foliageHight);
84
85 // Get event name
86 string eventName;
87
88 if (treeSoundType == ETreeSoundTypes.Leafy)
89 {
90 eventName = GetTreeSoundEventName(foliageHight, treeSoundType);
91 }
92 else
93 {
94 vector v = entity.GetOrigin();
95 int seed = v[0] * v[2];
97 ranGen.SetSeed(seed);
98
99 if (ranGen.RandFloat01() > m_fBushCricketThreshold)
100 {
101 float sampleSelector = Math.AbsInt(seed % 100) * 0.01;
102 m_LocalSignalsManager.SetSignalValue(m_iSeedSignalIdx, sampleSelector);
103 eventName = SCR_SoundEvent.SOUND_BUSH_CRICKETS_LP;
104 }
105 else
106 {
107 eventName = SCR_SoundEvent.SOUND_BUSH_LP;
108 }
109 }
110
111 // Get sound position
112 vector mat[4];
113 Math3D.MatrixIdentity4(mat);
114
115 // Get world bounding box
116 vector mins, maxs;
117 entity.GetWorldBounds(mins, maxs);
118
119 // Get height
120 float BVHeight = (maxs[1] - mins[1] - foliageHight) * BOUNDING_BOX_CROP_FACTOR_HEIGHT;
121
122 // Get average width
123 float widthX = (maxs[0] - mins[0]) * 0.5;
124 float widthZ = (maxs[2] - mins[2]) * 0.5;
125 float BVRadius = 0.5 * (widthX + widthZ) * BOUNDING_BOX_CROP_FACTOR;
126
127 // Get center
128 mat[3][0] = mins[0] + widthX;
129 mat[3][1] = mins[1] + foliageHight + 0.5 * BVHeight;
130 mat[3][2] = mins[2] + widthZ;
131
132 // Play sound
133 AudioHandle audioHandle = m_AmbientSoundsComponent.SoundEventTransform(eventName, mat);
134 if (!m_AmbientSoundsComponent.IsHandleValid(audioHandle))
135 continue;
136
137 // Set BV parameters
138 AudioSystem.SetBoundingVolumeParams(audioHandle, AudioSystem.BV_Cylinder, BVRadius, BVHeight, 0);
139
140 // Store references
141 m_aLoopedSoundID.Insert(entity);
142 m_aLoopedSoundAudioHandle.Insert(audioHandle);
143 }
144 }
145
146 //------------------------------------------------------------------------------------------------
147 private void UpdateClosestEntitiesArray()
148 {
149 m_aClosestEntityID.Clear();
150 m_AmbientSoundsComponent.GetClosestEntities(EAmbientSoundFlags.TreeBush, BUSH_LOOP_SOUND_COUNT_LIMIT, m_aClosestEntityID);
151 m_AmbientSoundsComponent.GetClosestEntities(EAmbientSoundFlags.TreeLeafy, LOOP_SOUND_COUNT - m_aClosestEntityID.Count(), m_aClosestEntityID);
152 }
153
154 //------------------------------------------------------------------------------------------------
155 protected void GetTreeProperties(IEntity entity, out ETreeSoundTypes soundType, out float foliageHeight)
156 {
157 // Get tree entity
158 Tree tree = Tree.Cast(entity);
159 if (!tree)
160 return;
161
162 // Get prefab data
163 TreeClass treeClass = TreeClass.Cast(tree.GetPrefabData());
164 if (!treeClass)
165 return;
166
167 foliageHeight = treeClass.m_iFoliageHeight * entity.GetScale();
168 soundType = treeClass.SoundType;
169 }
170
171 //------------------------------------------------------------------------------------------------
172 protected string GetTreeSoundEventName(float foliageHeight, ETreeSoundTypes treeSoundType)
173 {
174 if (foliageHeight < 3)
175 return SCR_SoundEvent.SOUND_LEAFYTREE_SMALL_LP;
176 else if (foliageHeight < 5)
177 return SCR_SoundEvent.SOUND_LEAFYTREE_MEDIUM_LP;
178 else if (foliageHeight < 7)
179 return SCR_SoundEvent.SOUND_LEAFYTREE_LARGE_LP;
180 else
181 return SCR_SoundEvent.SOUND_LEAFYTREE_VERYLARGE_LP;
182 }
183
184 //------------------------------------------------------------------------------------------------
185 // Called by SCR_AmbientSoundComponent in EOnPostInit()
186 override void OnPostInit(SCR_AmbientSoundsComponent ambientSoundsComponent, SignalsManagerComponent signalsManagerComponent)
187 {
188 super.OnPostInit(ambientSoundsComponent, signalsManagerComponent);
189
190 m_iEntitySizeSignalIdx = signalsManagerComponent.AddOrFindSignal(ENTITY_SIZE_SIGNAL_NAME);
191 m_iSeedSignalIdx = signalsManagerComponent.AddOrFindSignal(SEED_SIGNAL_NAME);
192 }
193}
SCR_AIAnimation_Loitering BaseContainerProps
Commanding menu commanding element class.
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
proto external float GetScale()
Definition Math.c:13
SignalsManagerComponent m_LocalSignalsManager
SCR_AmbientSoundsComponent m_AmbientSoundsComponent
Handles looped sounds such as leaves rustles, or crickets played on entities close to camera.
string GetTreeSoundEventName(float foliageHeight, ETreeSoundTypes treeSoundType)
void GetTreeProperties(IEntity entity, out ETreeSoundTypes soundType, out float foliageHeight)
override void OnPostInit(SCR_AmbientSoundsComponent ambientSoundsComponent, SignalsManagerComponent signalsManagerComponent)
static RandomGenerator GetMathRandomGenerator()
Definition SCR_Math.c:270
Definition Tree.c:11
EAmbientSoundFlags
SCR_FieldOfViewSettings Attribute
ETreeSoundTypes