// Constructor
FGTileEntry::FGTileEntry ( void )
: ncount(0),
- state(Unused)
+ state(Unused),
+ vtlist(NULL),
+ vnlist(NULL),
+ tclist(NULL)
{
nodes.clear();
}
// mark tile unused
mark_unused();
- // delete fragment list
- for_each( begin(), end(),
- mem_fun_ref( &fgFRAGMENT::deleteDisplayList ));
- fragment_list.erase( begin(), end() );
+ // delete fragment list and node list
+ FG_LOG( FG_TERRAIN, FG_DEBUG,
+ " deleting " << fragment_list.size() << " fragments" );
+ fragment_list.clear();
+ FG_LOG( FG_TERRAIN, FG_DEBUG,
+ " deleting " << nodes.size() << " nodes" );
+ nodes.clear();
- // delete the ssg used structures
- delete vtlist;
- delete vnlist;
- delete tclist;
+ // delete the ssg structures
+ FG_LOG( FG_TERRAIN, FG_DEBUG,
+ " deleting vertex, normal, and texture coordinate arrays" );
+ FG_LOG( FG_TERRAIN, FG_DEBUG,
+ " deleting vertex array" );
+ if ( vtlist != NULL ) {
+ delete vtlist;
+ }
+ FG_LOG( FG_TERRAIN, FG_DEBUG,
+ " deleting normal array" );
+ if ( vnlist != NULL ) {
+ delete vnlist;
+ }
+ FG_LOG( FG_TERRAIN, FG_DEBUG,
+ " deleting texture coordinate array" );
+ if ( tclist != NULL ) {
+ delete tclist;
+ }
// delete the ssg branch
// make sure we have a sane number of parents
- int pcount = branch_ptr->getNumParents();
+ int pcount = select_ptr->getNumParents();
if ( pcount > 0 ) {
// find the first parent (should only be one)
- ssgBranch *parent = branch_ptr->getParent( 0 ) ;
+ ssgBranch *parent = select_ptr->getParent( 0 ) ;
// find the number of kids this parent has
int kcount = parent->getNumKids();
- // find the kid that matches our original branch_ptr
+ // find the kid that matches our original select_ptr
bool found_kid = false;
for ( int i = 0; i < kcount; ++i ) {
ssgEntity *kid = parent->getKid( i );
- if ( kid == branch_ptr ) {
- FG_LOG( FG_TERRAIN, FG_INFO,
+ if ( kid == select_ptr ) {
+ FG_LOG( FG_TERRAIN, FG_DEBUG,
"Found a kid to delete " << kid);
found_kid = true;
+ parent->removeKid( i );
}
}
if ( ! found_kid ) {
FG_LOG( FG_TERRAIN, FG_ALERT,
"Parent count is zero for an ssg tile! Dying" );
exit(-1);
- }
+ }
}
+// when a tile is still in the cache, but not in the immediate draw
+// list, it can still remain in the scene graph, but we use a range
+// selector to disable it from ever being drawn.
+void
+FGTileEntry::ssg_disable() {
+ // cout << "TILE STATE = " << state << endl;
+ if ( state == Scheduled_for_use ) {
+ state = Scheduled_for_cache;
+ } else if ( state == Scheduled_for_cache ) {
+ // do nothing
+ } else if ( (state == Loaded) || (state == Cached) ) {
+ state = Cached;
+ // cout << "DISABLING SSG NODE" << endl;
+ select_ptr->select(0);
+ } else {
+ FG_LOG( FG_TERRAIN, FG_ALERT,
+ "Trying to disable an unused tile! Dying" );
+ exit(-1);
+ }
+ // cout << "TILE STATE = " << state << endl;
+}