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