basic/geometry/ObjectGroup.cpp

Go to the documentation of this file.
00001 //## begin module%36FE80AD0258.cm preserve=no
00002 //        %X% %Q% %Z% %W%
00003 //## end module%36FE80AD0258.cm
00004 
00005 //## begin module%36FE80AD0258.cp preserve=no
00006 //## end module%36FE80AD0258.cp
00007 
00008 //## Module: ObjectGroup%36FE80AD0258; Pseudo Package body
00009 //## Source file: E:\mpk\code\geometry\ObjectGroup.cpp
00010 
00011 //## begin module%36FE80AD0258.additionalIncludes preserve=no
00012 //## end module%36FE80AD0258.additionalIncludes
00013 
00014 //## begin module%36FE80AD0258.includes preserve=yes
00015 #include <assert.h>
00016 #include <additional/streams/mystreams.h>
00017 #include <geometry/IGS/IGS_Group.h>
00018 //## end module%36FE80AD0258.includes
00019 
00020 // ObjectGroup
00021 #include "geometry\ObjectGroup.h"
00022 // Frame
00023 #include "geometry\Frame.h"
00024 //## begin module%36FE80AD0258.additionalDeclarations preserve=yes
00025 //## end module%36FE80AD0258.additionalDeclarations
00026 
00027 // Class ObjectGroup 
00028 
00029 ObjectGroup::ObjectGroup (FrameManager* frameManager)
00030   //## begin ObjectGroup::ObjectGroup%926969419.hasinit preserve=no
00031   //## end ObjectGroup::ObjectGroup%926969419.hasinit
00032   //## begin ObjectGroup::ObjectGroup%926969419.initialization preserve=yes
00033     :ObjectBase( frameManager ),
00034         baseFrame( NULL ),
00035         offsetFrame( NULL )
00036   //## end ObjectGroup::ObjectGroup%926969419.initialization
00037 {
00038   //## begin ObjectGroup::ObjectGroup%926969419.body preserve=yes
00039   //## end ObjectGroup::ObjectGroup%926969419.body
00040 }
00041 
00042 ObjectGroup::ObjectGroup (const ObjectGroup& right)
00043   //## begin ObjectGroup::ObjectGroup%926969420.hasinit preserve=no
00044   //## end ObjectGroup::ObjectGroup%926969420.hasinit
00045   //## begin ObjectGroup::ObjectGroup%926969420.initialization preserve=yes
00046     :   ObjectBase( right ),
00047   baseFrame( right.baseFrame ),
00048   offsetFrame( right.offsetFrame )
00049 
00050   //## end ObjectGroup::ObjectGroup%926969420.initialization
00051 {
00052   //## begin ObjectGroup::ObjectGroup%926969420.body preserve=yes
00053         //clone each of the objects in the original group
00054         for( int i = 0; i < right.objects.size(); i++ )
00055         {
00056                 ObjectBase* object = static_cast< ObjectBase* >( right.objects[ i ]->Clone() ) ;
00057                 objects.push_back( object ) ;
00058         }
00059   //## end ObjectGroup::ObjectGroup%926969420.body
00060 }
00061 
00062 //=============================================================================
00063 // Constructor
00064 //
00065 // Description: create an object group from an IGS group
00066 //=============================================================================
00067 ObjectGroup::ObjectGroup( const IGS_Group& right )
00068 :
00069         ObjectBase( NULL )
00070 {
00071         int i;
00072         int size = right.objects.size();
00073         for( i = 0; i < size; i++ )
00074         {
00075                 IGS_Object* object = right.objects[ i ];
00076                 ObjectBase* mpkObject = ObjectBase::Create( object );
00077                 this->AddObject( mpkObject );
00078                 delete mpkObject;
00079         }
00080 }
00081 
00082 
00083 ObjectGroup::~ObjectGroup()
00084 {
00085   //## begin ObjectGroup::~ObjectGroup%.body preserve=yes
00086         int size = objects.size() ;
00087         for( int i = 0; i < objects.size() ; i++ )
00088         {
00089                 assert( i < objects.size() ) ;
00090                 ObjectBase* deleteMe = objects[ i ] ;
00091                 delete( deleteMe ) ;
00092                 objects[ i ] = NULL ;
00093         }
00094   //## end ObjectGroup::~ObjectGroup%.body
00095 }
00096 
00097 
00098 
00099 //## Other Operations (implementation)
00100 const ObjectBase* ObjectGroup::operator [] (const unsigned int index) const
00101 {
00102   //## begin ObjectGroup::operator[]%922649203.body preserve=yes
00103         assert( index < objects.size() ); 
00104         return( objects[ index ] ) ;
00105   //## end ObjectGroup::operator[]%922649203.body
00106 }
00107 
00108 int ObjectGroup::AddObject (const ObjectBase* object)
00109 {
00110     if( object != NULL )
00111     {
00112             objects.push_back( reinterpret_cast<ObjectBase*>( object->Clone() ) ) ;
00113     }
00114         return objects.size() - 1 ;
00115 }
00116 
00117 bool ObjectGroup::IsInterfering (const Entity* entity) const
00118 {
00119   //## begin ObjectGroup::IsInterfering%925235847.body preserve=yes
00120         for( int i = 0; i < objects.size(); i++ )
00121         {
00122                 const Entity* e1 = objects[ i ] ;
00123                 const Entity* e2 = entity ;
00124                 bool forwardTest = e1->CanCheckInterference( e2 ) ;             //IMPROVE: inline all this stuff
00125                 bool reverseTest = e2->CanCheckInterference( e1 ) ;
00126                 
00127                 if( forwardTest )
00128                 {
00129                         if( e1->IsInterfering( e2 ) )
00130                         {
00131                                 return true ;
00132                         }
00133                 }
00134                 else
00135                 {
00136                         //IMPROVE: need to say something if geometry is incompatable
00137                         //assert( reverseTest != false ) ;
00138                         if( e2->IsInterfering( e1 ) )
00139                         {
00140                                 return true ;
00141                         }
00142                 }
00143         }
00144         return false ;
00145         //IMPROVE: use a bounding volume?
00146   //## end ObjectGroup::IsInterfering%925235847.body
00147 }
00148 
00149 void ObjectGroup::SetFrameManager (FrameManager* frameManager)
00150 {
00151   //## begin ObjectGroup::SetFrameManager%926969418.body preserve=yes
00152         //need to set the frame manager of all the contained objects
00153         Entity::SetFrameManager( frameManager ) ;
00154         for( int i = 0 ; i < objects.size(); i++ )
00155         {
00156                 objects[ i ]->SetFrameManager( frameManager ) ;
00157         }
00158   //## end ObjectGroup::SetFrameManager%926969418.body
00159 }
00160 
00161 //removes all the elements from the group
00162 void ObjectGroup::Clear()
00163 {
00164         this->objects.empty();
00165 }
00166 
00167 
00168 Entity* ObjectGroup::Clone () const
00169 {
00170   //## begin ObjectGroup::Clone%926969421.body preserve=yes
00171         return new ObjectGroup( *this ) ;
00172   //## end ObjectGroup::Clone%926969421.body
00173 }
00174 
00175 bool ObjectGroup::CanCheckInterference (const Entity* entity) const
00176 {
00177   //## begin ObjectGroup::CanCheckInterference%926969422.body preserve=yes
00178         //check if each of the underlying objects can check interference with this entity
00179         for( int i = 0; i < objects.size(); i++ )
00180         {
00181                 const Entity* e1 = objects[ i ] ;
00182                 const Entity* e2 = entity ;
00183                 bool forwardTest = e1->CanCheckInterference( e2 ) ;             //IMPROVE: inline all this stuff
00184                 bool reverseTest = e2->CanCheckInterference( e1 ) ;
00185                 if( !forwardTest && !reverseTest )
00186                 {
00187                         return false ;
00188                 }
00189         }
00190         return true ;
00191   //## end ObjectGroup::CanCheckInterference%926969422.body
00192 }
00193 
00194 void ObjectGroup::SetBaseFrame (const unsigned int baseFrame)
00195 {
00196   //## begin ObjectGroup::SetBaseFrame%927936639.body preserve=yes
00197         ObjectBase::SetBaseFrame( baseFrame ); 
00198         for( int i = 0; i < objects.size(); i++ )
00199         {
00200                 objects[ i ]->SetBaseFrame( baseFrame ) ;
00201         }
00202   //## end ObjectGroup::SetBaseFrame%927936639.body
00203 }
00204 
00205 void ObjectGroup::SetFrame (const Matrix4x4& frame)
00206 {
00207   //## begin ObjectGroup::SetFrame%928263343.body preserve=yes
00208         for( int i = 0 ; i < objects.size(); i++ )
00209         {
00210                 objects[ i ]->SetFrame( frame ) ;
00211         }
00212   //## end ObjectGroup::SetFrame%928263343.body
00213 }
00214 
00215 unsigned int ObjectGroup::Size () const
00216 {
00217   //## begin ObjectGroup::Size%928344303.body preserve=yes
00218         return objects.size() ;
00219   //## end ObjectGroup::Size%928344303.body
00220 }
00221 
00222 void ObjectGroup::Serialize (ostream& os) const
00223 {
00224   //## begin ObjectGroup::Serialize%934220963.body preserve=yes
00225         using std::endl ;
00226 
00227         //form a list of all the serializable objects
00228         std::vector< MPK_Serializable* > serializable ;
00229 
00230     int i;
00231         for( i = 0; i < objects.size(); i++ )
00232         {
00233                 ObjectBase* object = objects[ i ] ;
00234                 MPK_Serializable* sObject = dynamic_cast< MPK_Serializable* >( object );
00235                 assert( sObject != NULL ) ;
00236                 serializable.push_back( sObject ) ;
00237         }
00238 
00239         os << "#object_group" << endl ;
00240         os << serializable.size() << endl ;
00241 
00242         for( i = 0; i < serializable.size(); i++ )
00243         {
00244                 serializable[ i ]->Serialize( os ) ;
00245         }
00246         os << "#end_object_group" << endl ;
00247   //## end ObjectGroup::Serialize%934220963.body
00248 }
00249 
00250 void ObjectGroup::Deserialize (IfstreamWithComments& is)
00251 {
00252   //## begin ObjectGroup::Deserialize%934220964.body preserve=yes
00253         int size = -1 ;
00254         is >> size ;
00255 
00256         for( int i = 0; i < size; i++ )
00257         {
00258                 ObjectBase* object = ObjectBase::Deserialize( is );
00259                 AddObject( object ) ;
00260                 delete object ;
00261         }
00262 
00263         char marker[ 300 ] ;
00264         eatwhite( is ) ;
00265         is.getline( marker, 300 ) ;
00266         assert( strcmp( marker, "#end_object_group" ) == 0 ) ;
00267 
00268   //## end ObjectGroup::Deserialize%934220964.body
00269 }
00270 
00271 // Additional Declarations
00272   //## begin ObjectGroup%36FE80AD0258.declarations preserve=yes
00273 int ObjectGroup::TotalPolys() const
00274 {
00275         int totalPolys = 0 ;
00276         for( int i = 0; i < objects.size(); i++ )
00277         {
00278                 totalPolys += objects[ i ]->TotalPolys() ;
00279         }
00280         return totalPolys ;
00281 };
00282   //## end ObjectGroup%36FE80AD0258.declarations
00283 
00284 bool ObjectGroup::Verify() const
00285 {
00286         assert( false );
00287         return true;
00288 }
00289 
00290 //## begin module%36FE80AD0258.epilog preserve=yes
00291 //## end module%36FE80AD0258.epilog

Generated on Sat Apr 1 21:30:33 2006 for Motion Planning Kernel by  doxygen 1.4.6-NO