![]() |
TAPs 0.7.7.3
|
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----+----