summaryrefslogtreecommitdiff
path: root/Runtime/Graphics/ParticleSystem/ParticleSystemGradients.h
blob: bb74cded424989d75b04ea289f52131ab9924049 (plain)
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