Fixed typo which resulted in jumping cloth when collisions where enabled, fixed colli...
[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_DerivedMesh.h"
39 #include "DNA_customdata_types.h"
40 #include "BKE_customdata.h"
41 #include "DNA_meshdata_types.h"
42
43 struct Object;
44 struct Cloth;
45 struct MFace;
46 struct DerivedMesh;
47
48 // this is needed for inlining behaviour
49
50 #ifndef _WIN32
51 #define LINUX
52 #define DO_INLINE 
53 #else
54 #define DO_INLINE
55 #endif
56
57 #define CLOTH_MAX_THREAD 2
58
59
60 /* goal defines */
61 #define SOFTGOALSNAP  0.999f
62
63 /* This is approximately the smallest number that can be
64 * represented by a float, given its precision. */
65 #define ALMOST_ZERO             0.000001
66
67 // some macro enhancements for vector treatment
68 #define VECADDADD(v1,v2,v3)     {*(v1)+= *(v2) + *(v3); *(v1+1)+= *(v2+1) + *(v3+1); *(v1+2)+= *(v2+2) + *(v3+2);}
69 #define VECSUBADD(v1,v2,v3)     {*(v1)-= *(v2) + *(v3); *(v1+1)-= *(v2+1) + *(v3+1); *(v1+2)-= *(v2+2) + *(v3+2);}
70 #define VECADDSUB(v1,v2,v3)     {*(v1)+= *(v2) - *(v3); *(v1+1)+= *(v2+1) - *(v3+1); *(v1+2)+= *(v2+2) - *(v3+2);}
71 #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;}
72 #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;}
73 #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;}
74 #define VECADDS(v1,v2,v3,bS)    {*(v1)= *(v2) + *(v3)*bS; *(v1+1)= *(v2+1) + *(v3+1)*bS; *(v1+2)= *(v2+2) + *(v3+2)*bS;}
75 #define VECSUBMUL(v1,v2,aS)     {*(v1)-= *(v2) * aS; *(v1+1)-= *(v2+1) * aS; *(v1+2)-= *(v2+2) * aS;}
76 #define VECSUBS(v1,v2,v3,bS)    {*(v1)= *(v2) - *(v3)*bS; *(v1+1)= *(v2+1) - *(v3+1)*bS; *(v1+2)= *(v2+2) - *(v3+2)*bS;}
77 #define VECSUBSB(v1,v2, v3,bS)  {*(v1)= (*(v2)- *(v3))*bS; *(v1+1)= (*(v2+1) - *(v3+1))*bS; *(v1+2)= (*(v2+2) - *(v3+2))*bS;}
78 #define VECMULS(v1,aS)  {*(v1)*= aS; *(v1+1)*= aS; *(v1+2)*= *aS;}
79 #define VECADDMUL(v1,v2,aS)     {*(v1)+= *(v2) * aS; *(v1+1)+= *(v2+1) * aS; *(v1+2)+= *(v2+2) * aS;}
80
81 /* SIMULATION FLAGS: goal flags,.. */
82 /* These are the bits used in SimSettings.flags. */
83 typedef enum
84 {
85     CLOTH_SIMSETTINGS_FLAG_RESET = ( 1 << 1 ),          // The CM object requires a reinitializaiton.
86     CLOTH_SIMSETTINGS_FLAG_COLLOBJ = ( 1 << 2 ),        // object is only collision object, no cloth simulation is done
87     CLOTH_SIMSETTINGS_FLAG_GOAL = ( 1 << 3 ),           // we have goals enabled
88     CLOTH_SIMSETTINGS_FLAG_TEARING = ( 1 << 4 ), // true if tearing is enabled
89     CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT = ( 1 << 5 ), // true if tearing is enabled
90 } CLOTH_SIMSETTINGS_FLAGS;
91
92 /* SPRING FLAGS */
93 typedef enum
94 {
95     CLOTH_COLLISIONSETTINGS_FLAG_ENABLED = ( 1 << 1 ),
96 } CLOTH_COLLISIONSETTINGS_FLAGS;
97
98 /* Spring types as defined in the paper.*/
99 typedef enum
100 {
101     CLOTH_SPRING_TYPE_STRUCTURAL = 0,
102     CLOTH_SPRING_TYPE_SHEAR,
103     CLOTH_SPRING_TYPE_BENDING,
104 } CLOTH_SPRING_TYPES;
105
106 /* SPRING FLAGS */
107 typedef enum
108 {
109     CLOTH_SPRING_FLAG_DEACTIVATE = ( 1 << 1 ),
110     CLOTH_SPRING_FLAG_NEEDED = ( 1 << 2 ), // springs has values to be applied
111 } CLOTH_SPRINGS_FLAGS;
112
113 /* Bits to or into the ClothVertex.flags. */
114 #define CVERT_FLAG_PINNED       1
115 #define CVERT_FLAG_COLLISION    2
116
117
118 // needed for buttons_object.c
119 void cloth_cache_free ( ClothModifierData *clmd, float time );
120 void cloth_free_modifier ( ClothModifierData *clmd );
121
122 // needed for cloth.c
123 void implicit_set_positions ( ClothModifierData *clmd );
124
125 // from cloth.c, needed for modifier.c
126 DerivedMesh *clothModifier_do(ClothModifierData *clmd,Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc);
127
128 // needed in implicit.c
129 int cloth_bvh_objcollision(ClothModifierData * clmd, float step, float prevstep, float dt);
130
131 ////////////////////////////////////////////////
132
133
134 /////////////////////////////////////////////////
135 // cloth.c
136 ////////////////////////////////////////////////
137 void cloth_free_modifier ( ClothModifierData *clmd );
138 void cloth_init ( ClothModifierData *clmd );
139 void cloth_update_normals ( ClothVertex *verts, int nVerts, MFace *face, int totface );
140 ////////////////////////////////////////////////
141
142
143 /* Typedefs for function pointers we need for solvers and collision detection. */
144 typedef void ( *CM_COLLISION_SELF ) ( ClothModifierData *clmd, int step );
145 // typedef void ( *CM_COLLISION_OBJ ) ( ClothModifierData *clmd, int step, CM_COLLISION_RESPONSE collision_response );
146
147
148 /* This enum provides the IDs for our solvers. */
149 // only one available in the moment
150 typedef enum {
151     CM_IMPLICIT = 0,
152 } CM_SOLVER_ID;
153
154
155 /* This structure defines how to call the solver.
156 */
157 typedef struct
158 {
159         char            *name;
160         CM_SOLVER_ID    id;
161         int     ( *init ) ( Object *ob, ClothModifierData *clmd );
162         int     ( *solver ) ( Object *ob, float framenr, ClothModifierData *clmd, ListBase *effectors );
163         int     ( *free ) ( ClothModifierData *clmd );
164 }
165 CM_SOLVER_DEF;
166
167
168 /* new C implicit simulator */
169 int implicit_init ( Object *ob, ClothModifierData *clmd );
170 int implicit_free ( ClothModifierData *clmd );
171 int implicit_solver ( Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors );
172
173 /* used for caching in implicit.c */
174 typedef struct Frame
175 {
176         ClothVertex *verts;
177         ClothSpring *springs;
178         unsigned int numverts, numsprings;
179         float time; /* we need float since we want to support sub-frames */
180         float (*x)[3];
181         float (*xold)[3];
182         float (*v)[3];
183         float (*current_xold)[3];
184 }
185 Frame;
186
187 /* used for collisions in collision.c */
188 /*
189 typedef struct CollPair
190 {
191         unsigned int face1; // cloth face
192         unsigned int face2; // object face
193         double distance; // magnitude of vector
194         float normal[3];
195         float vector[3]; // unnormalized collision vector: p2-p1
196         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
197         int lastsign; // indicates if the distance sign has changed, unused itm
198         float time; // collision time, from 0 up to 1
199         unsigned int ap1, ap2, ap3, bp1, bp2, bp3, bp4;
200         unsigned int pointsb[4];
201 }
202 CollPair;
203 */
204
205 /* used for collisions in collision.c */
206 typedef struct EdgeCollPair
207 {
208         unsigned int p11, p12, p21, p22;
209         float normal[3];
210         float vector[3];
211         float time;
212         int lastsign;
213         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
214 }
215 EdgeCollPair;
216
217 /* used for collisions in collision.c */
218 typedef struct FaceCollPair
219 {
220         unsigned int p11, p12, p13, p21;
221         float normal[3];
222         float vector[3];
223         float time;
224         int lastsign;
225         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
226 }
227 FaceCollPair;
228
229 #endif
230