]> git.mxchange.org Git - flightgear.git/blobdiff - Scenery/tilecache.cxx
Converted to new logstream debugging facility. This allows release
[flightgear.git] / Scenery / tilecache.cxx
index 4735417e12ec0606c50395ec0472a483c57fefc2..993e28551d200b9ad9fa5507b53b9dd8e428fb73 100644 (file)
@@ -1,27 +1,25 @@
-/**************************************************************************
- * tilecache.c -- routines to handle scenery tile caching
- *
- * Written by Curtis Olson, started January 1998.
- *
- * Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
- * (Log is kept at end of this file)
- **************************************************************************/
+// tilecache.cxx -- routines to handle scenery tile caching
+//
+// Written by Curtis Olson, started January 1998.
+//
+// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+// $Id$
+// (Log is kept at end of this file)
 
 
 #ifdef HAVE_CONFIG_H
 #include <GL/glut.h>
 #include <XGL/xgl.h>
 
-#include <Include/general.h>
-
+#include <Airports/genapt.hxx>
 #include <Bucket/bucketutils.h>
-#include <Debug/fg_debug.h>
+#include <Debug/logstream.hxx>
+#include <Main/options.hxx>
 #include <Main/views.hxx>
+#include <Objects/obj.hxx>
 
-#include "obj.h"
+#include "tile.hxx"
 #include "tilecache.hxx"
 
 
