1 /* 2 Bullet Continuous Collision Detection and Physics Library 3 Copyright (c) 2003-2006 Erwin Coumans https://bulletphysics.org 4 5 This software is provided 'as-is', without any express or implied warranty. 6 In no event will the authors be held liable for any damages arising from the use of this software. 7 Permission is granted to anyone to use this software for any purpose, 8 including commercial applications, and to alter it and redistribute it freely, 9 subject to the following restrictions: 10 11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 13 3. This notice may not be removed or altered from any source distribution. 14 */ 15 16 #ifndef BT_SOFTBODY_FLOAT_DATA 17 #define BT_SOFTBODY_FLOAT_DATA 18 19 #include "BulletCollision/CollisionDispatch/btCollisionObject.h" 20 #include "BulletDynamics/Dynamics/btRigidBody.h" 21 22 struct SoftBodyMaterialData 23 { 24 float m_linearStiffness; 25 float m_angularStiffness; 26 float m_volumeStiffness; 27 int m_flags; 28 }; 29 30 struct SoftBodyNodeData 31 { 32 SoftBodyMaterialData *m_material; 33 btVector3FloatData m_position; 34 btVector3FloatData m_previousPosition; 35 btVector3FloatData m_velocity; 36 btVector3FloatData m_accumulatedForce; 37 btVector3FloatData m_normal; 38 float m_inverseMass; 39 float m_area; 40 int m_attach; 41 int m_pad; 42 }; 43 44 struct SoftBodyLinkData 45 { 46 SoftBodyMaterialData *m_material; 47 int m_nodeIndices[2]; // Node pointers 48 float m_restLength; // Rest length 49 int m_bbending; // Bending link 50 }; 51 52 struct SoftBodyFaceData 53 { 54 btVector3FloatData m_normal; // Normal 55 SoftBodyMaterialData *m_material; 56 int m_nodeIndices[3]; // Node pointers 57 float m_restArea; // Rest area 58 }; 59 60 struct SoftBodyTetraData 61 { 62 btVector3FloatData m_c0[4]; // gradients 63 SoftBodyMaterialData *m_material; 64 int m_nodeIndices[4]; // Node pointers 65 float m_restVolume; // Rest volume 66 float m_c1; // (4*kVST)/(im0+im1+im2+im3) 67 float m_c2; // m_c1/sum(|g0..3|^2) 68 int m_pad; 69 }; 70 71 struct SoftRigidAnchorData 72 { 73 btMatrix3x3FloatData m_c0; // Impulse matrix 74 btVector3FloatData m_c1; // Relative anchor 75 btVector3FloatData m_localFrame; // Anchor position in body space 76 btRigidBodyData *m_rigidBody; 77 int m_nodeIndex; // Node pointer 78 float m_c2; // ima*dt 79 }; 80 81 struct SoftBodyConfigData 82 { 83 int m_aeroModel; // Aerodynamic model (default: V_Point) 84 float m_baumgarte; // Velocities correction factor (Baumgarte) 85 float m_damping; // Damping coefficient [0,1] 86 float m_drag; // Drag coefficient [0,+inf] 87 float m_lift; // Lift coefficient [0,+inf] 88 float m_pressure; // Pressure coefficient [-inf,+inf] 89 float m_volume; // Volume conversation coefficient [0,+inf] 90 float m_dynamicFriction; // Dynamic friction coefficient [0,1] 91 float m_poseMatch; // Pose matching coefficient [0,1] 92 float m_rigidContactHardness; // Rigid contacts hardness [0,1] 93 float m_kineticContactHardness; // Kinetic contacts hardness [0,1] 94 float m_softContactHardness; // Soft contacts hardness [0,1] 95 float m_anchorHardness; // Anchors hardness [0,1] 96 float m_softRigidClusterHardness; // Soft vs rigid hardness [0,1] (cluster only) 97 float m_softKineticClusterHardness; // Soft vs kinetic hardness [0,1] (cluster only) 98 float m_softSoftClusterHardness; // Soft vs soft hardness [0,1] (cluster only) 99 float m_softRigidClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only) 100 float m_softKineticClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only) 101 float m_softSoftClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only) 102 float m_maxVolume; // Maximum volume ratio for pose 103 float m_timeScale; // Time scale 104 int m_velocityIterations; // Velocities solver iterations 105 int m_positionIterations; // Positions solver iterations 106 int m_driftIterations; // Drift solver iterations 107 int m_clusterIterations; // Cluster solver iterations 108 int m_collisionFlags; // Collisions flags 109 }; 110 111 struct SoftBodyPoseData 112 { 113 btMatrix3x3FloatData m_rot; // Rotation 114 btMatrix3x3FloatData m_scale; // Scale 115 btMatrix3x3FloatData m_aqq; // Base scaling 116 btVector3FloatData m_com; // COM 117 118 btVector3FloatData *m_positions; // Reference positions 119 float *m_weights; // Weights 120 int m_numPositions; 121 int m_numWeigts; 122 123 int m_bvolume; // Is valid 124 int m_bframe; // Is frame 125 float m_restVolume; // Rest volume 126 int m_pad; 127 }; 128 129 struct SoftBodyClusterData 130 { 131 btTransformFloatData m_framexform; 132 btMatrix3x3FloatData m_locii; 133 btMatrix3x3FloatData m_invwi; 134 btVector3FloatData m_com; 135 btVector3FloatData m_vimpulses[2]; 136 btVector3FloatData m_dimpulses[2]; 137 btVector3FloatData m_lv; 138 btVector3FloatData m_av; 139 140 btVector3FloatData *m_framerefs; 141 int *m_nodeIndices; 142 float *m_masses; 143 144 int m_numFrameRefs; 145 int m_numNodes; 146 int m_numMasses; 147 148 float m_idmass; 149 float m_imass; 150 int m_nvimpulses; 151 int m_ndimpulses; 152 float m_ndamping; 153 float m_ldamping; 154 float m_adamping; 155 float m_matching; 156 float m_maxSelfCollisionImpulse; 157 float m_selfCollisionImpulseFactor; 158 int m_containsAnchor; 159 int m_collide; 160 int m_clusterIndex; 161 }; 162 163 enum btSoftJointBodyType 164 { 165 BT_JOINT_SOFT_BODY_CLUSTER = 1, 166 BT_JOINT_RIGID_BODY, 167 BT_JOINT_COLLISION_OBJECT 168 }; 169 170 struct btSoftBodyJointData 171 { 172 void *m_bodyA; 173 void *m_bodyB; 174 btVector3FloatData m_refs[2]; 175 float m_cfm; 176 float m_erp; 177 float m_split; 178 int m_delete; 179 btVector3FloatData m_relPosition[2]; //linear 180 int m_bodyAtype; 181 int m_bodyBtype; 182 int m_jointType; 183 int m_pad; 184 }; 185 186 ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 187 struct btSoftBodyFloatData 188 { 189 btCollisionObjectFloatData m_collisionObjectData; 190 191 SoftBodyPoseData *m_pose; 192 SoftBodyMaterialData **m_materials; 193 SoftBodyNodeData *m_nodes; 194 SoftBodyLinkData *m_links; 195 SoftBodyFaceData *m_faces; 196 SoftBodyTetraData *m_tetrahedra; 197 SoftRigidAnchorData *m_anchors; 198 SoftBodyClusterData *m_clusters; 199 btSoftBodyJointData *m_joints; 200 201 int m_numMaterials; 202 int m_numNodes; 203 int m_numLinks; 204 int m_numFaces; 205 int m_numTetrahedra; 206 int m_numAnchors; 207 int m_numClusters; 208 int m_numJoints; 209 SoftBodyConfigData m_config; 210 }; 211 212 #endif //BT_SOFTBODY_FLOAT_DATA 213