Browse Source

stackedPerlinNoise

David Rose 20 years ago
parent
commit
c207be10b9

+ 11 - 4
panda/src/mathutil/Sources.pp

@@ -30,8 +30,10 @@
     perlinNoise2.h perlinNoise2.I \
     perlinNoise3.h perlinNoise3.I \
     plane.h plane_src.I plane_src.cxx  \
-    plane_src.h rotate_to.h rotate_to_src.cxx
-     
+    plane_src.h rotate_to.h rotate_to_src.cxx \
+    stackedPerlinNoise2.h stackedPerlinNoise2.I \
+    stackedPerlinNoise3.h stackedPerlinNoise3.I
+
   #define INCLUDED_SOURCES \
     boundingHexahedron.cxx boundingLine.cxx \
     boundingPlane.cxx \
@@ -45,6 +47,8 @@
     perlinNoise.cxx \
     perlinNoise2.cxx \
     perlinNoise3.cxx \
+    stackedPerlinNoise2.cxx \
+    stackedPerlinNoise3.cxx \
     plane.cxx rotate_to.cxx
 
   #define INSTALL_HEADERS \
@@ -62,8 +66,11 @@
     perlinNoise.h perlinNoise.I \
     perlinNoise2.h perlinNoise2.I \
     perlinNoise3.h perlinNoise3.I \
-    plane.h plane_src.I \
-    plane_src.h rotate_to.h
+    plane.h plane_src.I plane_src.cxx \
+    plane_src.h rotate_to.h rotate_to_src.cxx \
+    stackedPerlinNoise2.h stackedPerlinNoise2.I \
+    stackedPerlinNoise3.h stackedPerlinNoise3.I
+
 
   #define IGATESCAN all
 

+ 1 - 3
panda/src/mathutil/mathutil_composite1.cxx

@@ -1,10 +1,8 @@
-
-#include "boundingVolume.cxx"
 #include "boundingHexahedron.cxx"
 #include "boundingLine.cxx"
 #include "boundingPlane.cxx"
 #include "boundingSphere.cxx"
+#include "boundingVolume.cxx"
 #include "finiteBoundingVolume.cxx"
 #include "geometricBoundingVolume.cxx"
 #include "omniBoundingVolume.cxx"
-

+ 6 - 6
panda/src/mathutil/mathutil_composite2.cxx

@@ -1,12 +1,12 @@
-
 #include "config_mathutil.cxx"
+#include "fftCompressor.cxx"
+#include "linmath_events.cxx"
+#include "look_at.cxx"
+#include "mersenne.cxx"
 #include "perlinNoise.cxx"
 #include "perlinNoise2.cxx"
 #include "perlinNoise3.cxx"
 #include "plane.cxx"
 #include "rotate_to.cxx"
-#include "look_at.cxx"
-#include "linmath_events.cxx"
-#include "mersenne.cxx"
-#include "fftCompressor.cxx"
-
+#include "stackedPerlinNoise2.cxx"
+#include "stackedPerlinNoise3.cxx"

+ 13 - 2
panda/src/mathutil/perlinNoise.I

@@ -55,7 +55,7 @@ random_int(int range) {
 ////////////////////////////////////////////////////////////////////
 INLINE double PerlinNoise::
 random_real(double range) {
-  return (range * _mersenne.get_uint31()) / ((double)0xffffffff + 1.0f);
+  return (range * _mersenne.get_uint31()) / ((double)0x80000000);
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -71,7 +71,7 @@ random_real_unit() {
 ////////////////////////////////////////////////////////////////////
 //     Function: PerlinNoise::get_next_seed
 //       Access: Protected, Static
-//  Description: Returns a random seed value for the next-in-sequence
+//  Description: Returns a random seed value for the next global
 //               PerlinNoise object.
 ////////////////////////////////////////////////////////////////////
 INLINE unsigned long PerlinNoise::
@@ -83,3 +83,14 @@ get_next_seed() {
   return _next_seed.get_uint31();
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: PerlinNoise::get_seed
+//       Access: Published
+//  Description: Returns a unique seed value based on the seed value
+//               passed to this PerlinNoise object (and on its current
+//               state).
+////////////////////////////////////////////////////////////////////
+INLINE unsigned long PerlinNoise::
+get_seed() {
+  return _mersenne.get_uint31();
+}

+ 3 - 0
panda/src/mathutil/perlinNoise.h

@@ -44,6 +44,9 @@ protected:
 
   INLINE static unsigned long get_next_seed();
 
+PUBLISHED:
+  INLINE unsigned long get_seed();
+
 protected:
   int _table_size;
 

+ 38 - 0
panda/src/mathutil/stackedPerlinNoise2.I

@@ -0,0 +1,38 @@
+// Filename: stackedPerlinNoise2.I
+// Created by:  drose (05Oct05)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://etc.cmu.edu/panda3d/docs/license/ .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////
+//     Function: StackedPerlinNoise2::noise
+//       Access: Published
+//  Description: Returns the noise function of the three inputs.
+////////////////////////////////////////////////////////////////////
+INLINE double StackedPerlinNoise2::
+noise(double x, double y) {
+  return noise(LVecBase2d(x, y));
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: StackedPerlinNoise2::noise
+//       Access: Published
+//  Description: Returns the noise function of the three inputs.
+////////////////////////////////////////////////////////////////////
+INLINE float StackedPerlinNoise2::
+noise(const LVecBase2f &value) {
+  return (float)noise(value[0], value[1]);
+}

+ 64 - 0
panda/src/mathutil/stackedPerlinNoise2.cxx

@@ -0,0 +1,64 @@
+// Filename: stackedPerlinNoise2.cxx
+// Created by:  drose (05Oct05)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://etc.cmu.edu/panda3d/docs/license/ .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#include "stackedPerlinNoise2.h"
+
+////////////////////////////////////////////////////////////////////
+//     Function: StackedPerlinNoise2::Constructor
+//       Access: Published
+//  Description: Creates num_levels nested PerlinNoise2 objects.  Each
+//               stacked Perlin object will have a scale of 1 /
+//               scale_factor times the previous object (so that it is
+//               higher-frequency, if scale_factor > 1), and an
+//               amplitude of amp_scale times the previous object (so
+//               that it is less important, if amp_scale < 1).
+////////////////////////////////////////////////////////////////////
+StackedPerlinNoise2::
+StackedPerlinNoise2(double sx, double sy, int num_levels,
+                    double scale_factor, double amp_scale,
+                    int table_size, unsigned long seed) :
+  _amp_scale(amp_scale) 
+{
+  _noises.reserve(num_levels);
+  for (int i = 0; i < num_levels; ++i) {
+    PerlinNoise2 noise(sx, sy, table_size, seed);
+    _noises.push_back(noise);
+    seed = noise.get_seed();
+    sx /= scale_factor;
+    sy /= scale_factor;
+  }
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: StackedPerlinNoise2::noise
+//       Access: Published
+//  Description: Returns the noise function of the three inputs.
+////////////////////////////////////////////////////////////////////
+double StackedPerlinNoise2::
+noise(const LVecBase2d &value) {
+  double result = 0.0f;
+  double amp = 1.0f;
+
+  Noises::iterator ni;
+  for (ni = _noises.begin(); ni != _noises.end(); ++ni) {
+    result += (*ni).noise(value) * amp;
+    amp *= _amp_scale;
+  }
+
+  return result;
+}

+ 52 - 0
panda/src/mathutil/stackedPerlinNoise2.h

@@ -0,0 +1,52 @@
+// Filename: stackedPerlinNoise2.h
+// Created by:  drose (05Oct05)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://etc.cmu.edu/panda3d/docs/license/ .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#ifndef STACKEDPERLINNOISE2_H
+#define STACKEDPERLINNOISE2_H
+
+#include "pandabase.h"
+#include "perlinNoise2.h"
+#include "pvector.h"
+
+////////////////////////////////////////////////////////////////////
+//       Class : StackedPerlinNoise2
+// Description : Implements a multi-layer PerlinNoise, with one or
+//               more high-frequency noise functions added to a
+//               lower-frequency base noise function.
+////////////////////////////////////////////////////////////////////
+class EXPCL_PANDA StackedPerlinNoise2 {
+PUBLISHED:
+  StackedPerlinNoise2(double sx, double sy, int num_levels = 3,
+                      double scale_factor = 4.0f, double amp_scale = 0.5f,
+                      int table_size = 256, unsigned long seed = 0);
+
+  INLINE double noise(double x, double y);
+  INLINE float noise(const LVecBase2f &value);
+  double noise(const LVecBase2d &value);
+
+private:
+  double _amp_scale;
+
+  typedef pvector<PerlinNoise2> Noises;
+  Noises _noises;
+};
+
+#include "stackedPerlinNoise2.I"
+
+#endif
+

+ 38 - 0
panda/src/mathutil/stackedPerlinNoise3.I

@@ -0,0 +1,38 @@
+// Filename: stackedPerlinNoise3.I
+// Created by:  drose (05Oct05)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://etc.cmu.edu/panda3d/docs/license/ .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////
+//     Function: StackedPerlinNoise3::noise
+//       Access: Published
+//  Description: Returns the noise function of the three inputs.
+////////////////////////////////////////////////////////////////////
+INLINE double StackedPerlinNoise3::
+noise(double x, double y, double z) {
+  return noise(LVecBase3d(x, y, z));
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: StackedPerlinNoise3::noise
+//       Access: Published
+//  Description: Returns the noise function of the three inputs.
+////////////////////////////////////////////////////////////////////
+INLINE float StackedPerlinNoise3::
+noise(const LVecBase3f &value) {
+  return (float)noise(value[0], value[1], value[2]);
+}

+ 65 - 0
panda/src/mathutil/stackedPerlinNoise3.cxx

@@ -0,0 +1,65 @@
+// Filename: stackedPerlinNoise3.cxx
+// Created by:  drose (05Oct05)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://etc.cmu.edu/panda3d/docs/license/ .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#include "stackedPerlinNoise3.h"
+
+////////////////////////////////////////////////////////////////////
+//     Function: StackedPerlinNoise3::Constructor
+//       Access: Published
+//  Description: Creates num_levels nested PerlinNoise3 objects.  Each
+//               stacked Perlin object will have a scale of 1 /
+//               scale_factor times the previous object (so that it is
+//               higher-frequency, if scale_factor > 1), and an
+//               amplitude of amp_scale times the previous object (so
+//               that it is less important, if amp_scale < 1).
+////////////////////////////////////////////////////////////////////
+StackedPerlinNoise3::
+StackedPerlinNoise3(double sx, double sy, double sz, int num_levels,
+                    double scale_factor, double amp_scale,
+                    int table_size, unsigned long seed) :
+  _amp_scale(amp_scale) 
+{
+  _noises.reserve(num_levels);
+  for (int i = 0; i < num_levels; ++i) {
+    PerlinNoise3 noise(sx, sy, sz, table_size, seed);
+    _noises.push_back(noise);
+    seed = noise.get_seed();
+    sx /= scale_factor;
+    sy /= scale_factor;
+    sz /= scale_factor;
+  }
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: StackedPerlinNoise3::noise
+//       Access: Published
+//  Description: Returns the noise function of the three inputs.
+////////////////////////////////////////////////////////////////////
+double StackedPerlinNoise3::
+noise(const LVecBase3d &value) {
+  double result = 0.0f;
+  double amp = 1.0f;
+
+  Noises::iterator ni;
+  for (ni = _noises.begin(); ni != _noises.end(); ++ni) {
+    result += (*ni).noise(value) * amp;
+    amp *= _amp_scale;
+  }
+
+  return result;
+}

+ 52 - 0
panda/src/mathutil/stackedPerlinNoise3.h

@@ -0,0 +1,52 @@
+// Filename: stackedPerlinNoise3.h
+// Created by:  drose (05Oct05)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://etc.cmu.edu/panda3d/docs/license/ .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#ifndef STACKEDPERLINNOISE3_H
+#define STACKEDPERLINNOISE3_H
+
+#include "pandabase.h"
+#include "perlinNoise3.h"
+#include "pvector.h"
+
+////////////////////////////////////////////////////////////////////
+//       Class : StackedPerlinNoise3
+// Description : Implements a multi-layer PerlinNoise, with one or
+//               more high-frequency noise functions added to a
+//               lower-frequency base noise function.
+////////////////////////////////////////////////////////////////////
+class EXPCL_PANDA StackedPerlinNoise3 {
+PUBLISHED:
+  StackedPerlinNoise3(double sx, double sy, double sz, int num_levels = 3,
+                      double scale_factor = 4.0f, double amp_scale = 0.5f,
+                      int table_size = 256, unsigned long seed = 0);
+
+  INLINE double noise(double x, double y, double z);
+  INLINE float noise(const LVecBase3f &value);
+  double noise(const LVecBase3d &value);
+
+private:
+  double _amp_scale;
+
+  typedef pvector<PerlinNoise3> Noises;
+  Noises _noises;
+};
+
+#include "stackedPerlinNoise3.I"
+
+#endif
+