-/* tile cache */
-struct fgTILE tile_cache[FG_TILE_CACHE_SIZE];
+// the tile cache
+fgTILECACHE global_tile_cache;
+
+
+// Constructor
+fgTILECACHE::fgTILECACHE( void ) {
+}
 
 
-/* Initialize the tile cache subsystem */
-void fgTileCacheInit( void ) {
+// Initialize the tile cache subsystem
+void
+fgTILECACHE::init( void )
+{
     int i;
 
-    fgPrintf(FG_TERRAIN, FG_INFO, "Initializing the tile cache.\n");
+    FG_LOG( FG_TERRAIN, FG_INFO, "Initializing the tile cache." );
 
     for ( i = 0; i < FG_TILE_CACHE_SIZE; i++ ) {
        tile_cache[i].used = 0;
@@ -61,8 +67,10 @@ void fgTileCacheInit( void ) {
 }
 
 
-/* Search for the specified "bucket" in the cache */
-int fgTileCacheExists( struct fgBUCKET *p ) {
+// Search for the specified "bucket" in the cache
+int
+fgTILECACHE::exists( fgBUCKET *p )
+{
     int i;
 
     for ( i = 0; i < FG_TILE_CACHE_SIZE; i++ ) {
@@ -70,8 +78,8 @@ int fgTileCacheExists( struct fgBUCKET *p ) {
            if ( tile_cache[i].tile_bucket.lat == p->lat ) {
                if ( tile_cache[i].tile_bucket.x == p->x ) {
                    if ( tile_cache[i].tile_bucket.y == p->y ) {
-                       fgPrintf( FG_TERRAIN, FG_DEBUG, 
-                                 "TILE EXISTS in cache ... index = %d\n", i );
+                       FG_LOG( FG_TERRAIN, FG_DEBUG, 
+                               "TILE EXISTS in cache ... index = " << i );
                        return( i );
                    }
                }
@@ -83,70 +91,90 @@ int fgTileCacheExists( struct fgBUCKET *p ) {
 }
 
 
-/* Fill in a tile cache entry with real data for the specified bucket */
-void fgTileCacheEntryFillIn( int index, struct fgBUCKET *p ) {
-    fgGENERAL *g;
+// Fill in a tile cache entry with real data for the specified bucket
+void
+fgTILECACHE::fill_in( int index, fgBUCKET *p )
+{
+    string root, tile_path, apt_path;
+    char index_str[256];
     char base_path[256];
-    char file_name[256];
 
-    g = &general;
-
-    /* Mark this cache entry as used */
+    // Mark this cache entry as used
     tile_cache[index].used = 1;
 
-    /* Update the bucket */
+    // Update the bucket
     tile_cache[index].tile_bucket.lon = p->lon;
     tile_cache[index].tile_bucket.lat = p->lat;
     tile_cache[index].tile_bucket.x = p->x;
     tile_cache[index].tile_bucket.y = p->y;
 
-    /* Load the appropriate area and get the display list pointer */
+    // Load the appropriate data file and built tile fragment list
     fgBucketGenBasePath(p, base_path);
-    sprintf(file_name, "%s/Scenery/%s/%ld", g->root_dir, 
-           base_path, fgBucketGenIndex(p));
-    tile_cache[index].display_list = 
-       fgObjLoad(file_name, &tile_cache[index].local_ref,
-                 &tile_cache[index].bounding_radius);    
+    root = current_options.get_fg_root();
+    sprintf( index_str, "%ld", fgBucketGenIndex(p) );
+
+    tile_path = root + "/Scenery/" + base_path + "/" + index_str;
+    fgObjLoad( tile_path.c_str(), &tile_cache[index] );
+
+    // cout << " ncount before = " << tile_cache[index].ncount << "\n";
+    // cout << " fragments before = " << tile_cache[index].fragment_list.size()
+    //      << "\n";
+
+    apt_path = tile_path + ".apt";
+    fgAptGenerate( apt_path, &tile_cache[index] );
+
+    // cout << " ncount after = " << tile_cache[index].ncount << "\n";
+    // cout << " fragments after = " << tile_cache[index].fragment_list.size()
+    //      << "\n";
 }
 
 
-/* Free a tile cache entry */
-void fgTileCacheEntryFree( int index ) {
-    /* Mark this cache entry as un-used */
+// Free a tile cache entry
+void
+fgTILECACHE::entry_free( int index )
+{
+    fgFRAGMENT *fragment;
+
+    // Mark this cache entry as un-used
     tile_cache[index].used = 0;
 
-    /* Update the bucket */
-    fgPrintf( FG_TERRAIN, FG_DEBUG, 
-             "FREEING TILE = (%d %d %d %d)\n",
-             tile_cache[index].tile_bucket.lon, 
-             tile_cache[index].tile_bucket.lat, 
-             tile_cache[index].tile_bucket.x,
-             tile_cache[index].tile_bucket.y );
-
-    /* Load the appropriate area and get the display list pointer */
-    if ( tile_cache[index].display_list >= 0 ) {
-       xglDeleteLists( tile_cache[index].display_list, 1 );
+    // Update the bucket
+    FG_LOG( FG_TERRAIN, FG_DEBUG, 
+           "FREEING TILE = ("
+           << tile_cache[index].tile_bucket.lon << " "
+           << tile_cache[index].tile_bucket.lat << " "
+           << tile_cache[index].tile_bucket.x << " "
+           << tile_cache[index].tile_bucket.y << ")" );
+
+    // Step through the fragment list, deleting the display list, then
+    // the fragment, until the list is empty.
+    while ( tile_cache[index].fragment_list.size() ) {
+       list < fgFRAGMENT > :: iterator current =
+           tile_cache[index].fragment_list.begin();
+       fragment = &(*current);
+       xglDeleteLists( fragment->display_list, 1 );
+
+       tile_cache[index].fragment_list.pop_front();
     }
 }
 
 
-/* Return info for a tile cache entry */
-void fgTileCacheEntryInfo( int index, GLint *display_list, 
-                          struct fgCartesianPoint *local_ref ) {
-    *display_list = tile_cache[index].display_list;
-    /* fgPrintf(FG_TERRAIN, FG_DEBUG, "Display list = %d\n", *display_list); */
-
-    local_ref->x = tile_cache[index].local_ref.x;
-    local_ref->y = tile_cache[index].local_ref.y;
-    local_ref->z = tile_cache[index].local_ref.z;
+// Return the specified tile cache entry 
+fgTILE *
+fgTILECACHE::get_tile( int index )
+{
+    return ( &tile_cache[index] );
 }
 
 
-/* Return index of next available slot in tile cache */
-int fgTileCacheNextAvail( void ) {
-    struct fgVIEW *v;
+// Return index of next available slot in tile cache
+int
+fgTILECACHE::next_avail( void )
+{
+    fgVIEW *v;
+    Point3D delta;
     int i;
-    float dx, dy, dz, max, med, min, tmp;
+    float max, med, min, tmp;
     float dist, max_dist;
     int max_index;
     
@@ -159,20 +187,23 @@ int fgTileCacheNextAvail( void ) {
        if ( tile_cache[i].used == 0 ) {
            return(i);
        } else {
-           /* calculate approximate distance from view point */
-           fgPrintf( FG_TERRAIN, FG_DEBUG,
-                     "DIST Abs view pos = %.4f, %.4f, %.4f\n", 
-                     v->abs_view_pos.x, v->abs_view_pos.y, v->abs_view_pos.z );
-           fgPrintf( FG_TERRAIN, FG_DEBUG,
-                     "    ref point = %.4f, %.4f, %.4f\n", 
-                     tile_cache[i].local_ref.x, tile_cache[i].local_ref.y,
-                     tile_cache[i].local_ref.z);
-
-           dx = fabs(tile_cache[i].local_ref.x - v->abs_view_pos.x);
-           dy = fabs(tile_cache[i].local_ref.y - v->abs_view_pos.y);
-           dz = fabs(tile_cache[i].local_ref.z - v->abs_view_pos.z);
-
-           max = dx; med = dy; min = dz;
+           // calculate approximate distance from view point
+           FG_LOG( FG_TERRAIN, FG_DEBUG,
+                   "DIST Abs view pos = "
+                   << v->abs_view_pos.x() << ", "
+                   << v->abs_view_pos.y() << ", "
+                   << v->abs_view_pos.z() );
+           FG_LOG( FG_TERRAIN, FG_DEBUG,
+                   "    ref point = "
+                   << tile_cache[i].center.x() << ", "
+                   << tile_cache[i].center.y() << ", "
+                   << tile_cache[i].center.z() );
+
+           delta.setx( fabs(tile_cache[i].center.x() - v->abs_view_pos.x() ) );
+           delta.sety( fabs(tile_cache[i].center.y() - v->abs_view_pos.y() ) );
+           delta.setz( fabs(tile_cache[i].center.z() - v->abs_view_pos.z() ) );
+
+           max = delta.x(); med = delta.y(); min = delta.z();
            if ( max < med ) {
                tmp = max; max = med; med = tmp;
            }
@@ -181,7 +212,7 @@ int fgTileCacheNextAvail( void ) {
            }
            dist = max + (med + min) / 4;
 
-           fgPrintf( FG_TERRAIN, FG_DEBUG, "    distance = %.2f\n", dist);
+           FG_LOG( FG_TERRAIN, FG_DEBUG, "    distance = " << dist );
 
            if ( dist > max_dist ) {
                max_dist = dist;
@@ -190,58 +221,140 @@ int fgTileCacheNextAvail( void ) {
        }
     }
 
-    /* If we made it this far, then there were no open cache entries.
-     * We will instead free the furthest cache entry and return it's
-     * index. */
+    // If we made it this far, then there were no open cache entries.
+    // We will instead free the furthest cache entry and return it's
+    // index.
     
-    fgTileCacheEntryFree( max_index );
+    entry_free( max_index );
     return( max_index );
 }
 
 
-/* $Log$
-/* Revision 1.2  1998/04/24 00:51:08  curt
-/* Wrapped "#include <config.h>" in "#ifdef HAVE_CONFIG_H"
-/* Tweaked the scenery file extentions to be "file.obj" (uncompressed)
-/* or "file.obz" (compressed.)
-/*
- * Revision 1.1  1998/04/22 13:22:46  curt
- * C++ - ifing the code a bit.
- *
- * Revision 1.11  1998/04/18 04:14:07  curt
- * Moved fg_debug.c to it's own library.
- *
- * Revision 1.10  1998/04/14 02:23:17  curt
- * Code reorganizations.  Added a Lib/ directory for more general libraries.
- *
- * Revision 1.9  1998/04/08 23:30:07  curt
- * Adopted Gnu automake/autoconf system.
- *
- * Revision 1.8  1998/04/03 22:11:38  curt
- * Converting to Gnu autoconf system.
- *
- * Revision 1.7  1998/02/01 03:39:55  curt
- * Minor tweaks.
- *
- * Revision 1.6  1998/01/31 00:43:26  curt
- * Added MetroWorks patches from Carmen Volpe.
- *
- * Revision 1.5  1998/01/29 00:51:39  curt
- * First pass at tile cache, dynamic tile loading and tile unloading now works.
- *
- * Revision 1.4  1998/01/27 03:26:43  curt
- * Playing with new fgPrintf command.
- *
- * Revision 1.3  1998/01/27 00:48:03  curt
- * Incorporated Paul Bleisch's <bleisch@chromatic.com> new debug message
- * system and commandline/config file processing code.
- *
- * Revision 1.2  1998/01/26 15:55:24  curt
- * Progressing on building dynamic scenery system.
- *
- * Revision 1.1  1998/01/24 00:03:29  curt
- * Initial revision.
- *
- */
+// Destructor
+fgTILECACHE::~fgTILECACHE( void ) {
+}
+
+
+// $Log$
+// Revision 1.19  1998/11/06 21:18:21  curt
+// Converted to new logstream debugging facility.  This allows release
+// builds with no messages at all (and no performance impact) by using
+// the -DFG_NDEBUG flag.
+//
+// Revision 1.18  1998/10/16 18:12:28  curt
+// Fixed a bug in the conversion to Point3D.
+//
+// Revision 1.17  1998/10/16 00:55:48  curt
+// Converted to Point3D class.
+//
+// Revision 1.16  1998/09/14 12:45:23  curt
+// minor tweaks.
+//
+// Revision 1.15  1998/08/27 17:02:10  curt
+// Contributions from Bernie Bright <bbright@c031.aone.net.au>
+// - use strings for fg_root and airport_id and added methods to return
+//   them as strings,
+// - inlined all access methods,
+// - made the parsing functions private methods,
+// - deleted some unused functions.
+// - propogated some of these changes out a bit further.
+//
+// Revision 1.14  1998/08/25 16:52:43  curt
+// material.cxx material.hxx obj.cxx obj.hxx texload.c texload.h moved to
+//   ../Objects
+//
+// Revision 1.13  1998/07/13 21:02:00  curt
+// Wrote access functions for current fgOPTIONS.
+//
+// Revision 1.12  1998/07/12 03:18:29  curt
+// Added ground collision detection.  This involved:
+// - saving the entire vertex list for each tile with the tile records.
+// - saving the face list for each fragment with the fragment records.
+// - code to intersect the current vertical line with the proper face in
+//   an efficient manner as possible.
+// Fixed a bug where the tiles weren't being shifted to "near" (0,0,0)
+//
+// Revision 1.11  1998/07/04 00:54:30  curt
+// Added automatic mipmap generation.
+//
+// When rendering fragments, use saved model view matrix from associated tile
+// rather than recalculating it with push() translate() pop().
+//
+// Revision 1.10  1998/05/23 14:09:22  curt
+// Added tile.cxx and tile.hxx.
+// Working on rewriting the tile management system so a tile is just a list
+// fragments, and the fragment record contains the display list for that fragment.
+//
+// Revision 1.9  1998/05/20 20:53:54  curt
+// Moved global ref point and radius (bounding sphere info, and offset) to
+// data file rather than calculating it on the fly.
+// Fixed polygon winding problem in scenery generation stage rather than
+// compensating for it on the fly.
+// Made a fgTILECACHE class.
+//
+// Revision 1.8  1998/05/16 13:09:57  curt
+// Beginning to add support for view frustum culling.
+// Added some temporary code to calculate bouding radius, until the
+//   scenery generation tools and scenery can be updated.
+//
+// Revision 1.7  1998/05/13 18:26:41  curt
+// Root path info moved to fgOPTIONS.
+//
+// Revision 1.6  1998/05/02 01:52:17  curt
+// Playing around with texture coordinates.
+//
+// Revision 1.5  1998/04/30 12:35:31  curt
+// Added a command line rendering option specify smooth/flat shading.
+//
+// Revision 1.4  1998/04/28 01:21:43  curt
+// Tweaked texture parameter calculations to keep the number smaller.  This
+// avoids the "swimming" problem.
+// Type-ified fgTIME and fgVIEW.
+//
+// Revision 1.3  1998/04/25 22:06:32  curt
+// Edited cvs log messages in source files ... bad bad bad!
+//
+// Revision 1.2  1998/04/24 00:51:08  curt
+// Wrapped "#include <config.h>" in "#ifdef HAVE_CONFIG_H"
+// Tweaked the scenery file extentions to be "file.obj" (uncompressed)
+// or "file.obz" (compressed.)
+//
+// Revision 1.1  1998/04/22 13:22:46  curt
+// C++ - ifing the code a bit.
+//
+// Revision 1.11  1998/04/18 04:14:07  curt
+// Moved fg_debug.c to it's own library.
+//
+// Revision 1.10  1998/04/14 02:23:17  curt
+// Code reorganizations.  Added a Lib/ directory for more general libraries.
+//
+// Revision 1.9  1998/04/08 23:30:07  curt
+// Adopted Gnu automake/autoconf system.
+//
+// Revision 1.8  1998/04/03 22:11:38  curt
+// Converting to Gnu autoconf system.
+//
+// Revision 1.7  1998/02/01 03:39:55  curt
+// Minor tweaks.
+//
+// Revision 1.6  1998/01/31 00:43:26  curt
+// Added MetroWorks patches from Carmen Volpe.
+//
+// Revision 1.5  1998/01/29 00:51:39  curt
+// First pass at tile cache, dynamic tile loading and tile unloading now works.
+//
+// Revision 1.4  1998/01/27 03:26:43  curt
+// Playing with new fgPrintf command.
+//
+// Revision 1.3  1998/01/27 00:48:03  curt
+// Incorporated Paul Bleisch's <pbleisch@acm.org> new debug message
+// system and commandline/config file processing code.
+//
+// Revision 1.2  1998/01/26 15:55:24  curt
+// Progressing on building dynamic scenery system.
+//
+// Revision 1.1  1998/01/24 00:03:29  curt
+// Initial revision.
+