summaryrefslogtreecommitdiffstats
path: root/source/cNoise.inc
blob: 60fd2f394a05bcfcb646b69beb381b2d197e91f1 (plain) (blame)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

#ifndef __C_NOISE_INC__
#define __C_NOISE_INC__

#include <math.h>





/****************
 * Random value generator
 **/
 
float cNoise::IntNoise( int a_X ) const
{
	int x = ((a_X*m_Seed)<<13) ^ a_X;
	return ( 1.0f - ( (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0f); 
	// returns a float number in the range of [-1, 1]
}





float cNoise::IntNoise2D( int a_X, int a_Y ) const
{
	int n = a_X + a_Y * 57 + m_Seed*57*57;
	n = (n<<13) ^ n;
	return ( 1.0f - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0f);  
	// returns a float number in the range of [-1, 1]
}





float cNoise::IntNoise3D( int a_X, int a_Y, int a_Z ) const
{
	int n = a_X + a_Y * 57 + a_Z * 57*57 + m_Seed*57*57*57;
	n = (n<<13) ^ n;
	return ( 1.0f - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0f);  
	// returns a float number in the range of [-1, 1]
}





int cNoise::IntNoise1DInt( int a_X ) const
{
	int x = ((a_X*m_Seed)<<13) ^ a_X;
	return ( (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff);
}





int cNoise::IntNoise2DInt( int a_X, int a_Y ) const
{
	int n = a_X + a_Y * 57 + m_Seed*57*57;
	n = (n<<13) ^ n;
	return ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff);
}





int cNoise::IntNoise3DInt( int a_X, int a_Y, int a_Z ) const
{
	int n = a_X + a_Y * 57 + a_Z * 57*57 + m_Seed*57*57*57;
	n = (n<<13) ^ n;
	return ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff);
}





/****************
 * Interpolation functions
 **/
 
float cNoise::CubicInterpolate( float a_A, float a_B, float a_C, float a_D, float a_Pct )
{
	float P = (a_D - a_C) - (a_A - a_B);
	float Q = (a_A - a_B) - P;
	float R = a_C - a_A;
	float S = a_B;

	return ((P * a_Pct + Q) * a_Pct + R) * a_Pct + S;
}





float cNoise::CosineInterpolate( float a_A, float a_B, float a_Pct )
{
	const float ft = a_Pct * 3.1415927f;
	const float f = (1.f - cosf(ft)) * 0.5f;
	return  a_A*(1-f) + a_B*f;
}





float cNoise::LinearInterpolate( float a_A, float a_B, float a_Pct )
{
	return  a_A*(1.f-a_Pct) + a_B*a_Pct;
}





#endif