stackedPerlinNoise

This commit is contained in:
David Rose 2005-10-07 22:38:34 +00:00
parent f3ca7417b0
commit c207be10b9
11 changed files with 343 additions and 15 deletions

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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();
}

View File

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

View File

@ -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
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
// 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]);
}

View File

@ -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
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#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;
}

View File

@ -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
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#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

View File

@ -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
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
// 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]);
}

View File

@ -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
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#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;
}

View File

@ -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
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#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