From a5f19c7a7ca5eee5bf6df01ab78b80d90b5fe8a6 Mon Sep 17 00:00:00 2001 From: curt Date: Sun, 8 Aug 1999 15:23:39 +0000 Subject: [PATCH] Removed extra square array of indirection indices between what's visible and where these things are in the cache. We just let ssg sort out what needs to be drawn based on visual range. --- src/Scenery/tilecache.cxx | 2 +- src/Scenery/tilecache.hxx | 5 ++- src/Scenery/tilemgr.cxx | 65 +++++++++++++-------------------------- src/Scenery/tilemgr.hxx | 4 --- 4 files changed, 27 insertions(+), 49 deletions(-) diff --git a/src/Scenery/tilecache.cxx b/src/Scenery/tilecache.cxx index f60bad41b..20f5d821f 100644 --- a/src/Scenery/tilecache.cxx +++ b/src/Scenery/tilecache.cxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started January 1998. // -// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com +// Copyright (C) 1998, 1999 Curtis L. Olson - curt@flightgear.org // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as diff --git a/src/Scenery/tilecache.hxx b/src/Scenery/tilecache.hxx index c3692c260..789c0db12 100644 --- a/src/Scenery/tilecache.hxx +++ b/src/Scenery/tilecache.hxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started January 1998. // -// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com +// Copyright (C) 1998, 1999 Curtis L. Olson - curt@flightgear.org // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -82,6 +82,9 @@ public: return &tile_cache[index]; } + // Return the cache size + inline size_t get_size() const { return tile_cache.size(); } + // Destructor ~FGTileCache( void ); }; diff --git a/src/Scenery/tilemgr.cxx b/src/Scenery/tilemgr.cxx index 4c12d9620..3de6ebce4 100644 --- a/src/Scenery/tilemgr.cxx +++ b/src/Scenery/tilemgr.cxx @@ -445,7 +445,7 @@ int FGTileMgr::update( void ) { p2 = fgBucketOffset( f->get_Longitude() * RAD_TO_DEG, f->get_Latitude() * RAD_TO_DEG, 0, 0 ); - tiles[(dh*tile_diameter) + dw] = sched_tile( p2 ); + sched_tile( p2 ); for ( i = 3; i <= tile_diameter; i = i + 2 ) { int span = i / 2; @@ -455,7 +455,7 @@ int FGTileMgr::update( void ) { p2 = fgBucketOffset( f->get_Longitude() * RAD_TO_DEG, f->get_Latitude() * RAD_TO_DEG, j, -span ); - tiles[((dh-span)*tile_diameter) + dw+j] = sched_tile( p2 ); + sched_tile( p2 ); } // top row @@ -463,7 +463,7 @@ int FGTileMgr::update( void ) { p2 = fgBucketOffset( f->get_Longitude() * RAD_TO_DEG, f->get_Latitude() * RAD_TO_DEG, j, span ); - tiles[((dh+span)*tile_diameter) + dw+j] = sched_tile( p2 ); + sched_tile( p2 ); } // middle rows @@ -471,11 +471,11 @@ int FGTileMgr::update( void ) { p2 = fgBucketOffset( f->get_Longitude() * RAD_TO_DEG, f->get_Latitude() * RAD_TO_DEG, -span, j ); - tiles[((dh+j)*tile_diameter) + dw-span] = sched_tile( p2 ); + sched_tile( p2 ); p2 = fgBucketOffset( f->get_Longitude() * RAD_TO_DEG, f->get_Latitude() * RAD_TO_DEG, span, j ); - tiles[((dh+j)*tile_diameter) + dw+span] = sched_tile( p2 ); + sched_tile( p2 ); } } @@ -486,7 +486,7 @@ int FGTileMgr::update( void ) { p2 = fgBucketOffset( f->get_Longitude() * RAD_TO_DEG, f->get_Latitude() * RAD_TO_DEG, i - dw, j -dh ); - tiles[(j*tile_diameter) + i] = sched_tile( p2 ); + sched_tile( p2 ); } } */ @@ -526,19 +526,15 @@ int FGTileMgr::update( void ) { FG_LOG( FG_TERRAIN, FG_INFO, "Updating Tile list for " << p1 ); if ( (p1.get_lon() > p_last.get_lon()) || - ( (p1.get_lon() == p_last.get_lon()) && (p1.get_x() > p_last.get_x()) ) ) { + ( (p1.get_lon() == p_last.get_lon()) && + (p1.get_x() > p_last.get_x()) ) ) { FG_LOG( FG_TERRAIN, FG_INFO, " (East) Loading " << tile_diameter << " tiles" ); for ( j = 0; j < tile_diameter; j++ ) { // scrolling East - disable_tile( tiles[(j*tile_diameter) + 0] ); - for ( i = 0; i < tile_diameter - 1; i++ ) { - tiles[(j*tile_diameter) + i] = - tiles[(j*tile_diameter) + i + 1]; - } - // load in new column + // schedule new column p2 = fgBucketOffset( last_lon, last_lat, dw + 1, j - dh ); - tiles[(j*tile_diameter) + tile_diameter - 1] = sched_tile( p2 ); + sched_tile( p2 ); } } else if ( (p1.get_lon() < p_last.get_lon()) || ( (p1.get_lon() == p_last.get_lon()) && @@ -547,47 +543,33 @@ int FGTileMgr::update( void ) { " (West) Loading " << tile_diameter << " tiles" ); for ( j = 0; j < tile_diameter; j++ ) { // scrolling West - disable_tile( tiles[(j*tile_diameter) + tile_diameter - 1] ); - for ( i = tile_diameter - 1; i > 0; i-- ) { - tiles[(j*tile_diameter) + i] = - tiles[(j*tile_diameter) + i - 1]; - } - // load in new column + // schedule new column p2 = fgBucketOffset( last_lon, last_lat, -dw - 1, j - dh ); - tiles[(j*tile_diameter) + 0] = sched_tile( p2 ); + sched_tile( p2 ); } } if ( (p1.get_lat() > p_last.get_lat()) || - ( (p1.get_lat() == p_last.get_lat()) && (p1.get_y() > p_last.get_y()) ) ) { + ( (p1.get_lat() == p_last.get_lat()) && + (p1.get_y() > p_last.get_y()) ) ) { FG_LOG( FG_TERRAIN, FG_INFO, " (North) Loading " << tile_diameter << " tiles" ); for ( i = 0; i < tile_diameter; i++ ) { // scrolling North - disable_tile( tiles[0 + i] ); - for ( j = 0; j < tile_diameter - 1; j++ ) { - tiles[(j * tile_diameter) + i] = - tiles[((j+1) * tile_diameter) + i]; - } - // load in new column + // schedule new row p2 = fgBucketOffset( last_lon, last_lat, i - dw, dh + 1); - tiles[((tile_diameter-1) * tile_diameter) + i] = - sched_tile( p2 ); + sched_tile( p2 ); } } else if ( (p1.get_lat() < p_last.get_lat()) || - ( (p1.get_lat() == p_last.get_lat()) && (p1.get_y() < p_last.get_y()) ) ) { + ( (p1.get_lat() == p_last.get_lat()) && + (p1.get_y() < p_last.get_y()) ) ) { FG_LOG( FG_TERRAIN, FG_INFO, " (South) Loading " << tile_diameter << " tiles" ); for ( i = 0; i < tile_diameter; i++ ) { // scrolling South - disable_tile( tiles[((tile_diameter-1) * tile_diameter) + i] ); - for ( j = tile_diameter - 1; j > 0; j-- ) { - tiles[(j * tile_diameter) + i] = - tiles[((j-1) * tile_diameter) + i]; - } - // load in new column + // schedule new row p2 = fgBucketOffset( last_lon, last_lat, i - dw, -dh - 1); - tiles[0 + i] = sched_tile( p2 ); + sched_tile( p2 ); } } } @@ -695,16 +677,13 @@ update_tile_geometry( FGTileEntry *t, GLdouble *MODEL_VIEW) void FGTileMgr::prep_ssg_nodes( void ) { FGTileEntry *t; - int tile_diameter = current_options.get_tile_diameter(); - float ranges[2]; ranges[0] = 0.0f; // traverse the potentially viewable tile list and update range // selector and transform - for ( int i = 0; i < (tile_diameter * tile_diameter); i++ ) { - int index = tiles[i]; - t = global_tile_cache.get_tile(index); + for ( int i = 0; i < (int)global_tile_cache.get_size(); i++ ) { + t = global_tile_cache.get_tile( i ); if ( t->is_loaded() ) { // set range selector (LOD trick) to be distance to center diff --git a/src/Scenery/tilemgr.hxx b/src/Scenery/tilemgr.hxx index 13b54409e..3c6de251a 100644 --- a/src/Scenery/tilemgr.hxx +++ b/src/Scenery/tilemgr.hxx @@ -63,10 +63,6 @@ class FGTileMgr { private: - // closest (potentially viewable) tiles, centered on current tile. - // This is an array of pointers to cache indexes. - int tiles[FG_LOCAL_X_Y]; - // Tile loading state enum load_state { Start = 0, -- 2.39.5