mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
add Triangulator
This commit is contained in:
parent
61ef8d64e2
commit
a2a49aa9fb
@ -30,9 +30,12 @@
|
|||||||
perlinNoise2.h perlinNoise2.I \
|
perlinNoise2.h perlinNoise2.I \
|
||||||
perlinNoise3.h perlinNoise3.I \
|
perlinNoise3.h perlinNoise3.I \
|
||||||
plane.h plane_src.I plane_src.cxx \
|
plane.h plane_src.I plane_src.cxx \
|
||||||
plane_src.h rotate_to.h rotate_to_src.cxx \
|
plane_src.h \
|
||||||
|
randomizer.h randomizer.I \
|
||||||
|
rotate_to.h rotate_to_src.cxx \
|
||||||
stackedPerlinNoise2.h stackedPerlinNoise2.I \
|
stackedPerlinNoise2.h stackedPerlinNoise2.I \
|
||||||
stackedPerlinNoise3.h stackedPerlinNoise3.I
|
stackedPerlinNoise3.h stackedPerlinNoise3.I \
|
||||||
|
triangulator.h triangulator.I
|
||||||
|
|
||||||
#define INCLUDED_SOURCES \
|
#define INCLUDED_SOURCES \
|
||||||
boundingHexahedron.cxx boundingLine.cxx \
|
boundingHexahedron.cxx boundingLine.cxx \
|
||||||
@ -47,8 +50,10 @@
|
|||||||
perlinNoise.cxx \
|
perlinNoise.cxx \
|
||||||
perlinNoise2.cxx \
|
perlinNoise2.cxx \
|
||||||
perlinNoise3.cxx \
|
perlinNoise3.cxx \
|
||||||
|
randomizer.cxx \
|
||||||
stackedPerlinNoise2.cxx \
|
stackedPerlinNoise2.cxx \
|
||||||
stackedPerlinNoise3.cxx \
|
stackedPerlinNoise3.cxx \
|
||||||
|
triangulator.cxx \
|
||||||
plane.cxx rotate_to.cxx
|
plane.cxx rotate_to.cxx
|
||||||
|
|
||||||
#define INSTALL_HEADERS \
|
#define INSTALL_HEADERS \
|
||||||
@ -67,9 +72,13 @@
|
|||||||
perlinNoise2.h perlinNoise2.I \
|
perlinNoise2.h perlinNoise2.I \
|
||||||
perlinNoise3.h perlinNoise3.I \
|
perlinNoise3.h perlinNoise3.I \
|
||||||
plane.h plane_src.I plane_src.cxx \
|
plane.h plane_src.I plane_src.cxx \
|
||||||
plane_src.h rotate_to.h rotate_to_src.cxx \
|
plane_src.h \
|
||||||
|
randomizer.h randomizer.I \
|
||||||
|
rotate_to.h rotate_to_src.cxx \
|
||||||
stackedPerlinNoise2.h stackedPerlinNoise2.I \
|
stackedPerlinNoise2.h stackedPerlinNoise2.I \
|
||||||
stackedPerlinNoise3.h stackedPerlinNoise3.I
|
stackedPerlinNoise3.h stackedPerlinNoise3.I \
|
||||||
|
triangulator.h triangulator.I
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define IGATESCAN all
|
#define IGATESCAN all
|
||||||
@ -79,7 +88,7 @@
|
|||||||
#begin test_bin_target
|
#begin test_bin_target
|
||||||
#define TARGET test_mathutil
|
#define TARGET test_mathutil
|
||||||
#define LOCAL_LIBS \
|
#define LOCAL_LIBS \
|
||||||
mathutil
|
mathutil pipeline
|
||||||
#define OTHER_LIBS $[OTHER_LIBS] pystub
|
#define OTHER_LIBS $[OTHER_LIBS] pystub
|
||||||
|
|
||||||
#define SOURCES \
|
#define SOURCES \
|
||||||
@ -87,3 +96,15 @@
|
|||||||
|
|
||||||
#end test_bin_target
|
#end test_bin_target
|
||||||
|
|
||||||
|
|
||||||
|
#begin test_bin_target
|
||||||
|
#define TARGET test_tri
|
||||||
|
#define LOCAL_LIBS \
|
||||||
|
mathutil pipeline
|
||||||
|
#define OTHER_LIBS $[OTHER_LIBS] pystub
|
||||||
|
|
||||||
|
#define SOURCES \
|
||||||
|
test_tri.cxx
|
||||||
|
|
||||||
|
#end test_bin_target
|
||||||
|
|
||||||
|
@ -6,3 +6,4 @@
|
|||||||
#include "finiteBoundingVolume.cxx"
|
#include "finiteBoundingVolume.cxx"
|
||||||
#include "geometricBoundingVolume.cxx"
|
#include "geometricBoundingVolume.cxx"
|
||||||
#include "omniBoundingVolume.cxx"
|
#include "omniBoundingVolume.cxx"
|
||||||
|
#include "config_mathutil.cxx"
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#include "config_mathutil.cxx"
|
|
||||||
#include "fftCompressor.cxx"
|
#include "fftCompressor.cxx"
|
||||||
#include "linmath_events.cxx"
|
#include "linmath_events.cxx"
|
||||||
#include "look_at.cxx"
|
#include "look_at.cxx"
|
||||||
@ -7,6 +6,8 @@
|
|||||||
#include "perlinNoise2.cxx"
|
#include "perlinNoise2.cxx"
|
||||||
#include "perlinNoise3.cxx"
|
#include "perlinNoise3.cxx"
|
||||||
#include "plane.cxx"
|
#include "plane.cxx"
|
||||||
|
#include "randomizer.cxx"
|
||||||
#include "rotate_to.cxx"
|
#include "rotate_to.cxx"
|
||||||
#include "stackedPerlinNoise2.cxx"
|
#include "stackedPerlinNoise2.cxx"
|
||||||
#include "stackedPerlinNoise3.cxx"
|
#include "stackedPerlinNoise3.cxx"
|
||||||
|
#include "triangulator.cxx"
|
||||||
|
@ -39,51 +39,6 @@ lerp(double t, double a, double b) {
|
|||||||
return a + t * (b - a);
|
return a + t * (b - a);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: PerlinNoise::random_int
|
|
||||||
// Access: Protected
|
|
||||||
// Description: Returns a random integer in the range [0, range).
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
INLINE int PerlinNoise::
|
|
||||||
random_int(int range) {
|
|
||||||
return (int)floor(random_real((double)range));
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: PerlinNoise::random_real
|
|
||||||
// Access: Protected
|
|
||||||
// Description: Returns a random double in the range [0, range).
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
INLINE double PerlinNoise::
|
|
||||||
random_real(double range) {
|
|
||||||
return (range * _mersenne.get_uint31()) / ((double)0x80000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: PerlinNoise::random_real_unit
|
|
||||||
// Access: Protected
|
|
||||||
// Description: Returns a random double in the range [-0.5, 0.5).
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
INLINE double PerlinNoise::
|
|
||||||
random_real_unit() {
|
|
||||||
return random_real(1.0f) - 0.5f;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: PerlinNoise::get_next_seed
|
|
||||||
// Access: Protected, Static
|
|
||||||
// Description: Returns a random seed value for the next global
|
|
||||||
// PerlinNoise object.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
INLINE unsigned long PerlinNoise::
|
|
||||||
get_next_seed() {
|
|
||||||
if (!_got_first_seed) {
|
|
||||||
_next_seed = Mersenne((unsigned long)time(NULL));
|
|
||||||
_got_first_seed = true;
|
|
||||||
}
|
|
||||||
return _next_seed.get_uint31();
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: PerlinNoise::get_seed
|
// Function: PerlinNoise::get_seed
|
||||||
// Access: Published
|
// Access: Published
|
||||||
@ -93,5 +48,5 @@ get_next_seed() {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
INLINE unsigned long PerlinNoise::
|
INLINE unsigned long PerlinNoise::
|
||||||
get_seed() {
|
get_seed() {
|
||||||
return _mersenne.get_uint31();
|
return _randomizer.get_seed();
|
||||||
}
|
}
|
||||||
|
@ -18,9 +18,6 @@
|
|||||||
|
|
||||||
#include "perlinNoise.h"
|
#include "perlinNoise.h"
|
||||||
|
|
||||||
Mersenne PerlinNoise::_next_seed(0);
|
|
||||||
bool PerlinNoise::_got_first_seed = false;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: PerlinNoise::Constructor
|
// Function: PerlinNoise::Constructor
|
||||||
// Access: Protected
|
// Access: Protected
|
||||||
@ -34,7 +31,7 @@ PerlinNoise::
|
|||||||
PerlinNoise(int table_size, unsigned long seed) :
|
PerlinNoise(int table_size, unsigned long seed) :
|
||||||
_table_size(table_size),
|
_table_size(table_size),
|
||||||
_table_size_mask(table_size - 1),
|
_table_size_mask(table_size - 1),
|
||||||
_mersenne(seed != 0 ? seed : get_next_seed())
|
_randomizer(seed)
|
||||||
{
|
{
|
||||||
// It is necessary for _table_size to be a power of 2.
|
// It is necessary for _table_size to be a power of 2.
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@ -55,7 +52,7 @@ PerlinNoise(int table_size, unsigned long seed) :
|
|||||||
_index.push_back(i);
|
_index.push_back(i);
|
||||||
}
|
}
|
||||||
for (i = 0; i < _table_size; ++i) {
|
for (i = 0; i < _table_size; ++i) {
|
||||||
int j = random_int(_table_size);
|
int j = _randomizer.random_int(_table_size);
|
||||||
nassertv(j >= 0 && j < _table_size);
|
nassertv(j >= 0 && j < _table_size);
|
||||||
int t = _index[i];
|
int t = _index[i];
|
||||||
_index[i] = _index[j];
|
_index[i] = _index[j];
|
||||||
@ -79,7 +76,7 @@ PerlinNoise::
|
|||||||
PerlinNoise(const PerlinNoise ©) :
|
PerlinNoise(const PerlinNoise ©) :
|
||||||
_table_size(copy._table_size),
|
_table_size(copy._table_size),
|
||||||
_table_size_mask(copy._table_size_mask),
|
_table_size_mask(copy._table_size_mask),
|
||||||
_mersenne(copy._mersenne),
|
_randomizer(copy._randomizer),
|
||||||
_index(copy._index)
|
_index(copy._index)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -94,6 +91,6 @@ void PerlinNoise::
|
|||||||
operator = (const PerlinNoise ©) {
|
operator = (const PerlinNoise ©) {
|
||||||
_table_size = copy._table_size;
|
_table_size = copy._table_size;
|
||||||
_table_size_mask = copy._table_size_mask;
|
_table_size_mask = copy._table_size_mask;
|
||||||
_mersenne = copy._mersenne;
|
_randomizer = copy._randomizer;
|
||||||
_index = copy._index;
|
_index = copy._index;
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#include "pvector.h"
|
#include "pvector.h"
|
||||||
#include "vector_int.h"
|
#include "vector_int.h"
|
||||||
#include "luse.h"
|
#include "luse.h"
|
||||||
#include "mersenne.h"
|
#include "randomizer.h"
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Class : PerlinNoise
|
// Class : PerlinNoise
|
||||||
@ -41,12 +41,6 @@ protected:
|
|||||||
INLINE static double fade(double t);
|
INLINE static double fade(double t);
|
||||||
INLINE static double lerp(double t, double a, double b);
|
INLINE static double lerp(double t, double a, double b);
|
||||||
|
|
||||||
INLINE int random_int(int range);
|
|
||||||
INLINE double random_real(double range);
|
|
||||||
INLINE double random_real_unit();
|
|
||||||
|
|
||||||
INLINE static unsigned long get_next_seed();
|
|
||||||
|
|
||||||
PUBLISHED:
|
PUBLISHED:
|
||||||
INLINE unsigned long get_seed();
|
INLINE unsigned long get_seed();
|
||||||
|
|
||||||
@ -54,9 +48,7 @@ protected:
|
|||||||
int _table_size;
|
int _table_size;
|
||||||
int _table_size_mask;
|
int _table_size_mask;
|
||||||
|
|
||||||
Mersenne _mersenne;
|
Randomizer _randomizer;
|
||||||
static Mersenne _next_seed;
|
|
||||||
static bool _got_first_seed;
|
|
||||||
|
|
||||||
typedef vector_int Index;
|
typedef vector_int Index;
|
||||||
Index _index;
|
Index _index;
|
||||||
|
@ -71,11 +71,11 @@ noise(const LVecBase2d &value) const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void PerlinNoise2::
|
void PerlinNoise2::
|
||||||
init_unscaled_xform() {
|
init_unscaled_xform() {
|
||||||
double rot = random_real(360.0f);
|
double rot = _randomizer.random_real(360.0f);
|
||||||
_unscaled_xform = LMatrix3d::rotate_mat(rot);
|
_unscaled_xform = LMatrix3d::rotate_mat(rot);
|
||||||
|
|
||||||
// And come up with a random translation too, just so the
|
// And come up with a random translation too, just so the
|
||||||
// singularity at (0, 0) is also unpredicatable.
|
// singularity at (0, 0) is also unpredicatable.
|
||||||
_unscaled_xform.set_row(2, LVecBase2d(random_real_unit(),
|
_unscaled_xform.set_row(2, LVecBase2d(_randomizer.random_real_unit(),
|
||||||
random_real_unit()));
|
_randomizer.random_real_unit()));
|
||||||
}
|
}
|
||||||
|
@ -85,16 +85,16 @@ noise(const LVecBase3d &value) const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void PerlinNoise3::
|
void PerlinNoise3::
|
||||||
init_unscaled_xform() {
|
init_unscaled_xform() {
|
||||||
LRotationd rot(random_real_unit(),
|
LRotationd rot(_randomizer.random_real_unit(),
|
||||||
random_real_unit(),
|
_randomizer.random_real_unit(),
|
||||||
random_real_unit(),
|
_randomizer.random_real_unit(),
|
||||||
random_real_unit());
|
_randomizer.random_real_unit());
|
||||||
rot.normalize();
|
rot.normalize();
|
||||||
rot.extract_to_matrix(_unscaled_xform);
|
rot.extract_to_matrix(_unscaled_xform);
|
||||||
|
|
||||||
// And come up with a random translation too, just so the
|
// And come up with a random translation too, just so the
|
||||||
// singularity at (0, 0, 0) is also unpredicatable.
|
// singularity at (0, 0, 0) is also unpredicatable.
|
||||||
_unscaled_xform.set_row(3, LVecBase3d(random_real_unit(),
|
_unscaled_xform.set_row(3, LVecBase3d(_randomizer.random_real_unit(),
|
||||||
random_real_unit(),
|
_randomizer.random_real_unit(),
|
||||||
random_real_unit()));
|
_randomizer.random_real_unit()));
|
||||||
}
|
}
|
||||||
|
108
panda/src/mathutil/randomizer.I
Normal file
108
panda/src/mathutil/randomizer.I
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
// Filename: randomizer.I
|
||||||
|
// Created by: drose (18Jan07)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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: Randomizer::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description: If seed is nonzero, it is used to define the tables;
|
||||||
|
// if it is zero a random seed is generated.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
Randomizer::
|
||||||
|
Randomizer(unsigned long seed) :
|
||||||
|
_mersenne(seed != 0 ? seed : get_next_seed())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Randomizer::Copy Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
Randomizer::
|
||||||
|
Randomizer(const Randomizer ©) :
|
||||||
|
_mersenne(copy._mersenne)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Randomizer::Copy Assignment Operator
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void Randomizer::
|
||||||
|
operator = (const Randomizer ©) {
|
||||||
|
_mersenne = copy._mersenne;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Randomizer::random_int
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns a random integer in the range [0, range).
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE int Randomizer::
|
||||||
|
random_int(int range) {
|
||||||
|
return (int)floor(random_real((double)range));
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Randomizer::random_real
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns a random double in the range [0, range).
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE double Randomizer::
|
||||||
|
random_real(double range) {
|
||||||
|
return (range * _mersenne.get_uint31()) / ((double)0x80000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Randomizer::random_real_unit
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns a random double in the range [-0.5, 0.5).
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE double Randomizer::
|
||||||
|
random_real_unit() {
|
||||||
|
return random_real(1.0f) - 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Randomizer::get_next_seed
|
||||||
|
// Access: Public, Static
|
||||||
|
// Description: Returns a random seed value for the next global
|
||||||
|
// Randomizer object.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE unsigned long Randomizer::
|
||||||
|
get_next_seed() {
|
||||||
|
if (!_got_first_seed) {
|
||||||
|
_next_seed = Mersenne((unsigned long)time(NULL));
|
||||||
|
_got_first_seed = true;
|
||||||
|
}
|
||||||
|
return _next_seed.get_uint31();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Randomizer::get_seed
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns a unique seed value based on the seed value
|
||||||
|
// passed to this Randomizer object (and on its current
|
||||||
|
// state).
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE unsigned long Randomizer::
|
||||||
|
get_seed() {
|
||||||
|
return _mersenne.get_uint31();
|
||||||
|
}
|
23
panda/src/mathutil/randomizer.cxx
Normal file
23
panda/src/mathutil/randomizer.cxx
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Filename: randomizer.cxx
|
||||||
|
// Created by: drose (18Jan07)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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 "randomizer.h"
|
||||||
|
|
||||||
|
Mersenne Randomizer::_next_seed(0);
|
||||||
|
bool Randomizer::_got_first_seed = false;
|
||||||
|
|
50
panda/src/mathutil/randomizer.h
Normal file
50
panda/src/mathutil/randomizer.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// Filename: randomizer.h
|
||||||
|
// Created by: drose (18Jan07)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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 RANDOMIZER_H
|
||||||
|
#define RANDOMIZER_H
|
||||||
|
|
||||||
|
#include "pandabase.h"
|
||||||
|
#include "mersenne.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : Randomizer
|
||||||
|
// Description : A handy class to return random numbers.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class EXPCL_PANDA Randomizer {
|
||||||
|
public:
|
||||||
|
INLINE Randomizer(unsigned long seed = 0);
|
||||||
|
INLINE Randomizer(const Randomizer ©);
|
||||||
|
INLINE void operator = (const Randomizer ©);
|
||||||
|
|
||||||
|
INLINE int random_int(int range);
|
||||||
|
INLINE double random_real(double range);
|
||||||
|
INLINE double random_real_unit();
|
||||||
|
|
||||||
|
INLINE static unsigned long get_next_seed();
|
||||||
|
INLINE unsigned long get_seed();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Mersenne _mersenne;
|
||||||
|
static Mersenne _next_seed;
|
||||||
|
static bool _got_first_seed;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "randomizer.I"
|
||||||
|
|
||||||
|
#endif
|
50
panda/src/mathutil/test_tri.cxx
Normal file
50
panda/src/mathutil/test_tri.cxx
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// Filename: test_tri.cxx
|
||||||
|
// Created by: drose (19Jan07)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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 "pandabase.h"
|
||||||
|
|
||||||
|
#include "triangulator.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
Triangulator t;
|
||||||
|
|
||||||
|
t.add_vertex(0, 0);
|
||||||
|
t.add_vertex(4, 0);
|
||||||
|
t.add_vertex(4, 4);
|
||||||
|
t.add_vertex(0, 4);
|
||||||
|
|
||||||
|
t.add_vertex(1, 1);
|
||||||
|
t.add_vertex(2, 1);
|
||||||
|
t.add_vertex(2, 2);
|
||||||
|
t.add_vertex(1, 2);
|
||||||
|
|
||||||
|
t.add_polygon_vertex(0);
|
||||||
|
t.add_polygon_vertex(1);
|
||||||
|
t.add_polygon_vertex(2);
|
||||||
|
t.add_polygon_vertex(3);
|
||||||
|
|
||||||
|
t.begin_hole();
|
||||||
|
t.add_hole_vertex(7);
|
||||||
|
t.add_hole_vertex(6);
|
||||||
|
t.add_hole_vertex(5);
|
||||||
|
t.add_hole_vertex(4);
|
||||||
|
|
||||||
|
t.triangulate();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
71
panda/src/mathutil/triangulator.I
Normal file
71
panda/src/mathutil/triangulator.I
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
// Filename: triangulator.I
|
||||||
|
// Created by: drose (18Jan07)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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: Triangulator::add_vertex
|
||||||
|
// Access: Published
|
||||||
|
// Description: Adds a new vertex to the vertex pool. Returns the
|
||||||
|
// vertex index number.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE int Triangulator::
|
||||||
|
add_vertex(double x, double y) {
|
||||||
|
return add_vertex(LPoint2d(x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Triangulator::Triangle::Constructor
|
||||||
|
// Access: Private
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE Triangulator::Triangle::
|
||||||
|
Triangle(Triangulator *t, int v0, int v1, int v2) :
|
||||||
|
_v0(t->vert[v0].user_i),
|
||||||
|
_v1(t->vert[v1].user_i),
|
||||||
|
_v2(t->vert[v2].user_i)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Triangulator::segment_t::Default Constructor
|
||||||
|
// Access: Private
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE Triangulator::segment_t::
|
||||||
|
segment_t() {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Triangulator::segment_t::Constructor
|
||||||
|
// Access: Private
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE Triangulator::segment_t::
|
||||||
|
segment_t(Triangulator *t, int v0_i, int v1_i, int prev, int next) :
|
||||||
|
is_inserted(false),
|
||||||
|
root0(0), root1(0),
|
||||||
|
next(next),
|
||||||
|
prev(prev),
|
||||||
|
v0_i(v0_i)
|
||||||
|
{
|
||||||
|
v0.x = t->_vertices[v0_i][0];
|
||||||
|
v0.y = t->_vertices[v0_i][1];
|
||||||
|
|
||||||
|
v1.x = t->_vertices[v1_i][0];
|
||||||
|
v1.y = t->_vertices[v1_i][1];
|
||||||
|
}
|
2128
panda/src/mathutil/triangulator.cxx
Normal file
2128
panda/src/mathutil/triangulator.cxx
Normal file
File diff suppressed because it is too large
Load Diff
211
panda/src/mathutil/triangulator.h
Normal file
211
panda/src/mathutil/triangulator.h
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
// Filename: triangulator.h
|
||||||
|
// Created by: drose (17Jan07)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// 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 TRIANGULATOR_H
|
||||||
|
#define TRIANGULATOR_H
|
||||||
|
|
||||||
|
#include "pandabase.h"
|
||||||
|
#include "luse.h"
|
||||||
|
#include "vector_int.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : Triangulator
|
||||||
|
// Description : This class can triangulate a convex or concave
|
||||||
|
// polygon, even one with holes. It is adapted from an
|
||||||
|
// algorithm published as:
|
||||||
|
//
|
||||||
|
// Narkhede A. and Manocha D., Fast polygon
|
||||||
|
// triangulation algorithm based on Seidel's Algorithm,
|
||||||
|
// UNC-CH, 1994.
|
||||||
|
//
|
||||||
|
// http://www.cs.unc.edu/~dm/CODE/GEM/chapter.html
|
||||||
|
//
|
||||||
|
// It works strictly on 2-d points. You'll have to
|
||||||
|
// convert your polygon into a plane if you have 3-d
|
||||||
|
// points.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class EXPCL_PANDA Triangulator {
|
||||||
|
PUBLISHED:
|
||||||
|
Triangulator();
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
int add_vertex(const LPoint2d &point);
|
||||||
|
INLINE int add_vertex(double x, double y);
|
||||||
|
|
||||||
|
void clear_polygon();
|
||||||
|
void add_polygon_vertex(int index);
|
||||||
|
|
||||||
|
void begin_hole();
|
||||||
|
void add_hole_vertex(int index);
|
||||||
|
|
||||||
|
void triangulate();
|
||||||
|
|
||||||
|
int get_num_triangles() const;
|
||||||
|
int get_triangle_v0(int n) const;
|
||||||
|
int get_triangle_v1(int n) const;
|
||||||
|
int get_triangle_v2(int n) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
typedef pvector<LPoint2d> Vertices;
|
||||||
|
Vertices _vertices;
|
||||||
|
|
||||||
|
vector_int _polygon;
|
||||||
|
|
||||||
|
typedef pvector<vector_int> Holes;
|
||||||
|
Holes _holes;
|
||||||
|
|
||||||
|
class Triangle {
|
||||||
|
public:
|
||||||
|
INLINE Triangle(Triangulator *t, int v0, int v1, int v2);
|
||||||
|
int _v0, _v1, _v2;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef pvector<Triangle> Result;
|
||||||
|
Result _result;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double x, y;
|
||||||
|
} point_t, vector_t;
|
||||||
|
|
||||||
|
|
||||||
|
struct segment_t {
|
||||||
|
INLINE segment_t();
|
||||||
|
INLINE segment_t(Triangulator *t, int v0_i, int v1_i, int prev, int next);
|
||||||
|
|
||||||
|
point_t v0, v1; /* two endpoints */
|
||||||
|
int is_inserted; /* inserted in trapezoidation yet ? */
|
||||||
|
int root0, root1; /* root nodes in Q */
|
||||||
|
int next; /* Next logical segment */
|
||||||
|
int prev; /* Previous segment */
|
||||||
|
int v0_i; // index to user's vertex number
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef pvector<segment_t> Segments;
|
||||||
|
Segments seg;
|
||||||
|
vector_int permute;
|
||||||
|
int choose_idx;
|
||||||
|
|
||||||
|
/* Trapezoid attributes */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int lseg, rseg; /* two adjoining segments */
|
||||||
|
point_t hi, lo; /* max/min y-values */
|
||||||
|
int u0, u1;
|
||||||
|
int d0, d1;
|
||||||
|
int sink; /* pointer to corresponding in Q */
|
||||||
|
int usave, uside; /* I forgot what this means */
|
||||||
|
int state;
|
||||||
|
} trap_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* Node attributes for every node in the query structure */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int nodetype; /* Y-node or S-node */
|
||||||
|
int segnum;
|
||||||
|
point_t yval;
|
||||||
|
int trnum;
|
||||||
|
int parent; /* doubly linked DAG */
|
||||||
|
int left, right; /* children */
|
||||||
|
} node_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int vnum;
|
||||||
|
int next; /* Circularly linked list */
|
||||||
|
int prev; /* describing the monotone */
|
||||||
|
int marked; /* polygon */
|
||||||
|
} monchain_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
point_t pt;
|
||||||
|
int vnext[4]; /* next vertices for the 4 chains */
|
||||||
|
int vpos[4]; /* position of v in the 4 chains */
|
||||||
|
int nextfree;
|
||||||
|
int user_i; // index to user's vertex number
|
||||||
|
} vertexchain_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef pvector<node_t> QueryStructure;
|
||||||
|
QueryStructure qs;
|
||||||
|
typedef pvector<trap_t> TrapezoidStructure;
|
||||||
|
TrapezoidStructure tr;
|
||||||
|
|
||||||
|
/* Table to hold all the monotone */
|
||||||
|
/* polygons . Each monotone polygon */
|
||||||
|
/* is a circularly linked list */
|
||||||
|
pvector<monchain_t> mchain;
|
||||||
|
|
||||||
|
/* chain init. information. This */
|
||||||
|
/* is used to decide which */
|
||||||
|
/* monotone polygon to split if */
|
||||||
|
/* there are several other */
|
||||||
|
/* polygons touching at the same */
|
||||||
|
/* vertex */
|
||||||
|
pvector<vertexchain_t> vert;
|
||||||
|
|
||||||
|
/* contains position of any vertex in */
|
||||||
|
/* the monotone chain for the polygon */
|
||||||
|
vector_int mon;
|
||||||
|
|
||||||
|
vector_int visited;
|
||||||
|
|
||||||
|
void make_segment(const vector_int &range);
|
||||||
|
|
||||||
|
int choose_segment();
|
||||||
|
int math_logstar_n(int n);
|
||||||
|
int math_N(int n, int h);
|
||||||
|
|
||||||
|
int newnode();
|
||||||
|
int newtrap();
|
||||||
|
int _max(point_t *yval, point_t *v0, point_t *v1);
|
||||||
|
int _min(point_t *yval, point_t *v0, point_t *v1);
|
||||||
|
int _greater_than(point_t *v0, point_t *v1);
|
||||||
|
int _equal_to(point_t *v0, point_t *v1);
|
||||||
|
int _greater_than_equal_to(point_t *v0, point_t *v1);
|
||||||
|
int _less_than(point_t *v0, point_t *v1);
|
||||||
|
int init_query_structure(int segnum);
|
||||||
|
int is_left_of(int segnum, point_t *v);
|
||||||
|
int inserted(int segnum, int whichpt);
|
||||||
|
int locate_endpoint(point_t *v, point_t *vo, int r);
|
||||||
|
int merge_trapezoids(int segnum, int tfirst, int tlast, int side);
|
||||||
|
int add_segment(int segnum);
|
||||||
|
int find_new_roots(int segnum);
|
||||||
|
int construct_trapezoids(int nseg);
|
||||||
|
|
||||||
|
int inside_polygon(trap_t *t);
|
||||||
|
int newmon();
|
||||||
|
int new_chain_element();
|
||||||
|
double get_angle(point_t *vp0, point_t *vpnext, point_t *vp1);
|
||||||
|
int get_vertex_positions(int v0, int v1, int *ip, int *iq);
|
||||||
|
int make_new_monotone_poly(int mcur, int v0, int v1);
|
||||||
|
int monotonate_trapezoids(int n);
|
||||||
|
int traverse_polygon(int mcur, int trnum, int from, int dir);
|
||||||
|
void triangulate_monotone_polygons(int nvert, int nmonpoly);
|
||||||
|
void triangulate_single_polygon(int nvert, int posmax, int side);
|
||||||
|
|
||||||
|
friend class Triangle;
|
||||||
|
friend struct segment_t;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "triangulator.I"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user