]> git.mxchange.org Git - flightgear.git/commitdiff
Updates from Bernie Bright to massage tile loading around to make it
authorcurt <curt>
Thu, 29 Mar 2001 01:42:31 +0000 (01:42 +0000)
committercurt <curt>
Thu, 29 Mar 2001 01:42:31 +0000 (01:42 +0000)
slightly more conducive to future threading.

src/Main/main.cxx
src/Objects/obj.cxx
src/Objects/obj.hxx
src/Scenery/newcache.cxx
src/Scenery/newcache.hxx
src/Scenery/tileentry.cxx
src/Scenery/tileentry.hxx

index c0778afc2057790fd0796e640986b7a902ccac73..e7191c5773523864c87bd5bf218009c768fd2e93 100644 (file)
@@ -490,7 +490,7 @@ void fgRenderFrame( void ) {
            // cout << "----> updating fog params" << endl;
                
            // for GL_FOG_EXP
-           fog_exp_density = -log(0.01 / actual_visibility);
+           fog_exp_density = -log(0.01) / actual_visibility;
     
            // for GL_FOG_EXP2
            fog_exp2_density = sqrt( -log(0.01) ) / actual_visibility;
@@ -565,9 +565,9 @@ void fgRenderFrame( void ) {
        ssgGetLight( 0 ) -> setPosition( l->sun_vec );
 
         // GL_LIGHT_MODEL_AMBIENT has a default non-zero value so if
-        // we only set GL_AMBIENT we will never get a completely dark
-        // scene.  Thus instead of playing with GL_AMBIENT, we just
-        // set that to black and instead modify GL_LIGHT_MODEL_AMBIENT.
+        // we only update GL_AMBIENT for our lights we will never get
+        // a completely dark scene.  So, we set GL_LIGHT_MODEL_AMBIENT
+        // explicitely to black.
        GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
        GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
        glLightModelfv( GL_LIGHT_MODEL_AMBIENT, black );
index bec98f138e9fd10df4786681894d501944a7f419..90bd2ceee507414edddad71d1bbcdf1977a59f1f 100644 (file)
@@ -338,7 +338,7 @@ static void gen_random_surface_points( ssgLeaf *leaf, ssgVertexArray *lights,
 
 
 // Load an Ascii obj file
-static ssgBranch *fgAsciiObjLoad( const string& path, FGTileEntry *t,
+ssgBranch *fgAsciiObjLoad( const string& path, FGTileEntry *t,
                                  ssgVertexArray *lights, const bool is_base)
 {
     FGNewMat *newmat = NULL;
@@ -902,7 +902,7 @@ static ssgLeaf *gen_leaf( const string& path,
 
 
 // Load an Binary obj file
-static ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
+ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
                                ssgVertexArray *lights, const bool is_base)
 {
     int i;
@@ -984,24 +984,3 @@ static ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t,
 
     return object;
 }
-
-
-// Load an obj file
-ssgBranch *fgObjLoad( const string& path, FGTileEntry *t,
-                     ssgVertexArray *lights, const bool is_base)
-{
-    ssgBranch *result = NULL;
-
-    // try loading binary format
-    result = fgBinObjLoad( path, t, lights, is_base );
-    if ( result == NULL ) {
-       // next try the older ascii format
-       result = fgAsciiObjLoad( path, t, lights, is_base );
-       if ( result == NULL ) {
-           // default to an ocean tile
-           result = fgGenTile( path, t );
-       }
-    }
-
-    return result;
-}
index 13c5fef10094750e8d1a6b95b656fc31cfe0a502..fe87427e71f21c5d07daa7f848d5fb92b1bd90af 100644 (file)
@@ -55,11 +55,16 @@ SG_USING_STD(string);
 #define FG_MAX_NODES 4000
 
 
-// Load a .obj file
-ssgBranch *fgObjLoad(const string& path, FGTileEntry *tile,
-                    ssgVertexArray *lights, const bool is_base);
+// Load a binary object file
+ssgBranch *fgBinObjLoad(const string& path, FGTileEntry *tile,
+                       ssgVertexArray *lights, const bool is_base);
 
+// Load an ascii object file
+ssgBranch *fgAsciiObjLoad(const string& path, FGTileEntry *tile,
+                         ssgVertexArray *lights, const bool is_base);
 
-#endif // _OBJ_HXX
+// Generate an ocean tile
+ssgBranch *fgGenTile( const string& path, FGTileEntry *t);
 
 
+#endif // _OBJ_HXX
index a6713fd2fbcee9094b7004cebcc8c5292b390766..c464bddee6e9ea0a0b7bba8dda3aab86f552f066 100644 (file)
 
 #include <simgear/bucket/newbucket.hxx>
 #include <simgear/debug/logstream.hxx>
-#include <simgear/math/sg_geodesy.hxx>
-#include <simgear/math/sg_random.h>
-#include <simgear/misc/sgstream.hxx>
 #include <simgear/misc/sg_path.hxx>
 
 #include <Main/globals.hxx>
-#include <Objects/matlib.hxx>
-#include <Objects/newmat.hxx>
-#include <Objects/obj.hxx>
 #include <Scenery/scenery.hxx>  // for scenery.center
 
 #include "newcache.hxx"
 
 SG_USING_NAMESPACE(std);
 
-// a cheesy hack (to be fixed later)
-extern ssgBranch *terrain;
-extern ssgBranch *ground;
-
 
 // the tile cache
 FGNewCache global_tile_cache;
@@ -85,6 +75,9 @@ void FGNewCache::entry_free( long cache_index ) {
 
 // Initialize the tile cache subsystem
 void FGNewCache::init( void ) {
+    // This is a hack that should really get cleaned up at some point
+    extern ssgBranch *terrain;
+
     SG_LOG( SG_TERRAIN, SG_INFO, "Initializing the tile cache." );
 
     // expand cache if needed.  For best results ... i.e. to avoid
@@ -122,101 +115,20 @@ bool FGNewCache::exists( const SGBucket& b ) {
 }
 
 
-#if 0
-static void print_refs( ssgSelector *sel, ssgTransform *trans, 
-                ssgRangeSelector *range) 
-{
-    cout << "selector -> " << sel->getRef()
-        << "  transform -> " << trans->getRef()
-        << "  range -> " << range->getRef() << endl;
-}
-#endif
-
-
-static ssgLeaf *gen_lights( ssgVertexArray *lights, int inc, float bright ) {
-    // generate a repeatable random seed
-    float *p1 = lights->get( 0 );
-    unsigned int *seed = (unsigned int *)p1;
-    sg_srandom( *seed );
-
-    int size = lights->getNum() / inc;
-
-    // Allocate ssg structure
-    ssgVertexArray   *vl = new ssgVertexArray( size + 1 );
-    ssgNormalArray   *nl = NULL;
-    ssgTexCoordArray *tl = NULL;
-    ssgColourArray   *cl = new ssgColourArray( size + 1 );
-
-    sgVec4 color;
-    for ( int i = 0; i < lights->getNum(); ++i ) {
-       // this loop is slightly less efficient than it otherwise
-       // could be, but we want a red light to always be red, and a
-       // yellow light to always be yellow, etc. so we are trying to
-       // preserve the random sequence.
-       float zombie = sg_random();
-       if ( i % inc == 0 ) {
-           vl->add( lights->get(i) );
-
-           // factor = sg_random() ^ 2, range = 0 .. 1 concentrated towards 0
-           float factor = sg_random();
-           factor *= factor;
-
-           if ( zombie > 0.5 ) {
-               // 50% chance of yellowish
-               sgSetVec4( color, 0.9, 0.9, 0.3, bright - factor * 0.2 );
-           } else if ( zombie > 0.15 ) {
-               // 35% chance of whitish
-               sgSetVec4( color, 0.9, 0.9, 0.8, bright - factor * 0.2 );
-           } else if ( zombie > 0.05 ) {
-               // 10% chance of orangish
-               sgSetVec4( color, 0.9, 0.6, 0.2, bright - factor * 0.2 );
-           } else {
-               // 5% chance of redish
-               sgSetVec4( color, 0.9, 0.2, 0.2, bright - factor * 0.2 );
-           }
-           cl->add( color );
-       }
-    }
-
-    // create ssg leaf
-    ssgLeaf *leaf = 
-       new ssgVtxTable ( GL_POINTS, vl, nl, tl, cl );
-
-    // assign state
-    FGNewMat *newmat = material_lib.find( "LIGHTS" );
-    leaf->setState( newmat->get_state() );
-
-    return leaf;
-}
-
-
 // Fill in a tile cache entry with real data for the specified bucket
 void FGNewCache::fill_in( const SGBucket& b ) {
-    SG_LOG( SG_TERRAIN, SG_INFO, "FILL IN CACHE ENTRY = " << b.gen_index() );
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "FILL IN CACHE ENTRY = " << b.gen_index() );
 
     // clear out a distant entry in the cache if needed.
     make_space();
 
     // create the entry
-    FGTileEntry *e = new FGTileEntry;
+    FGTileEntry *e = new FGTileEntry( b );
 
     // register it in the cache
     long tile_index = b.gen_index();
     tile_cache[tile_index] = e;
 
-    // update the contents
-    e->center = Point3D( 0.0 );
-    if ( e->vec3_ptrs.size() || e->vec2_ptrs.size() || e->index_ptrs.size() ) {
-       SG_LOG( SG_TERRAIN, SG_ALERT, 
-               "Attempting to overwrite existing or"
-               << " not properly freed leaf data." );
-       exit(-1);
-    }
-
-    e->terra_transform = new ssgTransform;
-    e->terra_range = new ssgRangeSelector;
-    e->tile_bucket = b;
-
     SGPath tile_path;
     if ( globals->get_fg_scenery() != (string)"" ) {
        tile_path.set( globals->get_fg_scenery() );
@@ -224,101 +136,19 @@ void FGNewCache::fill_in( const SGBucket& b ) {
        tile_path.set( globals->get_fg_root() );
        tile_path.append( "Scenery" );
     }
-    tile_path.append( b.gen_base_path() );
     
-    // fgObjLoad will generate ground lighting for us ...
-    ssgVertexArray *light_pts = new ssgVertexArray( 100 );
-
     // Load the appropriate data file
-    SGPath tile_base = tile_path;
-    tile_base.append( b.gen_index_str() );
-    ssgBranch *new_tile = fgObjLoad( tile_base.str(), e, light_pts, true );
-
-    if ( new_tile != NULL ) {
-       e->terra_range->addKid( new_tile );
-    }
-  
-    // load custom objects
-    SG_LOG( SG_TERRAIN, SG_DEBUG, "CUSTOM OBJECTS" );
-
-    SGPath index_path = tile_path;
-    index_path.append( b.gen_index_str() );
-    index_path.concat( ".ind" );
-
-    SG_LOG( SG_TERRAIN, SG_DEBUG, "Looking in " << index_path.str() );
-
-    sg_gzifstream in( index_path.str() );
-
-    if ( in.is_open() ) {
-       string token, name;
-
-       while ( ! in.eof() ) {
-           in >> token;
-           in >> name;
-#if defined ( macintosh ) || defined ( _MSC_VER )
-           in >> ::skipws;
-#else
-           in >> skipws;
-#endif
-           SG_LOG( SG_TERRAIN, SG_DEBUG, "token = " << token
-                   << " name = " << name );
-
-           SGPath custom_path = tile_path;
-           custom_path.append( name );
-           ssgBranch *custom_obj = 
-               fgObjLoad( custom_path.str(), e, NULL, false );
-           if ( (new_tile != NULL) && (custom_obj != NULL) ) {
-               new_tile -> addKid( custom_obj );
-           }
-       }
-    }
-
-    e->terra_transform->addKid( e->terra_range );
-
-    // calculate initial tile offset
-    e->SetOffset( scenery.center );
-    sgCoord sgcoord;
-    sgSetCoord( &sgcoord,
-               e->offset.x(), e->offset.y(), e->offset.z(),
-               0.0, 0.0, 0.0 );
-    e->terra_transform->setTransform( &sgcoord );
-    terrain->addKid( e->terra_transform );
-
-    e->lights_transform = NULL;
-    e->lights_range = NULL;
-    /* uncomment this section for testing ground lights */
-    if ( light_pts->getNum() ) {
-       SG_LOG( SG_TERRAIN, SG_DEBUG, "generating lights" );
-       e->lights_transform = new ssgTransform;
-       e->lights_range = new ssgRangeSelector;
-       e->lights_brightness = new ssgSelector;
-       ssgLeaf *lights;
-
-       lights = gen_lights( light_pts, 4, 0.7 );
-       e->lights_brightness->addKid( lights );
-
-       lights = gen_lights( light_pts, 2, 0.85 );
-       e->lights_brightness->addKid( lights );
-
-       lights = gen_lights( light_pts, 1, 1.0 );
-       e->lights_brightness->addKid( lights );
-
-       e->lights_range->addKid( e->lights_brightness );
-       e->lights_transform->addKid( e->lights_range );
-       e->lights_transform->setTransform( &sgcoord );
-       ground->addKid( e->lights_transform );
-    }
-    /* end of ground light section */
+    e->load( tile_path, true );
 }
 
 
 // Ensure at least one entry is free in the cache
 void FGNewCache::make_space() {
-    SG_LOG( SG_TERRAIN, SG_INFO, "Make space in cache" );
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "Make space in cache" );
 
     
     SG_LOG( SG_TERRAIN, SG_DEBUG, "cache entries = " << tile_cache.size() );
-    SG_LOG( SG_TERRAIN, SG_INFO, "max size = " << max_cache_size );
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "max size = " << max_cache_size );
 
     if ( (int)tile_cache.size() < max_cache_size ) {
        // space in the cache, return
index c86a087fb9a076fb7a10a00361cd2bb90fb07580..ed7486f572c19803e86ff78b760c105671ee796b 100644 (file)
@@ -73,10 +73,10 @@ class FGNewCache {
 public:
 
     // Constructor
-    FGNewCache( void );
+    FGNewCache();
 
     // Destructor
-    ~FGNewCache( void );
+    ~FGNewCache();
 
     // Initialize the tile cache subsystem 
     void init( void );
index 32be88ab46c3f3db64b3bb01927fca50981b8bdb..886f71fec76ecb5ccee9566cb2247efaf60830bc 100644 (file)
 
 #include STL_FUNCTIONAL
 #include STL_ALGORITHM
+#include STL_STRING
 
 #include <simgear/bucket/newbucket.hxx>
 #include <simgear/debug/logstream.hxx>
+#include <simgear/math/sg_random.h>
+#include <simgear/misc/sgstream.hxx>
 
 #include <Aircraft/aircraft.hxx>
 #include <Include/general.hxx>
 #include <Main/globals.hxx>
 #include <Scenery/scenery.hxx>
 #include <Time/light.hxx>
+#include <Objects/matlib.hxx>
+#include <Objects/newmat.hxx>
+#include <Objects/obj.hxx>
 
 #include "tileentry.hxx"
 
 SG_USING_STD(for_each);
 SG_USING_STD(mem_fun_ref);
+SG_USING_STD(string);
 
 
 // Constructor
-FGTileEntry::FGTileEntry ()
-    : ncount(0)
+FGTileEntry::FGTileEntry ( const SGBucket& b )
+    : ncount( 0 ),
+      center( Point3D( 0.0 ) ),
+      tile_bucket( b ),
+      terra_transform( new ssgTransform ),
+      terra_range( new ssgRangeSelector )
 {
     nodes.clear();
+
+    // update the contents
+    // if ( vec3_ptrs.size() || vec2_ptrs.size() || index_ptrs.size() ) {
+    //     SG_LOG( SG_TERRAIN, SG_ALERT, 
+    //             "Attempting to overwrite existing or"
+    //             << " not properly freed leaf data." );
+    //     exit(-1);
+    // }
 }
 
 
@@ -229,3 +248,173 @@ void FGTileEntry::prep_ssg_node( const Point3D& p, float vis) {
        }
     }
 }
+
+
+ssgLeaf* FGTileEntry::gen_lights( ssgVertexArray *lights, int inc, float bright ) {
+    // generate a repeatable random seed
+    float *p1 = lights->get( 0 );
+    unsigned int *seed = (unsigned int *)p1;
+    sg_srandom( *seed );
+
+    int size = lights->getNum() / inc;
+
+    // Allocate ssg structure
+    ssgVertexArray   *vl = new ssgVertexArray( size + 1 );
+    ssgNormalArray   *nl = NULL;
+    ssgTexCoordArray *tl = NULL;
+    ssgColourArray   *cl = new ssgColourArray( size + 1 );
+
+    sgVec4 color;
+    for ( int i = 0; i < lights->getNum(); ++i ) {
+       // this loop is slightly less efficient than it otherwise
+       // could be, but we want a red light to always be red, and a
+       // yellow light to always be yellow, etc. so we are trying to
+       // preserve the random sequence.
+       float zombie = sg_random();
+       if ( i % inc == 0 ) {
+           vl->add( lights->get(i) );
+
+           // factor = sg_random() ^ 2, range = 0 .. 1 concentrated towards 0
+           float factor = sg_random();
+           factor *= factor;
+
+           if ( zombie > 0.5 ) {
+               // 50% chance of yellowish
+               sgSetVec4( color, 0.9, 0.9, 0.3, bright - factor * 0.2 );
+           } else if ( zombie > 0.15 ) {
+               // 35% chance of whitish
+               sgSetVec4( color, 0.9, 0.9, 0.8, bright - factor * 0.2 );
+           } else if ( zombie > 0.05 ) {
+               // 10% chance of orangish
+               sgSetVec4( color, 0.9, 0.6, 0.2, bright - factor * 0.2 );
+           } else {
+               // 5% chance of redish
+               sgSetVec4( color, 0.9, 0.2, 0.2, bright - factor * 0.2 );
+           }
+           cl->add( color );
+       }
+    }
+
+    // create ssg leaf
+    ssgLeaf *leaf = 
+       new ssgVtxTable ( GL_POINTS, vl, nl, tl, cl );
+
+    // assign state
+    FGNewMat *newmat = material_lib.find( "LIGHTS" );
+    leaf->setState( newmat->get_state() );
+
+    return leaf;
+}
+
+
+ssgBranch*
+FGTileEntry::obj_load( const std::string& path,
+                      ssgVertexArray* lights, bool is_base )
+{
+    ssgBranch* result = 0;
+
+    // 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 ) {
+           // default to an ocean tile
+           result = fgGenTile( path, this );
+       }
+    }
+
+    return result;
+}
+
+
+void
+FGTileEntry::load( SGPath& tile_path, bool is_base )
+{
+    // a cheesy hack (to be fixed later)
+    extern ssgBranch *terrain;
+    extern ssgBranch *ground;
+
+    string index_str = tile_bucket.gen_index_str();
+
+    // Generate name of file to load.
+    tile_path.append( tile_bucket.gen_base_path() );
+    SGPath basename = tile_path;
+    basename.append( index_str );
+    string path = basename.str();
+
+    SG_LOG( SG_TERRAIN, SG_INFO, "Loading tile " << path );
+
+    // fgObjLoad will generate ground lighting for us ...
+    ssgVertexArray *light_pts = new ssgVertexArray( 100 );
+
+    ssgBranch* new_tile = obj_load( path, light_pts, is_base );
+    if ( new_tile != NULL ) {
+       terra_range->addKid( new_tile );
+    }
+
+    // load custom objects
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "CUSTOM OBJECTS" );
+
+    SGPath index_path = tile_path;
+    index_path.append( index_str );
+    index_path.concat( ".ind" );
+
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "Looking in " << index_path.str() );
+
+    sg_gzifstream in( index_path.str() );
+
+    if ( in.is_open() ) {
+       string token, name;
+
+       while ( ! in.eof() ) {
+           in >> token >> name >> ::skipws;
+           SG_LOG( SG_TERRAIN, SG_DEBUG, "token = " << token
+                   << " name = " << name );
+
+           SGPath custom_path = tile_path;
+           custom_path.append( name );
+           ssgBranch *custom_obj = obj_load( custom_path.str(), NULL, false );
+           if ( (new_tile != NULL) && (custom_obj != NULL) ) {
+               new_tile -> addKid( custom_obj );
+           }
+       }
+    }
+
+    terra_transform->addKid( terra_range );
+
+    // calculate initial tile offset
+    SetOffset( scenery.center );
+    sgCoord sgcoord;
+    sgSetCoord( &sgcoord,
+               offset.x(), offset.y(), offset.z(),
+               0.0, 0.0, 0.0 );
+    terra_transform->setTransform( &sgcoord );
+    terrain->addKid( terra_transform );
+
+    lights_transform = NULL;
+    lights_range = NULL;
+    /* uncomment this section for testing ground lights */
+    if ( light_pts->getNum() ) {
+       SG_LOG( SG_TERRAIN, SG_DEBUG, "generating lights" );
+       lights_transform = new ssgTransform;
+       lights_range = new ssgRangeSelector;
+       lights_brightness = new ssgSelector;
+       ssgLeaf *lights;
+
+       lights = gen_lights( light_pts, 4, 0.7 );
+       lights_brightness->addKid( lights );
+
+       lights = gen_lights( light_pts, 2, 0.85 );
+       lights_brightness->addKid( lights );
+
+       lights = gen_lights( light_pts, 1, 1.0 );
+       lights_brightness->addKid( lights );
+
+       lights_range->addKid( lights_brightness );
+       lights_transform->addKid( lights_range );
+       lights_transform->setTransform( &sgcoord );
+       ground->addKid( lights_transform );
+    }
+    /* end of ground light section */
+}
index 446ac98558244560f0bbec67ba836c466074b381..b0e8746879c1488d5623649364f1ae2761f4e6cf 100644 (file)
@@ -63,7 +63,9 @@ typedef point_list::iterator point_list_iterator;
 typedef point_list::const_iterator const_point_list_iterator;
 
 
-// Scenery tile class
+/**
+ * A class to encapsulate everything we need to know about a scenery tile.
+ */
 class FGTileEntry {
 
 public:
@@ -90,6 +92,8 @@ public:
     free_vec2_list vec2_ptrs;
     free_index_list index_ptrs;
 
+private:
+
     // ssg tree structure for this tile is as follows:
     // ssgRoot(scene)
     //     - ssgBranch(terrain)
@@ -113,10 +117,15 @@ public:
     // want based on lighting conditions.
     ssgSelector *lights_brightness;
 
+    ssgBranch* obj_load( const std::string& path,
+                        ssgVertexArray* lights, bool is_base );
+
+    ssgLeaf* gen_lights( ssgVertexArray *lights, int inc, float bright );
+
 public:
 
     // Constructor
-    FGTileEntry();
+    FGTileEntry( const SGBucket& b );
 
     // Destructor
     ~FGTileEntry();
@@ -137,6 +146,14 @@ public:
     // Update the ssg transform node for this tile so it can be
     // properly drawn relative to our (0,0,0) point
     void prep_ssg_node( const Point3D& p, float vis);
+
+    /**
+     * Load tile data from a file.
+     * @param base name of directory containing tile data file.
+     * @param is_base is this a base terrain object for which we should generate
+     *        random ground light points
+     */
+    void load( SGPath& base, bool is_base );
 };