ParticleSystemGradients.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //
  2. // ParticleSystemGradients.h
  3. // cocos2d_libs
  4. //
  5. // Created by 徐俊杰 on 2020/4/24.
  6. //
  7. #ifndef ParticleSystemGradients_h
  8. #define ParticleSystemGradients_h
  9. #include "rparticle/Macros/RParticleMacros.h"
  10. #include "rparticle/Math/Gradient.h"
  11. NS_RRP_BEGIN
  12. enum MinMaxGradientEvalMode
  13. {
  14. kGEMGradient,
  15. kGEMGradientMinMax,
  16. kGEMSlow,
  17. };
  18. enum MinMaxGradientState
  19. {
  20. kMMGColor = 0,
  21. kMMGGradient = 1,
  22. kMMGRandomBetweenTwoColors = 2,
  23. kMMGRandomBetweenTwoGradients = 3
  24. };
  25. struct OptimizedMinMaxGradient
  26. {
  27. OptimizedGradient max;
  28. OptimizedGradient min;
  29. };
  30. inline ColorRGBA32 EvaluateGradient (const OptimizedMinMaxGradient& g, float t)
  31. {
  32. return g.max.Evaluate(t);
  33. }
  34. inline ColorRGBA32 EvaluateRandomGradient (const OptimizedMinMaxGradient& g, float t, UInt32 factor)
  35. {
  36. return Lerp (g.min.Evaluate(t), g.max.Evaluate(t), factor);
  37. }
  38. struct MinMaxGradient
  39. {
  40. GradientNEW maxGradient;
  41. GradientNEW minGradient;
  42. ColorRGBA32 minColor; // we have the colors separate to prevent destroying the gradients
  43. ColorRGBA32 maxColor;
  44. short minMaxState; // see enum State
  45. MinMaxGradient();
  46. //TODO: Serialize
  47. // DEFINE_GET_TYPESTRING (MinMaxGradient)
  48. void InitializeOptimized(OptimizedMinMaxGradient& g);
  49. template<class TransferFunction>
  50. void Transfer (TransferFunction& transfer);
  51. };
  52. inline ColorRGBA32 EvaluateColor (const MinMaxGradient& gradient)
  53. {
  54. return gradient.maxColor;
  55. }
  56. inline ColorRGBA32 EvaluateGradient (const MinMaxGradient& gradient, float t)
  57. {
  58. return gradient.maxGradient.Evaluate(t);
  59. }
  60. inline ColorRGBA32 EvaluateRandomColor (const MinMaxGradient& gradient, UInt32 factor)
  61. {
  62. return Lerp (gradient.minColor, gradient.maxColor, factor);
  63. }
  64. inline ColorRGBA32 EvaluateRandomGradient (const MinMaxGradient& gradient, float t, UInt32 factor)
  65. {
  66. return Lerp (gradient.minGradient.Evaluate(t), gradient.maxGradient.Evaluate(t), factor);
  67. }
  68. inline ColorRGBA32 Evaluate (const MinMaxGradient& gradient, float t, UInt32 factor = 0xff)
  69. {
  70. if (gradient.minMaxState == kMMGColor)
  71. return EvaluateColor(gradient);
  72. else if (gradient.minMaxState == kMMGGradient)
  73. return EvaluateGradient(gradient, t);
  74. else if (gradient.minMaxState == kMMGRandomBetweenTwoColors)
  75. return EvaluateRandomColor(gradient, factor);
  76. else // gradient.minMaxState == kMMGRandomBetweenTwoGradients
  77. return EvaluateRandomGradient(gradient, t, factor);
  78. }
  79. NS_RRP_END
  80. #endif /* ParticleSystemGradients_h */