Revision: 6918
http://playerstage.svn.sourceforge.net/playerstage/?rev=6918&view=rev
Author: jeremy_asher
Date: 2008-07-24 00:00:30 +0000 (Thu, 24 Jul 2008)
Log Message:
-----------
stage: fixed ForEachModel being called multiple times for some models by
replacing with new ForEachDescendant method in StgAncestor
Modified Paths:
--------------
code/stage/trunk/libstage/ancestor.cc
code/stage/trunk/libstage/model.cc
code/stage/trunk/libstage/model_fiducial.cc
code/stage/trunk/libstage/stage.hh
code/stage/trunk/libstage/world.cc
Modified: code/stage/trunk/libstage/ancestor.cc
===================================================================
--- code/stage/trunk/libstage/ancestor.cc 2008-07-23 21:50:03 UTC (rev
6917)
+++ code/stage/trunk/libstage/ancestor.cc 2008-07-24 00:00:30 UTC (rev
6918)
@@ -63,3 +63,12 @@
return pose;
}
+void StgAncestor::ForEachDescendant( stg_model_callback_t func, void* arg )
+{
+ for( GList* it=children; it; it=it->next ) {
+ StgModel* mod = (StgModel*)it->data;
+ func( mod, arg );
+ mod->ForEachDescendant( func, arg );
+ }
+}
+
Modified: code/stage/trunk/libstage/model.cc
===================================================================
--- code/stage/trunk/libstage/model.cc 2008-07-23 21:50:03 UTC (rev 6917)
+++ code/stage/trunk/libstage/model.cc 2008-07-24 00:00:30 UTC (rev 6918)
@@ -705,6 +705,7 @@
{
//printf( "Startup model %s\n", this->token );
+ // TODO: this could be a callback
if( initfunc )
initfunc( this );
Modified: code/stage/trunk/libstage/model_fiducial.cc
===================================================================
--- code/stage/trunk/libstage/model_fiducial.cc 2008-07-23 21:50:03 UTC (rev
6917)
+++ code/stage/trunk/libstage/model_fiducial.cc 2008-07-24 00:00:30 UTC (rev
6918)
@@ -228,7 +228,7 @@
// TODO - add a fiducial-only hash table to the world to speed this
// up a lot for large populations
- world->ForEachModel(
(GHFunc)(StgModelFiducial::AddModelIfVisibleStatic),
+ world->ForEachDescendant(
(stg_model_callback_t)(StgModelFiducial::AddModelIfVisibleStatic),
this );
PRINT_DEBUG2( "model %s saw %d fiducials", token, data->len );
@@ -310,3 +310,15 @@
PopColor();
}
}
+
+void StgModelFiducial::Shutdown( void )
+{
+ PRINT_DEBUG( "fiducial shutdown" );
+
+ // clear the data
+ data = g_array_set_size( data, 0 );
+ fiducials = NULL;
+ fiducial_count = 0;
+
+ StgModel::Shutdown();
+}
Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh 2008-07-23 21:50:03 UTC (rev 6917)
+++ code/stage/trunk/libstage/stage.hh 2008-07-24 00:00:30 UTC (rev 6918)
@@ -848,13 +848,14 @@
protected:
GList* children;
- //GHashTable* child_types;
-
char* token;
bool debug;
public:
+
+ /** recursively call func( model, arg ) for each descendant */
+ void ForEachDescendant( stg_model_callback_t func, void* arg );
/** array contains the number of each type of child model */
unsigned int child_type_counts[MODEL_TYPE_COUNT];
@@ -1118,10 +1119,6 @@
/** Return the 3D bounding box of the world, in meters */
stg_bounds3d_t GetExtent(){ return extent; };
- /** call func( model, arg ) for each model in the world */
- void ForEachModel( GHFunc func, void* arg )
- { g_hash_table_foreach( models_by_name, func, arg ); };
-
/** Return the number of times the world has been updated. */
long unsigned int GetUpdateCount() { return updates; }
};
@@ -2354,9 +2351,7 @@
void AddModelIfVisible( StgModel* him );
// static wrapper function can be used as a function pointer
- static void AddModelIfVisibleStatic( gpointer key,
- StgModel* him,
- StgModelFiducial* me )
+ static int AddModelIfVisibleStatic( StgModel* him,
StgModelFiducial* me )
{ if( him != me ) me->AddModelIfVisible( him ); };
virtual void Update();
@@ -2375,6 +2370,7 @@
virtual ~StgModelFiducial();
virtual void Load();
+ void Shutdown( void );
stg_meters_t max_range_anon; //< maximum detection range
stg_meters_t max_range_id; ///< maximum range at which the ID
can be read
Modified: code/stage/trunk/libstage/world.cc
===================================================================
--- code/stage/trunk/libstage/world.cc 2008-07-23 21:50:03 UTC (rev 6917)
+++ code/stage/trunk/libstage/world.cc 2008-07-24 00:00:30 UTC (rev 6918)
@@ -622,9 +622,9 @@
return;
}
-static void _save_cb( gpointer key, gpointer data, gpointer user )
+static int _save_cb( StgModel* mod, void* dummy )
{
- ((StgModel*)data)->Save();
+ mod->Save();
}
bool StgWorld::Save( const char *filename )
@@ -632,20 +632,20 @@
// ask every model to save itself
//g_hash_table_foreach( this->models_by_id, stg_model_save_cb, NULL );
- ForEachModel( _save_cb, NULL );
+ ForEachDescendant( _save_cb, NULL );
return this->wf->Save( filename );
}
-static void _reload_cb( gpointer key, gpointer data, gpointer user )
+static int _reload_cb( StgModel* mod, void* dummy )
{
- ((StgModel*)data)->Load();
+ mod->Load();
}
// reload the current worldfile
void StgWorld::Reload( void )
{
- ForEachModel( _reload_cb, NULL );
+ ForEachDescendant( _reload_cb, NULL );
}
void StgWorld::StartUpdatingModel( StgModel* mod )
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit