From f347d6d291192ef73cd6e7162a047382cd6370a6 Mon Sep 17 00:00:00 2001 From: curt Date: Tue, 6 May 2003 14:20:30 +0000 Subject: [PATCH] Removed support of old Ascii scenery format. The loader had not been maintianed or upgraded in a *long* time so it didn't support many new features like the runway lighting. If anyone was using it for anything, it should not be a huge amount of work to switch to the binary format. SimGear includes a reader and writer for the binary format. --- src/Objects/obj.cxx | 489 +------------------------------------- src/Objects/obj.hxx | 10 +- src/Scenery/tileentry.cxx | 20 +- 3 files changed, 11 insertions(+), 508 deletions(-) diff --git a/src/Objects/obj.cxx b/src/Objects/obj.cxx index 8fda04db2..ebdda8144 100644 --- a/src/Objects/obj.cxx +++ b/src/Objects/obj.cxx @@ -1,4 +1,5 @@ -// obj.cxx -- routines to handle "sorta" WaveFront .obj format files. +// obj.hxx -- routines to handle loading scenery and building the plib +// scene graph. // // Written by Curtis Olson, started October 1997. // @@ -71,9 +72,6 @@ typedef int_list::iterator int_list_iterator; typedef int_list::const_iterator int_point_list_iterator; -static double normals[FG_MAX_NODES][3]; -static double tex_coords[FG_MAX_NODES*3][3]; - // not used because plib branches don't honor call backs. static int runway_lights_pretrav (ssgEntity * e, int mask) @@ -85,44 +83,6 @@ runway_lights_pretrav (ssgEntity * e, int mask) } -#define FG_TEX_CONSTANT 69.0 - -// Calculate texture coordinates for a given point. -static Point3D local_calc_tex_coords(const Point3D& node, const Point3D& ref) { - Point3D cp; - Point3D pp; - // double tmplon, tmplat; - - // cout << "-> " << node[0] << " " << node[1] << " " << node[2] << endl; - // cout << "-> " << ref.x() << " " << ref.y() << " " << ref.z() << endl; - - cp = Point3D( node[0] + ref.x(), - node[1] + ref.y(), - node[2] + ref.z() ); - - pp = sgCartToPolar3d(cp); - - // tmplon = pp.lon() * SGD_RADIANS_TO_DEGREES; - // tmplat = pp.lat() * SGD_RADIANS_TO_DEGREES; - // cout << tmplon << " " << tmplat << endl; - - pp.setx( fmod(SGD_RADIANS_TO_DEGREES * FG_TEX_CONSTANT * pp.x(), 11.0) ); - pp.sety( fmod(SGD_RADIANS_TO_DEGREES * FG_TEX_CONSTANT * pp.y(), 11.0) ); - - if ( pp.x() < 0.0 ) { - pp.setx( pp.x() + 11.0 ); - } - - if ( pp.y() < 0.0 ) { - pp.sety( pp.y() + 11.0 ); - } - - // cout << pp << endl; - - return(pp); -} - - // Generate an ocean tile bool fgGenTile( const string& path, SGBucket b, Point3D *center, @@ -766,451 +726,6 @@ gen_random_surface_objects (ssgLeaf *leaf, // Scenery loaders. //////////////////////////////////////////////////////////////////////// - -// Load an Ascii obj file -ssgBranch *fgAsciiObjLoad( const string& path, FGTileEntry *t, - ssgVertexArray *lights, const bool is_base) -{ - FGNewMat *newmat = NULL; - string material; - float coverage = -1; - Point3D pp; - // sgVec3 approx_normal; - // double normal[3], scale = 0.0; - // double x, y, z, xmax, xmin, ymax, ymin, zmax, zmin; - // GLfloat sgenparams[] = { 1.0, 0.0, 0.0, 0.0 }; - // GLint display_list = 0; - int shading; - bool in_faces = false; - int vncount, vtcount; - int n1 = 0, n2 = 0, n3 = 0; - int tex; - // int last1 = 0, last2 = 0; - bool odd = false; - point_list nodes; - Point3D node; - Point3D center; - double scenery_version = 0.0; - double tex_width = 1000.0, tex_height = 1000.0; - bool shared_done = false; - int_list fan_vertices; - int_list fan_tex_coords; - int i; - ssgSimpleState *state = NULL; - sgVec3 *vtlist, *vnlist; - sgVec2 *tclist; - - ssgBranch *tile = new ssgBranch () ; - - tile -> setName ( (char *)path.c_str() ) ; - - // Attempt to open "path.gz" or "path" - sg_gzifstream in( path ); - if ( ! in.is_open() ) { - SG_LOG( SG_TERRAIN, SG_DEBUG, "Cannot open file: " << path ); - SG_LOG( SG_TERRAIN, SG_DEBUG, "default to ocean tile: " << path ); - - delete tile; - - return NULL; - } - - shading = fgGetBool("/sim/rendering/shading"); - - if ( is_base ) { - t->ncount = 0; - } - vncount = 0; - vtcount = 0; - if ( is_base ) { - t->bounding_radius = 0.0; - } - center = t->center; - - // StopWatch stopwatch; - // stopwatch.start(); - - // ignore initial comments and blank lines. (priming the pump) - // in >> skipcomment; - // string line; - - string token; - char c; - -#ifdef __MWERKS__ - while ( in.get(c) && c != '\0' ) { - in.putback(c); -#else - while ( ! in.eof() ) { -#endif - in >> ::skipws; - - if ( in.get( c ) && c == '#' ) { - // process a comment line - - // getline( in, line ); - // cout << "comment = " << line << endl; - - in >> token; - - if ( token == "Version" ) { - // read scenery versions number - in >> scenery_version; - // cout << "scenery_version = " << scenery_version << endl; - if ( scenery_version > 0.4 ) { - SG_LOG( SG_TERRAIN, SG_ALERT, - "\nYou are attempting to load a tile format that\n" - << "is newer than this version of flightgear can\n" - << "handle. You should upgrade your copy of\n" - << "FlightGear to the newest version. For\n" - << "details, please see:\n" - << "\n http://www.flightgear.org\n" ); - exit(-1); - } - } else if ( token == "gbs" ) { - // reference point (center offset) - if ( is_base ) { - in >> t->center >> t->bounding_radius; - } else { - Point3D junk1; - double junk2; - in >> junk1 >> junk2; - } - center = t->center; - // cout << "center = " << center - // << " radius = " << t->bounding_radius << endl; - } else if ( token == "bs" ) { - // reference point (center offset) - // (skip past this) - Point3D junk1; - double junk2; - in >> junk1 >> junk2; - } else if ( token == "usemtl" ) { - // material property specification - - // if first usemtl with shared_done = false, then set - // shared_done true and build the ssg shared lists - if ( ! shared_done ) { - // sanity check - if ( (int)nodes.size() != vncount ) { - SG_LOG( SG_TERRAIN, SG_ALERT, - "Tile has mismatched nodes = " << nodes.size() - << " and normals = " << vncount << " : " - << path ); - // exit(-1); - } - shared_done = true; - - vtlist = new sgVec3 [ nodes.size() ]; - t->vec3_ptrs.push_back( vtlist ); - vnlist = new sgVec3 [ vncount ]; - t->vec3_ptrs.push_back( vnlist ); - tclist = new sgVec2 [ vtcount ]; - t->vec2_ptrs.push_back( tclist ); - - for ( i = 0; i < (int)nodes.size(); ++i ) { - sgSetVec3( vtlist[i], - nodes[i][0], nodes[i][1], nodes[i][2] ); - } - for ( i = 0; i < vncount; ++i ) { - sgSetVec3( vnlist[i], - normals[i][0], - normals[i][1], - normals[i][2] ); - } - for ( i = 0; i < vtcount; ++i ) { - sgSetVec2( tclist[i], - tex_coords[i][0], - tex_coords[i][1] ); - } - } - - // display_list = xglGenLists(1); - // xglNewList(display_list, GL_COMPILE); - // printf("xglGenLists(); xglNewList();\n"); - in_faces = false; - - // scan the material line - in >> material; - - // find this material in the properties list - - newmat = material_lib.find( material ); - if ( newmat == NULL ) { - // see if this is an on the fly texture - string file = path; - int pos = file.rfind( "/" ); - file = file.substr( 0, pos ); - // cout << "current file = " << file << endl; - file += "/"; - file += material; - // cout << "current file = " << file << endl; - if ( ! material_lib.add_item( file ) ) { - SG_LOG( SG_TERRAIN, SG_ALERT, - "Ack! unknown usemtl name = " << material - << " in " << path ); - } else { - // locate our newly created material - newmat = material_lib.find( material ); - if ( newmat == NULL ) { - SG_LOG( SG_TERRAIN, SG_ALERT, - "Ack! bad on the fly materia create = " - << material << " in " << path ); - } - } - } - - if ( newmat != NULL ) { - // set the texture width and height values for this - // material - tex_width = newmat->get_xsize(); - tex_height = newmat->get_ysize(); - state = newmat->get_state(); - coverage = newmat->get_light_coverage(); - // cout << "(w) = " << tex_width << " (h) = " - // << tex_width << endl; - } else { - coverage = -1; - } - } else { - // unknown comment, just gobble the input until the - // end of line - - in >> skipeol; - } - } else { - in.putback( c ); - - in >> token; - - // cout << "token = " << token << endl; - - if ( token == "vn" ) { - // vertex normal - if ( vncount < FG_MAX_NODES ) { - in >> normals[vncount][0] - >> normals[vncount][1] - >> normals[vncount][2]; - vncount++; - } else { - SG_LOG( SG_TERRAIN, SG_ALERT, - "Read too many vertex normals in " << path - << " ... dying :-(" ); - exit(-1); - } - } else if ( token == "vt" ) { - // vertex texture coordinate - if ( vtcount < FG_MAX_NODES*3 ) { - in >> tex_coords[vtcount][0] - >> tex_coords[vtcount][1]; - vtcount++; - } else { - SG_LOG( SG_TERRAIN, SG_ALERT, - "Read too many vertex texture coords in " << path - << " ... dying :-(" - ); - exit(-1); - } - } else if ( token == "v" ) { - // node (vertex) - if ( t->ncount < FG_MAX_NODES ) { - /* in >> nodes[t->ncount][0] - >> nodes[t->ncount][1] - >> nodes[t->ncount][2]; */ - in >> node; - nodes.push_back(node); - if ( is_base ) { - t->ncount++; - } - } else { - SG_LOG( SG_TERRAIN, SG_ALERT, - "Read too many nodes in " << path - << " ... dying :-("); - exit(-1); - } - } else if ( (token == "tf") || (token == "ts") || (token == "f") ) { - // triangle fan, strip, or individual face - // SG_LOG( SG_TERRAIN, SG_INFO, "new fan or strip"); - - fan_vertices.clear(); - fan_tex_coords.clear(); - odd = true; - - // xglBegin(GL_TRIANGLE_FAN); - - in >> n1; - fan_vertices.push_back( n1 ); - // xglNormal3dv(normals[n1]); - if ( in.get( c ) && c == '/' ) { - in >> tex; - fan_tex_coords.push_back( tex ); - if ( scenery_version >= 0.4 ) { - if ( tex_width > 0 ) { - tclist[tex][0] *= (1000.0 / tex_width); - } - if ( tex_height > 0 ) { - tclist[tex][1] *= (1000.0 / tex_height); - } - } - pp.setx( tex_coords[tex][0] * (1000.0 / tex_width) ); - pp.sety( tex_coords[tex][1] * (1000.0 / tex_height) ); - } else { - in.putback( c ); - pp = local_calc_tex_coords(nodes[n1], center); - } - // xglTexCoord2f(pp.x(), pp.y()); - // xglVertex3dv(nodes[n1].get_n()); - - in >> n2; - fan_vertices.push_back( n2 ); - // xglNormal3dv(normals[n2]); - if ( in.get( c ) && c == '/' ) { - in >> tex; - fan_tex_coords.push_back( tex ); - if ( scenery_version >= 0.4 ) { - if ( tex_width > 0 ) { - tclist[tex][0] *= (1000.0 / tex_width); - } - if ( tex_height > 0 ) { - tclist[tex][1] *= (1000.0 / tex_height); - } - } - pp.setx( tex_coords[tex][0] * (1000.0 / tex_width) ); - pp.sety( tex_coords[tex][1] * (1000.0 / tex_height) ); - } else { - in.putback( c ); - pp = local_calc_tex_coords(nodes[n2], center); - } - // xglTexCoord2f(pp.x(), pp.y()); - // xglVertex3dv(nodes[n2].get_n()); - - // read all subsequent numbers until next thing isn't a number - while ( true ) { - in >> ::skipws; - - char c; - in.get(c); - in.putback(c); - if ( ! isdigit(c) || in.eof() ) { - break; - } - - in >> n3; - fan_vertices.push_back( n3 ); - // cout << " triangle = " - // << n1 << "," << n2 << "," << n3 - // << endl; - // xglNormal3dv(normals[n3]); - if ( in.get( c ) && c == '/' ) { - in >> tex; - fan_tex_coords.push_back( tex ); - if ( scenery_version >= 0.4 ) { - if ( tex_width > 0 ) { - tclist[tex][0] *= (1000.0 / tex_width); - } - if ( tex_height > 0 ) { - tclist[tex][1] *= (1000.0 / tex_height); - } - } - pp.setx( tex_coords[tex][0] * (1000.0 / tex_width) ); - pp.sety( tex_coords[tex][1] * (1000.0 / tex_height) ); - } else { - in.putback( c ); - pp = local_calc_tex_coords(nodes[n3], center); - } - // xglTexCoord2f(pp.x(), pp.y()); - // xglVertex3dv(nodes[n3].get_n()); - - if ( (token == "tf") || (token == "f") ) { - // triangle fan - n2 = n3; - } else { - // triangle strip - odd = !odd; - n1 = n2; - n2 = n3; - } - } - - // xglEnd(); - - // build the ssg entity - int size = (int)fan_vertices.size(); - ssgVertexArray *vl = new ssgVertexArray( size ); - ssgNormalArray *nl = new ssgNormalArray( size ); - ssgTexCoordArray *tl = new ssgTexCoordArray( size ); - ssgColourArray *cl = new ssgColourArray( 1 ); - - sgVec4 color; - sgSetVec4( color, 1.0, 1.0, 1.0, 1.0 ); - cl->add( color ); - - sgVec2 tmp2; - sgVec3 tmp3; - for ( i = 0; i < size; ++i ) { - sgCopyVec3( tmp3, vtlist[ fan_vertices[i] ] ); - vl -> add( tmp3 ); - - sgCopyVec3( tmp3, vnlist[ fan_vertices[i] ] ); - nl -> add( tmp3 ); - - sgCopyVec2( tmp2, tclist[ fan_tex_coords[i] ] ); - tl -> add( tmp2 ); - } - - ssgLeaf *leaf = NULL; - if ( token == "tf" ) { - // triangle fan - leaf = - new ssgVtxTable ( GL_TRIANGLE_FAN, vl, nl, tl, cl ); - } else if ( token == "ts" ) { - // triangle strip - leaf = - new ssgVtxTable ( GL_TRIANGLE_STRIP, vl, nl, tl, cl ); - } else if ( token == "f" ) { - // triangle - leaf = - new ssgVtxTable ( GL_TRIANGLES, vl, nl, tl, cl ); - } - // leaf->makeDList(); - leaf->setState( state ); - - tile->addKid( leaf ); - - if ( is_base ) { - if ( coverage > 0.0 ) { - if ( coverage < 10000.0 ) { - SG_LOG(SG_INPUT, SG_ALERT, "Light coverage is " - << coverage << ", pushing up to 10000"); - coverage = 10000; - } - gen_random_surface_points(leaf, lights, coverage); - } - } - } else { - SG_LOG( SG_TERRAIN, SG_WARN, "Unknown token in " - << path << " = " << token ); - } - - // eat white space before start of while loop so if we are - // done with useful input it is noticed before hand. - in >> ::skipws; - } - } - - if ( is_base ) { - t->nodes = nodes; - } - - // stopwatch.stop(); - // SG_LOG( SG_TERRAIN, SG_DEBUG, - // "Loaded " << path << " in " - // << stopwatch.elapsedSeconds() << " seconds" ); - - return tile; -} - - ssgLeaf *gen_leaf( const string& path, const GLenum ty, const string& material, const point_list& nodes, const point_list& normals, diff --git a/src/Objects/obj.hxx b/src/Objects/obj.hxx index 195cceabf..eedbd1ff4 100644 --- a/src/Objects/obj.hxx +++ b/src/Objects/obj.hxx @@ -1,4 +1,5 @@ -// obj.hxx -- routines to handle WaveFront .obj-ish format files. +// obj.hxx -- routines to handle loading scenery and building the plib +// scene graph. // // Written by Curtis Olson, started October 1997. // @@ -40,10 +41,9 @@ #include // plib include +#include #include -#include - SG_USING_STD(string); @@ -60,10 +60,6 @@ bool fgBinObjLoad( const string& path, const bool is_base, ssgBranch* taxi_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 bool fgGenTile( const string& path, SGBucket b, Point3D *center, diff --git a/src/Scenery/tileentry.cxx b/src/Scenery/tileentry.cxx index 2df901c2a..5882b5165 100644 --- a/src/Scenery/tileentry.cxx +++ b/src/Scenery/tileentry.cxx @@ -1137,21 +1137,13 @@ bool FGTileEntry::obj_load( const std::string& path, 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 (NULL != tmp); + // default to an ocean tile + if ( fgGenTile( path, tile_bucket, &c, &br, geometry ) ) { + center = c; + bounding_radius = br; } else { - // default to an ocean tile - 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!" ); - } + SG_LOG( SG_TERRAIN, SG_ALERT, + "Warning: failed to generate ocean tile!" ); } } -- 2.39.5