1
0
Fork 0

Updates to the scenery loading infrastructure to make it more flexible,

clean up some messiness, and lay more groundwork for runway lighting.
This commit is contained in:
curt 2002-03-03 20:29:31 +00:00
parent 9c42c9288a
commit 938d006188
4 changed files with 82 additions and 54 deletions

View file

@ -108,19 +108,17 @@ static Point3D local_calc_tex_coords(const Point3D& node, const Point3D& ref) {
}
// Generate a generic ocean tile on the fly
ssgBranch *fgGenTile( const string& path, FGTileEntry *t) {
// Generate an ocean tile
bool fgGenTile( const string& path, SGBucket b,
Point3D *center,
double *bounding_radius,
ssgBranch* geometry )
{
FGNewMat *newmat;
ssgSimpleState *state = NULL;
ssgBranch *tile = new ssgBranch () ;
if ( !tile ) {
SG_LOG( SG_TERRAIN, SG_ALERT, "fgGenTile(): NO MEMORY" );
return NULL;
}
tile -> setName ( (char *)path.c_str() ) ;
geometry -> setName ( (char *)path.c_str() ) ;
double tex_width = 1000.0;
// double tex_height;
@ -142,14 +140,14 @@ ssgBranch *fgGenTile( const string& path, FGTileEntry *t) {
}
// Calculate center point
SGBucket b = t->tile_bucket;
double clon = b.get_center_lon();
double clat = b.get_center_lat();
double height = b.get_height();
double width = b.get_width();
Point3D center = sgGeodToCart(Point3D(clon*SGD_DEGREES_TO_RADIANS,clat*SGD_DEGREES_TO_RADIANS,0.0));
t->center = center;
*center = sgGeodToCart( Point3D(clon*SGD_DEGREES_TO_RADIANS,
clat*SGD_DEGREES_TO_RADIANS,
0.0) );
// cout << "center = " << center << endl;;
// Caculate corner vertices
@ -168,18 +166,14 @@ ssgBranch *fgGenTile( const string& path, FGTileEntry *t) {
}
Point3D cart[4], rel[4];
t->nodes.clear();
for ( i = 0; i < 4; ++i ) {
cart[i] = sgGeodToCart(rad[i]);
rel[i] = cart[i] - center;
t->nodes.push_back( rel[i] );
rel[i] = cart[i] - *center;
// cout << "corner " << i << " = " << cart[i] << endl;
}
t->ncount = 4;
// Calculate bounding radius
t->bounding_radius = center.distance3D( cart[0] );
*bounding_radius = center->distance3D( cart[0] );
// cout << "bounding radius = " << t->bounding_radius << endl;
// Calculate normals
@ -239,9 +233,9 @@ ssgBranch *fgGenTile( const string& path, FGTileEntry *t) {
leaf->setState( state );
tile->addKid( leaf );
geometry->addKid( leaf );
return tile;
return true;
}
@ -311,7 +305,7 @@ static void gen_random_surface_points( ssgLeaf *leaf, ssgVertexArray *lights,
// Load an Ascii obj file
ssgBranch *fgAsciiObjLoad( const string& path, FGTileEntry *t,
ssgVertexArray *lights, const bool is_base)
ssgVertexArray *lights, const bool is_base)
{
FGNewMat *newmat = NULL;
string material;
@ -906,28 +900,29 @@ ssgLeaf *gen_leaf( const string& path,
// Load an Binary obj file
ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
ssgVertexArray *lights, const bool is_base)
bool fgBinObjLoad( const string& path, const bool is_base,
Point3D *center,
double *bounding_radius,
ssgBranch* geometry,
ssgBranch* rwy_lights,
ssgVertexArray *ground_lights )
{
int i;
SGBinObject obj;
bool result = obj.read_bin( path );
if ( !result ) {
return NULL;
return false;
}
// cout << "fans size = " << obj.get_fans_v().size()
// << " fan_mats size = " << obj.get_fan_materials().size() << endl;
ssgBranch *object = new ssgBranch();
object->setName( (char *)path.c_str() );
geometry->setName( (char *)path.c_str() );
if ( is_base && t != NULL ) {
if ( is_base ) {
// reference point (center offset/bounding sphere)
t->center = obj.get_gbs_center();
t->bounding_radius = obj.get_gbs_radius();
*center = obj.get_gbs_center();
*bounding_radius = obj.get_gbs_radius();
}
point_list nodes = obj.get_wgs84_nodes();
@ -939,6 +934,8 @@ ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
int_list vertex_index;
int_list tex_index;
int i;
// generate points
string_list pt_materials = obj.get_pt_materials();
group_list pts_v = obj.get_pts_v();
@ -950,9 +947,9 @@ ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
ssgLeaf *leaf = gen_leaf( path, GL_POINTS, material,
nodes, normals, texcoords,
vertex_index, tex_index,
false, lights );
false, ground_lights );
object->addKid( leaf );
geometry->addKid( leaf );
}
// generate triangles
@ -966,9 +963,9 @@ ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
ssgLeaf *leaf = gen_leaf( path, GL_TRIANGLES, material,
nodes, normals, texcoords,
vertex_index, tex_index,
is_base, lights );
is_base, ground_lights );
object->addKid( leaf );
geometry->addKid( leaf );
}
// generate strips
@ -982,9 +979,9 @@ ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
ssgLeaf *leaf = gen_leaf( path, GL_TRIANGLE_STRIP, material,
nodes, normals, texcoords,
vertex_index, tex_index,
is_base, lights );
is_base, ground_lights );
object->addKid( leaf );
geometry->addKid( leaf );
}
// generate fans
@ -998,10 +995,10 @@ ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
ssgLeaf *leaf = gen_leaf( path, GL_TRIANGLE_FAN, material,
nodes, normals, texcoords,
vertex_index, tex_index,
is_base, lights );
is_base, ground_lights );
object->addKid( leaf );
geometry->addKid( leaf );
}
return object;
return true;
}

View file

@ -57,16 +57,23 @@ SG_USING_STD(string);
#define FG_MAX_NODES 4000
// Load a binary object file
ssgBranch *fgBinObjLoad(const string& path, FGTileEntry *tile,
ssgVertexArray *lights, const bool is_base);
// Load an Binary obj file
bool fgBinObjLoad( const string& path, const bool is_base,
Point3D *center,
double *bounding_radius,
ssgBranch* geometry,
ssgBranch* rwy_lights,
ssgVertexArray *ground_lights );
// Load an ascii object file
ssgBranch *fgAsciiObjLoad(const string& path, FGTileEntry *tile,
ssgVertexArray *lights, const bool is_base);
// Generate an ocean tile
ssgBranch *fgGenTile( const string& path, FGTileEntry *t);
bool fgGenTile( const string& path, SGBucket b,
Point3D *center,
double *bounding_radius,
ssgBranch* geometry );
// Create an ssg leaf

View file

@ -959,22 +959,42 @@ ssgLeaf* FGTileEntry::gen_lights( ssgVertexArray *lights, int inc, float bright
ssgBranch*
FGTileEntry::obj_load( const std::string& path,
ssgVertexArray* lights, bool is_base )
ssgVertexArray* ground_lights, bool is_base )
{
ssgBranch* result = 0;
ssgBranch* geometry = new ssgBranch;
ssgBranch* rwy_lights = new ssgBranch;
Point3D c; // returned center point
double br; // returned bounding radius
// try loading binary format
result = fgBinObjLoad( path, this, lights, is_base );
if ( result == NULL ) {
// next try the older ascii format
result = fgAsciiObjLoad( path, this, lights, is_base );
if ( result == NULL ) {
if ( fgBinObjLoad( path, is_base,
&c, &br, geometry, rwy_lights, ground_lights ) )
{
if ( is_base ) {
center = c;
bounding_radius = br;
}
} else {
// next try the older ascii format, this is some ugly
// weirdness because the ascii loader is *old* and hasn't been
// updated, but hopefully we can can the ascii format soon.
ssgBranch *tmp = fgAsciiObjLoad( path, this, ground_lights, is_base );
if ( tmp ) {
return tmp;
} else {
// default to an ocean tile
result = fgGenTile( path, this );
if ( fgGenTile( path, tile_bucket, &c, &br, geometry ) ) {
center = c;
bounding_radius = br;
} else {
SG_LOG( SG_TERRAIN, SG_ALERT,
"Warning: failed to generate ocean tile!" );
}
}
}
return result;
return geometry;
}

View file

@ -104,6 +104,8 @@ class FGTileEntry {
public:
/* CLO123 FROM HERE TO THE CORRESPONDING MARKER ARE THINGS THAT
CAN BE DELETED AFTER WE DROP THE ASCII SCENERY FORMAT */
typedef vector < sgVec3 * > free_vec3_list;
typedef vector < sgVec2 * > free_vec2_list;
typedef vector < unsigned short * > free_index_list;
@ -111,6 +113,7 @@ public:
// node list
point_list nodes;
int ncount;
/* CLO123 MARKER */
// global tile culling data
Point3D center;
@ -180,7 +183,8 @@ private:
volatile int pending_models;
ssgBranch* obj_load( const std::string& path,
ssgVertexArray* lights, bool is_base );
ssgVertexArray* gound_lights,
bool is_base );
ssgLeaf* gen_lights( ssgVertexArray *lights, int inc, float bright );