Revision: 8444
http://playerstage.svn.sourceforge.net/playerstage/?rev=8444&view=rev
Author: rtv
Date: 2009-12-01 00:12:34 +0000 (Tue, 01 Dec 2009)
Log Message:
-----------
removing unused code. applied polygon winding patch from Jeff Donner
Modified Paths:
--------------
code/stage/trunk/libstage/block.cc
code/stage/trunk/libstage/model_load.cc
code/stage/trunk/libstage/region.hh
code/stage/trunk/libstage/stage.hh
code/stage/trunk/libstage/world.cc
code/stage/trunk/todo.txt
code/stage/trunk/worlds/SFU.world
code/stage/trunk/worlds/benchmark/hospital.world
code/stage/trunk/worlds/fasr.world
Modified: code/stage/trunk/libstage/block.cc
===================================================================
--- code/stage/trunk/libstage/block.cc 2009-11-24 19:39:13 UTC (rev 8443)
+++ code/stage/trunk/libstage/block.cc 2009-12-01 00:12:34 UTC (rev 8444)
@@ -2,7 +2,11 @@
#include "worldfile.hh"
using namespace Stg;
+using std::vector;
+static void canonicalize_winding(vector<stg_point_t>& pts);
+
+
/** Create a new block. A model's body is a list of these
blocks. The point data is copied, so pts can safely be freed
after calling this.*/
@@ -32,6 +36,7 @@
this->pts.reserve( pt_count );
for( size_t p=0; p<pt_count; p++ )
this->pts.push_back( pts[p] );
+ canonicalize_winding(this->pts);
}
/** A from-file constructor */
@@ -52,6 +57,7 @@
assert(entity);
Load( wf, entity );
+ canonicalize_winding(this->pts);
}
Block::~Block()
@@ -458,3 +464,92 @@
glow = wf->ReadFloat( entity, "glow", glow );
}
+
+static
+/// util; puts angle into [0, 2pi)
+void positivize(stg_radians_t& angle)
+{
+ while (angle < 0) angle += 2 * M_PI;
+}
+
+static
+/// util; puts angle into -pi/2, pi/2
+void pi_ize(stg_radians_t& angle)
+{
+ while (angle < -M_PI) angle += 2 * M_PI;
+ while (M_PI < angle) angle -= 2 * M_PI;
+}
+
+typedef stg_point_t V2;
+
+static
+/// util; How much was v1 rotated to get to v2?
+stg_radians_t angle_change(V2 v1, V2 v2)
+{
+ stg_radians_t a1 = atan2(v1.y, v1.x);
+ positivize(a1);
+
+ stg_radians_t a2 = atan2(v2.y, v2.x);
+ positivize(a2);
+
+ stg_radians_t angle_change = a2 - a1;
+ pi_ize(angle_change);
+
+ return angle_change;
+}
+
+static
+/// util; find vectors between adjacent points, pts[next] - pts[cur]
+vector<stg_point_t> find_vectors(vector<stg_point_t> const& pts)
+{
+ vector<stg_point_t> vs;
+ assert(2 <= pts.size());
+ for (unsigned i = 0, n = pts.size(); i < n; ++i)
+ {
+ unsigned j = (i + 1) % n;
+ vs.push_back(V2(pts[j].x - pts[i].x, pts[j].y - pts[i].y));
+ }
+ assert(vs.size() == pts.size());
+ return vs;
+}
+
+static
+/// util; finds sum of angle changes, from each vertex to the
+/// next one (in current ordering), wrapping around.
+stg_radians_t angles_sum(vector<stg_point_t> const& vs)
+{
+ stg_radians_t angle_sum = 0;
+ for (unsigned i = 0, n = vs.size(); i < n; ++i)
+ {
+ unsigned j = (i + 1) % n;
+ angle_sum += angle_change(vs[i], vs[j]);
+ }
+ return angle_sum;
+}
+
+static
+/// Util
+bool is_canonical_winding(vector<stg_point_t> const& ps)
+{
+ // reuse stg_point_t as vector
+ vector<stg_point_t> vs = find_vectors(ps);
+ stg_radians_t sum = angles_sum(vs);
+ bool bCanon = 0 < sum;
+
+ return bCanon;
+}
+
+static
+/// util; sums angle changes to see whether it's 2pi or -2pi.
+/// 2pi is counter-clockwise winding (which OpenGL requires),
+/// -2pi is clockwise. Reverses <pts> when winding is clockwise.
+// Note that a simple line that doubles back on itself has an
+// angle sum of 0, but that's intrinsic to a line - its winding could
+// be either way.
+void canonicalize_winding(vector<stg_point_t>& ps)
+{
+ if (not is_canonical_winding(ps))
+ {
+ std::reverse(ps.begin(), ps.end());
+ }
+}
Modified: code/stage/trunk/libstage/model_load.cc
===================================================================
--- code/stage/trunk/libstage/model_load.cc 2009-11-24 19:39:13 UTC (rev
8443)
+++ code/stage/trunk/libstage/model_load.cc 2009-12-01 00:12:34 UTC (rev
8444)
@@ -51,26 +51,16 @@
watts_give = wf->ReadFloat( wf_entity, "give_watts", watts_give );
watts_take = wf->ReadFloat( wf_entity, "take_watts", watts_take );
- if( wf->PropertyExists( wf_entity, "debug" ) )
- {
- PRINT_WARN2( "debug property specified for model %d %s\n",
- wf_entity, this->token.c_str()
);
- this->debug = wf->ReadInt( wf_entity, "debug", this->debug );
- }
+ this->debug = wf->ReadInt( wf_entity, "debug", this->debug );
- if( wf->PropertyExists( wf_entity, "name" ) )
- {
- const std::string& name = wf->ReadString(wf_entity, "name", token );
- if( name != token )
- {
- //printf( "adding name %s to %s\n", name, this->token
);
- this->token = name ;
- world->AddModelName( this, name ); // add this name to
the world's table
- }
- else
- PRINT_ERR1( "Name blank for model %s. Check your
worldfile\n", this->token.c_str() );
- }
-
+ const std::string& name = wf->ReadString(wf_entity, "name", token );
+ if( name != token )
+ {
+ //printf( "adding name %s to %s\n", name, this->token );
+ this->token = name ;
+ world->AddModelName( this, name ); // add this name to the
world's table
+ }
+
//PRINT_WARN1( "%s::Load", token );
if( wf->PropertyExists( wf_entity, "origin" ) )
@@ -176,24 +166,22 @@
AddBlockRect(blockgroup.maxx-epsilon,blockgroup.miny,
epsilon, bgsize.y, bgsize.z );
}
}
-
- if( wf->PropertyExists( wf_entity, "mass" ))
- this->SetMass( wf->ReadFloat(wf_entity, "mass", this->mass ));
-
+
+ stg_kg_t m = wf->ReadFloat(wf_entity, "mass", this->mass );
+ if( m != this->mass )
+ SetMass( m );
+
vis.Load( wf, wf_entity );
- SetFiducialReturn( vis.fiducial_return ); // may have some work to do
-
+ SetFiducialReturn( vis.fiducial_return ); // may have some work to do
+
gui.Load( wf, wf_entity );
- if( wf->PropertyExists( wf_entity, "map_resolution" ))
- this->SetMapResolution( wf->ReadFloat(wf_entity, "map_resolution",
this->map_resolution ));
-
- // todo - look into this
- //if (vis.gravity_return)
- //this->SetVelocity( GetVelocity() );
+ double res = wf->ReadFloat(wf_entity, "map_resolution", this->map_resolution
);
+ if( res != this->map_resolution )
+ SetMapResolution( res );
+
+ velocity_enable = wf->ReadInt( wf_entity, "enable_velocity", velocity_enable
);
- velocity_enable = wf->ReadInt( wf_entity, "enable_velocity",
velocity_enable );
-
if( wf->PropertyExists( wf_entity, "friction" ))
{
this->SetFriction( wf->ReadFloat(wf_entity, "friction", this->friction ));
@@ -214,11 +202,11 @@
}
- if( wf->PropertyExists( wf_entity, "say" ))
- this->Say( wf->ReadString(wf_entity, "say", "" ));
+
+ Say( wf->ReadString(wf_entity, "say", "" ));
- trail_length = wf->ReadInt( wf_entity, "trail_length", trail_length );
- trail.resize( trail_length );
+ trail_length = wf->ReadInt( wf_entity, "trail_length", trail_length );
+ trail.resize( trail_length );
trail_interval = wf->ReadInt( wf_entity, "trail_interval",
trail_interval );
Modified: code/stage/trunk/libstage/region.hh
===================================================================
--- code/stage/trunk/libstage/region.hh 2009-11-24 19:39:13 UTC (rev 8443)
+++ code/stage/trunk/libstage/region.hh 2009-12-01 00:12:34 UTC (rev 8444)
@@ -11,6 +11,8 @@
{
// a bit of experimenting suggests that these values are fast. YMMV.
+ //const int32_t RBITS( 5 ); // regions contain (2^RBITS)^2 pixels
+ //const int32_t SBITS( 5 );// superregions contain (2^SBITS)^2 regions
const int32_t RBITS( 5 ); // regions contain (2^RBITS)^2 pixels
const int32_t SBITS( 5 );// superregions contain (2^SBITS)^2 regions
const int32_t SRBITS( RBITS+SBITS );
Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh 2009-11-24 19:39:13 UTC (rev 8443)
+++ code/stage/trunk/libstage/stage.hh 2009-12-01 00:12:34 UTC (rev 8444)
@@ -783,6 +783,9 @@
bool destroy;
bool dirty; ///< iff true, a gui redraw would be required
+ /** Models that should be rendered into the background just-in-time,
before sensing occurs */
+ //std::vector<Model*> jit_render;
+
/** Pointers to all the models in this world. */
std::set<Model*> models;
@@ -887,9 +890,9 @@
virtual Model* RecentlySelectedModel(){ return NULL; }
SuperRegion* AddSuperRegion( const stg_point_int_t& coord );
- SuperRegion* GetSuperRegion( const stg_point_int_t& coord );
- SuperRegion* GetSuperRegionCached( const stg_point_int_t& coord);
- SuperRegion* GetSuperRegionCached( int32_t x, int32_t y );
+ //SuperRegion* GetSuperRegion( const stg_point_int_t& coord );
+ //SuperRegion* GetSuperRegionCached( const stg_point_int_t& coord);
+ SuperRegion* GetSuperRegion( int32_t x, int32_t y );
void ExpireSuperRegion( SuperRegion* sr );
/** add a Cell pointer to the vector for each cell on the line
from
@@ -1610,6 +1613,9 @@
always runs. Defaults to false. */
bool alwayson;
+ /** If true, the model is rendered lazily into the regions, to reduce
memory use. */
+ // bool background;
+
BlockGroup blockgroup;
/** OpenGL display list identifier for the blockgroup */
int blocks_dl;
Modified: code/stage/trunk/libstage/world.cc
===================================================================
--- code/stage/trunk/libstage/world.cc 2009-11-24 19:39:13 UTC (rev 8443)
+++ code/stage/trunk/libstage/world.cc 2009-12-01 00:12:34 UTC (rev 8444)
@@ -47,9 +47,9 @@
detection and sensing. The default is often a reasonable choice.
- show_clock <int>\n
- If non-zero, print the simulation time on stdout every
- $show_clock_interval updates. Useful to watch the progress of
- non-GUI simulations.
+ If non-zero, print the simulation time on stdout every
+ $show_clock_interval updates. Useful to watch the progress of
+ non-GUI simulations.
- show_clock_interval <int>\n
Sets the number of updates between printing the time on stdoutm,
@@ -103,6 +103,7 @@
// private
destroy( false ),
dirty( true ),
+ //jit_render(),
models(),
models_by_name(),
models_with_fiducials(),
@@ -351,18 +352,18 @@
// kick off the threads
for( unsigned int t=0; t<worker_threads; t++ )
- {
- std::pair<World*,int> *p = new std::pair<World*,int>( this, t+1 );
+ {
+ std::pair<World*,int> info( this, t+1 );
+
+ //normal posix pthread C function pointer
+ typedef void* (*func_ptr) (void*);
- //normal posix pthread C function pointer
- typedef void* (*func_ptr) (void*);
-
- pthread_t pt;
- pthread_create( &pt,
- NULL,
- (func_ptr)World::update_thread_entry,
- p );
- }
+ pthread_t pt;
+ pthread_create( &pt,
+ NULL,
+
(func_ptr)World::update_thread_entry,
+ &info );
+ }
printf( "[threads %u]", worker_threads );
}
@@ -374,13 +375,13 @@
// don't load window entries here
if( strcmp( typestr, "window" ) == 0 )
- {
- /* do nothing here */
- }
+ {
+ /* do nothing here */
+ }
else if( strcmp( typestr, "block" ) == 0 )
- LoadBlock( wf, entity );
+ LoadBlock( wf, entity );
else
- LoadModel( wf, entity );
+ LoadModel( wf, entity );
}
// call all controller init functions
@@ -448,7 +449,7 @@
}
void World::AddUpdateCallback( stg_world_callback_t cb,
- void* user )
+
void* user )
{
// add the callback & argument to the list
std::pair<stg_world_callback_t,void*> p(cb, user);
@@ -456,7 +457,7 @@
}
int World::RemoveUpdateCallback( stg_world_callback_t cb,
- void* user )
+
void* user )
{
std::pair<stg_world_callback_t,void*> p( cb, user );
@@ -705,7 +706,7 @@
// inline calls have a noticeable (2-3%) effect on performance.
while( n > 0 ) // while we are still not at the ray end
{
- Region* reg( GetSuperRegionCached( GETSREG(globx), GETSREG(globy) )
+ Region* reg( GetSuperRegion( GETSREG(globx), GETSREG(globy) )
->GetRegion( GETREG(globx),
GETREG(globy) ));
if( reg->count ) // if the region contains any objects
@@ -903,56 +904,36 @@
//printf( "top right (%.2f,%.2f,%.2f)\n", pt.x, pt.y, pt.z );
Extend( pt ); // top right corner of the new superregion
+// // map all jit models
+// FOR_EACH( it, jit_render )
+// (*it)->Map();
+
return sr;
}
-inline SuperRegion* World::GetSuperRegionCached( int32_t x, int32_t y )
+
+inline SuperRegion* World::GetSuperRegion( int32_t x, int32_t y )
{
// around 99% of the time the SR is the same as last
// lookup - cache gives a 4% overall speed up :)
if( sr_cached && sr_cached->origin.x == x && sr_cached->origin.y == y )
return sr_cached;
- //else
- // delay constructing the object as long as possible
- return GetSuperRegion( stg_point_int_t(x,y) );
-}
-
-inline SuperRegion* World::GetSuperRegionCached( const stg_point_int_t& sup )
-{
- // around 99% of the time the SR is the same as last
- // lookup - cache gives a 4% overall speed up :)
- if( sr_cached && sr_cached->origin == sup )
- return sr_cached;
- //else
- return GetSuperRegion( sup);
-}
-
-
-inline SuperRegion* World::GetSuperRegion( const stg_point_int_t& sup )
-{
- //printf( "SUP[ %d %d ] ", sup.x, sup.y );
- SuperRegion* sr = superregions[ sup ];
+ stg_point_int_t pt(x,y);
+ SuperRegion* sr = superregions[ pt ];
+
if( sr == NULL ) // no superregion exists! make a new one
- sr = AddSuperRegion( sup );
+ sr = AddSuperRegion( pt );
// cache for next time around
sr_cached = sr;
- assert( sr );
+ //assert( sr );
return sr;
}
-// Cell* World::GetCell( const stg_point_int_t& glob )
-// {
-// return( ((Region*)GetSuperRegionCached( GETSREG(glob.x), GETSREG(glob.y)
)
-// ->GetRegion( GETREG(glob.x), GETREG(glob.y) ))
-// ->GetCell( GETCELL(glob.x), GETCELL(glob.y) )) ;
-// }
-
-
void World::ForEachCellInLine( const stg_point_int_t& start,
const stg_point_int_t& end,
CellPtrVec& cells )
@@ -975,9 +956,9 @@
while( n )
{
- Region* reg( GetSuperRegionCached( GETSREG(globx), GETSREG(globy) )
+ Region* reg( GetSuperRegion( GETSREG(globx), GETSREG(globy) )
->GetRegion( GETREG(globx),
GETREG(globy) ));
-
+
// add all the required cells in this region before looking up
// another region
int32_t cx( GETCELL(globx) );
@@ -994,7 +975,7 @@
n > 0 )
{
// find the cell at this location, then add it to the
vector
- cells.push_back( c );
+ cells.push_back( c );
// cleverly skip to the next cell (now it's safe to
// manipulate the cell pointer)
Modified: code/stage/trunk/todo.txt
===================================================================
--- code/stage/trunk/todo.txt 2009-11-24 19:39:13 UTC (rev 8443)
+++ code/stage/trunk/todo.txt 2009-12-01 00:12:34 UTC (rev 8444)
@@ -16,6 +16,7 @@
OS X 16.20 (rev 7949)
19.94 (rev 8210 - new event queue is slower but more powerful and
elegant)
14.5 (rev 8295) threads: 6: 13.7 3: 13.4
+ 14.16 (rev 8329) threads 3: 13.4
MBA 17.3
MBA 23.1 (1 thread)
Modified: code/stage/trunk/worlds/SFU.world
===================================================================
--- code/stage/trunk/worlds/SFU.world 2009-11-24 19:39:13 UTC (rev 8443)
+++ code/stage/trunk/worlds/SFU.world 2009-12-01 00:12:34 UTC (rev 8444)
@@ -9,7 +9,7 @@
speedup -1 # as fast as possible
paused 0
-resolution 0.1
+resolution 0.05
threads 0
# configure the GUI window
Modified: code/stage/trunk/worlds/benchmark/hospital.world
===================================================================
--- code/stage/trunk/worlds/benchmark/hospital.world 2009-11-24 19:39:13 UTC
(rev 8443)
+++ code/stage/trunk/worlds/benchmark/hospital.world 2009-12-01 00:12:34 UTC
(rev 8444)
@@ -32,6 +32,7 @@
# load an environment bitmap
floorplan
(
+ background 0
size [140.000 60.000 0.500]
pose [0 0.500 0 0]
bitmap "../bitmaps/hospital.png"
@@ -43,22 +44,22 @@
color "random"
ranger( pose [ 0 0 -0.050 0 ]
- alwayson 1
+ # alwayson 1
- scount 12
- spose[0] [0 0 0]
- spose[1] [0 0 30]
- spose[2] [0 0 60]
- spose[3] [0 0 90]
- spose[4] [0 0 120]
- spose[5] [0 0 150]
- spose[6] [0 0 180]
- spose[7] [0 0 210]
- spose[8] [0 0 240]
- spose[9] [0 0 270]
- spose[10] [0 0 300]
- spose[11] [0 0 330]
- sview [ 0 2 30] )
+ scount 12
+ spose[0] [0 0 0]
+ spose[1] [0 0 30]
+ spose[2] [0 0 60]
+ spose[3] [0 0 90]
+ spose[4] [0 0 120]
+ spose[5] [0 0 150]
+ spose[6] [0 0 180]
+ spose[7] [0 0 210]
+ spose[8] [0 0 240]
+ spose[9] [0 0 270]
+ spose[10] [0 0 300]
+ spose[11] [0 0 330]
+ sview [ 0 2 30] )
ctrl "expand_swarm"
)
Modified: code/stage/trunk/worlds/fasr.world
===================================================================
--- code/stage/trunk/worlds/fasr.world 2009-11-24 19:39:13 UTC (rev 8443)
+++ code/stage/trunk/worlds/fasr.world 2009-12-01 00:12:34 UTC (rev 8444)
@@ -15,7 +15,7 @@
resolution 0.02
-#threads 2
+ threads 0
# configure the GUI window
window
@@ -35,7 +35,7 @@
# load an environment bitmap
floorplan
(
- name "cave"
+ name "cave"
pose [0 0 0 0]
size [16.000 16.000 0.600]
bitmap "bitmaps/cave.png"
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing.
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit