Merge with blender svn -> svn merge -r 12064:12150 https://svn.blender.org/svnroot...
[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 "BKE_DerivedMesh.h"
38 #include "DNA_customdata_types.h"
39 #include "BKE_customdata.h"
40 #include "DNA_meshdata_types.h"
41
42 struct Object;
43 struct Cloth;
44 struct MFace;
45 struct DerivedMesh;
46
47 // this is needed for inlining behaviour
48 #ifndef _WIN32
49         #define LINUX 
50         #define DO_INLINE inline
51 #else
52         #define DO_INLINE
53 #endif
54
55 #define CLOTH_MAX_THREAD 2
56
57
58 /* goal defines */
59 #define SOFTGOALSNAP  0.999f 
60
61 /* This is approximately the smallest number that can be
62 * represented by a float, given its precision. */
63 #define ALMOST_ZERO             0.000001
64
65 /* Bits to or into the ClothVertex.flags. */
66 #define CVERT_FLAG_PINNED       1
67 #define CVERT_FLAG_COLLISION    2
68
69
70 // some macro enhancements for vector treatment
71 #define VECADDADD(v1,v2,v3)     {*(v1)+= *(v2) + *(v3); *(v1+1)+= *(v2+1) + *(v3+1); *(v1+2)+= *(v2+2) + *(v3+2);}
72 #define VECSUBADD(v1,v2,v3)     {*(v1)-= *(v2) + *(v3); *(v1+1)-= *(v2+1) + *(v3+1); *(v1+2)-= *(v2+2) + *(v3+2);}
73 #define VECADDSUB(v1,v2,v3)     {*(v1)+= *(v2) - *(v3); *(v1+1)+= *(v2+1) - *(v3+1); *(v1+2)+= *(v2+2) - *(v3+2);}
74 #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;}
75 #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;}
76 #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;}
77 #define VECADDS(v1,v2,v3,bS)    {*(v1)= *(v2) + *(v3)*bS; *(v1+1)= *(v2+1) + *(v3+1)*bS; *(v1+2)= *(v2+2) + *(v3+2)*bS;}
78 #define VECSUBMUL(v1,v2,aS)     {*(v1)-= *(v2) * aS; *(v1+1)-= *(v2+1) * aS; *(v1+2)-= *(v2+2) * aS;}
79 #define VECSUBS(v1,v2,v3,bS)    {*(v1)= *(v2) - *(v3)*bS; *(v1+1)= *(v2+1) - *(v3+1)*bS; *(v1+2)= *(v2+2) - *(v3+2)*bS;}
80 #define VECSUBSB(v1,v2, v3,bS)  {*(v1)= (*(v2)- *(v3))*bS; *(v1+1)= (*(v2+1) - *(v3+1))*bS; *(v1+2)= (*(v2+2) - *(v3+2))*bS;}
81 #define VECMULS(v1,aS)  {*(v1)*= aS; *(v1+1)*= aS; *(v1+2)*= *aS;}
82 #define VECADDMUL(v1,v2,aS)     {*(v1)+= *(v2) * aS; *(v1+1)+= *(v2+1) * aS; *(v1+2)+= *(v2+2) * aS;}
83
84 /* SIMULATION FLAGS: goal flags,.. */
85 /* These are the bits used in SimSettings.flags. */
86 typedef enum 
87 {
88         CSIMSETT_FLAG_RESET = (1 << 1),         // The CM object requires a reinitializaiton.
89         CSIMSETT_FLAG_COLLOBJ = (1 << 2),       // object is only collision object, no cloth simulation is done
90         CSIMSETT_FLAG_GOAL = (1 << 3),          // we have goals enabled
91         CSIMSETT_FLAG_CCACHE_FREE_ALL = (1 << 4),  // delete all from cache
92         CSIMSETT_FLAG_CCACHE_FREE_PART = (1 << 5), // delete some part of cache
93         CSIMSETT_FLAG_TEARING_ENABLED = (1 << 6), // true if tearing is enabled
94         CSIMSETT_FLAG_CCACHE_PROTECT = (1 << 7), // true if tearing is enabled
95 } CSIMSETT_FLAGS;
96
97 /* Spring types as defined in the paper.*/
98 typedef enum 
99 {
100         STRUCTURAL = 0,
101         SHEAR,
102         BENDING,
103 } springType;
104
105 /* SPRING FLAGS */
106 typedef enum 
107 {
108         CSPRING_FLAG_DEACTIVATE = (1 << 1),
109         CSPRING_FLAG_NEEDED = (1 << 2), // springs has values to be applied
110 } CSPRINGS_FLAGS;
111
112 // needed for buttons_object.c
113 void cloth_cache_free(ClothModifierData *clmd, float time);
114 void cloth_free_modifier (ClothModifierData *clmd);
115
116 // needed for cloth.c
117 void implicit_set_positions (ClothModifierData *clmd);
118
119 // from cloth.c, needed for modifier.c
120 void clothModifier_do(ClothModifierData *clmd, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numverts);
121
122 // used in collision.c
123 typedef struct Tree {
124         struct Tree *nodes[4]; // 4 children --> quad-tree
125         struct Tree *parent;
126         struct Tree *nextLeaf; 
127         struct Tree *prevLeaf;
128         float   bv[26]; // Bounding volume of all nodes / we have 7 axes on a 14-DOP
129         unsigned int tri_index; // this saves the index of the face
130         int     count_nodes; // how many nodes are used
131         int     traversed;  // how many nodes already traversed until this level?
132         int     isleaf;
133 } Tree;
134
135 typedef struct Tree TreeNode;
136
137 typedef struct BVH{ 
138         unsigned int    numfaces;
139         unsigned int    numverts;
140         ClothVertex     *verts; // just a pointer to the original datastructure
141         MFace           *mfaces; // just a pointer to the original datastructure
142         struct LinkNode *tree;
143         TreeNode        *root; // TODO: saving the root --> is this really needed? YES!
144         TreeNode        *leaf_tree; /* Tail of the leaf linked list.    */
145         TreeNode        *leaf_root;     /* Head of the leaf linked list.        */
146         float           epsilon; /* epslion is used for inflation of the k-dop     */
147         int             flags; /* bvhFlags */              
148 } BVH;
149
150 typedef void (*CM_COLLISION_RESPONSE) (ClothModifierData *clmd, ClothModifierData *coll_clmd, Tree * tree1, Tree * tree2);
151
152
153 /////////////////////////////////////////////////
154 // collision.c
155 ////////////////////////////////////////////////
156
157 // needed for implicit.c
158 void bvh_collision_response(ClothModifierData *clmd, ClothModifierData *coll_clmd, Tree * tree1, Tree * tree2);
159 int cloth_bvh_objcollision(ClothModifierData * clmd, float step, CM_COLLISION_RESPONSE collision_response, float dt);
160
161 ////////////////////////////////////////////////
162
163
164 /////////////////////////////////////////////////
165 // kdop.c
166 ////////////////////////////////////////////////
167
168 // needed for implicit.c
169 void bvh_update_static(ClothModifierData * clmd, BVH * bvh);
170 void bvh_update_moving(ClothModifierData * clmd, BVH * bvh);
171
172 // needed for cloth.c
173 void bvh_free(BVH * bvh);
174 BVH *bvh_build (ClothModifierData *clmd, float epsilon);
175
176 // needed for collision.c
177 int bvh_traverse(ClothModifierData * clmd, ClothModifierData * coll_clmd, Tree * tree1, Tree * tree2, float step, CM_COLLISION_RESPONSE collision_response);
178
179 ////////////////////////////////////////////////
180
181
182
183 /////////////////////////////////////////////////
184 // cloth.c
185 ////////////////////////////////////////////////
186 void cloth_free_modifier (ClothModifierData *clmd);
187 void cloth_init (ClothModifierData *clmd);
188 void cloth_deform_verts(struct Object *ob, float framenr, float (*vertexCos)[3], int numVerts, void *derivedData, ClothModifierData *clmd);
189 void cloth_update_normals (ClothVertex *verts, int nVerts, MFace *face, int totface);
190
191 ////////////////////////////////////////////////
192
193
194 /* Typedefs for function pointers we need for solvers and collision detection. */
195 typedef void (*CM_COLLISION_SELF) (ClothModifierData *clmd, int step);
196 typedef void (*CM_COLLISION_OBJ) (ClothModifierData *clmd, int step, CM_COLLISION_RESPONSE collision_response);
197
198
199 /* This enum provides the IDs for our solvers. */
200 // only one available in the moment
201 typedef enum {
202         CM_IMPLICIT = 0,
203 } CM_SOLVER_ID;
204
205
206 /* This structure defines how to call the solver.
207 */
208 typedef struct {
209         char            *name;
210         CM_SOLVER_ID    id;
211         int             (*init) (Object *ob, ClothModifierData *clmd);
212         int             (*solver) (Object *ob, float framenr, ClothModifierData *clmd, ListBase *effectors,
213         CM_COLLISION_SELF self_collision, CM_COLLISION_OBJ obj_collision);
214         int             (*free) (ClothModifierData *clmd);
215 } CM_SOLVER_DEF;
216
217
218 /* new C implicit simulator */
219 int implicit_init (Object *ob, ClothModifierData *clmd);
220 int implicit_free (ClothModifierData *clmd);
221 int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors,
222                                                 CM_COLLISION_SELF self_collision, CM_COLLISION_OBJ obj_collision);
223
224 /* used for caching in implicit.c */
225 typedef struct Frame
226 {
227         ClothVertex *verts;
228         ClothSpring *springs;
229         float time; /* we need float since we want to support sub-frames */
230 } Frame;
231
232 /* used for collisions in collision.c */
233 typedef struct CollPair
234 {
235         unsigned int face1; // cloth face
236         unsigned int face2; // object face
237         double distance; // magnitude of vector
238         float normal[3]; 
239         float vector[3]; // unnormalized collision vector: p2-p1
240         float p1[3], p2[3]; // collision point p1 on face1, p2 on face2
241         int lastsign; // indicates if the distance sign has changed, unused itm
242         float time; // collision time, from 0 up to 1
243         unsigned int Aindex1, Aindex2, Aindex3, Aindex4, Bindex1, Bindex2, Bindex3, Bindex4;
244 } CollPair;
245
246
247 #endif
248