Dayz Build 1.29.163047, Scripts Rev. 123548
Dayz Code Explorer by Zeroy
Loading...
Searching...
No Matches
ppematclassparametercolor.c
Go to the documentation of this file.
1
3{
4 protected ref array<float> m_Values;
5 protected int m_Operator;
6
7 void ColorValuesData(array<float> values, int operator)
8 {
10 m_Values.Copy(values);
11 m_Operator = operator;
12 }
13
15 {
16 m_Values.Copy(values);
17 }
18
20 {
21 return m_Values;
22 }
23
24 void SetOperator(int operator)
25 {
26 m_Operator = operator;
27 }
28
30 {
31 return m_Operator;
32 }
33}
34
36{
37 const int VALUE_RED = 0;
38 const int VALUE_GREEN = 1;
39 const int VALUE_BLUE = 2;
40 const int VALUE_ALPHA = 3;
41 const int VALUES_COUNT = 4; //rgba
42
44 protected ref map<int,ref ColorValuesData> m_LayerInfo; //<priority,<<values>,operator>>
45
47
48 void PPEMatClassParameterColor(int mat_idx, int parameter_idx, PPEClassBase parent)
49 {
51 }
52
53 override void InitDefaults()
54 {
55 m_Color = PPETemplateDefColor.Cast(m_Defaults);
56 m_ColorDefaults = {m_Color.param2,m_Color.param3,m_Color.param4,m_Color.param5};
57 }
58
59 override void InitCuttent()
60 {
61 m_CurrentValues = new Param4<float,float,float,float>(m_ColorDefaults[0],m_ColorDefaults[1],m_ColorDefaults[2],m_ColorDefaults[3]);
62 }
63
64 override int GetParameterVarType()
65 {
66 return PPEConstants.VAR_TYPE_COLOR;
67 }
68
69 override void Update(float timeslice, out Param p_total, out bool setting_defaults, int order)
70 {
71 super.Update(timeslice,p_total,setting_defaults,order);
72
73 int active_request_count = 0;
74
75 PPERequestParamDataColor req_data;
76
77 bool setting_value_zero = false;
78
79 array<float> color_values_total = {0.0,0.0,0.0,0.0};
80 array<float> color_values_temp = {0.0,0.0,0.0,0.0};
81 bool color_total_override_set = false;
82
83 // param creation
84 if (p_total == null)
85 {
86 p_total = new Param4<float,float,float,float>(0.0,0.0,0.0,0.0);
87 }
88
89 if (m_RequestMap.Count() > 0)
90 {
91 m_LayerInfo.Clear();
92 }
93 else
94 {
95 //DbgPrnt("m_RequestMap.Count() is zero! Using default values. | mat/par: " + m_MaterialIndex + "/" + m_ParameterIndex);
96 SetParameterValueDefault(p_total); //TODO - redundant?
97 m_Parent.ParamUpdateRemove(m_ParameterIndex);
98 return;
99 }
100
101 //get target values, evaluate active and priority conditions, and insert into arrays to later process
102 for ( int i = 0; i < m_RequestMap.Count(); i++ )
103 {
104 req_data = PPERequestParamDataColor.Cast(m_RequestMap.GetElement(i));
105
106 if (req_data == null)
107 {
108 Error("PPEMatClassParameterColor | req_data not found! | " + this + " | mat/par: " + m_MaterialIndex + "/" + m_ParameterIndex);
109 continue;
110 }
111
112 setting_value_zero = req_data.IsSettingDefaultValues();
113
114 //skips "zero value" defaults
115 if (setting_value_zero && !req_data.GetUpdatingDataValues() && !req_data.IsDataActive())
116 {
117 //DbgPrnt("Is Default, not updating | idx: " + i + " | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX());
118 continue;
119 }
120
121 active_request_count++; //something is active, though not necessarily setting new values
122
123 //evaluation
124 //--------------------------------
125 req_data.m_ColorLast = req_data.m_ColorCurrent;
126
127 if (!req_data.GetUpdatingDataValues() && req_data.IsDataActive()) //set to exact value, not updating anymore
128 {
129 color_values_temp.Copy(req_data.m_ColorCurrent); //already converted from before?
130 PrepareLayerInfo(req_data.GetPriorityLayer(),{color_values_temp[0],color_values_temp[1],color_values_temp[2],color_values_temp[3]},req_data.GetInteractionMask());
131 //DbgPrnt("PPEDebug | PPEMatClassParameterColor - UpdateParameterValues | !req_data.m_UpdatingData | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX() + " | not updating, addaing current values into mix: " + req_data.m_ColorCurrent[0] + "," + req_data.m_ColorCurrent[1] + "," + req_data.m_ColorCurrent[2] + "," + req_data.m_ColorCurrent[3]);
132 continue;
133 }
134
135 if (setting_value_zero)
136 {
137 req_data.m_ColorTarget = {0.0,0.0,0.0,0.0}; //color_defaults;
138 //DbgPrnt("PPEDebug | PPEMatClassParameterColor - UpdateParameterValues | !data.m_DefaultTargetSet | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX() + " | req_data.m_FloatTarget: " + req_data.m_FloatTarget);
139 }
140
141 //DbgPrnt("PPEDebug | PPEMatClassParameterColor - UpdateParameterValues | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX());
142 req_data.SetUpdatingDataValues(false);
143 if (setting_value_zero)
144 {
145 req_data.SetDataActive(false);
146 //RemovePriorityInfo(req_data.GetPriorityLayer()); //redundant?
147 }
148 else
149 {
150 color_values_temp.Copy(req_data.m_ColorTarget);
151 PrepareLayerInfo(req_data.GetPriorityLayer(),{color_values_temp[0],color_values_temp[1],color_values_temp[2],color_values_temp[3]},req_data.GetInteractionMask());
152 }
153
154 req_data.m_ColorCurrent.Copy(color_values_temp);
155 //DbgPrnt("PPEDebug | PPEMatClassParameterColor - UpdateParameterValues | current: " + req_data.m_ColorCurrent);
156 }
157
158 //---------------------------
159 //MASK handling and calculation
160 array<float> values;
161 int operator = -1;
162 bool override_active = false;
163
164 color_values_total = {m_ColorDefaults[0],m_ColorDefaults[1],m_ColorDefaults[2],m_ColorDefaults[3]};
165
166 for ( i = 0; i < m_LayerInfo.Count(); i++ )
167 {
168 if ( override_active )
169 break;
170
171 values = m_LayerInfo.Get(m_CommandLayersArray.Get(i)).GetValues();
172 operator = m_LayerInfo.Get(m_CommandLayersArray.Get(i)).GetOperator();
173
174 switch (operator)
175 {
176 case PPOperators.LOWEST:
177 color_values_total[VALUE_RED] = Math.Min(color_values_total[VALUE_RED], values[VALUE_RED]);
178 color_values_total[VALUE_GREEN] = Math.Min(color_values_total[VALUE_GREEN], values[VALUE_GREEN]);
179 color_values_total[VALUE_BLUE] = Math.Min(color_values_total[VALUE_BLUE], values[VALUE_BLUE]);
180 color_values_total[VALUE_ALPHA] = Math.Min(color_values_total[VALUE_ALPHA], values[VALUE_ALPHA]);
181 break;
182
183 case PPOperators.HIGHEST:
184 color_values_total[VALUE_RED] = Math.Max(color_values_total[VALUE_RED], values[VALUE_RED]);
185 color_values_total[VALUE_GREEN] = Math.Max(color_values_total[VALUE_GREEN], values[VALUE_GREEN]);
186 color_values_total[VALUE_BLUE] = Math.Max(color_values_total[VALUE_BLUE], values[VALUE_BLUE]);
187 color_values_total[VALUE_ALPHA] = Math.Max(color_values_total[VALUE_ALPHA], values[VALUE_ALPHA]);
188 break;
189
190 case PPOperators.ADD_RELATIVE:
191 case PPOperators.ADD:
192 color_values_total[VALUE_RED] = color_values_total[VALUE_RED] + values[VALUE_RED];
193 color_values_total[VALUE_GREEN] = color_values_total[VALUE_GREEN] + values[VALUE_GREEN];
194 color_values_total[VALUE_BLUE] = color_values_total[VALUE_BLUE] + values[VALUE_BLUE];
195 color_values_total[VALUE_ALPHA] = color_values_total[VALUE_ALPHA] + values[VALUE_ALPHA];
196 break;
197
198 /*case PPOperators.ADD_RELATIVE: //no known max values, unusable!
199 float_value_total = (1 - float_value_total) * value + float_value_total;
200 break;*/
201
202 case PPOperators.SUBSTRACT_RELATIVE:
203 case PPOperators.SUBSTRACT:
204 color_values_total[VALUE_RED] = color_values_total[VALUE_RED] - values[VALUE_RED];
205 color_values_total[VALUE_GREEN] = color_values_total[VALUE_GREEN] - values[VALUE_GREEN];
206 color_values_total[VALUE_BLUE] = color_values_total[VALUE_BLUE] - values[VALUE_BLUE];
207 color_values_total[VALUE_ALPHA] = color_values_total[VALUE_ALPHA] - values[VALUE_ALPHA];
208 break;
209
210 /*case PPOperators.SUBSTRACT_RELATIVE: //no known max values, unusable!
211 float_value_total = float_value_total - value * float_value_total;
212 break;*/
213
214 case PPOperators.SUBSTRACT_REVERSE_RELATIVE:
215 case PPOperators.SUBSTRACT_REVERSE:
216 color_values_total[VALUE_RED] = values[VALUE_RED] - color_values_total[VALUE_RED];
217 color_values_total[VALUE_GREEN] = values[VALUE_GREEN] - color_values_total[VALUE_GREEN];
218 color_values_total[VALUE_BLUE] = values[VALUE_BLUE] - color_values_total[VALUE_BLUE];
219 color_values_total[VALUE_ALPHA] = values[VALUE_ALPHA] - color_values_total[VALUE_ALPHA];
220 break;
221
222 /*case PPOperators.SUBSTRACT_REVERSE_RELATIVE: //no known max values, unusable!
223 float_value_total = value * float_value_total - float_value_total;
224 break;*/
225
226 case PPOperators.MULTIPLICATIVE:
227 color_values_total[VALUE_RED] = color_values_total[VALUE_RED] * values[VALUE_RED];
228 color_values_total[VALUE_GREEN] = color_values_total[VALUE_GREEN] * values[VALUE_GREEN];
229 color_values_total[VALUE_BLUE] = color_values_total[VALUE_BLUE] * values[VALUE_BLUE];
230 color_values_total[VALUE_ALPHA] = color_values_total[VALUE_ALPHA] * values[VALUE_ALPHA];
231 break;
232
233 case PPOperators.OVERRIDE:
234 color_values_total.Copy(values);
235 break;
236
237 case PPOperators.SET:
238 color_values_total.Copy(values);
239 break;
240 }
241
242 //DbgPrnt("m_LayerInfo | color_values_total pre-clamp: " + color_values_total[VALUE_RED] + "/" + color_values_total[VALUE_GREEN] + "/" + color_values_total[VALUE_BLUE] + "/" + color_values_total[VALUE_ALPHA] + " | i: " + i);
243 if ( operator == PPOperators.OVERRIDE )
244 {
245 //DbgPrnt("m_LayerInfo | PPOperators.OVERRIDE at: " + i);
246 override_active = true;
247 }
248
249 //RemovePriorityInfo(m_CommandLayersArray.Get(i));
250 }
251
252 m_CommandLayersArray.Clear();
253
254 if ( m_MaterialIndex == 15 && m_ParameterIndex == 21 )
255 {
256 //Print("m_MaterialIndex: " + m_MaterialIndex + "|m_ParameterIndex: " + m_ParameterIndex);
257 //Print("PPEMatClassParameterColor values: " + color_values_total[0] + " " + color_values_total[1] + " " + color_values_total[2] + " " + color_values_total[3]);
258 }
259
260 //TODO - consider moving this up, if possible
261 if ( active_request_count <= 0 )
262 {
264 }
265 else
266 {
267 Param4<float,float,float,float>.Cast(p_total).param1 = color_values_total[0];
268 Param4<float,float,float,float>.Cast(p_total).param2 = color_values_total[1];
269 Param4<float,float,float,float>.Cast(p_total).param3 = color_values_total[2];
270 Param4<float,float,float,float>.Cast(p_total).param4 = color_values_total[3];
271 }
272
273 //DbgPrnt("PPEDebug | PPEMatClassParameterColor - UpdateParameterValues | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX() + " | parameter update end, removing from queue");
274 m_Parent.ParamUpdateRemove(m_ParameterIndex);
275
276 ModifyResultValues(p_total);
277
278 m_CurrentValues = p_total;
279 }
280
282 void PrepareLayerInfo(int layer, array<float> values, int operator)
283 {
284 ColorValuesData tmp;
285 if (m_LayerInfo.Contains(layer))
286 {
287 tmp = m_LayerInfo.Get(layer);
288 tmp.SetValues(values);
289 tmp.SetOperator(operator);
290 }
291 else
292 {
293 tmp = new ColorValuesData(values,operator);
294 }
295
296 m_LayerInfo.Set(layer,tmp);
297 AddPriorityInfo(layer);
298 }
299
300 override void SetParameterValueDefault(inout Param p_total)
301 {
302 if (!p_total)
303 {
304 p_total = new Param4<float,float,float,float>(m_ColorDefaults[0],m_ColorDefaults[1],m_ColorDefaults[2],m_ColorDefaults[3]);
305 }
306 else
307 {
308 Param4<float,float,float,float>.Cast(p_total).param1 = m_ColorDefaults[0];
309 Param4<float,float,float,float>.Cast(p_total).param2 = m_ColorDefaults[1];
310 Param4<float,float,float,float>.Cast(p_total).param3 = m_ColorDefaults[2];
311 Param4<float,float,float,float>.Cast(p_total).param4 = m_ColorDefaults[3];
312 }
313 m_CurrentValues = p_total;
314 }
315}
316
317class PPEMatClassParameterColorColorization extends PPEMatClassParameterColor
318{
319 override void ModifyResultValues(inout Param result_values)
320 {
321 super.ModifyResultValues(result_values);
322
323 //saturation-dependency handling
324 Param par = PPEManagerStatic.GetPPEManager().GetPostProcessCurrentValues(PostProcessEffectType.Glow,PPEGlow.PARAM_SATURATION);
325 float saturation_coef = Param1<float>.Cast(par).param1;
326
327 float r = Param4<float,float,float,float>.Cast(result_values).param1;
328 float g = Param4<float,float,float,float>.Cast(result_values).param2;
329 float b = Param4<float,float,float,float>.Cast(result_values).param3;
330 float a = Param4<float,float,float,float>.Cast(result_values).param4;
331
332 float highest_channel = Math.Max(Math.Max(r,g),b);
333 saturation_coef = Easing.EaseOutSine(saturation_coef);
334
335 r = Math.Lerp(highest_channel,r,saturation_coef);
336 g = Math.Lerp(highest_channel,g,saturation_coef);
337 b = Math.Lerp(highest_channel,b,saturation_coef);
338 a = Math.Lerp(m_ColorDefaults[3],a,saturation_coef);
339 //
340
341 Param4<float,float,float,float>.Cast(result_values).param1 = r;
342 Param4<float,float,float,float>.Cast(result_values).param2 = g;
343 Param4<float,float,float,float>.Cast(result_values).param3 = b;
344 Param4<float,float,float,float>.Cast(result_values).param4 = a;
345 }
346}
Entity m_Parent
ref array< float > m_Values
void SetOperator(int operator)
void SetValues(array< float > values)
void ColorValuesData(array< float > values, int operator)
Input value between 0 and 1, returns value adjusted by easing, no automatic clamping of input(do your...
Definition easing.c:3
static float EaseOutSine(float t)
Definition easing.c:9
TODO doc.
Definition enscript.c:118
Definition enmath.c:7
Created once, on manager init. Script-side representation of C++ material class, separate handling.
Glow - PostProcessEffectType.Glow.
Definition ppeglow.c:8
static const int PARAM_SATURATION
Definition ppeglow.c:31
Static component of PPE manager, used to hold the instance.
Definition ppemanager.c:3
static PPEManager GetPPEManager()
Returns the manager instance singleton.
Definition ppemanager.c:27
override void ModifyResultValues(inout Param result_values)
Base Param Class with no parameters.
Definition param.c:12
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
PostProcessEffectType
Post-process effect type.
Definition enworld.c:72
void Error(string err)
Messagebox with error message.
Definition endebug.c:90
string m_Color
Definition enentity.c:850
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Lerp(float a, float b, float time)
Linearly interpolates between 'a' and 'b' given 'time'.
proto native volatile void Update()
PPOperators
PP operators, specify operation between subsequent layers.
Param5< string, float, float, float, float > PPETemplateDefColor
const int VALUE_BLUE
const int VALUE_ALPHA
override int GetParameterVarType()
ref map< int, ref ColorValuesData > m_LayerInfo
ColorValuesData VALUE_RED
override void SetParameterValueDefault(inout Param p_total)
override void InitDefaults()
void PPEMatClassParameterColor(int mat_idx, int parameter_idx, PPEClassBase parent)
void PrepareLayerInfo(int layer, array< float > values, int operator)
Fills relative values into arrays/member variables.
const int VALUE_GREEN
override void InitCuttent()
float m_ColorDefaults[4]
const int VALUES_COUNT