svn merge -r 13357:13382 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_collision.h"
39 #include "BKE_customdata.h"
40 #include "BKE_DerivedMesh.h"
41 #include "DNA_cloth_types.h"
42 #include "DNA_customdata_types.h"
43 #include "DNA_meshdata_types.h"
44 #include "DNA_modifier_types.h"
45 #include "DNA_object_types.h"
46
47 struct Object;
48 struct Cloth;
49 struct MFace;
50 struct DerivedMesh;
51 struct ClothModifierData;
52 struct CollisionTree;
53
54 // this is needed for inlining behaviour
55 #ifndef _WIN32
56 #define LINUX
57 #define DO_INLINE inline
58 #else
59 #define DO_INLINE
60 #endif
61
62 #define CLOTH_MAX_THREAD 2
63
64 /**
65  * Pin and unpin frames are the frames on which the vertices stop moving.
66  * They will assume the position they had prior to pinFrame until unpinFrame
67  * is reached.
68  */
69 typedef struct ClothVertex
70 {
71         int     flags;          /* General flags per vertex.            */
72         float   v [3];          /* The velocity of the point.           */
73         float   xconst [3];     /* constrained position                 */
74         float   x [3];          /* The current position of this vertex. */
75         float   xold [3];       /* The previous position of this vertex.*/
76         float   tx [3];         /* temporary position */
77         float   txold [3];      /* temporary old position */
78         float   tv[3];          /* temporary "velocity", mostly used as tv = tx-txold */
79         float   mass;           /* mass / weight of the vertex          */
80         float   goal;           /* goal, from SB                        */
81         float   impulse[3];     /* used in collision.c */
82         unsigned int impulse_count; /* same as above */
83         float avg_spring_len; /* average length of connected springs, UNUSED ATM */
84 }
85 ClothVertex;
86
87
88 /**
89  * The definition of a spring.
90  */
91 typedef struct ClothSpring
92 {
93         int     ij;             /* Pij from the paper, one end of the spring.   */
94         int     kl;             /* Pkl from the paper, one end of the spring.   */
95         float   restlen;        /* The original length of the spring.   */
96         int     matrix_index;   /* needed for implicit solver (fast lookup) */
97         int     type;           /* types defined in BKE_cloth.h ("springType") */
98         int     flags;          /* defined in BKE_cloth.h, e.g. deactivated due to tearing */
99         float dfdx[3][3];
100         float dfdv[3][3];
101         float f[3];
102 }
103 ClothSpring;
104
105
106 /* goal defines */
107 #define SOFTGOALSNAP  0.999f
108
109 /* This is approximately the smallest number that can be
110 * represented by a float, given its precision. */
111 #define ALMOST_ZERO             0.000001
112
113 // some macro enhancements for vector treatment
114 #define VECADDADD(v1,v2,v3)     {*(v1)+= *(v2) + *(v3); *(v1+1)+= *(v2+1) + *(v3+1); *(v1+2)+= *(v2+2) + *(v3+2);}
115 #define VECSUBADD(v1,v2,v3)     {*(v1)-= *(v2) + *(v3); *(v1+1)-= *(v2+1) + *(v3+1); *(v1+2)-= *(v2+2) + *(v3+2);}
116 #define VECADDSUB(v1,v2,v3)     {*(v1)+= *(v2) - *(v3); *(v1+1)+= *(v2+1) - *(v3+1); *(v1+2)+= *(v2+2) - *(v3+2);}
117 #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;}
118 #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;}
119 #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;}
120 #define VECADDS(v1,v2,v3,bS)    {*(v1)= *(v2) + *(v3)*bS; *(v1+1)= *(v2+1) + *(v3+1)*bS; *(v1+2)= *(v2+2) + *(v3+2)*bS;}
121 #define VECSUBMUL(v1,v2,aS)     {*(v1)-= *(v2) * aS; *(v1+1)-= *(v2+1) * aS; *(v1+2)-= *(v2+2) * aS;}
122 #define VECSUBS(v1,v2,v3,bS)    {*(v1)= *(v2) - *(v3)*bS; *(v1+1)= *(v2+1) - *(v3+1)*bS; *(v1+2)= *(v2+2) - *(v3+2)*bS;}
123 #define VECSUBSB(v1,v2, v3,bS)  {*(v1)= (*(v2)- *(v3))*bS; *(v1+1)= (*(v2+1) - *(v3+1))*bS; *(v1+2)= (*(v2+2) - *(v3+2))*bS;}
124 #define VECMULS(v1,aS)  {*(v1)*= aS; *(v1+1)*= aS; *(v1+2)*= *aS;}
125 #define VECADDMUL(v1,v2,aS)     {*(v1)+= *(v2) * aS; *(v1+1)+= *(v2+1) * aS; *(v1+2)+= *(v2+2) * aS;}
126
127 /* SIMULATION FLAGS: goal flags,.. */
128 /* These are the bits used in SimSettings.flags. */
129 typedef enum
130 {
131     CLOTH_SIMSETTINGS_FLAG_RESET = ( 1 << 1 ),          // The CM object requires a reinitializaiton.
132     CLOTH_SIMSETTINGS_FLAG_COLLOBJ = ( 1 << 2 ),        // object is only collision object, no cloth simulation is done
133     CLOTH_SIMSETTINGS_FLAG_GOAL = ( 1 << 3 ),           // we have goals enabled
134     CLOTH_SIMSETTINGS_FLAG_TEARING = ( 1 << 4 ), // true if tearing is enabled
135     CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT = ( 1 << 5 ), // true if tearing is enabled
136 } CLOTH_SIMSETTINGS_FLAGS;
137
138 /* SPRING FLAGS */
139 typedef enum
140 {
141     CLOTH_COLLISIONSETTINGS_FLAG_ENABLED = ( 1 << 1 ),
142 } CLOTH_COLLISIONSETTINGS_FLAGS;
143
144 /* Spring types as defined in the paper.*/
145 typedef enum
146 {
147     CLOTH_SPRING_TYPE_STRUCTURAL = 0,
148     CLOTH_SPRING_TYPE_SHEAR,
149     CLOTH_SPRING_TYPE_BENDING,
150 } CLOTH_SPRING_TYPES;
151
152 /* SPRING FLAGS */
153 typedef enum
154 {
155     CLOTH_SPRING_FLAG_DEACTIVATE = ( 1 << 1 ),
156     CLOTH_SPRING_FLAG_NEEDED = ( 1 << 2 ), // springs has values to be applied
157 } CLOTH_SPRINGS_FLAGS;
158
159 /* Bits to or into the ClothVertex.flags. */
160 #define CLOTH_VERT_FLAG_PINNED 1
161 #define CLOTH_VERT_FLAG_COLLISION 2
162
163 typedef void ( *CM_COLLISION_RESPONSE ) ( ClothModifierData *clmd, CollisionModifierData *collmd, CollisionTree *tree1, CollisionTree *tree2 );
164
165
166 /////////////////////////////////////////////////
167 // collision.c
168 ////////////////////////////////////////////////
169
170 // needed for implicit.c
171 void bvh_collision_response ( ClothModifierData *clmd, ClothModifierData *coll_clmd, CollisionTree * tree1, CollisionTree * tree2 );
172 int cloth_bvh_objcollision ( ClothModifierData * clmd, float step, float dt );
173
174 int bvh_traverse ( ClothModifierData * clmd, CollisionModifierData * collmd, CollisionTree * tree1, CollisionTree * tree2, float step, CM_COLLISION_RESPONSE collision_response );
175 ////////////////////////////////////////////////
176
177
178 ////////////////////////////////////////////////
179 // implicit.c
180 ////////////////////////////////////////////////
181                 
182 // needed for cloth.c
183 int implicit_init ( Object *ob, ClothModifierData *clmd );
184 int implicit_free ( ClothModifierData *clmd );
185 int implicit_solver ( Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors );
186 void implicit_set_positions ( ClothModifierData *clmd );
187 ////////////////////////////////////////////////
188
189
190 /////////////////////////////////////////////////
191 // cloth.c
192 ////////////////////////////////////////////////
193
194 // needed for modifier.c
195 void cloth_free_modifier_extern (ClothModifierData *clmd);
196 void cloth_free_modifier (Object *ob, ClothModifierData *clmd);
197 void cloth_init (ClothModifierData *clmd);
198 DerivedMesh *clothModifier_do(ClothModifierData *clmd,Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc);
199
200 void cloth_update_normals (ClothVertex *verts, int nVerts, MFace *face, int totface);
201
202 // needed for collision.c
203 void bvh_update_from_cloth(ClothModifierData *clmd, int moving);
204
205 // needed for editmesh.c
206 void cloth_write_cache(Object *ob, ClothModifierData *clmd, float framenr);
207
208 ////////////////////////////////////////////////
209
210
211 /* Typedefs for function pointers we need for solvers and collision detection. */
212 typedef void ( *CM_COLLISION_SELF ) ( ClothModifierData *clmd, int step );
213 typedef void ( *CM_COLLISION_OBJ ) ( ClothModifierData *clmd, int step, CM_COLLISION_RESPONSE collision_response );
214
215
216 /* This enum provides the IDs for our solvers. */
217 // only one available in the moment
218 typedef enum {
219     CM_IMPLICIT = 0,
220 } CM_SOLVER_ID;
221
222
223 /* This structure defines how to call the solver.
224 */
225 typedef struct
226 {
227         char            *name;
228         CM_SOLVER_ID    id;
229         int     ( *init ) ( Object *ob, ClothModifierData *clmd );
230         int     ( *solver ) ( Object *ob, float framenr, ClothModifierData *clmd, ListBase *effectors );
231         int     ( *free ) ( ClothModifierData *clmd );
232 }
233 CM_SOLVER_DEF;
234
235 /* used for caching in implicit.c */
236 typedef struct Frame
237 {
238         ClothVertex *verts;
239         ClothSpring *springs;
240         unsigned int numverts, numsprings;
241         float time; /* we need float since we want to support sub-frames */
242 }
243 Frame;
244
245 #endif
246