aboutsummaryrefslogtreecommitdiff
path: root/dep/include/g3dlite/G3D/PrecomputedRandom.h
diff options
context:
space:
mode:
Diffstat (limited to 'dep/include/g3dlite/G3D/PrecomputedRandom.h')
-rw-r--r--dep/include/g3dlite/G3D/PrecomputedRandom.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/dep/include/g3dlite/G3D/PrecomputedRandom.h b/dep/include/g3dlite/G3D/PrecomputedRandom.h
new file mode 100644
index 00000000000..411d128c582
--- /dev/null
+++ b/dep/include/g3dlite/G3D/PrecomputedRandom.h
@@ -0,0 +1,110 @@
+/**
+ @file PrecomputedRandom.h
+
+ @maintainer Morgan McGuire, http://graphics.cs.williams.edu
+
+ @created 2009-03-31
+ @edited 2009-03-31
+
+ Copyright 2000-2009, Morgan McGuire.
+ All rights reserved.
+ */
+#ifndef G3D_PrecomputedRandom_h
+#define G3D_PrecomputedRandom_h
+
+#include "G3D/platform.h"
+#include "G3D/Random.h"
+
+namespace G3D {
+
+/** Fast random numbers using a precomputed data table.
+
+ e.g., generates cosHemi about 13x faster than Random.
+ This is useful for quickly generating seeded random
+ numbers for reproducibility. G3D::Random takes a long
+ time to seed; this is instantaneous (providing the
+ precomputed data is already available.)
+
+ Not threadsafe.*/
+class PrecomputedRandom : public Random {
+public:
+ /** Put the cosHemi and the uniform together so that when
+ alternating between them we stay in cache. This is also packed
+ into a good size for SIMD and GPU operations.*/
+ class HemiUniformData {
+ public:
+ float cosHemiX;
+ float cosHemiY;
+ float cosHemiZ;
+ float uniform;
+ };
+
+ class SphereBitsData {
+ public:
+ float sphereX;
+ float sphereY;
+ float sphereZ;
+ uint32 bits;
+ };
+
+protected:
+
+ /** Array of 2^n elements. */
+ const HemiUniformData* m_hemiUniform;
+ const SphereBitsData* m_sphereBits;
+
+ /** 2^n - 1; the AND mask for computing a fast modulo */
+ int m_modMask;
+
+ int m_index;
+
+ /** If true, free m_hemiUniform and m_sphereBits in destructor */
+ bool m_freeData;
+
+public:
+
+ /*
+ \param dataSize Must be a power of 2
+ \param data Will NOT be deleted by the destructor.
+ */
+ PrecomputedRandom(const HemiUniformData* data1, const SphereBitsData* data2, int dataSize, uint32 seed = 0xF018A4D2);
+
+ /**
+ \param dataSize Number of random numbers that can be requested before periodicity. Must be a power of 2.
+ */
+ PrecomputedRandom(int dataSize, uint32 seed = 0xF018A4D2);
+
+ ~PrecomputedRandom();
+
+ /** Each bit is random. Subclasses can choose to override just
+ this method and the other methods will all work automatically. */
+ virtual uint32 bits();
+
+ // integer is inherited
+
+ /** Uniform random float on the range [min, max] */
+ virtual float uniform(float low, float high);
+
+ /** Uniform random float on the range [0, 1] */
+ virtual float uniform();
+
+ // gaussian is inherited
+
+ /** Returns 3D unit vectors distributed according to
+ a cosine distribution about the z axis. */
+ virtual void cosHemi(float& x, float& y, float& z);
+
+ /** Returns 3D unit vectors distributed according to a cosine
+ power distribution (\f$ \mbox{cos}^k \theta \f$) about
+ the z-axis. */
+ virtual void cosPowHemi(const float k, float& x, float& y, float& z);
+
+ // hemi is inherited
+
+ /** Returns 3D unit vectors uniformly distributed on the sphere */
+ virtual void sphere(float& x, float& y, float& z);
+};
+
+}
+
+#endif