Partial commit of patch #8812 (fixing inlining on sunOS)
[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 "float.h"
38
39 #include "BLI_linklist.h"
40 #include "BKE_customdata.h"
41 #include "BKE_DerivedMesh.h"
42
43 #include "BLI_blenlib.h"
44 #include "BLI_arithb.h"
45 #include "BLI_edgehash.h"
46
47 #include "DNA_cloth_types.h"
48 #include "DNA_customdata_types.h"
49 #include "DNA_meshdata_types.h"
50 #include "DNA_modifier_types.h"
51 #include "DNA_object_types.h"
52
53 #include "BKE_collision.h"
54
55 struct Object;
56 struct Cloth;
57 struct MFace;
58 struct DerivedMesh;
59 struct ClothModifierData;
60 struct CollisionTree;
61
62 // this is needed for inlining behaviour
63 #if defined _WIN32
64 #   define DO_INLINE __inline
65 #elif defined (__sgi)
66 #   define DO_INLINE
67 #elif defined (__sun) || defined (__sun__)
68 #   define DO_INLINE
69 #else
70 #   define DO_INLINE inline
71 #   define LINUX
72 #endif
73
74 #define CLOTH_MAX_THREAD 2
75
76 /* goal defines */
77 #define SOFTGOALSNAP  0.999f
78
79 /* This is approximately the smallest number that can be
80 * represented by a float, given its precision. */
81 #define ALMOST_ZERO             FLT_EPSILON
82
83 /* Bits to or into the ClothVertex.flags. */
84 #define CLOTH_VERT_FLAG_PINNED 1
85 #define CLOTH_VERT_FLAG_COLLISION 2
86 #define CLOTH_VERT_FLAG_PINNED_EM 3
87
88 /**
89  * The definition of a cloth vertex.
90  */
91 typedef struct ClothVertex
92 {
93         int     flags;          /* General flags per vertex.            */
94         float   v [3];          /* The velocity of the point.           */
95         float   xconst [3];     /* constrained position                 */
96         float   x [3];          /* The current position of this vertex. */
97         float   xold [3];       /* The previous position of this vertex.*/
98         float   tx [3];         /* temporary position */
99         float   txold [3];      /* temporary old position */
100         float   tv[3];          /* temporary "velocity", mostly used as tv = tx-txold */
101         float   mass;           /* mass / weight of the vertex          */
102         float   goal;           /* goal, from SB                        */
103         float   impulse[3];     /* used in collision.c */
104         unsigned int impulse_count; /* same as above */
105         float   avg_spring_len; /* average length of connected springs */
106         float   struct_stiff;
107         float   bend_stiff;
108         float   shear_stiff;
109         int     spring_count; /* how many springs attached? */
110 }
111 ClothVertex;
112
113 /**
114  * The definition of a spring.
115  */
116 typedef struct ClothSpring
117 {
118         int     ij;             /* Pij from the paper, one end of the spring.   */
119         int     kl;             /* Pkl from the paper, one end of the spring.   */
120         float   restlen;        /* The original length of the spring.   */
121         int     matrix_index;   /* needed for implicit solver (fast lookup) */
122         int     type;           /* types defined in BKE_cloth.h ("springType") */
123         int     flags;          /* defined in BKE_cloth.h, e.g. deactivated due to tearing */
124         float dfdx[3][3];
125         float dfdv[3][3];
126         float f[3];
127         float   stiffness;      /* stiffness factor from the vertex groups */
128         float editrestlen;
129 }
130 ClothSpring;
131
132 // some macro enhancements for vector treatment
133 #define VECADDADD(v1,v2,v3)     {*(v1)+= *(v2) + *(v3); *(v1+1)+= *(v2+1) + *(v3+1); *(v1+2)+= *(v2+2) + *(v3+2);}
134 #define VECSUBADD(v1,v2,v3)     {*(v1)-= *(v2) + *(v3); *(v1+1)-= *(v2+1) + *(v3+1); *(v1+2)-= *(v2+2) + *(v3+2);}
135 #define VECADDSUB(v1,v2,v3)     {*(v1)+= *(v2) - *(v3); *(v1+1)+= *(v2+1) - *(v3+1); *(v1+2)+= *(v2+2) - *(v3+2);}
136 #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;}
137 #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;}
138 #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;}
139 #define VECADDS(v1,v2,v3,bS)    {*(v1)= *(v2) + *(v3)*bS; *(v1+1)= *(v2+1) + *(v3+1)*bS; *(v1+2)= *(v2+2) + *(v3+2)*bS;}
140 #define VECSUBMUL(v1,v2,aS)     {*(v1)-= *(v2) * aS; *(v1+1)-= *(v2+1) * aS; *(v1+2)-= *(v2+2) * aS;}
141 #define VECSUBS(v1,v2,v3,bS)    {*(v1)= *(v2) - *(v3)*bS; *(v1+1)= *(v2+1) - *(v3+1)*bS; *(v1+2)= *(v2+2) - *(v3+2)*bS;}
142 #define VECSUBSB(v1,v2, v3,bS)  {*(v1)= (*(v2)- *(v3))*bS; *(v1+1)= (*(v2+1) - *(v3+1))*bS; *(v1+2)= (*(v2+2) - *(v3+2))*bS;}
143 #define VECMULS(v1,aS)  {*(v1)*= aS; *(v1+1)*= aS; *(v1+2)*= *aS;}
144 #define VECADDMUL(v1,v2,aS)     {*(v1)+= *(v2) * aS; *(v1+1)+= *(v2+1) * aS; *(v1+2)+= *(v2+2) * aS;}
145
146 /* SIMULATION FLAGS: goal flags,.. */
147 /* These are the bits used in SimSettings.flags. */
148 typedef enum
149 {
150         //CLOTH_SIMSETTINGS_FLAG_RESET = ( 1 << 1 ),    // The CM object requires a reinitializaiton.
151         CLOTH_SIMSETTINGS_FLAG_COLLOBJ = ( 1 << 2 ),// object is only collision object, no cloth simulation is done
152         CLOTH_SIMSETTINGS_FLAG_GOAL = ( 1 << 3 ),       // we have goals enabled
153         CLOTH_SIMSETTINGS_FLAG_TEARING = ( 1 << 4 ),// true if tearing is enabled
154         //CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT = ( 1 << 5 ), // true if tearing is enabled
155         //CLOTH_SIMSETTINGS_FLAG_EDITMODE = ( 1 << 6 ), // are we in editmode? -several things disabled
156         //CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE = ( 1 << 7 ), /* force cache freeing */
157         CLOTH_SIMSETTINGS_FLAG_SCALING = ( 1 << 8 ), /* is advanced scaling active? */
158         //CLOTH_SIMSETTINGS_FLAG_LOADED = ( 1 << 9 ), /* did we just got load? */
159         //CLOTH_SIMSETTINGS_FLAG_AUTOPROTECT = ( 1 << 10 ), /* is autoprotect enabled? */
160         //CLOTH_SIMSETTINGS_FLAG_CCACHE_OUTDATED = (1 << 11),   /* while protected, did cache get outdated? */
161         CLOTH_SIMSETTINGS_FLAG_CCACHE_EDIT = (1 << 12)  /* edit cache in editmode */
162 } CLOTH_SIMSETTINGS_FLAGS;
163
164 /* COLLISION FLAGS */
165 typedef enum
166 {
167         CLOTH_COLLSETTINGS_FLAG_ENABLED = ( 1 << 1 ), /* enables cloth - object collisions */
168         CLOTH_COLLSETTINGS_FLAG_SELF = ( 1 << 2 ), /* enables selfcollisions */
169 } CLOTH_COLLISIONSETTINGS_FLAGS;
170
171 /* Spring types as defined in the paper.*/
172 typedef enum
173 {
174         CLOTH_SPRING_TYPE_STRUCTURAL  = ( 1 << 1 ),
175         CLOTH_SPRING_TYPE_SHEAR  = ( 1 << 2 ) ,
176         CLOTH_SPRING_TYPE_BENDING  = ( 1 << 3 ),
177         CLOTH_SPRING_TYPE_GOAL  = ( 1 << 4 ),
178 } CLOTH_SPRING_TYPES;
179
180 /* SPRING FLAGS */
181 typedef enum
182 {
183         CLOTH_SPRING_FLAG_DEACTIVATE = ( 1 << 1 ),
184         CLOTH_SPRING_FLAG_NEEDED = ( 1 << 2 ), // springs has values to be applied
185 } CLOTH_SPRINGS_FLAGS;
186
187 /////////////////////////////////////////////////
188 // collision.c
189 ////////////////////////////////////////////////
190
191 // needed for implicit.c
192 int cloth_bvh_objcollision ( ClothModifierData * clmd, float step, float dt );
193
194 ////////////////////////////////////////////////
195
196
197 ////////////////////////////////////////////////
198 // implicit.c
199 ////////////////////////////////////////////////
200
201 // needed for cloth.c
202 int implicit_init ( Object *ob, ClothModifierData *clmd );
203 int implicit_free ( ClothModifierData *clmd );
204 int implicit_solver ( Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors );
205 void implicit_set_positions ( ClothModifierData *clmd );
206
207 // globally needed
208 void clmdSetInterruptCallBack ( int ( *f ) ( void ) );
209 ////////////////////////////////////////////////
210
211
212 /////////////////////////////////////////////////
213 // cloth.c
214 ////////////////////////////////////////////////
215
216 // needed for modifier.c
217 void cloth_free_modifier_extern ( ClothModifierData *clmd );
218 void cloth_free_modifier ( Object *ob, ClothModifierData *clmd );
219 void cloth_init ( ClothModifierData *clmd );
220 DerivedMesh *clothModifier_do ( ClothModifierData *clmd,Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc );
221
222 void cloth_update_normals ( ClothVertex *verts, int nVerts, MFace *face, int totface );
223
224 // needed for collision.c
225 void bvh_update_from_cloth ( ClothModifierData *clmd, int moving );
226
227 // needed for editmesh.c
228 void cloth_write_cache ( Object *ob, ClothModifierData *clmd, float framenr );
229 int cloth_read_cache ( Object *ob, ClothModifierData *clmd, float framenr );
230
231 // needed for button_object.c
232 void cloth_clear_cache ( Object *ob, ClothModifierData *clmd, float framenr );
233
234 // needed for cloth.c
235 int cloth_add_spring ( ClothModifierData *clmd, unsigned int indexA, unsigned int indexB, float restlength, int spring_type);
236
237 ////////////////////////////////////////////////
238
239
240 /* Typedefs for function pointers we need for solvers and collision detection. */
241 typedef void ( *CM_COLLISION_SELF ) ( ClothModifierData *clmd, int step );
242 typedef void ( *CM_COLLISION_OBJ ) ( ClothModifierData *clmd, int step, CM_COLLISION_RESPONSE collision_response );
243
244
245 /* This enum provides the IDs for our solvers. */
246 // only one available in the moment
247 typedef enum
248 {
249         CM_IMPLICIT = 0,
250 } CM_SOLVER_ID;
251
252
253 /* This structure defines how to call the solver.
254 */
255 typedef struct
256 {
257         char            *name;
258         CM_SOLVER_ID    id;
259         int     ( *init ) ( Object *ob, ClothModifierData *clmd );
260         int     ( *solver ) ( Object *ob, float framenr, ClothModifierData *clmd, ListBase *effectors );
261         int     ( *free ) ( ClothModifierData *clmd );
262 }
263 CM_SOLVER_DEF;
264
265 /* used for caching in implicit.c */
266 typedef struct Frame
267 {
268         ClothVertex *verts;
269         ClothSpring *springs;
270         unsigned int numverts, numsprings;
271         float time; /* we need float since we want to support sub-frames */
272 }
273 Frame;
274
275 #endif
276