Fix T92423: Blender freeze rendering animation with Mantaflow
[blender.git] / source / blender / blenkernel / BKE_cloth.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) Blender Foundation.
17  * All rights reserved.
18  */
19 #pragma once
20
21 /** \file
22  * \ingroup bke
23  */
24
25 #include "BLI_math_inline.h"
26 #include <float.h>
27
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31
32 struct ClothModifierData;
33 struct CollisionModifierData;
34 struct Depsgraph;
35 struct GHash;
36 struct Mesh;
37 struct Object;
38 struct Scene;
39
40 #define DO_INLINE MALWAYS_INLINE
41
42 /* Goal defines. */
43 #define SOFTGOALSNAP 0.999f
44
45 /* This is approximately the smallest number that can be
46  * represented by a float, given its precision. */
47 #define ALMOST_ZERO FLT_EPSILON
48
49 /* Bits to or into the #ClothVertex.flags. */
50 typedef enum eClothVertexFlag {
51   CLOTH_VERT_FLAG_PINNED = (1 << 0),
52   CLOTH_VERT_FLAG_NOSELFCOLL = (1 << 1), /* vertex NOT used for self collisions */
53   CLOTH_VERT_FLAG_NOOBJCOLL = (1 << 2),  /* vertex NOT used for object collisions */
54 } eClothVertexFlag;
55
56 typedef struct ClothHairData {
57   float loc[3];
58   float rot[3][3];
59   float rest_target[3]; /* rest target direction for each segment */
60   float radius;
61   float bending_stiffness;
62 } ClothHairData;
63
64 typedef struct ClothSolverResult {
65   int status;
66
67   int max_iterations, min_iterations;
68   float avg_iterations;
69   float max_error, min_error, avg_error;
70 } ClothSolverResult;
71
72 /**
73  * This structure describes a cloth object against which the
74  * simulation can run.
75  *
76  * The m and n members of this structure represent the assumed
77  * rectangular ordered grid for which the original paper is written.
78  * At some point they need to disappear and we need to determine out
79  * own connectivity of the mesh based on the actual edges in the mesh.
80  */
81 typedef struct Cloth {
82   struct ClothVertex *verts;     /* The vertices that represent this cloth. */
83   struct LinkNode *springs;      /* The springs connecting the mesh. */
84   unsigned int numsprings;       /* The count of springs. */
85   unsigned int mvert_num;        /* The number of verts == m * n. */
86   unsigned int primitive_num;    /* Number of triangles for cloth and edges for hair. */
87   unsigned char old_solver_type; /* unused, only 1 solver here */
88   unsigned char pad2;
89   short pad3;
90   struct BVHTree *bvhtree;     /* collision tree for this cloth object */
91   struct BVHTree *bvhselftree; /* collision tree for this cloth object */
92   struct MVertTri *tri;
93   struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */
94   struct EdgeSet *edgeset;        /* used for selfcollisions */
95   int last_frame;
96   float initial_mesh_volume;      /* Initial volume of the mesh. Used for pressure */
97   float average_acceleration[3];  /* Moving average of overall acceleration. */
98   struct MEdge *edges;            /* Used for hair collisions. */
99   struct EdgeSet *sew_edge_graph; /* Sewing edges represented using a GHash */
100 } Cloth;
101
102 /**
103  * The definition of a cloth vertex.
104  */
105 typedef struct ClothVertex {
106   int flags;                  /* General flags per vertex. */
107   float v[3];                 /* The velocity of the point. */
108   float xconst[3];            /* constrained position         */
109   float x[3];                 /* The current position of this vertex. */
110   float xold[3];              /* The previous position of this vertex. */
111   float tx[3];                /* temporary position */
112   float txold[3];             /* temporary old position */
113   float tv[3];                /* temporary "velocity", mostly used as tv = tx-txold */
114   float mass;                 /* mass / weight of the vertex      */
115   float goal;                 /* goal, from SB            */
116   float impulse[3];           /* used in collision.c */
117   float xrest[3];             /* rest position of the vertex */
118   float dcvel[3];             /* delta velocities to be applied by collision response */
119   unsigned int impulse_count; /* same as above */
120   float avg_spring_len;       /* average length of connected springs */
121   float struct_stiff;
122   float bend_stiff;
123   float shear_stiff;
124   int spring_count;      /* how many springs attached? */
125   float shrink_factor;   /* how much to shrink this cloth */
126   float internal_stiff;  /* internal spring stiffness scaling */
127   float pressure_factor; /* how much pressure should affect this vertex */
128 } ClothVertex;
129
130 /**
131  * The definition of a spring.
132  */
133 typedef struct ClothSpring {
134   int ij;              /* `Pij` from the paper, one end of the spring. */
135   int kl;              /* `Pkl` from the paper, one end of the spring. */
136   int mn;              /* For hair springs: third vertex index; For bending springs: edge index; */
137   int *pa;             /* Array of vert indices for poly a (for bending springs). */
138   int *pb;             /* Array of vert indices for poly b (for bending springs). */
139   int la;              /* Length of `*pa`. */
140   int lb;              /* Length of `*pb`. */
141   float restlen;       /* The original length of the spring. */
142   float restang;       /* The original angle of the bending springs. */
143   int type;            /* Types defined in BKE_cloth.h ("springType"). */
144   int flags;           /* Defined in BKE_cloth.h, e.g. deactivated due to tearing. */
145   float lin_stiffness; /* Linear stiffness factor from the vertex groups. */
146   float ang_stiffness; /* Angular stiffness factor from the vertex groups. */
147   float editrestlen;
148
149   /* angular bending spring target and derivatives */
150   float target[3];
151 } ClothSpring;
152
153 /* Some macro enhancements for vector treatment. */
154 #define VECSUBADDSS(v1, v2, aS, v3, bS) \
155   { \
156     *(v1) -= *(v2)*aS + *(v3)*bS; \
157     *(v1 + 1) -= *(v2 + 1) * aS + *(v3 + 1) * bS; \
158     *(v1 + 2) -= *(v2 + 2) * aS + *(v3 + 2) * bS; \
159   } \
160   ((void)0)
161 #define VECADDSS(v1, v2, aS, v3, bS) \
162   { \
163     *(v1) = *(v2)*aS + *(v3)*bS; \
164     *(v1 + 1) = *(v2 + 1) * aS + *(v3 + 1) * bS; \
165     *(v1 + 2) = *(v2 + 2) * aS + *(v3 + 2) * bS; \
166   } \
167   ((void)0)
168 #define VECADDS(v1, v2, v3, bS) \
169   { \
170     *(v1) = *(v2) + *(v3)*bS; \
171     *(v1 + 1) = *(v2 + 1) + *(v3 + 1) * bS; \
172     *(v1 + 2) = *(v2 + 2) + *(v3 + 2) * bS; \
173   } \
174   ((void)0)
175 #define VECSUBMUL(v1, v2, aS) \
176   { \
177     *(v1) -= *(v2)*aS; \
178     *(v1 + 1) -= *(v2 + 1) * aS; \
179     *(v1 + 2) -= *(v2 + 2) * aS; \
180   } \
181   ((void)0)
182 #define VECSUBS(v1, v2, v3, bS) \
183   { \
184     *(v1) = *(v2) - *(v3)*bS; \
185     *(v1 + 1) = *(v2 + 1) - *(v3 + 1) * bS; \
186     *(v1 + 2) = *(v2 + 2) - *(v3 + 2) * bS; \
187   } \
188   ((void)0)
189 #define VECADDMUL(v1, v2, aS) \
190   { \
191     *(v1) += *(v2)*aS; \
192     *(v1 + 1) += *(v2 + 1) * aS; \
193     *(v1 + 2) += *(v2 + 2) * aS; \
194   } \
195   ((void)0)
196
197 /* Spring types as defined in the paper. */
198 typedef enum {
199   CLOTH_SPRING_TYPE_STRUCTURAL = (1 << 1),
200   CLOTH_SPRING_TYPE_SHEAR = (1 << 2),
201   CLOTH_SPRING_TYPE_BENDING = (1 << 3),
202   CLOTH_SPRING_TYPE_GOAL = (1 << 4),
203   CLOTH_SPRING_TYPE_SEWING = (1 << 5),
204   CLOTH_SPRING_TYPE_BENDING_HAIR = (1 << 6),
205   CLOTH_SPRING_TYPE_INTERNAL = (1 << 7),
206 } CLOTH_SPRING_TYPES;
207
208 /* SPRING FLAGS */
209 typedef enum {
210   CLOTH_SPRING_FLAG_DEACTIVATE = (1 << 1),
211   CLOTH_SPRING_FLAG_NEEDED = (1 << 2), /* Springs has values to be applied. */
212 } CLOTH_SPRINGS_FLAGS;
213
214 /* -------------------------------------------------------------------- */
215 /* collision.c */
216
217 struct CollPair;
218
219 typedef struct ColliderContacts {
220   struct Object *ob;
221   struct CollisionModifierData *collmd;
222
223   struct CollPair *collisions;
224   int totcollisions;
225 } ColliderContacts;
226
227 /* needed for implicit.c */
228 int cloth_bvh_collision(struct Depsgraph *depsgraph,
229                         struct Object *ob,
230                         struct ClothModifierData *clmd,
231                         float step,
232                         float dt);
233
234 /* -------------------------------------------------------------------- */
235 /* cloth.c */
236
237 /* Needed for modifier.c */
238 void cloth_free_modifier_extern(struct ClothModifierData *clmd);
239 void cloth_free_modifier(struct ClothModifierData *clmd);
240 void clothModifier_do(struct ClothModifierData *clmd,
241                       struct Depsgraph *depsgraph,
242                       struct Scene *scene,
243                       struct Object *ob,
244                       struct Mesh *me,
245                       float (*vertexCos)[3]);
246
247 int cloth_uses_vgroup(struct ClothModifierData *clmd);
248
249 /* Needed for collision.c */
250 void bvhtree_update_from_cloth(struct ClothModifierData *clmd, bool moving, bool self);
251
252 /* Needed for button_object.c */
253 void cloth_clear_cache(struct Object *ob, struct ClothModifierData *clmd, float framenr);
254
255 void cloth_parallel_transport_hair_frame(float mat[3][3],
256                                          const float dir_old[3],
257                                          const float dir_new[3]);
258
259 #ifdef __cplusplus
260 }
261 #endif