Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
gameplayeffectwidgets.c
Go to the documentation of this file.
1/*
2TODO - doxygen formating
3*/
4
6class GameplayEffectWidgets extends GameplayEffectWidgets_base
7{
8 protected ref Widget m_Root; //dummy parent node
10 protected ref set<ref Widget> m_UniqueLayouts;
12 protected ref set<int> m_RunningEffects;
13 protected ref set<int> m_RunningEffectsPrevious;
15 protected ref array<ref Widget> m_UpdatedWidgetsCheck; //to make sure widgets are not updated over and over (case of multiple IDs sharing same widget set)
16 protected ref array<int> m_UpdatedWidgetSetsCheck; //to make sure sets are not updated over and over (case of multiple IDs sharing same widget set)
17 protected ref set<int> m_SuspendRequests;
19
20 protected float m_TimeProgBreath;
21 protected float m_BreathMultStamina;
22 protected float m_BreathResidue;
23
24 //UserID's for widget containers that use something different from 'EffectWidgetsTypes' defaults
25 protected const int WIDGETSET_BREATH = 100;
26
27 //effect values
28 protected int m_BreathColor;
29 protected float m_BreathAlphaVal;
30 protected float m_FlashbangCoverAlphaVal;
31
33 {
34 m_Root = GetGame().GetWorkspace().CreateWidget(FrameWidgetTypeID,0,0,1.0,1.0,WidgetFlags.VISIBLE | WidgetFlags.HEXACTPOS | WidgetFlags.VEXACTPOS, 0xffffffff, 0);
35 m_Layouts = new map<int,ref Widget>;
36 m_UniqueLayouts = new set<ref Widget>;
37 m_WidgetDataMap = new GameplayEffectDataMap;
38 m_RunningEffects = new set<int>;
39 m_RunningEffectsPrevious = new set<int>;
40 m_UpdatingEffects = new array<int>;
41 m_UpdatedWidgetsCheck = new array<ref Widget>;
42 m_UpdatedWidgetSetsCheck = new array<int>;
43 m_SuspendRequests = new set<int>;
44 m_IDToTypeMap = new map<int,typename>;
45
46 m_TimeProgBreath = 0.0;
47 m_BreathMultStamina = 1.0;
48
49 Init();
50
52 }
53
55 {
56 for (int i = 0; i < m_Layouts.Count(); i++)
57 {
58 if (m_Layouts.GetElement(i))
59 m_Layouts.GetElement(i).Unlink();
60 }
61 }
62
64//inits
65
66 protected void Init()
67 {
71 }
72
74 protected void PairIDToTypes()
75 {
76 m_IDToTypeMap.Insert(EffectWidgetsTypes.BLEEDING_LAYER,GameplayEffectsDataBleeding);
77 }
78
79 protected void InitLayouts()
80 {
81 RegisterLayouts("gui/layouts/gameplay/CameraEffects.layout",CompileEffectListing());
82 RegisterLayouts("gui/layouts/gameplay/BleedingEffects.layout",{EffectWidgetsTypes.BLEEDING_LAYER});
83 }
84
85 protected void InitWidgetSets()
86 {
87 InitWidgetSet(EffectWidgetsTypes.MASK_BREATH,true,WIDGETSET_BREATH);
88 InitWidgetSet(EffectWidgetsTypes.HELMET_BREATH,true,WIDGETSET_BREATH);
89 InitWidgetSet(EffectWidgetsTypes.MOTO_BREATH,true,WIDGETSET_BREATH);
90
91 InitWidgetSet(EffectWidgetsTypes.MASK_OCCLUDER);
92 InitWidgetSet(EffectWidgetsTypes.HELMET_OCCLUDER);
93 InitWidgetSet(EffectWidgetsTypes.HELMET2_OCCLUDER);
94 InitWidgetSet(EffectWidgetsTypes.MOTO_OCCLUDER);
95 InitWidgetSet(EffectWidgetsTypes.NVG_OCCLUDER);
96 InitWidgetSet(EffectWidgetsTypes.PUMPKIN_OCCLUDER,false,EffectWidgetsTypes.NVG_OCCLUDER);
97 InitWidgetSet(EffectWidgetsTypes.EYEPATCH_OCCLUDER);
98
99 InitWidgetSet(EffectWidgetsTypes.COVER_FLASHBANG);
100
101 InitWidgetSet(EffectWidgetsTypes.BLEEDING_LAYER,true);
102 }
103
105
110 protected void RegisterLayouts(string path, array<int> types)
111 {
112 Widget w = GetGame().GetWorkspace().CreateWidgets(path,m_Root,false);
113 m_UniqueLayouts.Insert(w);
114 w.Show(false);
115 foreach (int i : types)
116 {
117 m_Layouts.Set(i,w);
118 }
119 }
120
121 protected typename TranslateIDToType(int typeID)
122 {
123 return m_IDToTypeMap.Get(typeID);
124 }
125
126 override void RegisterGameplayEffectData(int id, Param p)
127 {
128 if (!m_WidgetDataMap.Get(id).DataInitialized())
129 {
130 m_WidgetDataMap.Get(id).RegisterData(p);
131 }
132 }
133
144 protected void InitWidgetSet(int type, bool updating = false, int user_id_override = -1)
145 {
146 Widget parent = null;
147 if (user_id_override != -1)
148 {
149 parent = m_Layouts.Get(type).FindAnyWidgetById(user_id_override);
150 }
151 else
152 {
153 parent = m_Layouts.Get(type).FindAnyWidgetById(type);
154 }
155
156 if (!parent)
157 {
158 Print("InitWidgetSet | type: " + type + " - parent not found!");
159 return;
160 }
161
162 array<ref Widget> output;
163 Widget w = parent.GetChildren();
164 if (w)
165 {
166 output = new array<ref Widget>;
167 while (w)
168 {
169 w.Update();
170 w.Show(false,true);
171 output.Insert(w);
172
173 w = w.GetSibling();
174 }
175
176 if (parent.GetChildren())
177 {
178 typename handled_type = TranslateIDToType(type);
179 if ( handled_type )
180 {
181 CreateHandledClass(handled_type,output,type,user_id_override);
182 }
183 else
184 {
185 if (ImageWidget.Cast(parent.GetChildren()))
186 {
187 m_WidgetDataMap.Set(type, new GameplayEffectsDataImage(output,type,user_id_override) );
188 }
189 else
190 {
191 m_WidgetDataMap.Set(type, new GameplayEffectsData(output,type,user_id_override) );
192 }
193 }
194 }
195
196 if (updating)
197 m_UpdatingEffects.Insert(type);
198 }
199 }
200
201 bool CreateHandledClass(typename handled_type, array<ref Widget> input, int type, int user_override)
202 {
203 if (handled_type)
204 {
205 GameplayEffectsData data = GameplayEffectsData.Cast(handled_type.Spawn());
206 data.Init(input,type,m_Layouts.Get(type),user_override);
207 m_WidgetDataMap.Set(type, data);
208 return true;
209 }
210 return false;
211 }
212
215 {
216 array<int> ret = new array<int>;
217 ret.Insert(EffectWidgetsTypes.MASK_OCCLUDER);
218 ret.Insert(EffectWidgetsTypes.MASK_BREATH);
219 ret.Insert(EffectWidgetsTypes.HELMET_OCCLUDER);
220 ret.Insert(EffectWidgetsTypes.HELMET_BREATH);
221 ret.Insert(EffectWidgetsTypes.MOTO_OCCLUDER);
222 ret.Insert(EffectWidgetsTypes.MOTO_BREATH);
223 ret.Insert(EffectWidgetsTypes.COVER_FLASHBANG);
224 ret.Insert(EffectWidgetsTypes.NVG_OCCLUDER);
225 ret.Insert(EffectWidgetsTypes.PUMPKIN_OCCLUDER);
226 ret.Insert(EffectWidgetsTypes.EYEPATCH_OCCLUDER);
227 ret.Insert(EffectWidgetsTypes.HELMET2_OCCLUDER);
228
229 return ret;
230 }
231
232 protected void UpdateVisibility()
233 {
234 Widget w;
235 //Hide diff
236 int value;
237 int runningEffectCount = m_RunningEffects.Count();
238 bool runningEffectsPresent = runningEffectCount > 0;
240 for (int i = 0; i < m_RunningEffectsPrevious.Count(); i++)
241 {
242 value = m_RunningEffectsPrevious.Get(i);
243 dta = m_WidgetDataMap.Get(value);
244 if (runningEffectCount < 1 || m_RunningEffects.Find(value) == -1)
245 {
246 if (dta.HasDefinedHandle())
247 {
248 dta.UpdateVisibility(false);
249 }
250 else
251 {
252 for (int j = 0; j < m_WidgetDataMap.Get(value).GetWidgetSet().Count(); j++)
253 {
254 w = m_WidgetDataMap.Get(value).GetWidgetSet().Get(j);
255 w.Show(false);
256 }
257 w.GetParent().Show(false);
258 }
259 }
260 }
261
262 //Show running effects
263 if (runningEffectsPresent)
264 {
265 value = 0;
266 for (i = 0; i < runningEffectCount; i++)
267 {
268 value = m_RunningEffects.Get(i);
269 dta = m_WidgetDataMap.Get(value);
270 if (dta.HasDefinedHandle())
271 {
272 dta.m_LayoutRoot.Show(true);
273 dta.UpdateVisibility(true);
274 }
275 else
276 {
277 for (j = 0; j < m_WidgetDataMap.Get(value).GetWidgetSet().Count(); j++)
278 {
279 w = m_WidgetDataMap.Get(value).GetWidgetSet().Get(j);
280 w.Update();
281 w.Show(true);
282 }
283
284 while (w) //dumb but necessary because of uncertain "visible" setting of the layout
285 {
286 w = w.GetParent();
287 if (w)
288 {
289 w.Show(true);
290 }
291 }
292 }
293 }
294 }
295
296 m_Root.Show(runningEffectsPresent && m_SuspendRequests.Count() < 1);
297 m_RunningEffectsPrevious.Clear();
298 }
299
300 override void AddActiveEffects(array<int> effects)
301 {
302 if (effects && effects.Count() > 0)
303 {
304 m_RunningEffectsPrevious.Copy(m_RunningEffects);
305
306 int value;
307 for (int i = 0; i < effects.Count(); i++)
308 {
309 value = effects.Get(i);
310 m_RunningEffects.Insert(value);
311 }
312
313 if (m_RunningEffectsPrevious.Count() != m_RunningEffects.Count())
314 {
316 }
317 }
318 }
319
320 override void RemoveActiveEffects(array<int> effects)
321 {
322 if (effects && effects.Count() > 0)
323 {
324 m_RunningEffectsPrevious.Copy(m_RunningEffects);
325
326 int count = effects.Count();
327 int value;
328 int idx;
329 for (int i = 0; i < count; ++i)
330 {
331 value = effects.Get(i);
332 idx = m_RunningEffects.Find(value);
333 if (idx != -1)
334 {
335 m_RunningEffects.Remove(idx);
336 }
337 }
338
339 if (m_RunningEffectsPrevious.Count() != m_RunningEffects.Count())
340 {
342 }
343 }
344 }
345
346 override void StopAllEffects()
347 {
348 m_Root.Show(false); //to avoid visual 'peeling'
349
350 if (IsAnyEffectRunning())
351 {
352 int count = m_RunningEffects.Count();
354 for (int i = 0; i < count; i++) //iterates over running metadata, in case anything requires its own stop handling
355 {
356 data = m_WidgetDataMap.Get(m_RunningEffects[i]);
357 data.ForceStop();
358 }
359 }
360
361 m_RunningEffectsPrevious.Copy(m_RunningEffects);
362 m_RunningEffects.Clear();
364 }
365
366 override bool IsAnyEffectRunning()
367 {
368 return m_RunningEffects && m_RunningEffects.Count() > 0;
369 }
370
371 override void AddSuspendRequest(int request_id)
372 {
373 m_SuspendRequests.Insert(request_id);
375 }
376
377 override void RemoveSuspendRequest(int request_id)
378 {
379 int idx = m_SuspendRequests.Find(request_id);
380 if (idx != -1)
381 {
382 m_SuspendRequests.Remove(idx);
383 }
385 }
386
387 override void ClearSuspendRequests()
388 {
389 m_SuspendRequests.Clear();
391 }
392
394 {
395 return m_SuspendRequests.Count();
396 }
397
399 override void UpdateWidgets(int type = -1, float timeSlice = 0, Param p = null, int handle = -1)
400 {
402 array<ref Widget> widget_set;
403
404 if (type == EffectWidgetsTypes.ROOT)
405 {
406 HandleWidgetRoot(timeSlice,p,handle);
407 }
408 else if (type == -1) //update stuff from the m_UpdatingEffects
409 {
410 int type_widgetset = 0;
411 for (int i = 0; i < m_UpdatingEffects.Count(); i++)
412 {
413 if (m_RunningEffects.Find(m_UpdatingEffects.Get(i)) != -1)
414 {
415 type_widgetset = m_UpdatingEffects.Get(i);
416
417 dta = m_WidgetDataMap.Get(type_widgetset);
418
419 if (dta.HasDefinedHandle() && dta.DataInitialized())
420 {
421 dta.Update(timeSlice,p,handle); //calculate and apply
422 }
423 else
424 {
425 CalculateValues(type_widgetset,timeSlice,p,handle);
426 widget_set = dta.GetWidgetSet();
427 foreach (Widget w : widget_set)
428 {
429 if (w.IsVisibleHierarchy() && m_UpdatedWidgetsCheck.Find(w) == -1)
430 {
431 m_UpdatedWidgetsCheck.Insert(w);
432 ProcessWidgetUpdate(w,type_widgetset,timeSlice,p,handle);
433 }
434 }
435 }
436 }
437 }
438 }
439 else //update specific widget set
440 {
441 if (m_RunningEffects.Find(type) != -1) //only do if the effect is running (FPS stonks!)
442 {
443 dta = m_WidgetDataMap.Get(type);
444
445 if (dta.HasDefinedHandle() && dta.DataInitialized())
446 {
447 dta.Update(timeSlice,p,handle); //calculate and apply
448 }
449 else
450 {
451 CalculateValues(type,timeSlice,p,handle);
452 widget_set = dta.GetWidgetSet();
453 foreach (Widget w2 : widget_set)
454 {
455 if (w2.IsVisibleHierarchy() && m_UpdatedWidgetsCheck.Find(w2) == -1)
456 {
457 m_UpdatedWidgetsCheck.Insert(w2);
458 ProcessWidgetUpdate(w2,type,timeSlice,p,handle);
459 }
460 }
461 }
462 }
463 }
464
465 m_UpdatedWidgetsCheck.Clear();
466 m_UpdatedWidgetSetsCheck.Clear();
467 }
468
470 protected void CalculateValues(int type = -1, float timeSlice = 0, Param p = null, int handle = -1)
471 {
472 if (m_UpdatedWidgetSetsCheck.Find(m_WidgetDataMap.Get(type).GetWidgetSetID()) != -1)
473 {
474 //Print("skipped updating set ID " + m_WidgetDataMap.Get(type).GetWidgetSetID() + " | effect: " + type);
475 return;
476 }
477
478 switch (type)
479 {
480 case EffectWidgetsTypes.MOTO_BREATH:
481 case EffectWidgetsTypes.HELMET_BREATH:
482 case EffectWidgetsTypes.MASK_BREATH:
483 {
484 CalculateBreathEffect(timeSlice);
485 }
486 break;
487
488 case EffectWidgetsTypes.MOTO_OCCLUDER:
489 case EffectWidgetsTypes.EYEPATCH_OCCLUDER:
490 case EffectWidgetsTypes.HELMET_OCCLUDER:
491 case EffectWidgetsTypes.HELMET2_OCCLUDER:
492 case EffectWidgetsTypes.MASK_OCCLUDER:
493 {
494 CalculateOccluderEffect(type,timeSlice,p,handle);
495 }
496 break;
497
498 case EffectWidgetsTypes.COVER_FLASHBANG:
499 {
500 CalculateFlashbangEffect(type,timeSlice,p,handle);
501 }
502 break;
503
504 default:
505 return; //no need to calculate anything
506 break;
507 }
508
509 m_UpdatedWidgetSetsCheck.Insert(m_WidgetDataMap.Get(type).GetWidgetSetID());
510 }
511
512 protected void ProcessWidgetUpdate(Widget w, int type, float timeSlice = 0, Param p = null, int handle = -1)
513 {
514 switch (type)
515 {
516 case EffectWidgetsTypes.MOTO_BREATH:
517 case EffectWidgetsTypes.HELMET_BREATH:
518 case EffectWidgetsTypes.MASK_BREATH:
519 {
520 UpdateBreathEffect(ImageWidget.Cast(w));
521 }
522 break;
523
524 case EffectWidgetsTypes.MOTO_OCCLUDER:
525 case EffectWidgetsTypes.EYEPATCH_OCCLUDER:
526 case EffectWidgetsTypes.HELMET_OCCLUDER:
527 case EffectWidgetsTypes.HELMET2_OCCLUDER:
528 case EffectWidgetsTypes.MASK_OCCLUDER:
529 {
530 UpdateOccluderEffect(ImageWidget.Cast(w),type,timeSlice,p,handle);
531 }
532 break;
533
534 case EffectWidgetsTypes.COVER_FLASHBANG:
535 {
536 UpdateFlashbangEffect(ImageWidget.Cast(w));
537 }
538 break;
539
540 default:
541 //Print("---invalid widget type to update---");
542 break;
543 }
544 }
545
546 //-----------------------------------------
547 //specific widget 'handlers'
548
549 const float BREATH_HDR_MIN = 0.005; //dusk?
550 const float BREATH_HDR_MAX = 1.0; //dark?
551 const float BREATH_COLOR_MULT_MIN = 0.5;
552 const float BREATH_COLOR_MULT_MAX = 0.8;
553
554 //-----------------------------------------
555 //Breath
556 //-----------------------------------------
557 protected void CalculateBreathEffect(float timeSlice = 0, int type = -1, Param p = null)
558 {
559 float modifier = Math.Lerp(0.25, 0.5, m_BreathResidue);
560 float speed = timeSlice * modifier;
561 m_BreathResidue -= speed;
562 m_BreathResidue = Math.Clamp(m_BreathResidue,0,1);
563 float residue_final = Math.Lerp(0, 0.7, m_BreathResidue);
564
565 float hdr_mult;
566 hdr_mult = GetSceneHDRMul(0);
567 hdr_mult = Math.Clamp(hdr_mult,BREATH_HDR_MIN,BREATH_HDR_MAX);
568 hdr_mult = Math.InverseLerp(BREATH_HDR_MIN,BREATH_HDR_MAX,hdr_mult);
569 hdr_mult = Math.Lerp(BREATH_COLOR_MULT_MAX,BREATH_COLOR_MULT_MIN,hdr_mult);
570 m_BreathColor = ARGBF(0.0,1.0 * hdr_mult,1.0 * hdr_mult,1.0 * hdr_mult); //grayscaling of the image
571
572 m_BreathAlphaVal = Math.Lerp(m_BreathAlphaVal, residue_final, timeSlice);
573 }
574
575 protected void UpdateBreathEffect(ImageWidget w)
576 {
577 w.SetColor(m_BreathColor);
578 w.SetAlpha(m_BreathAlphaVal);
579 }
580
581 //-----------------------------------------
582 //Occluders
583 //-----------------------------------------
584 protected void CalculateOccluderEffect(int type, float timeSlice, Param p, int handle)
585 {
586 }
587
588 protected void UpdateOccluderEffect(ImageWidget w, int type, float timeSlice, Param p, int handle)
589 {
590 }
591
592 //-----------------------------------------
593 //Flashbang
594 //-----------------------------------------
595 protected void CalculateFlashbangEffect(int type, float timeSlice, Param p, int handle)
596 {
597 Param1<float> par = Param1<float>.Cast(p);
598 m_FlashbangCoverAlphaVal = par.param1;
599
600 /*if (m_FlashbangCoverAlphaVal <= 0.0)
601 {
602 RemoveActiveEffects({EffectWidgetsTypes.COVER_FLASHBANG});
603 return;
604 }*/
605 }
606
607 protected void UpdateFlashbangEffect(ImageWidget w)
608 {
609 w.SetAlpha(1 - m_FlashbangCoverAlphaVal);
610 }
611
612 //-----------------------------------------
613 //root handling (generic 'Widget', so mainly alpha and hiding?)
614 //-----------------------------------------
615 protected void HandleWidgetRoot(float timeSlice = 0, Param p = null, int handle = -1)
616 {
617 switch (handle)
618 {
619 default:
620 {
621 Param1<float> par = Param1<float>.Cast(p);
622 if (par)
623 {
624 float alpha_mod = Math.Clamp(par.param1,0.0,1.0);
625 m_Root.SetAlpha(alpha_mod);
626 }
627 }
628 break;
629 }
630 }
631
632 //-----------------------------------------
634 override void Update(float timeSlice)
635 {
636 if (m_SuspendRequests.Count() > 0)
637 {
638 return;
639 }
640
641 UpdateWidgets(-1,timeSlice);
642 }
643
644 /*
645 override void SetBreathIntensityStamina(float stamina_cap, float stamina_current)
646 {
647 float stamina_normalized = Math.InverseLerp(0, stamina_cap, stamina_current);
648 stamina_normalized = Math.Clamp(stamina_normalized,0,1);
649
650 if ( stamina_normalized < STAMINA_SOUND_TR2 )
651 {
652 m_BreathMultStamina = 2.0;
653 }
654 else if ( stamina_normalized < STAMINA_SOUND_TR1 )
655 {
656 m_BreathMultStamina = 1.5;
657 }
658 else
659 {
660 m_BreathMultStamina = 1.0;
661 }
662 }
663 */
664 override void OnVoiceEvent(float breathing_resistance01)
665 {
666 m_BreathResidue += Math.Lerp(0,0.35,breathing_resistance01);
667 m_BreathResidue = Math.Clamp(m_BreathResidue,0,1);
668 }
669}
grouped gameplay effect widgets and their handling
override void AddSuspendRequest(int request_id)
ref array< int > m_UpdatedWidgetSetsCheck
void PairIDToTypes()
Links types to unique handler types, if needed. Vanilla stuff was already handled in the generic upda...
void ProcessWidgetUpdate(Widget w, int type, float timeSlice=0, Param p=null, int handle=-1)
override void OnVoiceEvent(float breathing_resistance01)
override void Update(float timeSlice)
Generic update, called on frame from the player.
void CalculateFlashbangEffect(int type, float timeSlice, Param p, int handle)
array< int > CompileEffectListing()
returns all vanilla effects, nested in a vanilla layout. If using different layouts for custom effect...
void RegisterLayouts(string path, array< int > types)
Registers new layout and ties effect IDs to it.
void UpdateBreathEffect(ImageWidget w)
void HandleWidgetRoot(float timeSlice=0, Param p=null, int handle=-1)
override void RemoveSuspendRequest(int request_id)
void UpdateFlashbangEffect(ImageWidget w)
override void RemoveActiveEffects(array< int > effects)
ref map< int, typename > m_IDToTypeMap
bool CreateHandledClass(typename handled_type, array< ref Widget > input, int type, int user_override)
void CalculateValues(int type=-1, float timeSlice=0, Param p=null, int handle=-1)
Only one calculation per unique WidgetSet.
ref GameplayEffectDataMap m_WidgetDataMap
override void UpdateWidgets(int type=-1, float timeSlice=0, Param p=null, int handle=-1)
Usually called in course of an OnFrame update, can be manually called from elsewhere with parameters.
void CalculateBreathEffect(float timeSlice=0, int type=-1, Param p=null)
ref set< ref Widget > m_UniqueLayouts
void InitWidgetSet(int type, bool updating=false, int user_id_override=-1)
InitWidgetSet.
ref map< int, ref Widget > m_Layouts
void UpdateOccluderEffect(ImageWidget w, int type, float timeSlice, Param p, int handle)
ref array< ref Widget > m_UpdatedWidgetsCheck
override void RegisterGameplayEffectData(int id, Param p)
override void AddActiveEffects(array< int > effects)
void CalculateOccluderEffect(int type, float timeSlice, Param p, int handle)
Manages all bleeding indicators and their updates.
override void Init(array< ref Widget > input, int type, Widget layout_root, int user_override=-1)
override void ForceStop()
stops and re-sets indicators and images even out of sequence. Should still be tied to the 'player' up...
override void Update(float timeSlice=0, Param p=null, int handle=-1)
override void UpdateVisibility(bool state)
Definition enmath.c:7
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
Definition param.c:12
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto native CGame GetGame()
void GameplayEffectsDataImage(array< ref Widget > input, int type, int user_override=-1)
map< int, ref GameplayEffectsData > GameplayEffectDataMap
proto void Print(void var)
Prints content of variable to console/log.
proto native float GetSceneHDRMul(int camera)
WidgetFlags
Definition enwidgets.c:58
int ARGBF(float fa, float fr, float fg, float fb)
Converts <0.0, 1.0> ARGB into color.
Definition proto.c:332
Widget m_Root
Definition sizetochild.c:91