TAPs 0.7.7.3
TAPsMultiMeshModel.cpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines