From: <cel...@us...> - 2013-03-24 16:47:00
|
Revision: 13591 http://vegastrike.svn.sourceforge.net/vegastrike/?rev=13591&view=rev Author: cellsafemode Date: 2013-03-24 16:46:53 +0000 (Sun, 24 Mar 2013) Log Message: ----------- removing a Unit pointer from a collection should only need to traverse until the first unit match, we dont put multiple copies in a single list. Also some minor const optimizations and unit_collide was re-creating a function already in collection Modified Paths: -------------- branches/py3/vegastrike/src/cmd/collection.cpp branches/py3/vegastrike/src/cmd/collection.h branches/py3/vegastrike/src/cmd/unit.h branches/py3/vegastrike/src/cmd/unit_click.h branches/py3/vegastrike/src/cmd/unit_collide.h branches/py3/vegastrike/src/cmd/unit_generic.h branches/py3/vegastrike/src/star_system.cpp Modified: branches/py3/vegastrike/src/cmd/collection.cpp =================================================================== --- branches/py3/vegastrike/src/cmd/collection.cpp 2013-03-24 16:41:39 UTC (rev 13590) +++ branches/py3/vegastrike/src/cmd/collection.cpp 2013-03-24 16:46:53 UTC (rev 13591) @@ -327,18 +327,15 @@ bool UnitCollection::remove( const Unit *unit ) { - bool res = false; if (u.empty() || !unit) return false; - for (list< Unit* >::iterator it = u.begin(); it != u.end();) { + for (list< Unit* >::iterator it = u.begin(); it != u.end();++it) { if ( (*it) == unit ) { erase( it ); - res = true; - } else { - ++it; + return(true); } } - return res; + return (false); } const UnitCollection& UnitCollection::operator=( const UnitCollection &uc ) Modified: branches/py3/vegastrike/src/cmd/collection.h =================================================================== --- branches/py3/vegastrike/src/cmd/collection.h 2013-03-24 16:41:39 UTC (rev 13590) +++ branches/py3/vegastrike/src/cmd/collection.h 2013-03-24 16:46:53 UTC (rev 13591) @@ -204,7 +204,7 @@ */ void erase( std::list< class Unit* >::iterator& ); - /* traverse list and remove all matching Units. + /* traverse list and remove first (only) matching Unit. * Do not use in fast-path code */ bool remove( const class Unit* ); Modified: branches/py3/vegastrike/src/cmd/unit.h =================================================================== --- branches/py3/vegastrike/src/cmd/unit.h 2013-03-24 16:41:39 UTC (rev 13590) +++ branches/py3/vegastrike/src/cmd/unit.h 2013-03-24 16:46:53 UTC (rev 13591) @@ -131,7 +131,7 @@ ///Queries the bounding sphere with a duo of mouse coordinates that project ///to the center of a ship and compare with a sphere...pretty fast*/ - bool querySphereClickList( int, int, float err, Camera *activeCam ); + bool querySphereClickList( int, int, float err, Camera *activeCam ) const; ///returns true if jump possible even if not taken /* ************************************************************************************** Modified: branches/py3/vegastrike/src/cmd/unit_click.h =================================================================== --- branches/py3/vegastrike/src/cmd/unit_click.h 2013-03-24 16:41:39 UTC (rev 13590) +++ branches/py3/vegastrike/src/cmd/unit_click.h 2013-03-24 16:46:53 UTC (rev 13591) @@ -10,7 +10,7 @@ Vector MouseCoordinate( int mouseX, int mouseY ); template < class UnitType > -bool GameUnit< UnitType >::querySphereClickList( int mouseX, int mouseY, float err, Camera *activeCam ) +bool GameUnit< UnitType >::querySphereClickList( int mouseX, int mouseY, float err, Camera *activeCam ) const { unsigned int i; Matrix vw; @@ -54,10 +54,11 @@ ) return true; } - Unit *su; - for (un_iter ui = this->getSubUnits(); (su = *ui); ++ui) - if ( (su)->querySphereClickList( mouseX, mouseY, err, activeCam ) ) + const Unit *su; + for (un_kiter ui = this->viewSubUnits(); (su = *ui); ++ui){ + if( su->querySphereClickList( mouseX, mouseY, err, activeCam ) ) return true; + } return false; } Modified: branches/py3/vegastrike/src/cmd/unit_collide.h =================================================================== --- branches/py3/vegastrike/src/cmd/unit_collide.h 2013-03-24 16:41:39 UTC (rev 13590) +++ branches/py3/vegastrike/src/cmd/unit_collide.h 2013-03-24 16:46:53 UTC (rev 13591) @@ -194,21 +194,12 @@ } } } + static bool removeFromVector( UnitCollection &myvector, Unit *objectToKill ) { - bool ret = false; - un_iter removal = myvector.createIterator(); - Unit *un; - while ( (un = *removal) ) { - if (un == objectToKill) { - ret = true; - removal.remove(); - } else { - ++removal; - } - } - return ret; + return (myvector.remove(objectToKill)); } + bool Eradicate( Unit *objectToKill ) { bool ret = removeFromVector( hugeobjects, objectToKill ); Modified: branches/py3/vegastrike/src/cmd/unit_generic.h =================================================================== --- branches/py3/vegastrike/src/cmd/unit_generic.h 2013-03-24 16:41:39 UTC (rev 13590) +++ branches/py3/vegastrike/src/cmd/unit_generic.h 2013-03-24 16:46:53 UTC (rev 13591) @@ -1398,7 +1398,7 @@ * queries the sphere for weapons (world space point) * Only in Unit class */ - virtual bool querySphereClickList( int, int, float err, Camera *activeCam ) + virtual bool querySphereClickList( int, int, float err, Camera *activeCam ) const { return false; } Modified: branches/py3/vegastrike/src/star_system.cpp =================================================================== --- branches/py3/vegastrike/src/star_system.cpp 2013-03-24 16:41:39 UTC (rev 13590) +++ branches/py3/vegastrike/src/star_system.cpp 2013-03-24 16:46:53 UTC (rev 13591) @@ -297,7 +297,7 @@ Unit *unit; if ( ( drawer.action.parent = _Universe->AccessCockpit()->GetParent() ) != NULL ) drawer.action.parenttarget = drawer.action.parent->Target(); - for (un_iter iter = this->GravitationalUnits.createIterator(); (unit = *iter) != NULL; ++iter) { + for (un_iter iter = this->GravitationalUnits.createIterator(); (unit = *iter); ++iter) { float distance = ( drawstartpos-unit->Position() ).Magnitude()-unit->rSize(); if (distance < game_options.precull_dist) drawer.action.grav_acquire( unit ); |