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