svn merge -r 13240:13323 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / blenkernel / BKE_cloth.h
1 /**
2  * BKE_cloth.h
3  *
4  * $Id: BKE_cloth.h,v 1.1 2007/08/01 02:07:27 daniel Exp $
5  *
6  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version. The Blender
12  * Foundation also sells licenses for use in proprietary software under
13  * the Blender License.  See http://www.blender.org/BL/ for information
14  * about this.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software Foundation,
23  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  *
25  * The Original Code is Copyright (C) Blender Foundation.
26  * All rights reserved.
27  *
28  * The Original Code is: all of this file.
29  *
30  * Contributor(s): none yet.
31  *
32  * ***** END GPL/BL DUAL LICENSE BLOCK *****
33  */
34 #ifndef BKE_CLOTH_H
35 #define BKE_CLOTH_H
36
37 #include "BLI_linklist.h"
38 #include "BKE_customdata.h"
39 #include "BKE_DerivedMesh.h"
40 #include "DNA_cloth_types.h"
41 #include "DNA_customdata_types.h"
42 #include "DNA_meshdata_types.h"
43 #include "DNA_modifier_types.h"
44 #include "DNA_object_types.h"
45
46 struct Object;
47 struct Cloth;
48 struct MFace;
49 struct DerivedMesh;
50 struct ClothModifierData;
51
52
53 // this is needed for inlining behaviour
54 #ifndef _WIN32
55 #define LINUX
56 #define DO_INLINE inline
57 #else
58 #define DO_INLINE
59 #endif
60
61 #define CLOTH_MAX_THREAD 2
62
63
64 /* goal defines */
65 #define SOFTGOALSNAP  0.999f
66
67 /* This is approximately the smallest number that can be
68 * represented by a float, given its precision. */
69 #define ALMOST_ZERO             0.000001
70
71 // some macro enhancements for vector treatment
72 #define VECADDADD(v1,v2,v3)     {*(v1)+= *(v2) + *(v3); *(v1+1)+= *(v2+1) + *(v3+1); *(v1+2)+= *(v2+2) + *(v3+2);}
73 #define VECSUBADD(v1,v2,v3)     {*(v1)-= *(v2) + *(v3); *(v1+1)-= *(v2+1) + *(v3+1); *(v1+2)-= *(v2+2) + *(v3+2);}
74 #define VECADDSUB(v1,v2,v3)     {*(v1)+= *(v2) - *(v3); *(v1+1)+= *(v2+1) - *(v3+1); *(v1+2)+= *(v2+2) - *(v3+2);}
75 #define VECSUBADDSS(v1,v2,aS,v3,bS)     {*(v1)-= *(v2)*aS + *(v3)*bS; *(v1+1)-= *(v2+1)*aS + *(v3+1)*bS; *(v1+2)-= *(v2+2)*aS + *(v3+2)*bS;}
76 #define VECADDSUBSS(v1,v2,aS,v3,bS)     {*(v1)+= *(v2)*aS - *(v3)*bS; *(v1+1)+= *(v2+1)*aS - *(v3+1)*bS; *(v1+2)+= *(v2+2)*aS - *(v3+2)*bS;}
77 #define VECADDSS(v1,v2,aS,v3,bS)        {*(v1)= *(v2)*aS + *(v3)*bS; *(v1+1)= *(v2+1)*aS + *(v3+1)*bS; *(v1+2)= *(v2+2)*aS + *(v3+2)*bS;}
78 #define VECADDS(v1,v2,v3,bS)    {*(v1)= *(v2) + *(v3)*bS; *(v1+1)= *(v2+1) + *(v3+1)*bS; *(v1+2)= *(v2+2) + *(v3+2)*bS;}
79 #define VECSUBMUL(v1,v2,aS)     {*(v1)-= *(v2) * aS; *(v1+1)-= *(v2+1) * aS; *(v1+2)-= *(v2+2) * aS;}
80 #define VECSUBS(v1,v2,v3,bS)    {*(v1)= *(v2) - *(v3)*bS; *(v1+1)= *(v2+1) - *(v3+1)*bS; *(v1+2)= *(v2+2) - *(v3+2)*bS;}
81 #define VECSUBSB(v1,v2, v3,bS)  {*(v1)= (*(v2)- *(v3))*bS; *(v1+1)= (*(v2+1) - *(v3+1))*bS; *(v1+2)= (*(v2+2) - *(v3+2))*bS;}
82 #define VECMULS(v1,aS)  {*(v1)*= aS; *(v1+1)*= aS; *(v1+2)*= *aS;}
83 #define VECADDMUL(v1,v2,aS)     {*(v1)+= *(v2) * aS; *(v1+1)+= *(v2+1) * aS; *(v1+2)+= *(v2+2) * aS;}
84
85 /* SIMULATION FLAGS: goal flags,.. */
86 /* These are the bits used in SimSettings.flags. */
87 typedef enum
88 {
89     CLOTH_SIMSETTINGS_FLAG_RESET = ( 1 << 1 ),          // The CM object requires a reinitializaiton.
90     CLOTH_SIMSETTINGS_FLAG_COLLOBJ = ( 1 << 2 ),        // object is only collision object, no cloth simulation is done
91     CLOTH_SIMSETTINGS_FLAG_GOAL = ( 1 << 3 ),           // we have goals enabled
92     CLOTH_SIMSETTINGS_FLAG_TEARING = ( 1 << 4 ), // true if tearing is enabled
93     CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT = ( 1 << 5 ), // true if tearing is enabled
94 } CLOTH_SIMSETTINGS_FLAGS;
95
96 /* SPRING FLAGS */
97 typedef enum
98 {
99     CLOTH_COLLISIONSETTINGS_FLAG_ENABLED = ( 1 << 1 ),
100 } CLOTH_COLLISIONSETTINGS_FLAGS;
101
102 /* Spring types as defined in the paper.*/
103 typedef enum
104 {
105     CLOTH_SPRING_TYPE_STRUCTURAL = 0,
106     CLOTH_SPRING_TYPE_SHEAR,
107     CLOTH_SPRING_TYPE_BENDING,
108 } CLOTH_SPRING_TYPES;
109
110 /* SPRING FLAGS */
111 typedef enum
112 {
113     CLOTH_SPRING_FLAG_DEACTIVATE = ( 1 << 1 ),
114     CLOTH_SPRING_FLAG_NEEDED = ( 1 << 2 ), // springs has values to be applied
115 } CLOTH_SPRINGS_FLAGS;
116
117 /* Bits to or into the ClothVertex.flags. */
118 #define CVERT_FLAG_PINNED       1
119 #define CVERT_FLAG_COLLISION    2
120
121
122 // needed for buttons_object.c
123 void cloth_clear_cache(Object *ob, ClothModifierData *clmd, float framenr);
124
125 // needed for cloth.c
126 void implicit_set_positions ( ClothModifierData *clmd );
127
128 // from cloth.c, needed for modifier.c
129 void clothModifier_do ( ClothModifierData *clmd, Object *ob, DerivedMesh *dm, float ( *vertexCos ) [3], int numverts );
130
131 // used in collision.c
132 typedef struct CollisionTree
133 {
134         struct CollisionTree *nodes[4]; // 4 children --> quad-tree
135         struct CollisionTree *parent;
136         struct CollisionTree *nextLeaf;
137         struct CollisionTree *prevLeaf;
138         float   bv[26]; // Bounding volume of all nodes / we have 7 axes on a 14-DOP
139         unsigned int tri_index; // this saves the index of the face
140         // int point_index[4]; // supports up to 4 points in a leaf
141         int     count_nodes; // how many nodes are used
142         int     traversed;  // how many nodes already traversed until this level?
143         int     isleaf;
144 }
145 CollisionTree;
146
147 typedef struct BVH
148 {
149         unsigned int    numfaces;
150         unsigned int    numverts;
151         // ClothVertex  *verts; // just a pointer to the original datastructure
152         MVert           *current_x; // e.g. txold in clothvertex
153         MVert           *current_xold; // e.g. tx in clothvertex
154         MFace           *mfaces; // just a pointer to the original datastructure
155         struct LinkNode *tree;
156         CollisionTree   *root; // TODO: saving the root --> is this really needed? YES!
157         CollisionTree   *leaf_tree; /* Tail of the leaf linked list.    */
158         CollisionTree   *leaf_root;     /* Head of the leaf linked list.        */
159         float           epsilon; /* epslion is used for inflation of the k-dop     */
160         int             flags; /* bvhFlags */
161 }
162 BVH;
163
164 typedef void ( *CM_COLLISION_RESPONSE ) ( ClothModifierData *clmd, ClothModifierData *coll_clmd, CollisionTree * tree1, CollisionTree * tree2 );
165
166
167 /////////////////////////////////////////////////
168 // collision.c
169 ////////////////////////////////////////////////
170
171 // needed for implicit.c
172 void bvh_collision_response ( ClothModifierData *clmd, ClothModifierData *coll_clmd, CollisionTree * tree1, CollisionTree * tree2 );
173 int cloth_bvh_objcollision ( ClothModifierData * clmd, float step, float dt );
174
175 // needed for modifier.c
176 BVH *bvh_build_from_mvert (MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon);
177
178 // needed for collision.c
179 void bvh_update_from_mvert(BVH * bvh, MVert *x, unsigned int numverts, MVert *xnew, int moving);
180
181 ////////////////////////////////////////////////
182
183
184 /////////////////////////////////////////////////
185 // kdop.c
186 ////////////////////////////////////////////////
187
188 // needed for cloth.c
189 void bvh_free ( BVH * bvh );
190 void bvh_build (BVH *bvh);
191 LinkNode *BLI_linklist_append_fast ( LinkNode **listp, void *ptr );
192
193 // needed for collision.c
194 int bvh_traverse ( ClothModifierData * clmd, ClothModifierData * coll_clmd, CollisionTree * tree1, CollisionTree * tree2, float step, CM_COLLISION_RESPONSE collision_response );
195 void bvh_update(BVH * bvh, int moving);
196 ////////////////////////////////////////////////
197
198
199
200 /////////////////////////////////////////////////
201 // cloth.c
202 ////////////////////////////////////////////////
203 void cloth_free_modifier ( ClothModifierData *clmd );
204 void cloth_init ( ClothModifierData *clmd );
205 void cloth_deform_verts ( struct Object *ob, float framenr, float ( *vertexCos ) [3], int numVerts, void *derivedData, ClothModifierData *clmd );
206 void cloth_update_normals ( ClothVertex *verts, int nVerts, MFace *face, int totface );
207
208 // needed for collision.c
209 void bvh_update_from_cloth(ClothModifierData *clmd, int moving);
210
211 ////////////////////////////////////////////////
212
213
214 /* Typedefs for function pointers we need for solvers and collision detection. */
215 typedef void ( *CM_COLLISION_SELF ) ( ClothModifierData *clmd, int step );
216 typedef void ( *CM_COLLISION_OBJ ) ( ClothModifierData *clmd, int step, CM_COLLISION_RESPONSE collision_response );
217
218
219 /* This enum provides the IDs for our solvers. */
220 // only one available in the moment
221 typedef enum {
222     CM_IMPLICIT = 0,
223 } CM_SOLVER_ID;
224
225
226 /* This structure defines how to call the solver.
227 */
228 typedef struct
229 {
230         char            *name;
231         CM_SOLVER_ID    id;
232         int     ( *init ) ( Object *ob, ClothModifierData *clmd );
233         int     ( *solver ) ( Object *ob, float framenr, ClothModifierData *clmd, ListBase *effectors );
234         int     ( *free ) ( ClothModifierData *clmd );
235 }
236 CM_SOLVER_DEF;
237
238
239 /* new C implicit simulator */
240 int implicit_init ( Object *ob, ClothModifierData *clmd );
241 int implicit_free ( ClothModifierData *clmd );
242 int implicit_solver ( Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors );
243
244 /* used for caching in implicit.c */
245 typedef struct Frame
246 {
247         ClothVertex *verts;
248         ClothSpring *springs;
249         unsigned int numverts, numsprings;
250         float time; /* we need float since we want to support sub-frames */
251 }
252 Frame;
253
254 /* used for collisions in collision.c */
255 typedef struct CollPair
256 {
257         unsigned int face1; // cloth face
258         unsigned int face2; // object face
259         double distance; // magnitude of vector
260         float normal[3];
261         float vector[3]; // unnormalized collision vector: p2-p1
262         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
263         int lastsign; // indicates if the distance sign has changed, unused itm
264         float time; // collision time, from 0 up to 1
265         unsigned int ap1, ap2, ap3, bp1, bp2, bp3, bp4;
266         unsigned int pointsb[4];
267 }
268 CollPair;
269
270 /* used for collisions in collision.c */
271 typedef struct EdgeCollPair
272 {
273         unsigned int p11, p12, p21, p22;
274         float normal[3];
275         float vector[3];
276         float time;
277         int lastsign;
278         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
279 }
280 EdgeCollPair;
281
282 /* used for collisions in collision.c */
283 typedef struct FaceCollPair
284 {
285         unsigned int p11, p12, p13, p21;
286         float normal[3];
287         float vector[3];
288         float time;
289         int lastsign;
290         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
291 }
292 FaceCollPair;
293
294 #endif
295