![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsMultiMeshModel.cpp 00003 00004 A collection of mesh models - 00005 can be any mixing of Polygonal, XPolygonal, and Halfedge Models. 00006 00007 SUKITTI PUNAK (08/08/2006) 00008 UPDATE (08/09/2006) 00009 ******************************************************************************/ 00010 #include "TAPsMultiMeshModel.hpp" 00011 // Using Inclusion Model (i.e. definitions are included in declarations) 00012 // (this name.cpp is included in name.hpp) 00013 // Each friend is defined directly inside its declaration. 00014 00015 BEGIN_NAMESPACE_TAPs__OpenGL 00016 //============================================================================= 00017 //----------------------------------------------------------------------------- 00018 // static initialization 00019 template <typename T> int MultiMeshModel<T>::m_iTotal = 0; 00020 //----------------------------------------------------------------------------- 00021 // Default Constructor 00022 template <typename T> 00023 MultiMeshModel<T>::MultiMeshModel () 00024 : ColDetSupport<T>(), 00025 PhysicsSupport<T>(), 00026 m_iId( m_iTotal++ ), m_pcName( NULL ) 00027 { 00028 #ifdef TAPs_DEBUG_MODE 00029 std::cout << "MultiMeshModel<" << typeid(T).name() << "> #" << m_iId << " constructor\n"; 00030 #endif//TAPs_DEBUG_MODE 00031 } 00032 //----------------------------------------------------------------------------- 00033 // Constructor 00034 template <typename T> 00035 MultiMeshModel<T>::MultiMeshModel (char *name) 00036 : //TransformationSupport<T>(), 00037 m_iId( m_iTotal++ ), m_pcName( NULL ) 00038 { 00039 SetName( name ); 00040 00041 #ifdef TAPs_DEBUG_MODE 00042 std::cout << "MultiMeshModel<" << typeid(T).name() << "> #" << m_iId << " constructor\n"; 00043 #endif//TAPs_DEBUG_MODE 00044 } 00045 //----------------------------------------------------------------------------- 00046 // Destructor 00047 template <typename T> 00048 MultiMeshModel<T>::~MultiMeshModel () 00049 { 00050 if ( m_pcName ) { 00051 delete [] m_pcName; 00052 m_pcName = NULL; 00053 } 00054 --m_iTotal; 00055 00056 #ifdef TAPs_DEBUG_MODE 00057 std::cout << "MultiMeshModel<" << typeid(T).name() << "> #" << m_iId << " destructor\n"; 00058 #endif//TAPs_DEBUG_MODE 00059 } 00060 //----------------------------------------------------------------------------- 00061 // Get/Set Fns 00062 template <typename T> 00063 int MultiMeshModel<T>::GetID () const 00064 { 00065 return m_iId; 00066 } 00067 //----------------------------------------------------------------------------- 00068 template <typename T> 00069 void MultiMeshModel<T>::SetID ( int id ) 00070 { 00071 m_iId = id; 00072 } 00073 //----------------------------------------------------------------------------- 00074 template <typename T> 00075 char const * const MultiMeshModel<T>::GetName () const 00076 { 00077 return m_pcName; 00078 } 00079 //----------------------------------------------------------------------------- 00080 template <typename T> 00081 void MultiMeshModel<T>::SetName ( char * name ) 00082 { 00083 if ( m_pcName ) { 00084 delete [] m_pcName; 00085 m_pcName = NULL; 00086 } 00087 m_pcName = new char[ strlen(name) + 1 ]; 00088 strcpy( m_pcName, name ); 00089 } 00090 //----------------------------------------------------------------------------- 00091 // Initailize 00092 template <typename T> 00093 void MultiMeshModel<T>::Initialize () 00094 { 00095 std::vector< MeshModel<T> * >::iterator pos = m_vModelPtrList.begin(); 00096 while ( pos != m_vModelPtrList.end() ) { 00097 assert( *pos != NULL ); 00098 (*pos)->Initialize(); 00099 ++pos; 00100 } 00101 } 00102 //****************************************************************************** 00103 // ApplyAndResetTransform 00104 //****************************************************************************** 00105 //----------------------------------------------------------------------------- 00106 template <typename T> 00107 void MultiMeshModel<T>::ApplyAndResetTransform () 00108 { 00109 std::vector< MeshModel<T> * >::iterator pos = m_vModelPtrList.begin(); 00110 while ( pos != m_vModelPtrList.end() ) { 00111 assert( *pos != NULL ); 00112 (*pos)->GetTransform().SetTranslation( GetTransform().GetTranslation() ); 00113 // (*pos)->GetTransform().SetRotationAngles( GetTransform().GetRotationAngles() ); 00114 // (*pos)->GetTransform().SetScale( GetTransform().GetScale() ); 00115 (*pos)->GetTransform().SetMatrixTransform( GetTransform().GetMatrixTransform() ); 00116 (*pos)->ApplyAndResetTransform(); 00117 ++pos; 00118 } 00119 GetTransform().MakeIdentity(); 00120 } 00121 //----------------------------------------------------------------------------- 00122 00123 //****************************************************************************** 00124 // Virtual Fns from Collision Detection from ColDetSupport class 00125 //****************************************************************************** 00126 //----------------------------------------------------------------------------- 00127 /* 00128 template <typename T> 00129 void MultiMeshModel<T>::CalBoundingAABB () 00130 { 00131 } 00132 //----------------------------------------------------------------------------- 00133 template <typename T> 00134 void MultiMeshModel<T>::CalBoundingEllipsoid () 00135 { 00136 } 00137 //----------------------------------------------------------------------------- 00138 template <typename T> 00139 void MultiMeshModel<T>::CalBoundingSphere () 00140 { 00141 } 00142 //*/ 00143 //----------------------------------------------------------------------------- 00144 // Create BVHTree 00145 template <typename T> 00146 void MultiMeshModel<T>::BuildBVHTree ( TAPs::Enum::CD treeType ) 00147 { 00148 //----------------------------------------------------- 00149 // Check Model Type 00150 for ( int i = 0; i < static_cast<int>( m_vModelPtrList.size() ); ++i ) { 00151 m_vModelPtrList[i]->BuildBVHTree( treeType ); 00152 } 00153 //----------------------------------------------------- 00154 } 00155 //----------------------------------------------------------------------------- 00156 00157 //****************************************************************************** 00158 //----------------------------------------------------------------------------- 00159 // Display By OpenGL 00160 template <typename T> 00161 void MultiMeshModel<T>::DisplayGL ( OpenGL::Enum::DrawMode DM ) 00162 { 00163 glPushMatrix(); 00164 GetTransform().TransformByOpenGLForDrawing(); 00165 00166 std::vector< MeshModel<T> * >::iterator pos = m_vModelPtrList.begin(); 00167 while ( pos != m_vModelPtrList.end() ) { 00168 assert( *pos != NULL ); 00169 (*pos)->DisplayGL( DM ); 00170 ++pos; 00171 } 00172 glPopMatrix(); 00173 } 00174 //----------------------------------------------------------------------------- 00175 // Display By OpenGL 00176 template <typename T> 00177 void MultiMeshModel<T>::DisplayGLUsingColorMaterial ( 00178 OpenGL::Enum::DrawMode DM, 00179 OpenGL::Enum::Face F ) 00180 { 00181 glPushMatrix(); 00182 GetTransform().TransformByOpenGLForDrawing(); 00183 00184 glPushAttrib( GL_CURRENT_BIT | GL_LIGHTING_BIT ); 00185 //--------------------------------------------------------------- 00186 glEnable( GL_COLOR_MATERIAL ); 00187 00188 //glColorMaterial( F, GL_AMBIENT_AND_DIFFUSE ); 00189 //glColorMaterial( F, GL_AMBIENT ); 00190 //glColorMaterial( F, GL_DIFFUSE ); 00191 //glColorMaterial( F, GL_SPECULAR ); 00192 //glColorMaterial( F, GL_EMISSION ); 00193 00194 //static GLfloat specular[4] = { 1, 1, 1, 1 }; //<--------- Hack for Specular Highlight 00195 //static GLfloat diffuse[4] = { 1, 1, 1, 1 }; //<--------- Hack for Diffuse Color 00196 //glMaterialfv( GL_FRONT, GL_SPECULAR, specular ); //<--------- Hack for Specular Highlight 00197 //glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuse ); //<--------- Hack for Diffuse Color 00198 //glMaterialfv( GL_FRONT, GL_AMBIENT, diffuse ); //<--------- Hack for Diffuse Color 00199 00200 std::vector< MeshModel<T> * >::iterator pos = m_vModelPtrList.begin(); 00201 while ( pos != m_vModelPtrList.end() ) { 00202 assert( *pos != NULL ); 00203 (*pos)->GetMaterial()->ApplyRGBAColor(); 00204 (*pos)->DisplayGL( DM ); 00205 //(*pos)->DrawBVH(); 00206 ++pos; 00207 } 00208 //--------------------------------------------------------------- 00209 glPopAttrib(); 00210 glPopMatrix(); 00211 } 00212 //----------------------------------------------------------------------------- 00213 // Display By OpenGL 00214 template <typename T> 00215 void MultiMeshModel<T>::DrawBVHOfEachMesh () const 00216 { 00217 glPushMatrix(); 00218 GetTransform().TransformByOpenGLForDrawing(); 00219 00220 std::vector< MeshModel<T> * >::const_iterator pos = m_vModelPtrList.begin(); 00221 while ( pos != m_vModelPtrList.end() ) { 00222 assert( *pos != NULL ); 00223 (*pos)->DrawBVH(); 00224 ++pos; 00225 } 00226 00227 glPopMatrix(); 00228 } 00229 //----------------------------------------------------------------------------- 00230 // Display By OpenGL 00231 template <typename T> 00232 void MultiMeshModel<T>::DrawBVHOfEachMesh ( int startLevel, int endLevel ) const 00233 { 00234 glPushMatrix(); 00235 GetTransform().TransformByOpenGLForDrawing(); 00236 00237 std::vector< MeshModel<T> * >::const_iterator pos = m_vModelPtrList.begin(); 00238 while ( pos != m_vModelPtrList.end() ) { 00239 assert( *pos != NULL ); 00240 (*pos)->DrawBVH( startLevel, endLevel ); 00241 ++pos; 00242 } 00243 00244 glPopMatrix(); 00245 } 00246 //----------------------------------------------------------------------------- 00247 // Display By OpenGL 00248 template <typename T> 00249 void MultiMeshModel<T>::DrawBVHOfEachMeshOnlyEndLevel () const 00250 { 00251 glPushMatrix(); 00252 GetTransform().TransformByOpenGLForDrawing(); 00253 00254 std::vector< MeshModel<T> * >::const_iterator pos = m_vModelPtrList.begin(); 00255 while ( pos != m_vModelPtrList.end() ) { 00256 assert( *pos != NULL ); 00257 (*pos)->DrawBVHOnlyEndLevel(); 00258 ++pos; 00259 } 00260 00261 glPopMatrix(); 00262 } 00263 //----------------------------------------------------------------------------- 00264 //============================================================================= 00265 END_NAMESPACE_TAPs__OpenGL 00266 //----------------------------------------------------------------------------- 00267 //345678901234567890123456789012345678901234567890123456789012345678901234567890 00268 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8