Panda3D
Loading...
Searching...
No Matches
perlinNoise2.I
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file perlinNoise2.I
10 * @author drose
11 * @date 2005-10-05
12 */
13
14/**
15 * Randomizes the tables to make a unique noise function. Uses a default
16 * scale (noise frequency), table size, and seed.
17 */
20 PerlinNoise(256, 0)
21{
22 init_unscaled_xform();
23 _input_xform = _unscaled_xform;
24}
25
26/**
27 * Randomizes the tables to make a unique noise function.
28 *
29 * If seed is nonzero, it is used to define the tables; if it is zero a random
30 * seed is generated.
31 */
33PerlinNoise2(double sx, double sy,
34 int table_size, unsigned long seed) :
35 PerlinNoise(table_size, seed)
36{
37 init_unscaled_xform();
38 set_scale(sx, sy);
39}
40
41/**
42 * Makes an exact copy of the existing PerlinNoise object, including its
43 * random seed.
44 */
46PerlinNoise2(const PerlinNoise2 &copy) :
47 PerlinNoise(copy),
48 _unscaled_xform(copy._unscaled_xform),
49 _input_xform(copy._input_xform)
50{
51}
52
53/**
54 * Makes an exact copy of the existing PerlinNoise object, including its
55 * random seed.
56 */
57INLINE void PerlinNoise2::
58operator = (const PerlinNoise2 &copy) {
59 PerlinNoise::operator = (copy);
60 _unscaled_xform = copy._unscaled_xform;
61 _input_xform = copy._input_xform;
62}
63
64/**
65 * Changes the scale (frequency) of the noise.
66 */
67INLINE void PerlinNoise2::
68set_scale(double scale) {
69 set_scale(scale, scale);
70}
71
72/**
73 * Changes the scale (frequency) of the noise.
74 */
75INLINE void PerlinNoise2::
76set_scale(double x, double y) {
77 set_scale(LVecBase2d(x, y));
78}
79
80/**
81 * Changes the scale (frequency) of the noise.
82 */
83INLINE void PerlinNoise2::
84set_scale(const LVecBase2f &value) {
85 set_scale(value[0], value[1]);
86}
87
88/**
89 * Changes the scale (frequency) of the noise.
90 */
91INLINE void PerlinNoise2::
92set_scale(const LVecBase2d &value) {
93 _input_xform = LMatrix3d::scale_mat(1.0f / value[0], 1.0f / value[1]) * _unscaled_xform;
94}
95
96/**
97 * Returns the noise function of the three inputs.
98 */
99INLINE double PerlinNoise2::
100noise(double x, double y) const {
101 return noise(LVecBase2d(x, y));
102}
103
104/**
105 * Returns the noise function of the three inputs.
106 */
107INLINE float PerlinNoise2::
108noise(const LVecBase2f &value) const {
109 return (float)noise(value[0], value[1]);
110}
111
112/**
113 * Returns the noise function of the two inputs.
114 */
115INLINE double PerlinNoise2::
116operator ()(double x, double y) const {
117 return noise(x, y);
118}
119
120/**
121 * Returns the noise function of the two inputs.
122 */
123INLINE float PerlinNoise2::
124operator ()(const LVecBase2f &value) const {
125 return noise(value);
126}
127
128/**
129 * Returns the noise function of the two inputs.
130 */
131INLINE double PerlinNoise2::
132operator ()(const LVecBase2d &value) const {
133 return noise(value);
134}
135
136/**
137 * Returns the dot product of a random gradient vector (determined by the hash
138 * code) with the indicated offset vector.
139 */
140INLINE double PerlinNoise2::
141grad(int hash, double x, double y) {
142 // Convert low 3 bits of hash code into 8 gradient directions.
143 switch (hash & 7) {
144 // Four corners.
145 case 0: return x + y;
146 case 1: return x - y;
147 case 2: return -x + y;
148 case 3: return -x - y;
149
150 // Four edges. Here we scale by 1.707 to make all the vectors equal
151 // length, and to make their lengths consistent with PerlinNoise3.
152 case 4: return 1.707 * x;
153 case 5: return 1.707 * y;
154 case 6: return -1.707 * x;
155 case 7: return -1.707 * y;
156 }
157
158 nassertr(false, 0);
159 return 0;
160}
This class provides an implementation of Perlin noise for 2 variables.
double noise(double x, double y) const
Returns the noise function of the three inputs.
PerlinNoise2()
Randomizes the tables to make a unique noise function.
void set_scale(double scale)
Changes the scale (frequency) of the noise.
void operator=(const PerlinNoise2 &copy)
Makes an exact copy of the existing PerlinNoise object, including its random seed.
double operator()(double x, double y) const
Returns the noise function of the two inputs.
This is the base class for PerlinNoise2 and PerlinNoise3, different dimensions of Perlin noise implem...
Definition perlinNoise.h:28