ppematclassparameterfloat.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. class PPEMatClassParameterFloat extends PPEMatClassParameterCommandData
  2. {
  3. protected ref map<int,ref array<float,int>> m_LayerInfo; //<priority,<value,operator>>
  4. protected PPETemplateDefFloat m_Float;
  5. protected float m_ValueDefault;
  6. protected float m_ValueMin;
  7. protected float m_ValueMax;
  8. void PPEMatClassParameterFloat(int mat_idx, int parameter_idx, PPEClassBase parent)
  9. {
  10. m_LayerInfo = new map<int,ref array<float,int>>;
  11. }
  12. override void InitDefaults()
  13. {
  14. Class.CastTo(m_Float,m_Defaults);
  15. //m_Float = PPETemplateDefFloat.Cast(m_Defaults);
  16. m_ValueDefault = m_Float.param2;
  17. m_ValueMin = m_Float.param3;
  18. m_ValueMax = m_Float.param4;
  19. }
  20. override void InitCuttent()
  21. {
  22. m_CurrentValues = new Param1<float>(m_ValueDefault);
  23. }
  24. override int GetParameterVarType()
  25. {
  26. return PPEConstants.VAR_TYPE_FLOAT;
  27. }
  28. override void Update(float timeslice, out Param p_total, out bool setting_defaults, int order)
  29. {
  30. super.Update(timeslice,p_total,setting_defaults,order);
  31. int active_request_count = 0;
  32. PPERequestParamDataFloat req_data;
  33. bool setting_value_zero = false;
  34. float float_value_temp = 0.0;
  35. float float_value_default = 0.0;
  36. float float_value_total = 0.0;
  37. if (p_total == null)
  38. {
  39. p_total = new Param1<float>(0.0);
  40. }
  41. if (m_RequestMap.Count() > 0)
  42. {
  43. m_LayerInfo.Clear();
  44. }
  45. else
  46. {
  47. //DbgPrnt("m_RequestMap.Count() is zero! Using default values. | mat/par: " + m_MaterialIndex + "/" + m_ParameterIndex);
  48. SetParameterValueDefault(p_total);
  49. m_Parent.ParamUpdateRemove(m_ParameterIndex);
  50. return;
  51. }
  52. for ( int i = 0; i < m_RequestMap.Count(); i++ )
  53. {
  54. req_data = PPERequestParamDataFloat.Cast(m_RequestMap.GetElement(i));
  55. if (req_data == null)
  56. {
  57. Error("Debug | PPEMatClassParameterFloat | req_data not found! | " + this + " | mat/par: " + m_MaterialIndex + "/" + m_ParameterIndex);
  58. continue;
  59. }
  60. setting_value_zero = req_data.IsSettingDefaultValues();
  61. if (setting_value_zero && !req_data.GetUpdatingDataValues() && !req_data.IsDataActive())
  62. {
  63. //DbgPrnt("Is Default, not updating | idx: " + i + " | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX());
  64. continue;
  65. }
  66. if (setting_value_zero)
  67. {
  68. req_data.m_FloatTarget = 0;//min;
  69. //DbgPrnt("PPEDebug | PPEMatClassParameterFloat - UpdateParameterValues | !data.m_DefaultTargetSet | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX() + " | req_data.m_FloatTarget: " + req_data.m_FloatTarget);
  70. }
  71. else
  72. {
  73. active_request_count++;
  74. }
  75. //evaluation
  76. //--------------------------------
  77. req_data.m_FloatLast = req_data.m_FloatCurrent;
  78. if (!req_data.GetUpdatingDataValues() && req_data.IsDataActive()) //set to exact value, not updating anymore
  79. {
  80. float_value_temp = req_data.m_FloatCurrent;
  81. PrepareLayerInfo(req_data.GetPriorityLayer(),float_value_temp,req_data.GetInteractionMask());
  82. //DbgPrnt("PPEDebug | PPEMatClassParameterFloat - UpdateParameterValues | !req_data.m_UpdatingData | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX() + " | not updating, addaing current value into mix: " + float_value_temp);
  83. continue;
  84. }
  85. float_value_temp = req_data.m_FloatTarget;
  86. //DbgPrnt("PPEDebug | PPEMatClassParameterFloat - UpdateParameterValues | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX());
  87. req_data.SetUpdatingDataValues(false);
  88. if (setting_value_zero)
  89. {
  90. req_data.SetDataActive(false);
  91. //RemovePriorityInfo(req_data.GetPriorityLayer()); //redundant?
  92. }
  93. else
  94. {
  95. float_value_temp = req_data.m_FloatTarget;
  96. PrepareLayerInfo(req_data.GetPriorityLayer(),float_value_temp,req_data.GetInteractionMask());
  97. }
  98. req_data.m_FloatCurrent = float_value_temp;
  99. }
  100. //---------------------------
  101. //MASK handling and calculation
  102. float value;
  103. int operator;
  104. bool override_active = false;
  105. if ( m_ValueMax == 0.0 )
  106. float_value_total = m_ValueDefault; //?
  107. else
  108. float_value_total = m_ValueDefault / m_ValueMax;
  109. //float_value_total = Math.InverseLerp(m_ValueMin,m_ValueMax,m_ValueDefault);
  110. float_value_default = float_value_total;
  111. for ( i = 0; i < m_LayerInfo.Count(); i++ )
  112. {
  113. if ( override_active )
  114. break;
  115. value = m_LayerInfo.Get(m_CommandLayersArray.Get(i)).Get(LAYER_INFO_VALUE);
  116. operator = m_LayerInfo.Get(m_CommandLayersArray.Get(i)).Get(LAYER_INFO_OPERATOR);
  117. switch (operator)
  118. {
  119. case PPOperators.LOWEST:
  120. float_value_total = Math.Min(float_value_total,value);
  121. break;
  122. case PPOperators.HIGHEST:
  123. float_value_total = Math.Max(float_value_total,value);
  124. break;
  125. case PPOperators.ADD:
  126. //float_value_total = float_value_total + value - float_value_default;
  127. float_value_total = float_value_total + value;
  128. break;
  129. case PPOperators.ADD_RELATIVE:
  130. float_value_total = (1 - float_value_total) * value + float_value_total;
  131. break;
  132. case PPOperators.SUBSTRACT:
  133. //float_value_total = float_value_total - value + float_value_default;
  134. float_value_total = float_value_total - value;
  135. break;
  136. case PPOperators.SUBSTRACT_RELATIVE:
  137. float_value_total = float_value_total - value * float_value_total;
  138. break;
  139. case PPOperators.SUBSTRACT_REVERSE:
  140. //float_value_total = value - float_value_default - float_value_total;
  141. float_value_total = value - float_value_total;
  142. break;
  143. case PPOperators.SUBSTRACT_REVERSE_RELATIVE:
  144. float_value_total = value * float_value_total - float_value_total;
  145. break;
  146. case PPOperators.MULTIPLICATIVE:
  147. //float_value_total = Math.Lerp(float_value_default, float_value_total, value);
  148. float_value_total = float_value_total * value;
  149. break;
  150. case PPOperators.OVERRIDE:
  151. float_value_total = value;
  152. break;
  153. case PPOperators.SET:
  154. float_value_total = value;
  155. break;
  156. }
  157. //DbgPrnt("m_LayerInfo | float_value_total pre-clamp: " + float_value_total + " | i: " + i);
  158. float_value_total = Math.Clamp(float_value_total,0,1);
  159. if ( operator == PPOperators.OVERRIDE )
  160. {
  161. //DbgPrnt("m_LayerInfo | PPOperators.OVERRIDE at: " + i);
  162. override_active = true;
  163. }
  164. //RemovePriorityInfo(m_CommandLayersArray.Get(i));
  165. }
  166. m_CommandLayersArray.Clear();
  167. //TODO - consider moving this up, if possible
  168. if (active_request_count == 0)
  169. {
  170. SetParameterValueDefault(p_total);
  171. }
  172. else
  173. {
  174. float res = Math.Lerp(m_ValueMin,m_ValueMax,float_value_total);
  175. Param1<float>.Cast(p_total).param1 = res; //converts back to absolute values
  176. }
  177. //DbgPrnt("PPEDebug | PPEMatClassParameterFloat - UpdateParameterValues | mat/par/req: " + m_MaterialIndex + "/" + m_ParameterIndex + "/" + req_data.GetRequesterIDX() + " | parameter update end, removing from queue");
  178. m_Parent.ParamUpdateRemove(m_ParameterIndex);
  179. m_CurrentValues = p_total;
  180. }
  181. void PrepareLayerInfo(int layer, float value, int operator)
  182. {
  183. m_LayerInfo.Set(layer,{value,operator});
  184. AddPriorityInfo(layer);
  185. }
  186. //! No active requests for the mat. parameter value change, sets the value to DEFAULT (zero?)
  187. override void SetParameterValueDefault(inout Param p_total)
  188. {
  189. p_total = new Param1<float>(PPETemplateDefFloat.Cast(m_Defaults).param2);
  190. m_CurrentValues = p_total;
  191. //DbgPrnt("PPEDebug | PPEMatClassParameterFloat - UpdateParameterValues | exit 3 - zero value");
  192. }
  193. }
  194. class PPEMatClassParameterFloatSaturation extends PPEMatClassParameterFloat
  195. {
  196. void PPEMatClassParameterFloatSaturation(int mat_idx, int parameter_idx, PPEClassBase parent)
  197. {
  198. m_Dependencies = new map<int,ref array<int>>;
  199. m_Dependencies.Set(PostProcessEffectType.Glow,{PPEGlow.PARAM_COLORIZATIONCOLOR, PPEGlow.PARAM_OVERLAYCOLOR});
  200. }
  201. }