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