TAPs 0.7.7.3
TAPsModelForSurgery.hpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsModelForSurgery.hpp
00003 
00004 ModelForSurgery class (hpp file).
00005 
00006 SUKITTI PUNAK   (08/06/2008)
00007 UPDATE          (10/08/2009)
00008 ******************************************************************************/
00009 
00023 #ifndef TAPs_MODEL_FOR_SURGERY_HPP
00024 #define TAPs_MODEL_FOR_SURGERY_HPP
00025 
00026 #include <TAPs/DataStructure/TAPsFlag.hpp>
00027 #include <TAPs/Support/TAPsTransformationSupport.hpp>
00028 
00029 #include <TAPs/OpenGLModel/TAPsHETriMeshOneModelMultiParts.hpp>
00030 #include <TAPs/CD/TAPsColDetFns.hpp>
00031 
00032 #if defined(__gl_h_) || defined(__GL_H__)
00033     #include <TAPs/OpenGLModel/TAPsOpenGLHETriMeshOneModelMultiParts.hpp>
00034 #else
00035 #endif
00036 
00037 BEGIN_NAMESPACE_TAPs
00038 //=============================================================================
00039 template <typename T>
00040 class ModelForSurgery {
00041 //=============================================================================
00042 public:
00043 
00044     enum Operation {
00045         SIMULATION_ON   = 1,
00046         COLLISION_ON    = 1 << 1,
00047         RENDER_ON       = 1 << 2,
00048         //FIXED         = 1 << 3,
00049         //DEFORMABLE        = 1 << 4,
00050     };
00051 
00052     enum ModelType {
00053 
00054         // Organs
00055         HEART = 0,
00056         LEFT_KIDNEY,
00057         RIGHT_KIDNEY,
00058         LIVER,
00059         LEFT_LUNG,
00060         RIGHT_LUNG,
00061         STOMACH,
00062 
00063         // For Practice
00064         TISSUE_BOX_01,
00065         TISSUE_TWO_TUBES_01,
00066         TISSUE_HIATUS_HERNIA_01,
00067 
00068         // Rigid Objects
00069         RIGID_TORUS_01,
00070 
00071         UNDEFINED
00072     };
00073 
00075     friend std::ostream & operator<< ( std::ostream &output, ModelForSurgery<T> const &obj )
00076     {
00077         output << obj.StrInfo();
00078         return output;
00079     }
00080 
00081     // Member Functions -------------------------------------------------------
00082 
00084     virtual ~ModelForSurgery ();
00085 
00087     virtual std::string StrInfo () const;
00088 
00090     inline int  GetID () const
00091     { return m_iId; }
00093     inline void SetID ( int id )
00094     { m_iId = id; }
00095 
00097     inline std::string const & GetName () const
00098     { return m_strName; }
00100     inline void SetName ( std::string const & name )
00101     { m_strName = name; }
00102 
00104     enum ModelType GetModelType () const
00105     { return m_eModelType; }
00106 
00108     inline TransformationSupport<T> const & GetTransform () const   { return m_Transform; }
00110     inline TransformationSupport<T> &       GetTransform ()         { return m_Transform; }
00112     inline void SetTransform ( TransformationSupport<T> const & trx )   { m_Transform = trx; }
00113 
00124     virtual void ApplyAndResetTransform ();
00125 
00127     inline TAPs::DS::Flag< enum Operation, 8 > &    GetOperationFlags ()
00128     { return m_OperationFlags; }
00129 
00131     void SetOperationFlag ( enum Operation flag );
00132 
00134     void ClearOperationFlag ( enum Operation flag );
00135 
00137     inline bool CheckOperationFlag ( enum Operation flag )
00138     { return m_OperationFlags.CheckFlag( flag ); }
00139 
00141     T   GetKPointMass () const  { return m_tPtMass; }
00142 
00144     T   GetKStiffness () const  { return m_tKStiffness; }
00145 
00147     T   GetKDamper ()    const  { return m_tKDamper; }
00148 
00150     T   GetHomeKStiffness () const  { return m_tHomeKStiffness; }
00151 
00153     T   GetHomeKDamper ()    const  { return m_tHomeKDamper; }
00154 
00156     T GetPredefinedTimeStep () const  { return m_tPredefinedTimeStep; }
00158     // NEED TO APPLY TO ALL PARTS
00159     void SetPredefinedTimeStep ( T ts ) { m_tPredefinedTimeStep = ts; }
00160 
00162     int GetNumSimSubSteps () const  { return m_iNumSimSubSteps; }
00164     // NEED TO APPLY TO ALL PARTS
00165     void SetNumSimSubSteps ( int i ) { m_iNumSimSubSteps = i; }
00166 
00167 
00168     // NEED TO APPLY TO ALL PARTS
00169     virtual void SetKPointMass ( T val )        { m_tPtMass = val; }
00170     virtual void SetKStiffness ( T val )        { m_tKStiffness = val; }
00171     virtual void SetKDamper ( T val )           { m_tKDamper = val; }
00172     virtual void SetHomeKStiffness ( T val )    { m_tKStiffness = val; }
00173     virtual void SetHomeKDamper ( T val )       { m_tKDamper = val; }
00174 
00175     //===============================================================
00176     // For simulation
00177     //---------------------------------------------------------------
00179     virtual void AdvanceSimulation ( T tCurrent, T tNext );
00181     virtual void AdvanceSimulation ( T tCurrent );
00183     virtual void AdvanceSimulation ( Simulation::SimClock<T> & simClock );
00184     //---------------------------------------------------------------
00185 
00186     //===============================================================
00187     // For collision detection
00188     //---------------------------------------------------------------
00189 
00191     bool CDR ( 
00192         TAPs::BoundingVolume<T> const * const pBVObj    
00193         , TAPs::Vector3<T> * totalForce = NULL          
00194         , T gain = 1.0                                  
00195     );
00196 
00198     bool CDR ( 
00199         TAPs::MultiBoundingVolume<T> const * const pMBVObj  
00200         , TAPs::Vector3<T> * totalForce = NULL              
00201         , T gain = 1.0                                      
00202     );
00203 
00205     bool CDRigid ( 
00206         TAPs::MultiBoundingVolume<T> const * const pMBVObj  
00207         , TAPs::Vector3<T> * totalForce = NULL              
00208         , T gain = 1.0                                      
00209     );
00210 
00212     bool CDR ( 
00213         ModelForSurgery<T> * const pModel,  
00214         T deformRatio = 0.5                 
00215     );
00216 
00217     //---------------------------------------------------------------
00218 
00219 
00220 #if defined(__gl_h_) || defined(__GL_H__)
00221     virtual void Draw ( OpenGL::Enum::DrawMode DM = OpenGL::Enum::POLYGON )
00222     {
00223         DisplayGL( DM );
00224     }
00225 
00226     virtual void DisplayGL ( OpenGL::Enum::DrawMode DM = OpenGL::Enum::POLYGON );
00227 
00229     int GetNumberOfParts ()
00230     { return static_cast<int>( m_Parts.size() ); }
00231 
00233     std::vector< OpenGL::OpenGLHETriMeshOneModelMultiParts<T> * > & GetListOfParts ()
00234     { return m_Parts; }
00235 
00237     OpenGL::OpenGLHETriMeshOneModelMultiParts<T> *  GetPtrToPartNo ( unsigned int i )
00238     {
00239         if ( i < static_cast<unsigned int>( m_Parts.size() ) )  return m_Parts[i];
00240         else                                                    return NULL;
00241     }
00242 #else
00243 #endif
00244 
00245     // Data Members -----------------------------------------------------------
00246 //=============================================================================
00247 protected:
00248     // Member Functions -------------------------------------------------------
00249 
00251     ModelForSurgery ( 
00252         std::string data_location,      
00253         enum ModelType  = UNDEFINED,    
00254         T Kpointmass    = 1.0,          
00255         T Kstiffness    = 1.0,          
00256         T Kdamper       = 1.0,          
00257         T HomeKstiffness    = 1.0,      
00258         T HomeKdamper       = 1.0,      
00259         T predefinedTimeStep    = 0.01, 
00260         int numSimSubSteps      = 10    
00261     );
00262 
00263     // Data Members -----------------------------------------------------------
00264 
00265     std::string     m_strDataLocation;  
00266 
00267     //-----------------------------------------------------
00268     // Not Finish Yet!!!
00269     // These values have to be set into the springs
00270     // !!!
00271     T   m_tPtMass;          
00272     T   m_tKStiffness;      
00273     T   m_tKDamper;         
00274     T   m_tHomeKStiffness;  
00275     T   m_tHomeKDamper;     
00276 
00277     // For advancing the simulation step
00278     T   m_tPredefinedTimeStep;  
00279     int m_iNumSimSubSteps;      
00280 
00281     //-----------------------------------------------------
00282     // Model Identification
00283     static int      m_iTotal;       
00284     int             m_iId;          
00285     std::string     m_strName;      
00286     enum ModelType  m_eModelType;   
00287 
00288     TransformationSupport<T>    m_Transform;    
00289     TAPs::DS::Flag< enum Operation, 8 > m_OperationFlags;   
00290 
00291 #if defined(__gl_h_) || defined(__GL_H__)
00292     std::vector< OpenGL::OpenGLHETriMeshOneModelMultiParts<T> * >   m_Parts;    
00293 #else
00294 #endif
00295 //=============================================================================
00296 private:
00297     // Member Functions -------------------------------------------------------
00298     // Data Members -----------------------------------------------------------
00299 //=============================================================================
00300 
00301 //=============================================================================
00302 }; // END CLASS ModelForSurgery
00303 //=============================================================================
00304 //-----------------------------------------------------------------------------
00306 typedef ModelForSurgery<int>    ModelForSurgeryi;
00307 typedef ModelForSurgery<float>  ModelForSurgeryf;
00308 typedef ModelForSurgery<double> ModelForSurgeryd;
00309 //=============================================================================
00310 END_NAMESPACE_TAPs
00311 
00312 //-----------------------------------------------------------------------------
00313 // Include definition if TAPs_USE_EXPORT is not defined
00314 
00315 // If the class is template, use this
00316 //#if !defined( TAPs_USE_EXPORT )
00317     #include "TAPsModelForSurgery.cpp"
00318 //#endif
00319 
00320 // If the class is NOT template, use this
00321 //#if !defined( TAPs_USE_EXPORT )
00322 //  #include "TAPsModelForSurgery.cpp"
00323 //#endif
00324 
00325 //-----------------------------------------------------------------------------
00326 #endif
00327 //34567890123456789012345678901234567890123456789012345678901234567890123456789
00328 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines