1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
|
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2006 by NaN Holding BV.
* All rights reserved.
*/
/** \file
* \ingroup DNA
*/
#pragma once
#include "DNA_defs.h"
/**
* This struct contains all the global data required to run a simulation.
* At the time of this writing, this structure contains data appropriate
* to run a simulation as described in Deformation Constraints in a
* Mass-Spring Model to Describe Rigid Cloth Behavior by Xavier Provot.
*
* I've tried to keep similar, if not exact names for the variables as
* are presented in the paper. Where I've changed the concept slightly,
* as in stepsPerFrame compared to the time step in the paper, I've used
* variables with different names to minimize confusion.
*/
typedef struct ClothSimSettings {
/** UNUSED atm. */
struct LinkNode *cache;
/** See SB. */
float mingoal;
/** Mechanical damping of springs. */
float Cdis DNA_DEPRECATED;
/** Viscous/fluid damping. */
float Cvi;
/** Gravity/external force vector. */
float gravity[3];
/** This is the duration of our time step, computed.. */
float dt;
/** The mass of the entire cloth. */
float mass;
/** Structural spring stiffness. */
float structural DNA_DEPRECATED;
/** Shear spring stiffness. */
float shear;
/** Flexion spring stiffness. */
float bending;
/** Max bending scaling value, min is "bending". */
float max_bend;
/** Max structural scaling value, min is "structural". */
float max_struct DNA_DEPRECATED;
/** Max shear scaling value. */
float max_shear;
/** Max sewing force. */
float max_sewing;
/** Used for normalized springs. */
float avg_spring_len;
/** Parameter how fast cloth runs. */
float timescale;
/** Multiplies cloth speed. */
float time_scale;
/** See SB. */
float maxgoal;
/** Scaling of effector forces (see softbody_calc_forces)..*/
float eff_force_scale;
/** Scaling of effector wind (see softbody_calc_forces).. */
float eff_wind_scale;
float sim_time_old;
float defgoal;
float goalspring;
float goalfrict;
/** Smoothing of velocities for hair. */
float velocity_smooth;
/** Minimum density for hair. */
float density_target;
/** Influence of hair density. */
float density_strength;
/** Friction with colliders. */
float collider_friction;
/** Damp the velocity to speed up getting to the resting position. */
float vel_damping DNA_DEPRECATED;
/** Min amount to shrink cloth by 0.0f (no shrink), 1.0f (shrink to nothing), -1.0f (double the
* edge length). */
float shrink_min;
/** Max amount to shrink cloth by 0.0f (no shrink), 1.0f (shrink to nothing), -1.0f (double the
* edge length). */
float shrink_max;
/* Air pressure */
/* The uniform pressure that is constanty applied to the mesh. Can be negative */
float uniform_pressure_force;
/* User set volume. This is the volume the mesh wants to expand to (the equilibrium volume). */
float target_volume;
/* The scaling factor to apply to the actual pressure.
pressure=( (current_volume/target_volume) - 1 + uniform_pressure_force) *
pressure_factor */
float pressure_factor;
/* Density of the fluid inside or outside the object for use in the hydrostatic pressure
* gradient. */
float fluid_density;
short vgroup_pressure;
char _pad7[6];
/* XXX various hair stuff
* should really be separate, this struct is a horrible mess already
*/
/** Damping of bending springs. */
float bending_damping;
/** Size of voxel grid cells for continuum dynamics. */
float voxel_cell_size;
/** Number of time steps per frame. */
int stepsPerFrame;
/** Flags, see CSIMSETT_FLAGS enum above. */
int flags;
/** How many frames of simulation to do before we start. */
int preroll DNA_DEPRECATED;
/** In percent!; if tearing enabled, a spring will get cut. */
int maxspringlen;
/** Which solver should be used? txold. */
short solver_type;
/** Vertex group for scaling bending stiffness. */
short vgroup_bend;
/** Optional vertexgroup name for assigning weight..*/
short vgroup_mass;
/** Vertex group for scaling structural stiffness. */
short vgroup_struct;
/** Vertex group for shrinking cloth. */
short vgroup_shrink;
/** Vertex group for scaling structural stiffness. */
short shapekey_rest;
/** Used for presets on GUI. */
short presets;
short reset;
struct EffectorWeights *effector_weights;
short bending_model;
/** Vertex group for scaling structural stiffness. */
short vgroup_shear;
float tension;
float compression;
float max_tension;
float max_compression;
/** Mechanical damping of tension springs. */
float tension_damp;
/** Mechanical damping of compression springs. */
float compression_damp;
/** Mechanical damping of shear springs. */
float shear_damp;
/** The maximum lenght an internal spring can have during creation. */
float internal_spring_max_length;
/** How much the interal spring can diverge from the vertex normal during creation. */
float internal_spring_max_diversion;
/** Vertex group for scaling structural stiffness. */
short vgroup_intern;
char _pad1[2];
float internal_tension;
float internal_compression;
float max_internal_tension;
float max_internal_compression;
char _pad0[4];
} ClothSimSettings;
/* SIMULATION FLAGS: goal flags,.. */
/* These are the bits used in SimSettings.flags. */
typedef enum {
/** Object is only collision object, no cloth simulation is done. */
CLOTH_SIMSETTINGS_FLAG_COLLOBJ = (1 << 2),
/** DEPRECATED, for versioning only. */
CLOTH_SIMSETTINGS_FLAG_GOAL = (1 << 3),
/** True if tearing is enabled. */
CLOTH_SIMSETTINGS_FLAG_TEARING = (1 << 4),
/** True if pressure sim is enabled. */
CLOTH_SIMSETTINGS_FLAG_PRESSURE = (1 << 5),
/** Use the user defined target volume. */
CLOTH_SIMSETTINGS_FLAG_PRESSURE_VOL = (1 << 6),
/** True if internal spring generation is enabled. */
CLOTH_SIMSETTINGS_FLAG_INTERNAL_SPRINGS = (1 << 7),
/** DEPRECATED, for versioning only. */
CLOTH_SIMSETTINGS_FLAG_SCALING = (1 << 8),
/** Require internal springs to be created between points with opposite normals. */
CLOTH_SIMSETTINGS_FLAG_INTERNAL_SPRINGS_NORMAL = (1 << 9),
/** Edit cache in edit-mode. */
/* CLOTH_SIMSETTINGS_FLAG_CCACHE_EDIT = (1 << 12), */ /* UNUSED */
/** Don't allow spring compression. */
CLOTH_SIMSETTINGS_FLAG_RESIST_SPRING_COMPRESS = (1 << 13),
/** Pull ends of loose edges together. */
CLOTH_SIMSETTINGS_FLAG_SEW = (1 << 14),
/** Make simulation respect deformations in the base object. */
CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH = (1 << 15),
} CLOTH_SIMSETTINGS_FLAGS;
/* ClothSimSettings.bending_model. */
typedef enum {
CLOTH_BENDING_LINEAR = 0,
CLOTH_BENDING_ANGULAR = 1,
} CLOTH_BENDING_MODEL;
typedef struct ClothCollSettings {
/** E.g. pointer to temp memory for collisions. */
struct LinkNode *collision_list;
/** Min distance for collisions. */
float epsilon;
/** Fiction/damping with self contact. */
float self_friction;
/** Friction/damping applied on contact with other object. */
float friction;
/** Collision restitution on contact with other object. */
float damping;
/** For selfcollision. */
float selfepsilon;
float repel_force DNA_DEPRECATED;
float distance_repel DNA_DEPRECATED;
/** Collision flags defined in BKE_cloth.h. */
int flags;
/** How many iterations for the selfcollision loop. */
short self_loop_count DNA_DEPRECATED;
/** How many iterations for the collision loop. */
short loop_count;
char _pad[4];
/** Only use colliders from this group of objects. */
struct Collection *group;
/** Vgroup to paint which vertices are used for self collisions. */
short vgroup_selfcol;
char _pad2[6];
/** Impulse clamp for object collisions. */
float clamp;
/** Impulse clamp for self collisions. */
float self_clamp;
} ClothCollSettings;
/* COLLISION FLAGS */
typedef enum {
CLOTH_COLLSETTINGS_FLAG_ENABLED = (1 << 1), /* enables cloth - object collisions */
CLOTH_COLLSETTINGS_FLAG_SELF = (1 << 2), /* enables selfcollisions */
} CLOTH_COLLISIONSETTINGS_FLAGS;
|