Keymap: enable repeat for text editing paste operations
[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 } eClothVertexFlag;
54
55 typedef struct ClothHairData {
56   float loc[3];
57   float rot[3][3];
58   float rest_target[3]; /* rest target direction for each segment */
59   float radius;
60   float bending_stiffness;
61 } ClothHairData;
62
63 typedef struct ClothSolverResult {
64   int status;
65
66   int max_iterations, min_iterations;
67   float avg_iterations;
68   float max_error, min_error, avg_error;
69 } ClothSolverResult;
70
71 /**
72  * This structure describes a cloth object against which the
73  * simulation can run.
74  *
75  * The m and n members of this structure represent the assumed
76  * rectangular ordered grid for which the original paper is written.
77  * At some point they need to disappear and we need to determine out
78  * own connectivity of the mesh based on the actual edges in the mesh.
79  */
80 typedef struct Cloth {
81   struct ClothVertex *verts;     /* The vertices that represent this cloth. */
82   struct LinkNode *springs;      /* The springs connecting the mesh. */
83   unsigned int numsprings;       /* The count of springs. */
84   unsigned int mvert_num;        /* The number of verts == m * n. */
85   unsigned int primitive_num;    /* Number of triangles for cloth and edges for hair. */
86   unsigned char old_solver_type; /* unused, only 1 solver here */
87   unsigned char pad2;
88   short pad3;
89   struct BVHTree *bvhtree;     /* collision tree for this cloth object */
90   struct BVHTree *bvhselftree; /* collision tree for this cloth object */
91   struct MVertTri *tri;
92   struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */
93   struct EdgeSet *edgeset;        /* used for selfcollisions */
94   int last_frame;
95   float initial_mesh_volume;      /* Initial volume of the mesh. Used for pressure */
96   float average_acceleration[3];  /* Moving average of overall acceleration. */
97   struct MEdge *edges;            /* Used for hair collisions. */
98   struct EdgeSet *sew_edge_graph; /* Sewing edges represented using a GHash */
99 } Cloth;
100
101 /**
102  * The definition of a cloth vertex.
103  */
104 typedef struct ClothVertex {
105   int flags;                  /* General flags per vertex.        */
106   float v[3];                 /* The velocity of the point.       */
107   float xconst[3];            /* constrained position         */
108   float x[3];                 /* The current position of this vertex. */
109   float xold[3];              /* The previous position of this vertex.*/
110   float tx[3];                /* temporary position */
111   float txold[3];             /* temporary old position */
112   float tv[3];                /* temporary "velocity", mostly used as tv = tx-txold */
113   float mass;                 /* mass / weight of the vertex      */
114   float goal;                 /* goal, from SB            */
115   float impulse[3];           /* used in collision.c */
116   float xrest[3];             /* rest position of the vertex */
117   float dcvel[3];             /* delta velocities to be applied by collision response */
118   unsigned int impulse_count; /* same as above */
119   float avg_spring_len;       /* average length of connected springs */
120   float struct_stiff;
121   float bend_stiff;
122   float shear_stiff;
123   int spring_count;      /* how many springs attached? */
124   float shrink_factor;   /* how much to shrink this cloth */
125   float internal_stiff;  /* internal spring stiffness scaling */
126   float pressure_factor; /* how much pressure should affect this vertex */
127 } ClothVertex;
128
129 /**
130  * The definition of a spring.
131  */
132 typedef struct ClothSpring {
133   int ij;              /* Pij from the paper, one end of the spring.   */
134   int kl;              /* Pkl from the paper, one end of the spring.   */
135   int mn;              /* For hair springs: third vertex index; For bending springs: edge index; */
136   int *pa;             /* Array of vert indices for poly a (for bending springs). */
137   int *pb;             /* Array of vert indices for poly b (for bending springs). */
138   int la;              /* Length of *pa. */
139   int lb;              /* Length of *pb. */
140   float restlen;       /* The original length of the spring. */
141   float restang;       /* The original angle of the bending springs. */
142   int type;            /* Types defined in BKE_cloth.h ("springType"). */
143   int flags;           /* Defined in BKE_cloth.h, e.g. deactivated due to tearing. */
144   float lin_stiffness; /* Linear stiffness factor from the vertex groups. */
145   float ang_stiffness; /* Angular stiffness factor from the vertex groups. */
146   float editrestlen;
147
148   /* angular bending spring target and derivatives */
149   float target[3];
150 } ClothSpring;
151
152 // some macro enhancements for vector treatment
153 #define VECSUBADDSS(v1, v2, aS, v3, bS) \
154   { \
155     *(v1) -= *(v2)*aS + *(v3)*bS; \
156     *(v1 + 1) -= *(v2 + 1) * aS + *(v3 + 1) * bS; \
157     *(v1 + 2) -= *(v2 + 2) * aS + *(v3 + 2) * bS; \
158   } \
159   ((void)0)
160 #define VECADDSS(v1, v2, aS, v3, bS) \
161   { \
162     *(v1) = *(v2)*aS + *(v3)*bS; \
163     *(v1 + 1) = *(v2 + 1) * aS + *(v3 + 1) * bS; \
164     *(v1 + 2) = *(v2 + 2) * aS + *(v3 + 2) * bS; \
165   } \
166   ((void)0)
167 #define VECADDS(v1, v2, v3, bS) \
168   { \
169     *(v1) = *(v2) + *(v3)*bS; \
170     *(v1 + 1) = *(v2 + 1) + *(v3 + 1) * bS; \
171     *(v1 + 2) = *(v2 + 2) + *(v3 + 2) * bS; \
172   } \
173   ((void)0)
174 #define VECSUBMUL(v1, v2, aS) \
175   { \
176     *(v1) -= *(v2)*aS; \
177     *(v1 + 1) -= *(v2 + 1) * aS; \
178     *(v1 + 2) -= *(v2 + 2) * aS; \
179   } \
180   ((void)0)
181 #define VECSUBS(v1, v2, v3, bS) \
182   { \
183     *(v1) = *(v2) - *(v3)*bS; \
184     *(v1 + 1) = *(v2 + 1) - *(v3 + 1) * bS; \
185     *(v1 + 2) = *(v2 + 2) - *(v3 + 2) * bS; \
186   } \
187   ((void)0)
188 #define VECADDMUL(v1, v2, aS) \
189   { \
190     *(v1) += *(v2)*aS; \
191     *(v1 + 1) += *(v2 + 1) * aS; \
192     *(v1 + 2) += *(v2 + 2) * aS; \
193   } \
194   ((void)0)
195
196 /* Spring types as defined in the paper.*/
197 typedef enum {
198   CLOTH_SPRING_TYPE_STRUCTURAL = (1 << 1),
199   CLOTH_SPRING_TYPE_SHEAR = (1 << 2),
200   CLOTH_SPRING_TYPE_BENDING = (1 << 3),
201   CLOTH_SPRING_TYPE_GOAL = (1 << 4),
202   CLOTH_SPRING_TYPE_SEWING = (1 << 5),
203   CLOTH_SPRING_TYPE_BENDING_HAIR = (1 << 6),
204   CLOTH_SPRING_TYPE_INTERNAL = (1 << 7),
205 } CLOTH_SPRING_TYPES;
206
207 /* SPRING FLAGS */
208 typedef enum {
209   CLOTH_SPRING_FLAG_DEACTIVATE = (1 << 1),
210   CLOTH_SPRING_FLAG_NEEDED = (1 << 2),  // springs has values to be applied
211 } CLOTH_SPRINGS_FLAGS;
212
213 /////////////////////////////////////////////////
214 // collision.c
215 ////////////////////////////////////////////////
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
236 /////////////////////////////////////////////////
237 // cloth.c
238 ////////////////////////////////////////////////
239
240 // needed for modifier.c
241 void cloth_free_modifier_extern(struct ClothModifierData *clmd);
242 void cloth_free_modifier(struct ClothModifierData *clmd);
243 void clothModifier_do(struct ClothModifierData *clmd,
244                       struct Depsgraph *depsgraph,
245                       struct Scene *scene,
246                       struct Object *ob,
247                       struct Mesh *me,
248                       float (*vertexCos)[3]);
249
250 int cloth_uses_vgroup(struct ClothModifierData *clmd);
251
252 // needed for collision.c
253 void bvhtree_update_from_cloth(struct ClothModifierData *clmd, bool moving, bool self);
254
255 // needed for button_object.c
256 void cloth_clear_cache(struct Object *ob, struct ClothModifierData *clmd, float framenr);
257
258 void cloth_parallel_transport_hair_frame(float mat[3][3],
259                                          const float dir_old[3],
260                                          const float dir_new[3]);
261
262 ////////////////////////////////////////////////
263
264 #ifdef __cplusplus
265 }
266 #endif