Big round of cascading FG -> TG name cleanups (once you get going it's hard
to stop.) :-) Also save elevations of 3d polygons into a separate lookup list when they are loaded by the clipper.
This commit is contained in:
parent
4abf503817
commit
d05fd4a8ff
16 changed files with 164 additions and 153 deletions
|
@ -44,27 +44,28 @@ SG_USING_STD(cout);
|
||||||
|
|
||||||
|
|
||||||
// Constructor.
|
// Constructor.
|
||||||
FGClipper::FGClipper() {
|
TGClipper::TGClipper() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Destructor.
|
// Destructor.
|
||||||
FGClipper::~FGClipper() {
|
TGClipper::~TGClipper() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Initialize the clipper (empty all the polygon buckets.)
|
// Initialize the clipper (empty all the polygon buckets.)
|
||||||
bool FGClipper::init() {
|
bool TGClipper::init() {
|
||||||
for ( int i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( int i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
polys_in.polys[i].clear();
|
polys_in.polys[i].clear();
|
||||||
}
|
}
|
||||||
|
fixed_elevations.clear();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Load a polygon definition file.
|
// Load a polygon definition file.
|
||||||
bool FGClipper::load_polys(const string& path) {
|
bool TGClipper::load_polys(const string& path) {
|
||||||
bool poly3d = false;
|
bool poly3d = false;
|
||||||
string first_line;
|
string first_line;
|
||||||
string poly_name;
|
string poly_name;
|
||||||
|
@ -127,9 +128,8 @@ bool FGClipper::load_polys(const string& path) {
|
||||||
startz = -9999.0;
|
startz = -9999.0;
|
||||||
}
|
}
|
||||||
p = Point3D(startx, starty, startz);
|
p = Point3D(startx, starty, startz);
|
||||||
// cout << "load poly's: poly pt = " << p << endl;
|
|
||||||
poly.add_node( i, p );
|
poly.add_node( i, p );
|
||||||
SG_LOG( SG_CLIPPER, SG_BULK, "0 = " << p );
|
fixed_elevations.unique_add( p );
|
||||||
|
|
||||||
for ( j = 1; j < count - 1; ++j ) {
|
for ( j = 1; j < count - 1; ++j ) {
|
||||||
in >> x;
|
in >> x;
|
||||||
|
@ -140,8 +140,8 @@ bool FGClipper::load_polys(const string& path) {
|
||||||
z = -9999.0;
|
z = -9999.0;
|
||||||
}
|
}
|
||||||
p = Point3D( x, y, z );
|
p = Point3D( x, y, z );
|
||||||
// cout << "load poly's: poly pt = " << p << endl;
|
|
||||||
poly.add_node( i, p );
|
poly.add_node( i, p );
|
||||||
|
fixed_elevations.unique_add( p );
|
||||||
}
|
}
|
||||||
|
|
||||||
in >> lastx;
|
in >> lastx;
|
||||||
|
@ -158,8 +158,8 @@ bool FGClipper::load_polys(const string& path) {
|
||||||
// last point same as first, discard
|
// last point same as first, discard
|
||||||
} else {
|
} else {
|
||||||
p = Point3D( lastx, lasty, lastz );
|
p = Point3D( lastx, lasty, lastz );
|
||||||
// cout << "load poly's: poly pt = " << p << endl;
|
|
||||||
poly.add_node( i, p );
|
poly.add_node( i, p );
|
||||||
|
fixed_elevations.unique_add( p );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ bool FGClipper::load_polys(const string& path) {
|
||||||
|
|
||||||
// Load a polygon definition file containing osgb36 Eastings and Northings
|
// Load a polygon definition file containing osgb36 Eastings and Northings
|
||||||
// and convert them to WGS84 Latitude and Longitude
|
// and convert them to WGS84 Latitude and Longitude
|
||||||
bool FGClipper::load_osgb36_polys(const string& path) {
|
bool TGClipper::load_osgb36_polys(const string& path) {
|
||||||
// cout << "Loading osgb36 poly\n";
|
// cout << "Loading osgb36 poly\n";
|
||||||
string poly_name;
|
string poly_name;
|
||||||
AreaType poly_type = DefaultArea;
|
AreaType poly_type = DefaultArea;
|
||||||
|
@ -288,7 +288,7 @@ bool FGClipper::load_osgb36_polys(const string& path) {
|
||||||
// TEST - Ignore
|
// TEST - Ignore
|
||||||
// } else
|
// } else
|
||||||
|
|
||||||
if ( area < FG_MAX_AREA_TYPES ) {
|
if ( area < TG_MAX_AREA_TYPES ) {
|
||||||
polys_in.polys[area].push_back(poly);
|
polys_in.polys[area].push_back(poly);
|
||||||
} else {
|
} else {
|
||||||
SG_LOG( SG_CLIPPER, SG_ALERT, "Polygon type out of range = "
|
SG_LOG( SG_CLIPPER, SG_ALERT, "Polygon type out of range = "
|
||||||
|
@ -303,9 +303,9 @@ bool FGClipper::load_osgb36_polys(const string& path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a polygon to the clipper.
|
// Add a polygon to the clipper.
|
||||||
void FGClipper::add_poly( int area, const TGPolygon &poly )
|
void TGClipper::add_poly( int area, const TGPolygon &poly )
|
||||||
{
|
{
|
||||||
if ( area < FG_MAX_AREA_TYPES ) {
|
if ( area < TG_MAX_AREA_TYPES ) {
|
||||||
polys_in.polys[area].push_back(poly);
|
polys_in.polys[area].push_back(poly);
|
||||||
} else {
|
} else {
|
||||||
SG_LOG( SG_CLIPPER, SG_ALERT, "Polygon type out of range = "
|
SG_LOG( SG_CLIPPER, SG_ALERT, "Polygon type out of range = "
|
||||||
|
@ -316,7 +316,7 @@ void FGClipper::add_poly( int area, const TGPolygon &poly )
|
||||||
|
|
||||||
|
|
||||||
// Move slivers from in polygon to out polygon.
|
// Move slivers from in polygon to out polygon.
|
||||||
void FGClipper::move_slivers( TGPolygon& in, TGPolygon& out ) {
|
void TGClipper::move_slivers( TGPolygon& in, TGPolygon& out ) {
|
||||||
// traverse each contour of the polygon and attempt to identify
|
// traverse each contour of the polygon and attempt to identify
|
||||||
// likely slivers
|
// likely slivers
|
||||||
|
|
||||||
|
@ -377,7 +377,7 @@ void FGClipper::move_slivers( TGPolygon& in, TGPolygon& out ) {
|
||||||
// a polygon with no increased contours (i.e. the sliver is adjacent
|
// a polygon with no increased contours (i.e. the sliver is adjacent
|
||||||
// and can be merged.) If so, replace the clipped polygon with the
|
// and can be merged.) If so, replace the clipped polygon with the
|
||||||
// new polygon that has the sliver merged in.
|
// new polygon that has the sliver merged in.
|
||||||
void FGClipper::merge_slivers( FGPolyList& clipped, TGPolygon& slivers ) {
|
void TGClipper::merge_slivers( TGPolyList& clipped, TGPolygon& slivers ) {
|
||||||
TGPolygon poly, result, sliver;
|
TGPolygon poly, result, sliver;
|
||||||
point_list contour;
|
point_list contour;
|
||||||
int original_contours, result_contours;
|
int original_contours, result_contours;
|
||||||
|
@ -393,7 +393,7 @@ void FGClipper::merge_slivers( FGPolyList& clipped, TGPolygon& slivers ) {
|
||||||
sliver.add_contour( contour, 0 );
|
sliver.add_contour( contour, 0 );
|
||||||
done = false;
|
done = false;
|
||||||
|
|
||||||
for ( area = 0; area < FG_MAX_AREA_TYPES && !done; ++area ) {
|
for ( area = 0; area < TG_MAX_AREA_TYPES && !done; ++area ) {
|
||||||
|
|
||||||
if ( area == HoleArea ) {
|
if ( area == HoleArea ) {
|
||||||
// don't merge a non-hole sliver in with a hole
|
// don't merge a non-hole sliver in with a hole
|
||||||
|
@ -468,7 +468,7 @@ is_water_area (AreaType type)
|
||||||
|
|
||||||
// Clip all the polygons against each other in a priority scheme based
|
// Clip all the polygons against each other in a priority scheme based
|
||||||
// on order of the polygon type in the polygon type enum.
|
// on order of the polygon type in the polygon type enum.
|
||||||
bool FGClipper::clip_all(const point2d& min, const point2d& max) {
|
bool TGClipper::clip_all(const point2d& min, const point2d& max) {
|
||||||
TGPolygon accum, tmp;
|
TGPolygon accum, tmp;
|
||||||
TGPolygon slivers, remains;
|
TGPolygon slivers, remains;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
@ -503,7 +503,7 @@ bool FGClipper::clip_all(const point2d& min, const point2d& max) {
|
||||||
// set up a mask for all water.
|
// set up a mask for all water.
|
||||||
TGPolygon water_mask;
|
TGPolygon water_mask;
|
||||||
water_mask.erase();
|
water_mask.erase();
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; i++ ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; i++ ) {
|
||||||
if (is_water_area(AreaType(i))) {
|
if (is_water_area(AreaType(i))) {
|
||||||
for (unsigned int j = 0; j < polys_in.polys[i].size(); j++) {
|
for (unsigned int j = 0; j < polys_in.polys[i].size(); j++) {
|
||||||
water_mask =
|
water_mask =
|
||||||
|
@ -521,7 +521,7 @@ bool FGClipper::clip_all(const point2d& min, const point2d& max) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// process polygons in priority order
|
// process polygons in priority order
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
cout << "num polys of type (" << i << ") = "
|
cout << "num polys of type (" << i << ") = "
|
||||||
<< polys_in.polys[i].size() << endl;
|
<< polys_in.polys[i].size() << endl;
|
||||||
// current = polys_in.polys[i].begin();
|
// current = polys_in.polys[i].begin();
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
#include <simgear/math/sg_types.hxx>
|
#include <simgear/math/sg_types.hxx>
|
||||||
|
|
||||||
|
#include <Geometry/trinodes.hxx>
|
||||||
#include <Polygon/polygon.hxx>
|
#include <Polygon/polygon.hxx>
|
||||||
|
|
||||||
#include STL_STRING
|
#include STL_STRING
|
||||||
|
@ -45,33 +46,34 @@ SG_USING_STD(string);
|
||||||
SG_USING_STD(vector);
|
SG_USING_STD(vector);
|
||||||
|
|
||||||
|
|
||||||
#define FG_MAX_AREA_TYPES 128 // FIXME also defined in
|
#define TG_MAX_AREA_TYPES 128 // FIXME also defined in
|
||||||
// MergerClipper/clipper.hxx
|
// MergerClipper/clipper.hxx
|
||||||
#define EXTRA_SAFETY_CLIP
|
#define EXTRA_SAFETY_CLIP
|
||||||
|
|
||||||
|
|
||||||
class FGPolyList
|
class TGPolyList
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
poly_list polys[FG_MAX_AREA_TYPES];
|
poly_list polys[TG_MAX_AREA_TYPES];
|
||||||
TGPolygon safety_base;
|
TGPolygon safety_base;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class FGClipper
|
class TGClipper
|
||||||
{
|
{
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
FGPolyList polys_in, polys_clipped;
|
TGPolyList polys_in, polys_clipped;
|
||||||
|
TGTriNodes fixed_elevations;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor.
|
// Constructor.
|
||||||
FGClipper (void);
|
TGClipper (void);
|
||||||
|
|
||||||
// Destructor.
|
// Destructor.
|
||||||
~FGClipper (void);
|
~TGClipper (void);
|
||||||
|
|
||||||
// Initialize Clipper (allocate and/or connect structures.)
|
// Initialize Clipper (allocate and/or connect structures.)
|
||||||
bool init();
|
bool init();
|
||||||
|
@ -93,13 +95,16 @@ public:
|
||||||
// yields a polygon with no increased contours (i.e. the sliver is
|
// yields a polygon with no increased contours (i.e. the sliver is
|
||||||
// adjacent and can be merged.) If so, replace the clipped
|
// adjacent and can be merged.) If so, replace the clipped
|
||||||
// polygon with the new polygon that has the sliver merged in.
|
// polygon with the new polygon that has the sliver merged in.
|
||||||
void merge_slivers( FGPolyList& clipped, TGPolygon& slivers );
|
void merge_slivers( TGPolyList& clipped, TGPolygon& slivers );
|
||||||
|
|
||||||
// Do actual clipping work.
|
// Do actual clipping work.
|
||||||
bool clip_all(const point2d& min, const point2d& max);
|
bool clip_all(const point2d& min, const point2d& max);
|
||||||
|
|
||||||
// Return output poly list
|
// Return output poly list
|
||||||
inline FGPolyList get_polys_clipped() const { return polys_clipped; }
|
inline TGPolyList get_polys_clipped() const { return polys_clipped; }
|
||||||
|
|
||||||
|
// Return the fixed elevation points list
|
||||||
|
inline TGTriNodes get_fixed_elevations() const { return fixed_elevations; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ int main( int argc, char **argv ) {
|
||||||
global_min.x = global_min.y = 200;
|
global_min.x = global_min.y = 200;
|
||||||
global_max.y = global_max.x = -200;
|
global_max.y = global_max.x = -200;
|
||||||
|
|
||||||
FGClipper clipper;
|
TGClipper clipper;
|
||||||
clipper.init();
|
clipper.init();
|
||||||
|
|
||||||
if ( argc < 2 ) {
|
if ( argc < 2 ) {
|
||||||
|
|
|
@ -46,7 +46,7 @@ SG_USING_STD(endl);
|
||||||
|
|
||||||
// calculate the global bounding sphere. Center is the center of the
|
// calculate the global bounding sphere. Center is the center of the
|
||||||
// tile and zero elevation
|
// tile and zero elevation
|
||||||
void FGGenOutput::calc_gbs( FGConstruct& c ) {
|
void TGGenOutput::calc_gbs( TGConstruct& c ) {
|
||||||
double dist_squared;
|
double dist_squared;
|
||||||
double radius_squared = 0;
|
double radius_squared = 0;
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ void FGGenOutput::calc_gbs( FGConstruct& c ) {
|
||||||
|
|
||||||
// traverse the specified fan and attempt to calculate "none
|
// traverse the specified fan and attempt to calculate "none
|
||||||
// stretching" texture coordinates
|
// stretching" texture coordinates
|
||||||
int_list FGGenOutput::calc_tex_coords( FGConstruct& c, point_list geod_nodes,
|
int_list TGGenOutput::calc_tex_coords( TGConstruct& c, point_list geod_nodes,
|
||||||
int_list fan )
|
int_list fan )
|
||||||
{
|
{
|
||||||
// cout << "calculating texture coordinates for a specific fan of size = "
|
// cout << "calculating texture coordinates for a specific fan of size = "
|
||||||
|
@ -162,7 +162,7 @@ int_list FGGenOutput::calc_tex_coords( FGConstruct& c, point_list geod_nodes,
|
||||||
|
|
||||||
// build the necessary output structures based on the triangulation
|
// build the necessary output structures based on the triangulation
|
||||||
// data
|
// data
|
||||||
int FGGenOutput::build( FGConstruct& c ) {
|
int TGGenOutput::build( TGConstruct& c ) {
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
TGTriNodes trinodes = c.get_tri_nodes();
|
TGTriNodes trinodes = c.get_tri_nodes();
|
||||||
|
@ -176,7 +176,7 @@ int FGGenOutput::build( FGConstruct& c ) {
|
||||||
// build the trifan list
|
// build the trifan list
|
||||||
cout << "total triangles = " << tri_elements.size() << endl;
|
cout << "total triangles = " << tri_elements.size() << endl;
|
||||||
TGGenFans f;
|
TGGenFans f;
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
triele_list area_tris;
|
triele_list area_tris;
|
||||||
area_tris.erase( area_tris.begin(), area_tris.end() );
|
area_tris.erase( area_tris.begin(), area_tris.end() );
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ int FGGenOutput::build( FGConstruct& c ) {
|
||||||
cout << "calculating texture coordinates" << endl;
|
cout << "calculating texture coordinates" << endl;
|
||||||
tex_coords.clear();
|
tex_coords.clear();
|
||||||
|
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
for ( j = 0; j < (int)fans[i].size(); ++j ) {
|
for ( j = 0; j < (int)fans[i].size(); ++j ) {
|
||||||
// int_list t_list = calc_tex_coords( c, geod_nodes, fans[i][j] );
|
// int_list t_list = calc_tex_coords( c, geod_nodes, fans[i][j] );
|
||||||
// cout << fans[i][j].size() << " === "
|
// cout << fans[i][j].size() << " === "
|
||||||
|
@ -238,7 +238,7 @@ int FGGenOutput::build( FGConstruct& c ) {
|
||||||
|
|
||||||
|
|
||||||
// caclulate the bounding sphere for a list of triangle faces
|
// caclulate the bounding sphere for a list of triangle faces
|
||||||
void FGGenOutput::calc_group_bounding_sphere( FGConstruct& c,
|
void TGGenOutput::calc_group_bounding_sphere( TGConstruct& c,
|
||||||
const opt_list& fans,
|
const opt_list& fans,
|
||||||
Point3D *center, double *radius )
|
Point3D *center, double *radius )
|
||||||
{
|
{
|
||||||
|
@ -290,7 +290,7 @@ void FGGenOutput::calc_group_bounding_sphere( FGConstruct& c,
|
||||||
|
|
||||||
|
|
||||||
// caclulate the bounding sphere for the specified triangle face
|
// caclulate the bounding sphere for the specified triangle face
|
||||||
void FGGenOutput::calc_bounding_sphere( FGConstruct& c, const FGTriEle& t,
|
void TGGenOutput::calc_bounding_sphere( TGConstruct& c, const TGTriEle& t,
|
||||||
Point3D *center, double *radius )
|
Point3D *center, double *radius )
|
||||||
{
|
{
|
||||||
point_list wgs84_nodes = c.get_wgs84_nodes();
|
point_list wgs84_nodes = c.get_wgs84_nodes();
|
||||||
|
@ -328,7 +328,7 @@ void FGGenOutput::calc_bounding_sphere( FGConstruct& c, const FGTriEle& t,
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// write out the fgfs scenery file
|
// write out the fgfs scenery file
|
||||||
int FGGenOutput::write_orig( FGConstruct &c ) {
|
int TGGenOutput::write_orig( TGConstruct &c ) {
|
||||||
Point3D p;
|
Point3D p;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -410,7 +410,7 @@ int FGGenOutput::write_orig( FGConstruct &c ) {
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
|
|
||||||
int total_tris = 0;
|
int total_tris = 0;
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
if ( (int)fans[i].size() > 0 ) {
|
if ( (int)fans[i].size() > 0 ) {
|
||||||
string attr_name = get_area_name( (AreaType)i );
|
string attr_name = get_area_name( (AreaType)i );
|
||||||
calc_group_bounding_sphere( c, fans[i], ¢er, &radius );
|
calc_group_bounding_sphere( c, fans[i], ¢er, &radius );
|
||||||
|
@ -446,7 +446,7 @@ int FGGenOutput::write_orig( FGConstruct &c ) {
|
||||||
|
|
||||||
|
|
||||||
// write out the fgfs scenery file
|
// write out the fgfs scenery file
|
||||||
int FGGenOutput::write( FGConstruct &c ) {
|
int TGGenOutput::write( TGConstruct &c ) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// Assemble all the data into the final format
|
// Assemble all the data into the final format
|
||||||
|
@ -475,7 +475,7 @@ int FGGenOutput::write( FGConstruct &c ) {
|
||||||
group_list fans_v; group_list fans_tc; string_list fan_materials;
|
group_list fans_v; group_list fans_tc; string_list fan_materials;
|
||||||
fans_v.clear(); fans_tc.clear(); fan_materials.clear();
|
fans_v.clear(); fans_tc.clear(); fan_materials.clear();
|
||||||
|
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
if ( (int)fans[i].size() > 0 ) {
|
if ( (int)fans[i].size() > 0 ) {
|
||||||
cout << "creating " << fans[i].size() << " fans of type "
|
cout << "creating " << fans[i].size() << " fans of type "
|
||||||
<< i << endl;
|
<< i << endl;
|
||||||
|
|
|
@ -52,7 +52,7 @@ typedef vector < int_list > tex_list;
|
||||||
typedef tex_list::iterator tex_list_iterator;
|
typedef tex_list::iterator tex_list_iterator;
|
||||||
typedef tex_list::const_iterator const_tex_list_iterator;
|
typedef tex_list::const_iterator const_tex_list_iterator;
|
||||||
|
|
||||||
class FGGenOutput {
|
class TGGenOutput {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -66,10 +66,10 @@ private:
|
||||||
TGTriNodes tex_coords;
|
TGTriNodes tex_coords;
|
||||||
|
|
||||||
// fan list
|
// fan list
|
||||||
opt_list fans[FG_MAX_AREA_TYPES];
|
opt_list fans[TG_MAX_AREA_TYPES];
|
||||||
|
|
||||||
// textures pointer list
|
// textures pointer list
|
||||||
tex_list textures[FG_MAX_AREA_TYPES];
|
tex_list textures[TG_MAX_AREA_TYPES];
|
||||||
|
|
||||||
// global bounding sphere
|
// global bounding sphere
|
||||||
Point3D gbs_center;
|
Point3D gbs_center;
|
||||||
|
@ -77,32 +77,32 @@ private:
|
||||||
|
|
||||||
// calculate the global bounding sphere. Center is the average of
|
// calculate the global bounding sphere. Center is the average of
|
||||||
// the points.
|
// the points.
|
||||||
void calc_gbs( FGConstruct& c );
|
void calc_gbs( TGConstruct& c );
|
||||||
|
|
||||||
// caclulate the bounding sphere for a list of triangle faces
|
// caclulate the bounding sphere for a list of triangle faces
|
||||||
void calc_group_bounding_sphere( FGConstruct& c, const opt_list& fans,
|
void calc_group_bounding_sphere( TGConstruct& c, const opt_list& fans,
|
||||||
Point3D *center, double *radius );
|
Point3D *center, double *radius );
|
||||||
|
|
||||||
// caclulate the bounding sphere for the specified triangle face
|
// caclulate the bounding sphere for the specified triangle face
|
||||||
void calc_bounding_sphere( FGConstruct& c, const FGTriEle& t,
|
void calc_bounding_sphere( TGConstruct& c, const TGTriEle& t,
|
||||||
Point3D *center, double *radius );
|
Point3D *center, double *radius );
|
||||||
|
|
||||||
// traverse the specified fan and attempt to calculate "none
|
// traverse the specified fan and attempt to calculate "none
|
||||||
// stretching" texture coordinates
|
// stretching" texture coordinates
|
||||||
// int_list calc_tex_coords( FGConstruct& c, point_list geod_nodes, int_list fan );
|
// int_list calc_tex_coords( TGConstruct& c, point_list geod_nodes, int_list fan );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor && Destructor
|
// Constructor && Destructor
|
||||||
inline FGGenOutput() { }
|
inline TGGenOutput() { }
|
||||||
inline ~FGGenOutput() { }
|
inline ~TGGenOutput() { }
|
||||||
|
|
||||||
// build the necessary output structures based on the
|
// build the necessary output structures based on the
|
||||||
// triangulation data
|
// triangulation data
|
||||||
int build( FGConstruct& c );
|
int build( TGConstruct& c );
|
||||||
|
|
||||||
// write out the fgfs scenery file
|
// write out the fgfs scenery file
|
||||||
int write( FGConstruct &c );
|
int write( TGConstruct &c );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
|
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
FGConstruct::FGConstruct() { }
|
TGConstruct::TGConstruct() { }
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
FGConstruct::~FGConstruct() { }
|
TGConstruct::~TGConstruct() { }
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
|
|
||||||
// Maximum nodes per tile
|
// Maximum nodes per tile
|
||||||
#define FG_MAX_NODES 4000
|
#define TG_MAX_NODES 4000
|
||||||
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
@ -55,7 +55,7 @@ typedef belongs_to_list::iterator belongs_to_list_iterator;
|
||||||
typedef belongs_to_list::const_iterator belongs_to_list_tripoly_iterator;
|
typedef belongs_to_list::const_iterator belongs_to_list_tripoly_iterator;
|
||||||
|
|
||||||
|
|
||||||
class FGConstruct {
|
class TGConstruct {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ private:
|
||||||
SGBucket bucket;
|
SGBucket bucket;
|
||||||
|
|
||||||
// clipped polygons (gpc format)
|
// clipped polygons (gpc format)
|
||||||
FGPolyList clipped_polys;
|
TGPolyList clipped_polys;
|
||||||
|
|
||||||
// raw node list (after triangulation)
|
// raw node list (after triangulation)
|
||||||
TGTriNodes tri_nodes;
|
TGTriNodes tri_nodes;
|
||||||
|
@ -111,10 +111,10 @@ private:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
FGConstruct();
|
TGConstruct();
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~FGConstruct();
|
~TGConstruct();
|
||||||
|
|
||||||
// minimum interior angle for triangulation
|
// minimum interior angle for triangulation
|
||||||
inline string get_angle() const { return angle; }
|
inline string get_angle() const { return angle; }
|
||||||
|
@ -145,8 +145,8 @@ public:
|
||||||
inline void set_bucket( const SGBucket b ) { bucket = b; }
|
inline void set_bucket( const SGBucket b ) { bucket = b; }
|
||||||
|
|
||||||
// clipped polygons
|
// clipped polygons
|
||||||
inline FGPolyList get_clipped_polys() const { return clipped_polys; }
|
inline TGPolyList get_clipped_polys() const { return clipped_polys; }
|
||||||
inline void set_clipped_polys( FGPolyList p ) { clipped_polys = p; }
|
inline void set_clipped_polys( TGPolyList p ) { clipped_polys = p; }
|
||||||
|
|
||||||
// node list (after triangulation)
|
// node list (after triangulation)
|
||||||
inline TGTriNodes get_tri_nodes() const { return tri_nodes; }
|
inline TGTriNodes get_tri_nodes() const { return tri_nodes; }
|
||||||
|
|
|
@ -133,8 +133,8 @@ static AreaType translateUSGSCover (int usgs_value)
|
||||||
|
|
||||||
// Scan a directory and load polygon files.
|
// Scan a directory and load polygon files.
|
||||||
static int actual_load_polys( const string& dir,
|
static int actual_load_polys( const string& dir,
|
||||||
FGConstruct& c,
|
TGConstruct& c,
|
||||||
FGClipper& clipper ) {
|
TGClipper& clipper ) {
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
string base = c.get_bucket().gen_base_path();
|
string base = c.get_bucket().gen_base_path();
|
||||||
string tile_str = c.get_bucket().gen_index_str();
|
string tile_str = c.get_bucket().gen_index_str();
|
||||||
|
@ -288,15 +288,15 @@ static void make_area( const LandCover &cover, TGPolygon *polys,
|
||||||
|
|
||||||
// Generate polygons from la and-cover raster. Horizontally- or
|
// Generate polygons from la and-cover raster. Horizontally- or
|
||||||
// vertically-adjacent polygons will be merged automatically.
|
// vertically-adjacent polygons will be merged automatically.
|
||||||
static int actual_load_landcover ( FGConstruct & c,
|
static int actual_load_landcover ( TGConstruct & c,
|
||||||
FGClipper &clipper ) {
|
TGClipper &clipper ) {
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
LandCover cover(c.get_cover());
|
LandCover cover(c.get_cover());
|
||||||
TGPolygon polys[FG_MAX_AREA_TYPES];
|
TGPolygon polys[TG_MAX_AREA_TYPES];
|
||||||
TGPolygon poly; // working polygon
|
TGPolygon poly; // working polygon
|
||||||
|
|
||||||
double dx = 1.0 / 120.0;
|
double dx = 1.0 / 120.0;
|
||||||
|
@ -350,7 +350,7 @@ static int actual_load_landcover ( FGConstruct & c,
|
||||||
// Now that we're finished looking up land cover, we have a list
|
// Now that we're finished looking up land cover, we have a list
|
||||||
// of lists of polygons, one (possibly-empty) list for each area
|
// of lists of polygons, one (possibly-empty) list for each area
|
||||||
// type. Add the remaining polygons to the clipper.
|
// type. Add the remaining polygons to the clipper.
|
||||||
for ( int i = 0; i < FG_MAX_AREA_TYPES; i++ ) {
|
for ( int i = 0; i < TG_MAX_AREA_TYPES; i++ ) {
|
||||||
if ( polys[i].contours() ) {
|
if ( polys[i].contours() ) {
|
||||||
clipper.add_poly( i, polys[i] );
|
clipper.add_poly( i, polys[i] );
|
||||||
count++;
|
count++;
|
||||||
|
@ -368,8 +368,8 @@ static int actual_load_landcover ( FGConstruct & c,
|
||||||
|
|
||||||
// load all 2d polygons from the specified load disk directories and
|
// load all 2d polygons from the specified load disk directories and
|
||||||
// clip against each other to resolve any overlaps
|
// clip against each other to resolve any overlaps
|
||||||
static int load_polys( FGConstruct& c ) {
|
static int load_polys( TGConstruct& c ) {
|
||||||
FGClipper clipper;
|
TGClipper clipper;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
string base = c.get_bucket().gen_base_path();
|
string base = c.get_bucket().gen_base_path();
|
||||||
|
@ -411,7 +411,7 @@ static int load_polys( FGConstruct& c ) {
|
||||||
|
|
||||||
// Load elevation data from an Array file, a regular grid of elevation
|
// Load elevation data from an Array file, a regular grid of elevation
|
||||||
// data) and return list of fitted nodes.
|
// data) and return list of fitted nodes.
|
||||||
static bool load_array( FGConstruct& c, TGArray& array) {
|
static bool load_array( TGConstruct& c, TGArray& array) {
|
||||||
point_list result;
|
point_list result;
|
||||||
string base = c.get_bucket().gen_base_path();
|
string base = c.get_bucket().gen_base_path();
|
||||||
int i;
|
int i;
|
||||||
|
@ -436,21 +436,15 @@ static bool load_array( FGConstruct& c, TGArray& array) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// fit array nodes, return number of fitted nodes
|
|
||||||
static int fit_array(TGArray& array, int error) {
|
|
||||||
return array.fit( error );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// triangulate the data for each polygon ( first time before splitting )
|
// triangulate the data for each polygon ( first time before splitting )
|
||||||
static void first_triangulate( FGConstruct& c, const TGArray& array,
|
static void first_triangulate( TGConstruct& c, const TGArray& array,
|
||||||
FGTriangle& t ) {
|
TGTriangle& t ) {
|
||||||
// first we need to consolidate the points of the Array fit list and
|
// first we need to consolidate the points of the Array fit list and
|
||||||
// all the polygons into a more "Triangle" friendly format
|
// all the polygons into a more "Triangle" friendly format
|
||||||
|
|
||||||
point_list corner_list = array.get_corner_node_list();
|
point_list corner_list = array.get_corner_node_list();
|
||||||
point_list fit_list = array.get_fit_node_list();
|
point_list fit_list = array.get_fit_node_list();
|
||||||
FGPolyList gpc_polys = c.get_clipped_polys();
|
TGPolyList gpc_polys = c.get_clipped_polys();
|
||||||
|
|
||||||
cout << "ready to build node list and polygons" << endl;
|
cout << "ready to build node list and polygons" << endl;
|
||||||
t.build( corner_list, fit_list, gpc_polys );
|
t.build( corner_list, fit_list, gpc_polys );
|
||||||
|
@ -464,7 +458,7 @@ static void first_triangulate( FGConstruct& c, const TGArray& array,
|
||||||
|
|
||||||
// triangulate the data for each polygon ( second time after splitting
|
// triangulate the data for each polygon ( second time after splitting
|
||||||
// and reassembling )
|
// and reassembling )
|
||||||
static void second_triangulate( FGConstruct& c, FGTriangle& t ) {
|
static void second_triangulate( TGConstruct& c, TGTriangle& t ) {
|
||||||
t.rebuild( c );
|
t.rebuild( c );
|
||||||
cout << "done re building node list and polygons" << endl;
|
cout << "done re building node list and polygons" << endl;
|
||||||
|
|
||||||
|
@ -490,7 +484,8 @@ static double distance2D( const Point3D p1, const Point3D p2 ) {
|
||||||
|
|
||||||
|
|
||||||
// fix the elevations of the geodetic nodes
|
// fix the elevations of the geodetic nodes
|
||||||
static void fix_point_heights( FGConstruct& c, const TGArray& array ) {
|
static void fix_point_heights( TGConstruct& c, const TGArray& array )
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
double z;
|
double z;
|
||||||
|
|
||||||
|
@ -509,7 +504,7 @@ static void fix_point_heights( FGConstruct& c, const TGArray& array ) {
|
||||||
cout << "flattening ocean connected nodes" << endl;
|
cout << "flattening ocean connected nodes" << endl;
|
||||||
|
|
||||||
triele_list tris = c.get_tri_elements();
|
triele_list tris = c.get_tri_elements();
|
||||||
FGTriEle t;
|
TGTriEle t;
|
||||||
Point3D p;
|
Point3D p;
|
||||||
AreaType a;
|
AreaType a;
|
||||||
int n1, n2, n3;
|
int n1, n2, n3;
|
||||||
|
@ -591,7 +586,7 @@ static void fix_point_heights( FGConstruct& c, const TGArray& array ) {
|
||||||
|
|
||||||
|
|
||||||
// build the wgs-84 point list
|
// build the wgs-84 point list
|
||||||
static void build_wgs_84_point_list( FGConstruct& c, const TGArray& array ) {
|
static void build_wgs_84_point_list( TGConstruct& c, const TGArray& array ) {
|
||||||
point_list geod_nodes;
|
point_list geod_nodes;
|
||||||
point_list wgs84_nodes;
|
point_list wgs84_nodes;
|
||||||
int i;
|
int i;
|
||||||
|
@ -624,7 +619,7 @@ static void build_wgs_84_point_list( FGConstruct& c, const TGArray& array ) {
|
||||||
// build the node -> element (triangle) reverse lookup table. there
|
// build the node -> element (triangle) reverse lookup table. there
|
||||||
// is an entry for each point containing a list of all the triangles
|
// is an entry for each point containing a list of all the triangles
|
||||||
// that share that point.
|
// that share that point.
|
||||||
static belongs_to_list gen_node_ele_lookup_table( FGConstruct& c ) {
|
static belongs_to_list gen_node_ele_lookup_table( TGConstruct& c ) {
|
||||||
belongs_to_list reverse_ele_lookup;
|
belongs_to_list reverse_ele_lookup;
|
||||||
reverse_ele_lookup.clear();
|
reverse_ele_lookup.clear();
|
||||||
|
|
||||||
|
@ -657,7 +652,7 @@ static belongs_to_list gen_node_ele_lookup_table( FGConstruct& c ) {
|
||||||
|
|
||||||
|
|
||||||
// caclulate the area for the specified triangle face
|
// caclulate the area for the specified triangle face
|
||||||
static double tri_ele_area( const FGConstruct& c, const FGTriEle tri ) {
|
static double tri_ele_area( const TGConstruct& c, const TGTriEle tri ) {
|
||||||
point_list nodes = c.get_geod_nodes();
|
point_list nodes = c.get_geod_nodes();
|
||||||
|
|
||||||
Point3D p1 = nodes[ tri.get_n1() ];
|
Point3D p1 = nodes[ tri.get_n1() ];
|
||||||
|
@ -669,7 +664,7 @@ static double tri_ele_area( const FGConstruct& c, const FGTriEle tri ) {
|
||||||
|
|
||||||
|
|
||||||
// caclulate the normal for the specified triangle face
|
// caclulate the normal for the specified triangle face
|
||||||
static Point3D calc_normal( FGConstruct& c, int i ) {
|
static Point3D calc_normal( TGConstruct& c, int i ) {
|
||||||
sgVec3 v1, v2, normal;
|
sgVec3 v1, v2, normal;
|
||||||
|
|
||||||
point_list wgs84_nodes = c.get_wgs84_nodes();
|
point_list wgs84_nodes = c.get_wgs84_nodes();
|
||||||
|
@ -731,7 +726,7 @@ static Point3D calc_normal( FGConstruct& c, int i ) {
|
||||||
|
|
||||||
|
|
||||||
// build the face normal list
|
// build the face normal list
|
||||||
static point_list gen_face_normals( FGConstruct& c ) {
|
static point_list gen_face_normals( TGConstruct& c ) {
|
||||||
point_list face_normals;
|
point_list face_normals;
|
||||||
|
|
||||||
// traverse triangle structure building the face normal table
|
// traverse triangle structure building the face normal table
|
||||||
|
@ -750,7 +745,7 @@ static point_list gen_face_normals( FGConstruct& c ) {
|
||||||
|
|
||||||
|
|
||||||
// calculate the normals for each point in wgs84_nodes
|
// calculate the normals for each point in wgs84_nodes
|
||||||
static point_list gen_point_normals( FGConstruct& c ) {
|
static point_list gen_point_normals( TGConstruct& c ) {
|
||||||
point_list point_normals;
|
point_list point_normals;
|
||||||
|
|
||||||
Point3D normal;
|
Point3D normal;
|
||||||
|
@ -793,14 +788,14 @@ static point_list gen_point_normals( FGConstruct& c ) {
|
||||||
|
|
||||||
|
|
||||||
// generate the flight gear scenery file
|
// generate the flight gear scenery file
|
||||||
static void do_output( FGConstruct& c, FGGenOutput& output ) {
|
static void do_output( TGConstruct& c, TGGenOutput& output ) {
|
||||||
output.build( c );
|
output.build( c );
|
||||||
output.write( c );
|
output.write( c );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// collect custom objects and move to scenery area
|
// collect custom objects and move to scenery area
|
||||||
static void do_custom_objects( const FGConstruct& c ) {
|
static void do_custom_objects( const TGConstruct& c ) {
|
||||||
SGBucket b = c.get_bucket();
|
SGBucket b = c.get_bucket();
|
||||||
|
|
||||||
// Create/open the output .stg file for writing
|
// Create/open the output .stg file for writing
|
||||||
|
@ -854,7 +849,7 @@ static void do_custom_objects( const FGConstruct& c ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// master construction routine
|
// master construction routine
|
||||||
static void construct_tile( FGConstruct& c ) {
|
static void construct_tile( TGConstruct& c ) {
|
||||||
cout << "Construct tile, bucket = " << c.get_bucket() << endl;
|
cout << "Construct tile, bucket = " << c.get_bucket() << endl;
|
||||||
|
|
||||||
// fit with ever increasing error tolerance until we produce <=
|
// fit with ever increasing error tolerance until we produce <=
|
||||||
|
@ -879,7 +874,7 @@ static void construct_tile( FGConstruct& c ) {
|
||||||
TGArray array;
|
TGArray array;
|
||||||
load_array( c, array );
|
load_array( c, array );
|
||||||
|
|
||||||
FGTriangle t;
|
TGTriangle t;
|
||||||
|
|
||||||
while ( ! acceptable ) {
|
while ( ! acceptable ) {
|
||||||
// do a least squares fit of the (array) data with the given
|
// do a least squares fit of the (array) data with the given
|
||||||
|
@ -965,7 +960,7 @@ static void construct_tile( FGConstruct& c ) {
|
||||||
|
|
||||||
// match tile edges with any neighbor tiles that have already been
|
// match tile edges with any neighbor tiles that have already been
|
||||||
// generated
|
// generated
|
||||||
FGMatch m;
|
TGMatch m;
|
||||||
m.load_neighbor_shared( c );
|
m.load_neighbor_shared( c );
|
||||||
m.split_tile( c );
|
m.split_tile( c );
|
||||||
m.write_shared( c );
|
m.write_shared( c );
|
||||||
|
@ -999,7 +994,7 @@ static void construct_tile( FGConstruct& c ) {
|
||||||
build_wgs_84_point_list( c, array );
|
build_wgs_84_point_list( c, array );
|
||||||
|
|
||||||
// generate the output
|
// generate the output
|
||||||
FGGenOutput output;
|
TGGenOutput output;
|
||||||
do_output( c, output );
|
do_output( c, output );
|
||||||
|
|
||||||
array.close();
|
array.close();
|
||||||
|
@ -1124,7 +1119,7 @@ int main(int argc, char **argv) {
|
||||||
#endif // end of stuff that crashes Cygwin
|
#endif // end of stuff that crashes Cygwin
|
||||||
|
|
||||||
// main construction data management class
|
// main construction data management class
|
||||||
FGConstruct c;
|
TGConstruct c;
|
||||||
|
|
||||||
c.set_angle( min_angle );
|
c.set_angle( min_angle );
|
||||||
c.set_cover( cover );
|
c.set_cover( cover );
|
||||||
|
@ -1133,7 +1128,7 @@ int main(int argc, char **argv) {
|
||||||
c.set_useUKGrid( useUKgrid );
|
c.set_useUKGrid( useUKgrid );
|
||||||
|
|
||||||
c.set_min_nodes( 50 );
|
c.set_min_nodes( 50 );
|
||||||
c.set_max_nodes( (int)(FG_MAX_NODES * 0.8) );
|
c.set_max_nodes( (int)(TG_MAX_NODES * 0.8) );
|
||||||
|
|
||||||
if (tile_id == -1) {
|
if (tile_id == -1) {
|
||||||
if (xdist == -1 || ydist == -1) {
|
if (xdist == -1 || ydist == -1) {
|
||||||
|
|
|
@ -40,16 +40,16 @@ SG_USING_STD(cout);
|
||||||
SG_USING_STD(endl);
|
SG_USING_STD(endl);
|
||||||
|
|
||||||
|
|
||||||
FGMatch::FGMatch( void ) {
|
TGMatch::TGMatch( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FGMatch::~FGMatch( void ) {
|
TGMatch::~TGMatch( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// scan the specified share file for the specified information
|
// scan the specified share file for the specified information
|
||||||
void FGMatch::scan_share_file( const string& dir, const SGBucket& b,
|
void TGMatch::scan_share_file( const string& dir, const SGBucket& b,
|
||||||
neighbor_type search, neighbor_type dest )
|
neighbor_type search, neighbor_type dest )
|
||||||
{
|
{
|
||||||
string file = dir + "/" + b.gen_base_path() + "/" + b.gen_index_str();
|
string file = dir + "/" + b.gen_base_path() + "/" + b.gen_index_str();
|
||||||
|
@ -140,7 +140,7 @@ void FGMatch::scan_share_file( const string& dir, const SGBucket& b,
|
||||||
|
|
||||||
|
|
||||||
// try to find info for the specified shared component
|
// try to find info for the specified shared component
|
||||||
void FGMatch::load_shared( const FGConstruct& c, neighbor_type n ) {
|
void TGMatch::load_shared( const TGConstruct& c, neighbor_type n ) {
|
||||||
SGBucket b = c.get_bucket();
|
SGBucket b = c.get_bucket();
|
||||||
|
|
||||||
double clon = b.get_center_lon();
|
double clon = b.get_center_lon();
|
||||||
|
@ -204,7 +204,7 @@ void FGMatch::load_shared( const FGConstruct& c, neighbor_type n ) {
|
||||||
|
|
||||||
// load any previously existing shared data from all neighbors (if
|
// load any previously existing shared data from all neighbors (if
|
||||||
// shared data for a component exists set that components flag to true
|
// shared data for a component exists set that components flag to true
|
||||||
void FGMatch::load_neighbor_shared( FGConstruct& c ) {
|
void TGMatch::load_neighbor_shared( TGConstruct& c ) {
|
||||||
cout << "Loading existing shared data from neighbor tiles" << endl;
|
cout << "Loading existing shared data from neighbor tiles" << endl;
|
||||||
|
|
||||||
// start with all flags false
|
// start with all flags false
|
||||||
|
@ -289,7 +289,7 @@ Point3D tgFakeNormal( const Point3D& p ) {
|
||||||
// segments and the body. This must be done after calling
|
// segments and the body. This must be done after calling
|
||||||
// load_neighbor_data() and will ignore any shared data from the
|
// load_neighbor_data() and will ignore any shared data from the
|
||||||
// current tile that already exists from a neighbor.
|
// current tile that already exists from a neighbor.
|
||||||
void FGMatch::split_tile( FGConstruct& c ) {
|
void TGMatch::split_tile( TGConstruct& c ) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cout << "Spliting tile" << endl;
|
cout << "Spliting tile" << endl;
|
||||||
|
@ -456,7 +456,7 @@ void FGMatch::split_tile( FGConstruct& c ) {
|
||||||
|
|
||||||
// write the new shared edge points, normals, and segments for this
|
// write the new shared edge points, normals, and segments for this
|
||||||
// tile
|
// tile
|
||||||
void FGMatch::write_shared( FGConstruct& c ) {
|
void TGMatch::write_shared( TGConstruct& c ) {
|
||||||
string base = c.get_work_base();
|
string base = c.get_work_base();
|
||||||
SGBucket b = c.get_bucket();
|
SGBucket b = c.get_bucket();
|
||||||
|
|
||||||
|
@ -635,7 +635,7 @@ void insert_normal( point_list& normals, Point3D n, int i ) {
|
||||||
|
|
||||||
// reassemble the tile pieces (combining the shared data and our own
|
// reassemble the tile pieces (combining the shared data and our own
|
||||||
// data)
|
// data)
|
||||||
void FGMatch::assemble_tile( FGConstruct& c ) {
|
void TGMatch::assemble_tile( TGConstruct& c ) {
|
||||||
int i;
|
int i;
|
||||||
TGTriNodes new_nodes;
|
TGTriNodes new_nodes;
|
||||||
new_nodes.clear();
|
new_nodes.clear();
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#include <Main/construct.hxx>
|
#include <Main/construct.hxx>
|
||||||
|
|
||||||
|
|
||||||
class FGMatch {
|
class TGMatch {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -73,36 +73,36 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
FGMatch( void );
|
TGMatch( void );
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~FGMatch( void );
|
~TGMatch( void );
|
||||||
|
|
||||||
// load any previously existing shared data from all neighbors (if
|
// load any previously existing shared data from all neighbors (if
|
||||||
// shared data for a component exists set that components flag to
|
// shared data for a component exists set that components flag to
|
||||||
// true
|
// true
|
||||||
void load_neighbor_shared( FGConstruct& c );
|
void load_neighbor_shared( TGConstruct& c );
|
||||||
|
|
||||||
// scan the specified share file for the specified information
|
// scan the specified share file for the specified information
|
||||||
void scan_share_file( const string& dir, const SGBucket& b,
|
void scan_share_file( const string& dir, const SGBucket& b,
|
||||||
neighbor_type search, neighbor_type dest );
|
neighbor_type search, neighbor_type dest );
|
||||||
|
|
||||||
// try to find info for the specified shared component
|
// try to find info for the specified shared component
|
||||||
void load_shared( const FGConstruct& c, neighbor_type n );
|
void load_shared( const TGConstruct& c, neighbor_type n );
|
||||||
|
|
||||||
// split up the tile between the shared edge points, normals, and
|
// split up the tile between the shared edge points, normals, and
|
||||||
// segments and the body. This must be done after calling
|
// segments and the body. This must be done after calling
|
||||||
// load_neighbor_data() and will ignore any shared data from the
|
// load_neighbor_data() and will ignore any shared data from the
|
||||||
// current tile that already exists from a neighbor.
|
// current tile that already exists from a neighbor.
|
||||||
void split_tile( FGConstruct& c );
|
void split_tile( TGConstruct& c );
|
||||||
|
|
||||||
// write the new shared edge points, normals, and segments for
|
// write the new shared edge points, normals, and segments for
|
||||||
// this tile
|
// this tile
|
||||||
void write_shared( FGConstruct& c );
|
void write_shared( TGConstruct& c );
|
||||||
|
|
||||||
// reassemble the tile pieces (combining the shared data and our
|
// reassemble the tile pieces (combining the shared data and our
|
||||||
// own data)
|
// own data)
|
||||||
void assemble_tile( FGConstruct& c );
|
void assemble_tile( TGConstruct& c );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,20 +33,20 @@ SG_USING_STD(endl);
|
||||||
|
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
FGTriangle::FGTriangle( void ) {
|
TGTriangle::TGTriangle( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
FGTriangle::~FGTriangle( void ) {
|
TGTriangle::~TGTriangle( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// populate this class based on the specified gpc_polys list
|
// populate this class based on the specified gpc_polys list
|
||||||
int
|
int
|
||||||
FGTriangle::build( const point_list& corner_list,
|
TGTriangle::build( const point_list& corner_list,
|
||||||
const point_list& fit_list,
|
const point_list& fit_list,
|
||||||
const FGPolyList& gpc_polys )
|
const TGPolyList& gpc_polys )
|
||||||
{
|
{
|
||||||
int debug_counter = 0;
|
int debug_counter = 0;
|
||||||
int index;
|
int index;
|
||||||
|
@ -78,7 +78,7 @@ FGTriangle::build( const point_list& corner_list,
|
||||||
// process polygons in priority order
|
// process polygons in priority order
|
||||||
cout << "prepairing node list and polygons" << endl;
|
cout << "prepairing node list and polygons" << endl;
|
||||||
|
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
polylist[i].clear();
|
polylist[i].clear();
|
||||||
|
|
||||||
cout << "area type = " << i << " polys = " << gpc_polys.polys[i].size()
|
cout << "area type = " << i << " polys = " << gpc_polys.polys[i].size()
|
||||||
|
@ -198,7 +198,7 @@ FGTriangle::build( const point_list& corner_list,
|
||||||
index = in_nodes.course_add( fit_list[i] );
|
index = in_nodes.course_add( fit_list[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
if ( polylist[i].size() ) {
|
if ( polylist[i].size() ) {
|
||||||
cout << get_area_name((AreaType)i) << " = "
|
cout << get_area_name((AreaType)i) << " = "
|
||||||
<< polylist[i].size() << endl;
|
<< polylist[i].size() << endl;
|
||||||
|
@ -214,7 +214,7 @@ FGTriangle::build( const point_list& corner_list,
|
||||||
point_list node_list = in_nodes.get_node_list();
|
point_list node_list = in_nodes.get_node_list();
|
||||||
TGPolygon poly;
|
TGPolygon poly;
|
||||||
|
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
cout << "area type = " << i << endl;
|
cout << "area type = " << i << endl;
|
||||||
poly_list_iterator tp_current, tp_last;
|
poly_list_iterator tp_current, tp_last;
|
||||||
tp_current = polylist[i].begin();
|
tp_current = polylist[i].begin();
|
||||||
|
@ -265,7 +265,7 @@ FGTriangle::build( const point_list& corner_list,
|
||||||
|
|
||||||
|
|
||||||
// populate this class based on the specified gpc_polys list
|
// populate this class based on the specified gpc_polys list
|
||||||
int FGTriangle::rebuild( FGConstruct& c ) {
|
int TGTriangle::rebuild( TGConstruct& c ) {
|
||||||
in_nodes.clear();
|
in_nodes.clear();
|
||||||
in_segs.clear();
|
in_segs.clear();
|
||||||
|
|
||||||
|
@ -338,7 +338,7 @@ static void write_out_data(struct triangulateio *out) {
|
||||||
// generates extra nodes for a better triangulation. 2 = second pass
|
// generates extra nodes for a better triangulation. 2 = second pass
|
||||||
// after split/reassem where we don't want any extra nodes generated.
|
// after split/reassem where we don't want any extra nodes generated.
|
||||||
|
|
||||||
int FGTriangle::run_triangulate( const string& angle, const int pass ) {
|
int TGTriangle::run_triangulate( const string& angle, const int pass ) {
|
||||||
TGPolygon poly;
|
TGPolygon poly;
|
||||||
Point3D p;
|
Point3D p;
|
||||||
struct triangulateio in, out, vorout;
|
struct triangulateio in, out, vorout;
|
||||||
|
@ -420,7 +420,7 @@ int FGTriangle::run_triangulate( const string& angle, const int pass ) {
|
||||||
|
|
||||||
// region list
|
// region list
|
||||||
in.numberofregions = 0;
|
in.numberofregions = 0;
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
poly_list_iterator h_current, h_last;
|
poly_list_iterator h_current, h_last;
|
||||||
h_current = polylist[i].begin();
|
h_current = polylist[i].begin();
|
||||||
h_last = polylist[i].end();
|
h_last = polylist[i].end();
|
||||||
|
@ -436,7 +436,7 @@ int FGTriangle::run_triangulate( const string& angle, const int pass ) {
|
||||||
|
|
||||||
in.regionlist = (REAL *) malloc(in.numberofregions * 4 * sizeof(REAL));
|
in.regionlist = (REAL *) malloc(in.numberofregions * 4 * sizeof(REAL));
|
||||||
counter = 0;
|
counter = 0;
|
||||||
for ( i = 0; i < FG_MAX_AREA_TYPES; ++i ) {
|
for ( i = 0; i < TG_MAX_AREA_TYPES; ++i ) {
|
||||||
poly_list_iterator h_current, h_last;
|
poly_list_iterator h_current, h_last;
|
||||||
h_current = polylist[(int)i].begin();
|
h_current = polylist[(int)i].begin();
|
||||||
h_last = polylist[(int)i].end();
|
h_last = polylist[(int)i].end();
|
||||||
|
@ -504,7 +504,7 @@ int FGTriangle::run_triangulate( const string& angle, const int pass ) {
|
||||||
tri_options = "pczYYAen";
|
tri_options = "pczYYAen";
|
||||||
} else {
|
} else {
|
||||||
cout << "unknown pass number = " << pass
|
cout << "unknown pass number = " << pass
|
||||||
<< " in FGTriangle::run_triangulate()" << endl;
|
<< " in TGTriangle::run_triangulate()" << endl;
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
cout << "Triangulation with options = " << tri_options << endl;
|
cout << "Triangulation with options = " << tri_options << endl;
|
||||||
|
@ -514,7 +514,7 @@ int FGTriangle::run_triangulate( const string& angle, const int pass ) {
|
||||||
// TEMPORARY
|
// TEMPORARY
|
||||||
// write_tri_data(&out);
|
// write_tri_data(&out);
|
||||||
|
|
||||||
// now copy the results back into the corresponding FGTriangle
|
// now copy the results back into the corresponding TGTriangle
|
||||||
// structures
|
// structures
|
||||||
|
|
||||||
// nodes
|
// nodes
|
||||||
|
@ -548,7 +548,7 @@ int FGTriangle::run_triangulate( const string& angle, const int pass ) {
|
||||||
}
|
}
|
||||||
// cout << "triangle = " << n1 << " " << n2 << " " << n3 << endl;
|
// cout << "triangle = " << n1 << " " << n2 << " " << n3 << endl;
|
||||||
|
|
||||||
elelist.push_back( FGTriEle( n1, n2, n3, attribute ) );
|
elelist.push_back( TGTriEle( n1, n2, n3, attribute ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// free mem allocated to the "Triangle" structures
|
// free mem allocated to the "Triangle" structures
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include <simgear/math/point3d.hxx>
|
#include <simgear/math/point3d.hxx>
|
||||||
|
|
||||||
#include <Array/array.hxx>
|
#include <Array/array.hxx>
|
||||||
#include <Clipper/clipper.hxx>
|
|
||||||
#include <Main/construct.hxx>
|
#include <Main/construct.hxx>
|
||||||
|
|
||||||
#include <Geometry/trinodes.hxx>
|
#include <Geometry/trinodes.hxx>
|
||||||
|
@ -50,7 +49,7 @@ extern "C" {
|
||||||
#include "trieles.hxx"
|
#include "trieles.hxx"
|
||||||
|
|
||||||
|
|
||||||
class FGTriangle {
|
class TGTriangle {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -63,7 +62,7 @@ private:
|
||||||
TGTriSegments out_segs;
|
TGTriSegments out_segs;
|
||||||
|
|
||||||
// polygon list
|
// polygon list
|
||||||
poly_list polylist[FG_MAX_AREA_TYPES];
|
poly_list polylist[TG_MAX_AREA_TYPES];
|
||||||
|
|
||||||
// triangle list
|
// triangle list
|
||||||
triele_list elelist;
|
triele_list elelist;
|
||||||
|
@ -71,8 +70,8 @@ private:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor and destructor
|
// Constructor and destructor
|
||||||
FGTriangle( void );
|
TGTriangle( void );
|
||||||
~FGTriangle( void );
|
~TGTriangle( void );
|
||||||
|
|
||||||
// add nodes from the dem fit
|
// add nodes from the dem fit
|
||||||
int add_nodes();
|
int add_nodes();
|
||||||
|
@ -80,10 +79,10 @@ public:
|
||||||
// populate this class based on the specified gpc_polys list
|
// populate this class based on the specified gpc_polys list
|
||||||
int build( const point_list& corner_list,
|
int build( const point_list& corner_list,
|
||||||
const point_list& fit_list,
|
const point_list& fit_list,
|
||||||
const FGPolyList& gpc_polys );
|
const TGPolyList& gpc_polys );
|
||||||
|
|
||||||
// populate this class based on the specified gpc_polys list
|
// populate this class based on the specified gpc_polys list
|
||||||
int rebuild( FGConstruct& c );
|
int rebuild( TGConstruct& c );
|
||||||
|
|
||||||
// Front end triangulator for polygon list. Allocates and builds
|
// Front end triangulator for polygon list. Allocates and builds
|
||||||
// up all the needed structures for the triangulator, runs it,
|
// up all the needed structures for the triangulator, runs it,
|
||||||
|
|
|
@ -38,7 +38,7 @@ SG_USING_STD(vector);
|
||||||
|
|
||||||
|
|
||||||
// a segment is two integer pointers into the node list
|
// a segment is two integer pointers into the node list
|
||||||
class FGTriEle {
|
class TGTriEle {
|
||||||
int n1, n2, n3;
|
int n1, n2, n3;
|
||||||
|
|
||||||
double attribute;
|
double attribute;
|
||||||
|
@ -46,12 +46,12 @@ class FGTriEle {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor and destructor
|
// Constructor and destructor
|
||||||
inline FGTriEle( void ) { };
|
inline TGTriEle( void ) { };
|
||||||
inline FGTriEle( int i1, int i2, int i3, double a ) {
|
inline TGTriEle( int i1, int i2, int i3, double a ) {
|
||||||
n1 = i1; n2 = i2; n3 = i3; attribute = a;
|
n1 = i1; n2 = i2; n3 = i3; attribute = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline ~FGTriEle( void ) { };
|
inline ~TGTriEle( void ) { };
|
||||||
|
|
||||||
inline int get_n1() const { return n1; }
|
inline int get_n1() const { return n1; }
|
||||||
inline void set_n1( int i ) { n1 = i; }
|
inline void set_n1( int i ) { n1 = i; }
|
||||||
|
@ -65,7 +65,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef vector < FGTriEle > triele_list;
|
typedef vector < TGTriEle > triele_list;
|
||||||
typedef triele_list::iterator triele_list_iterator;
|
typedef triele_list::iterator triele_list_iterator;
|
||||||
typedef triele_list::const_iterator const_triele_list_iterator;
|
typedef triele_list::const_iterator const_triele_list_iterator;
|
||||||
|
|
||||||
|
|
|
@ -382,7 +382,7 @@ void polygon_tesselate( const TGPolygon &p,
|
||||||
// TEMPORARY
|
// TEMPORARY
|
||||||
// write_tri_data(&out);
|
// write_tri_data(&out);
|
||||||
|
|
||||||
// now copy the results back into the corresponding FGTriangle
|
// now copy the results back into the corresponding TGTriangle
|
||||||
// structures
|
// structures
|
||||||
|
|
||||||
// triangles
|
// triangles
|
||||||
|
@ -400,7 +400,7 @@ void polygon_tesselate( const TGPolygon &p,
|
||||||
}
|
}
|
||||||
// cout << "triangle = " << n1 << " " << n2 << " " << n3 << endl;
|
// cout << "triangle = " << n1 << " " << n2 << " " << n3 << endl;
|
||||||
|
|
||||||
elelist.push_back( FGTriEle( n1, n2, n3, attribute ) );
|
elelist.push_back( TGTriEle( n1, n2, n3, attribute ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// output points
|
// output points
|
||||||
|
@ -468,7 +468,7 @@ TGPolygon polygon_tesselate_alt( TGPolygon &p ) {
|
||||||
// 3. Convert the tesselated output to a list of tringles.
|
// 3. Convert the tesselated output to a list of tringles.
|
||||||
// basically a polygon with a contour for every triangle
|
// basically a polygon with a contour for every triangle
|
||||||
for ( i = 0; i < (int)trieles.size(); ++i ) {
|
for ( i = 0; i < (int)trieles.size(); ++i ) {
|
||||||
FGTriEle t = trieles[i];
|
TGTriEle t = trieles[i];
|
||||||
Point3D p1 = nodes[ t.get_n1() ];
|
Point3D p1 = nodes[ t.get_n1() ];
|
||||||
Point3D p2 = nodes[ t.get_n2() ];
|
Point3D p2 = nodes[ t.get_n2() ];
|
||||||
Point3D p3 = nodes[ t.get_n3() ];
|
Point3D p3 = nodes[ t.get_n3() ];
|
||||||
|
@ -515,7 +515,7 @@ static void contour_tesselate( TGContourNode *node, const TGPolygon &p,
|
||||||
out_pts.push_back( Point3D(0, 0, 0) );
|
out_pts.push_back( Point3D(0, 0, 0) );
|
||||||
out_pts.push_back( Point3D(0, 1, 0) );
|
out_pts.push_back( Point3D(0, 1, 0) );
|
||||||
out_pts.push_back( Point3D(1, 1, 0) );
|
out_pts.push_back( Point3D(1, 1, 0) );
|
||||||
elelist.push_back( FGTriEle( 0, 1, 2, 0.0 ) );
|
elelist.push_back( TGTriEle( 0, 1, 2, 0.0 ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -661,7 +661,7 @@ static void contour_tesselate( TGContourNode *node, const TGPolygon &p,
|
||||||
// TEMPORARY
|
// TEMPORARY
|
||||||
// write_tri_data(&out);
|
// write_tri_data(&out);
|
||||||
|
|
||||||
// now copy the results back into the corresponding FGTriangle
|
// now copy the results back into the corresponding TGTriangle
|
||||||
// structures
|
// structures
|
||||||
|
|
||||||
// triangles
|
// triangles
|
||||||
|
@ -679,7 +679,7 @@ static void contour_tesselate( TGContourNode *node, const TGPolygon &p,
|
||||||
}
|
}
|
||||||
// cout << "triangle = " << n1 << " " << n2 << " " << n3 << endl;
|
// cout << "triangle = " << n1 << " " << n2 << " " << n3 << endl;
|
||||||
|
|
||||||
elelist.push_back( FGTriEle( n1, n2, n3, attribute ) );
|
elelist.push_back( TGTriEle( n1, n2, n3, attribute ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// output points
|
// output points
|
||||||
|
@ -728,7 +728,7 @@ static Point3D point_inside_hole( point_list contour ) {
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
FGTriEle t = elelist[0];
|
TGTriEle t = elelist[0];
|
||||||
Point3D p1 = contour[ t.get_n1() ];
|
Point3D p1 = contour[ t.get_n1() ];
|
||||||
Point3D p2 = contour[ t.get_n2() ];
|
Point3D p2 = contour[ t.get_n2() ];
|
||||||
Point3D p3 = contour[ t.get_n3() ];
|
Point3D p3 = contour[ t.get_n3() ];
|
||||||
|
@ -778,7 +778,7 @@ static Point3D point_inside_contour( TGContourNode *node, const TGPolygon &p ) {
|
||||||
double max_area = 0.0;
|
double max_area = 0.0;
|
||||||
int biggest = 0;
|
int biggest = 0;
|
||||||
for ( i = 0; i < (int)elelist.size(); ++i ) {
|
for ( i = 0; i < (int)elelist.size(); ++i ) {
|
||||||
FGTriEle t = elelist[i];
|
TGTriEle t = elelist[i];
|
||||||
Point3D p1 = out_pts[ t.get_n1() ];
|
Point3D p1 = out_pts[ t.get_n1() ];
|
||||||
Point3D p2 = out_pts[ t.get_n2() ];
|
Point3D p2 = out_pts[ t.get_n2() ];
|
||||||
Point3D p3 = out_pts[ t.get_n3() ];
|
Point3D p3 = out_pts[ t.get_n3() ];
|
||||||
|
@ -791,7 +791,7 @@ static Point3D point_inside_contour( TGContourNode *node, const TGPolygon &p ) {
|
||||||
|
|
||||||
// find center point of largest triangle
|
// find center point of largest triangle
|
||||||
cout << "biggest = " << biggest + 1 << " out of " << elelist.size() << endl;
|
cout << "biggest = " << biggest + 1 << " out of " << elelist.size() << endl;
|
||||||
FGTriEle t = elelist[biggest];
|
TGTriEle t = elelist[biggest];
|
||||||
contour_num = node->get_contour_num();
|
contour_num = node->get_contour_num();
|
||||||
Point3D p1 = out_pts[ t.get_n1() ];
|
Point3D p1 = out_pts[ t.get_n1() ];
|
||||||
Point3D p2 = out_pts[ t.get_n2() ];
|
Point3D p2 = out_pts[ t.get_n2() ];
|
||||||
|
|
|
@ -40,7 +40,7 @@ int TGTriNodes::unique_add( const Point3D& p ) {
|
||||||
point_list_iterator current, last;
|
point_list_iterator current, last;
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
|
|
||||||
// cout << p.x() << "," << p.y() << endl;
|
cout << "unique add = " << p << endl;
|
||||||
|
|
||||||
// see if point already exists
|
// see if point already exists
|
||||||
current = node_list.begin();
|
current = node_list.begin();
|
||||||
|
@ -48,6 +48,12 @@ int TGTriNodes::unique_add( const Point3D& p ) {
|
||||||
for ( ; current != last; ++current ) {
|
for ( ; current != last; ++current ) {
|
||||||
if ( close_enough_2d(p, *current) ) {
|
if ( close_enough_2d(p, *current) ) {
|
||||||
// cout << "found an existing match!" << endl;
|
// cout << "found an existing match!" << endl;
|
||||||
|
|
||||||
|
// update elevation if new point has better info
|
||||||
|
if ( p.z() > current->z() ) {
|
||||||
|
current->setz( p.z() );
|
||||||
|
}
|
||||||
|
|
||||||
return counter;
|
return counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,6 +118,12 @@ int TGTriNodes::course_add( const Point3D& p ) {
|
||||||
for ( ; current != last; ++current ) {
|
for ( ; current != last; ++current ) {
|
||||||
if ( course_close_enough(p, *current) ) {
|
if ( course_close_enough(p, *current) ) {
|
||||||
// cout << "found an existing match!" << endl;
|
// cout << "found an existing match!" << endl;
|
||||||
|
|
||||||
|
// update elevation if new point has better info
|
||||||
|
if ( p.z() > current->z() ) {
|
||||||
|
current->setz( p.z() );
|
||||||
|
}
|
||||||
|
|
||||||
return counter;
|
return counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,14 +54,14 @@ static void add_and_expand( opt_list& by_node, int n, int i ) {
|
||||||
|
|
||||||
// given an input triangle, shuffle nodes so that "center" is the
|
// given an input triangle, shuffle nodes so that "center" is the
|
||||||
// first node, but maintain winding order.
|
// first node, but maintain winding order.
|
||||||
static FGTriEle canonify( const FGTriEle& t, int center ) {
|
static TGTriEle canonify( const TGTriEle& t, int center ) {
|
||||||
if ( t.get_n1() == center ) {
|
if ( t.get_n1() == center ) {
|
||||||
// already ok
|
// already ok
|
||||||
return t;
|
return t;
|
||||||
} else if ( t.get_n2() == center ) {
|
} else if ( t.get_n2() == center ) {
|
||||||
return FGTriEle( t.get_n2(), t.get_n3(), t.get_n1(), 0.0 );
|
return TGTriEle( t.get_n2(), t.get_n3(), t.get_n1(), 0.0 );
|
||||||
} else if ( t.get_n3() == center ) {
|
} else if ( t.get_n3() == center ) {
|
||||||
return FGTriEle( t.get_n3(), t.get_n1(), t.get_n2(), 0.0 );
|
return TGTriEle( t.get_n3(), t.get_n1(), t.get_n2(), 0.0 );
|
||||||
} else {
|
} else {
|
||||||
cout << "ERROR, index doesn't refer to this triangle!!!" << endl;
|
cout << "ERROR, index doesn't refer to this triangle!!!" << endl;
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
@ -86,8 +86,8 @@ static int_list make_best_fan( const triele_list& master_tris,
|
||||||
int_list tmp_result;
|
int_list tmp_result;
|
||||||
tmp_result.clear();
|
tmp_result.clear();
|
||||||
|
|
||||||
FGTriEle current_tri;
|
TGTriEle current_tri;
|
||||||
FGTriEle test;
|
TGTriEle test;
|
||||||
current_tri = canonify( master_tris[local_tris[start]], center );
|
current_tri = canonify( master_tris[local_tris[start]], center );
|
||||||
tmp_result.push_back( local_tris[start] );
|
tmp_result.push_back( local_tris[start] );
|
||||||
|
|
||||||
|
@ -200,7 +200,7 @@ opt_list TGGenFans::greedy_build( triele_list tris ) {
|
||||||
int_list_iterator i_current = i_start;
|
int_list_iterator i_current = i_start;
|
||||||
int_list_iterator i_last = best_fan.end();
|
int_list_iterator i_last = best_fan.end();
|
||||||
for ( ; i_current != i_last; ++i_current ) {
|
for ( ; i_current != i_last; ++i_current ) {
|
||||||
FGTriEle t = canonify( tris[*i_current], index );
|
TGTriEle t = canonify( tris[*i_current], index );
|
||||||
if ( i_start == i_current ) {
|
if ( i_start == i_current ) {
|
||||||
node_list.push_back( t.get_n1() );
|
node_list.push_back( t.get_n1() );
|
||||||
node_list.push_back( t.get_n2() );
|
node_list.push_back( t.get_n2() );
|
||||||
|
|
Loading…
Add table
Reference in a new issue