aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/shared/internal/src/authoring/Noise.h
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/shared/internal/src/authoring/Noise.h
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'APEX_1.4/shared/internal/src/authoring/Noise.h')
-rw-r--r--APEX_1.4/shared/internal/src/authoring/Noise.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/APEX_1.4/shared/internal/src/authoring/Noise.h b/APEX_1.4/shared/internal/src/authoring/Noise.h
new file mode 100644
index 00000000..df5865bb
--- /dev/null
+++ b/APEX_1.4/shared/internal/src/authoring/Noise.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved.
+ *
+ * NVIDIA CORPORATION and its licensors retain all intellectual property
+ * and proprietary rights in and to this software, related documentation
+ * and any modifications thereto. Any use, reproduction, disclosure or
+ * distribution of this software and related documentation without an express
+ * license agreement from NVIDIA CORPORATION is strictly prohibited.
+ */
+
+
+#ifndef NOISE_H
+#define NOISE_H
+
+#include "authoring/ApexCSGMath.h"
+
+#include "NoiseUtils.h"
+
+#ifndef WITHOUT_APEX_AUTHORING
+
+namespace ApexCSG
+{
+
+class UserRandom;
+
+/**
+ Provides Perlin noise sampling across multiple dimensions and for different data types
+*/
+template<typename T, int SampleSize = 1024, int D = 3, class VecType = Vec<T, D> >
+class PerlinNoise
+{
+public:
+ PerlinNoise(UserRandom& rnd, int octaves = 1, T frequency = 1., T amplitude = 1.)
+ : mRnd(rnd),
+ mOctaves(octaves),
+ mFrequency(frequency),
+ mAmplitude(amplitude),
+ mbInit(false)
+ {
+
+ }
+
+ void reset(int octaves = 1, T frequency = (T)1., T amplitude = (T)1.)
+ {
+ mOctaves = octaves;
+ mFrequency = frequency;
+ mAmplitude = amplitude;
+ init();
+ }
+
+ T sample(const VecType& point)
+ {
+ return perlinNoise(point);
+ }
+
+private:
+ PerlinNoise& operator=(const PerlinNoise&);
+
+ T perlinNoise(VecType point)
+ {
+ if (!mbInit)
+ init();
+
+ const int octaves = mOctaves;
+ const T frequency = mFrequency;
+ T amplitude = mAmplitude;
+ T result = (T)0;
+
+ point *= frequency;
+
+ for (int i = 0; i < octaves; ++i)
+ {
+ result += noiseSample<T, SampleSize>(point, p, g) * amplitude;
+ point *= (T)2.0;
+ amplitude *= (T)0.5;
+ }
+
+ return result;
+ }
+
+ void init(void)
+ {
+ mbInit = true;
+
+ unsigned i, j;
+ int k;
+
+ for (i = 0 ; i < (unsigned)SampleSize; i++)
+ {
+ p[i] = (int)i;
+ for (j = 0; j < D; ++j)
+ g[i][j] = (T)((mRnd.getInt() % (SampleSize + SampleSize)) - SampleSize) / SampleSize;
+ g[i].normalize();
+ }
+
+ while (--i)
+ {
+ k = p[i];
+ j = (unsigned)mRnd.getInt() % SampleSize;
+ p[i] = p[j];
+ p[j] = k;
+ }
+
+ for (i = 0 ; i < SampleSize + 2; ++i)
+ {
+ p [(unsigned)SampleSize + i] = p[i];
+ for (j = 0; j < D; ++j)
+ g[(unsigned)SampleSize + i][j] = g[i][j];
+ }
+
+ }
+
+ UserRandom& mRnd;
+ int mOctaves;
+ T mFrequency;
+ T mAmplitude;
+
+ // Permutation vector
+ int p[(unsigned)(SampleSize + SampleSize + 2)];
+ // Gradient vector
+ VecType g[(unsigned)(SampleSize + SampleSize + 2)];
+
+ bool mbInit;
+};
+
+}
+
+#endif /* #ifndef WITHOUT_APEX_AUTHORING */
+
+#endif /* #ifndef NOISE_H */
+