Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
AnimateWidget.c
Go to the documentation of this file.
1//------------------------------------------------------------------------------------------------
3{
4//---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
5// Solving this with an array resulted in a lot of calls, as stopping/getting animations is bruteforced. In Mod Manager menu, it was reported we reached 26 million .Get() calls, as we recreate the Widgets to update the lists of mods
6
7 protected ref array<ref WidgetAnimationBase> m_aAnimations = {};
8
9//---- REFACTOR NOTE END ----
10
11 protected static AnimateWidget s_Instance;
12
15
16 //------------------------------------------------------------------------------------------------
17 static sealed AnimateWidget GetInstance()
18 {
19 return s_Instance;
20 }
21
25 //------------------------------------------------------------------------------------------------
26 static bool StopAnimation(Widget w, typename typeName)
27 {
28 if (!s_Instance || !w)
29 return false;
30
31 bool success = false;
32 WidgetAnimationBase current;
33 for (int i = s_Instance.m_aAnimations.Count() - 1; i >= 0; i--)
34 {
35 current = s_Instance.m_aAnimations.Get(i);
36 if (current.GetWidget() != w)
37 continue;
38
39 if (!current.IsInherited(typeName))
40 continue;
41
42 s_Instance.m_aAnimations.Remove(i);
43 success = true;
44 }
45
46 return success;
47 }
48
49 //------------------------------------------------------------------------------------------------
56 {
57 if (!s_Instance)
58 return false;
59
60 int index = s_Instance.m_aAnimations.Find(anim);
61 if (index == -1)
62 return false;
63
64 s_Instance.m_aAnimations.Remove(index);
65 return true;
66 }
67
68 //------------------------------------------------------------------------------------------------
74 {
75 if (!s_Instance)
76 return;
77
78 for (int i = s_Instance.m_aAnimations.Count() - 1; i >= 0; i--)
79 {
80 if (s_Instance.m_aAnimations[i].GetWidget() == w)
81 s_Instance.m_aAnimations.Remove(i);
82 }
83 }
84
85 //------------------------------------------------------------------------------------------------
86 static bool IsAnimating(Widget w)
87 {
88 if (!w || !s_Instance)
89 return false;
90
91 foreach (WidgetAnimationBase animation: s_Instance.m_aAnimations)
92 {
93 if (animation.GetWidget() == w)
94 return true;
95 }
96
97 return false;
98 }
99
100 //------------------------------------------------------------------------------------------------
101 static bool IsAnimatingType(Widget w, typename type)
102 {
103 if (!w || !s_Instance)
104 return false;
105
106 foreach (WidgetAnimationBase animation: s_Instance.m_aAnimations)
107 {
108 if (animation.GetWidget() == w && animation.Type() == type)
109 return true;
110 }
111
112 return false;
113 }
114
115 //------------------------------------------------------------------------------------------------
117 {
118 if (!w || !s_Instance)
119 return null;
120
121 foreach (WidgetAnimationBase animation: s_Instance.m_aAnimations)
122 {
123 if (animation.GetWidget() == w && animation.Type() == type)
124 return animation;
125 }
126
127 return null;
128 }
129
131 //------------------------------------------------------------------------------------------------
132 static bool IsActive()
133 {
134 if (!s_Instance)
135 return false;
136
137 return !s_Instance.m_aAnimations.IsEmpty();
138 }
139
140 //------------------------------------------------------------------------------------------------
141 static bool AddAnimation(notnull WidgetAnimationBase animation)
142 {
143 if (!s_Instance || !animation || !animation.GetWidget() || animation.GetSpeed() <= 0)
144 return false;
145
146 StopAnimation(animation.GetWidget(), animation.Type());
147 if (!IsActive())
148 s_Instance.m_OnAnimatingStarted.Invoke();
149
150 s_Instance.m_aAnimations.Insert(animation);
151
152 return true;
153 }
154
155 // Visibility/colorization animations
156 static WidgetAnimationBlurIntensity BlurIntensity(Widget widget, float targetValue, float speed)
157 {
159 return null;
160
161 WidgetAnimationBlurIntensity anim = new WidgetAnimationBlurIntensity(widget, speed, targetValue);
162 s_Instance.m_aAnimations.Insert(anim);
163 return anim;
164 }
165
166 //------------------------------------------------------------------------------------------------
167 static WidgetAnimationOpacity Opacity(Widget widget, float targetValue, float speed, bool toggleVisibility = false)
168 {
169 if (!PrepareAnimation(widget, speed, WidgetAnimationOpacity))
170 return null;
171
172 WidgetAnimationOpacity anim = new WidgetAnimationOpacity(widget, speed, targetValue, toggleVisibility);
173 s_Instance.m_aAnimations.Insert(anim);
174 return anim;
175 }
176
177 //------------------------------------------------------------------------------------------------
178 static WidgetAnimationImageSaturation Saturation(Widget widget, float targetValue, float speed)
179 {
181 return null;
182
183 WidgetAnimationImageSaturation anim = new WidgetAnimationImageSaturation(widget, speed, targetValue);
184 s_Instance.m_aAnimations.Insert(anim);
185 return anim;
186 }
187
188 //------------------------------------------------------------------------------------------------
189 static WidgetAnimationAlphaMask AlphaMask(Widget widget, float targetValue, float speed)
190 {
191 if (!PrepareAnimation(widget, speed, WidgetAnimationAlphaMask))
192 return null;
193
194 WidgetAnimationAlphaMask anim = new WidgetAnimationAlphaMask(widget, speed, targetValue);
195 s_Instance.m_aAnimations.Insert(anim);
196 return anim;
197 }
198
199 //------------------------------------------------------------------------------------------------
200 static WidgetAnimationColor Color(Widget widget, Color color, float speed)
201 {
202 if (!PrepareAnimation(widget, speed, WidgetAnimationColor))
203 return null;
204
205 WidgetAnimationColor anim = new WidgetAnimationColor(widget, speed, color);
206 s_Instance.m_aAnimations.Insert(anim);
207 return anim;
208 }
209
210 // Size and position animations
211
212 //------------------------------------------------------------------------------------------------
213 static WidgetAnimationFrameSize Size(Widget widget, float size[2], float speed)
214 {
215 if (!PrepareAnimation(widget, speed, WidgetAnimationFrameSize))
216 return null;
217
218 WidgetAnimationFrameSize anim = new WidgetAnimationFrameSize(widget, speed, size);
219 s_Instance.m_aAnimations.Insert(anim);
220 return anim;
221 }
222
223 //------------------------------------------------------------------------------------------------
224 static WidgetAnimationPosition Position(Widget widget, float position[2], float speed)
225 {
226 if (!PrepareAnimation(widget, speed, WidgetAnimationPosition))
227 return null;
228
230 s_Instance.m_aAnimations.Insert(anim);
231 return anim;
232 }
233
234 //------------------------------------------------------------------------------------------------
235 static WidgetAnimationPadding Padding(Widget widget, float padding[4], float speed)
236 {
237 if (!PrepareAnimation(widget, speed, WidgetAnimationPadding))
238 return null;
239
240 WidgetAnimationPadding anim = new WidgetAnimationPadding(widget, speed, padding);
241 s_Instance.m_aAnimations.Insert(anim);
242 return anim;
243 }
244
245 //------------------------------------------------------------------------------------------------
246 static WidgetAnimationLayoutFill LayoutFill(Widget widget, float targetValue, float speed)
247 {
248 if (!PrepareAnimation(widget, speed, WidgetAnimationLayoutFill))
249 return null;
250
251 WidgetAnimationLayoutFill anim = new WidgetAnimationLayoutFill(widget, speed, targetValue);
252 s_Instance.m_aAnimations.Insert(anim);
253 return anim;
254 }
255
256 //------------------------------------------------------------------------------------------------
257 static WidgetAnimationImageRotation Rotation(Widget widget, float targetValue, float speed)
258 {
260 return null;
261
262 WidgetAnimationImageRotation anim = new WidgetAnimationImageRotation(widget, speed, targetValue);
263 s_Instance.m_aAnimations.Insert(anim);
264 return anim;
265 }
266
267 //------------------------------------------------------------------------------------------------
268 static WidgetAnimationValue Value(float defaultValue, float targetValue, float speed)
269 {
270 if (!s_Instance || speed <= 0)
271 return null;
272
273 WidgetAnimationValue anim = new WidgetAnimationValue(null, speed, targetValue, defaultValue);
274 s_Instance.m_aAnimations.Insert(anim);
275 return anim;
276 }
277
279 //------------------------------------------------------------------------------------------------
280 protected static bool PrepareAnimation(Widget w, float speed, typename typeName)
281 {
282 if (!g_Game || !(g_Game.InPlayMode() || g_Game.GetWorldEditor()))
283 return false;
284
285 if (!s_Instance)
286 {
287 Print("[AnimateWidget.PrepareAnimation] AnimateWidget entity instance is missing " + w + "." + w.GetName(), LogLevel.WARNING);
288 return false;
289 }
290
291 if (!w)
292 {
293 Print("[AnimateWidget.PrepareAnimation] Widget to animate is missing", LogLevel.WARNING);
294 return false;
295 }
296
297 if (speed <= 0)
298 {
299 Print("[AnimateWidget.PrepareAnimation] Animation speed must be > 0 " + w + "." + w.GetName(), LogLevel.WARNING);
300 return false;
301 }
302
303 // Stop animation of the same type
304 foreach (int i, WidgetAnimationBase anim : s_Instance.m_aAnimations)
305 {
306 if (anim.GetWidget() != w || !anim.IsInherited(typeName))
307 continue;
308
309 anim.Stop();
310 s_Instance.m_aAnimations.Remove(i);
311 break;
312 }
313
314 // If there is no animation running, invoke that new animation is ready to run
315 if (!IsActive())
316 s_Instance.m_OnAnimatingStarted.Invoke();
317
318 return true;
319 }
320
321 // Events
322
323 //------------------------------------------------------------------------------------------------
324 void UpdateAnimations(float timeSlice)
325 {
326 if (m_aAnimations.IsEmpty())
327 m_OnAnimatingCompleted.Invoke();
328
329 // Tick all animations
330 bool finished;
331 for (int i = m_aAnimations.Count() - 1; i >=0; i--)
332 {
333 finished = m_aAnimations[i].OnUpdate(timeSlice);
334 if (finished)
335 m_aAnimations.Remove(i);
336 }
337 }
338
339 //------------------------------------------------------------------------------------------------
341 {
342 if (!s_Instance)
343 s_Instance = this;
344 }
345};
int size
EDamageType type
vector position
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
void WidgetAnimationBase(Widget w, float speed)
static AnimateWidget s_Instance
static bool StopAnimation(Widget w, typename typeName)
static WidgetAnimationValue Value(float defaultValue, float targetValue, float speed)
static sealed AnimateWidget GetInstance()
static WidgetAnimationBase GetAnimation(Widget w, typename type)
static WidgetAnimationFrameSize Size(Widget widget, float size[2], float speed)
static bool IsActive()
Is.
static WidgetAnimationBlurIntensity BlurIntensity(Widget widget, float targetValue, float speed)
static WidgetAnimationPadding Padding(Widget widget, float padding[4], float speed)
void UpdateAnimations(float timeSlice)
static WidgetAnimationOpacity Opacity(Widget widget, float targetValue, float speed, bool toggleVisibility=false)
static bool IsAnimatingType(Widget w, typename type)
static WidgetAnimationImageRotation Rotation(Widget widget, float targetValue, float speed)
static WidgetAnimationAlphaMask AlphaMask(Widget widget, float targetValue, float speed)
static WidgetAnimationPosition Position(Widget widget, float position[2], float speed)
static bool StopAnimation(WidgetAnimationBase anim)
static bool PrepareAnimation(Widget w, float speed, typename typeName)
Make sure that animation can be played, and animator is ready to run it.
ref array< ref WidgetAnimationBase > m_aAnimations
static bool AddAnimation(notnull WidgetAnimationBase animation)
ref ScriptInvoker m_OnAnimatingStarted
static void StopAllAnimations(Widget w)
ref ScriptInvoker m_OnAnimatingCompleted
static WidgetAnimationColor Color(Widget widget, Color color, float speed)
static WidgetAnimationLayoutFill LayoutFill(Widget widget, float targetValue, float speed)
static bool IsAnimating(Widget w)
static WidgetAnimationImageSaturation Saturation(Widget widget, float targetValue, float speed)
Game g_Game
Game singleton instance.
Definition gameLib.c:13
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134