Blender V4.3
implicit.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
11#include <stdio.h>
12
13#include "BLI_utildefines.h"
14
15#include "BKE_collision.h"
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21// #define IMPLICIT_SOLVER_EIGEN
22#define IMPLICIT_SOLVER_BLENDER
23
24#define CLOTH_ROOT_FRAME /* enable use of root frame coordinate transform */
25
26#define CLOTH_FORCE_GRAVITY
27#define CLOTH_FORCE_DRAG
28#define CLOTH_FORCE_SPRING_STRUCTURAL
29#define CLOTH_FORCE_SPRING_SHEAR
30#define CLOTH_FORCE_SPRING_BEND
31// #define CLOTH_FORCE_SPRING_GOAL /* UNUSED. */
32// #define CLOTH_FORCE_EFFECTORS /* UNUSED. */
33
34// #define IMPLICIT_PRINT_SOLVER_INPUT_OUTPUT
35
36// #define IMPLICIT_ENABLE_EIGEN_DEBUG
37
38struct Implicit_Data;
39
46
48{
49 printf("%-8.3f", v);
50}
51
52void SIM_mass_spring_set_vertex_mass(struct Implicit_Data *data, int index, float mass);
53void SIM_mass_spring_set_rest_transform(struct Implicit_Data *data, int index, float tfm[3][3]);
54
56 int index,
57 const float x[3],
58 const float v[3]);
59void SIM_mass_spring_set_position(struct Implicit_Data *data, int index, const float x[3]);
60void SIM_mass_spring_set_velocity(struct Implicit_Data *data, int index, const float v[3]);
62 int index,
63 float x[3],
64 float v[3]);
65void SIM_mass_spring_get_position(struct Implicit_Data *data, int index, float x[3]);
66void SIM_mass_spring_get_velocity(struct Implicit_Data *data, int index, float v[3]);
67
68/* Access to modified motion state during solver step. */
69
70void SIM_mass_spring_get_new_position(struct Implicit_Data *data, int index, float x[3]);
71void SIM_mass_spring_set_new_position(struct Implicit_Data *data, int index, const float x[3]);
72void SIM_mass_spring_get_new_velocity(struct Implicit_Data *data, int index, float v[3]);
73void SIM_mass_spring_set_new_velocity(struct Implicit_Data *data, int index, const float v[3]);
74
77 int index,
78 const float dV[3]);
80 int index,
81 const float c1[3],
82 const float c2[3],
83 const float dV[3]);
85 int index,
86 const float c1[3],
87 const float dV[3]);
88
90 float dt,
91 struct ImplicitSolverResult *result);
92bool SIM_mass_spring_solve_positions(struct Implicit_Data *data, float dt);
94
103 int index,
104 const float acceleration[3],
105 const float omega[3],
106 const float domega_dt[3],
107 float mass);
112 int index,
113 float mass,
114 const float g[3]);
118void SIM_mass_spring_force_drag(struct Implicit_Data *data, float drag);
123 struct Implicit_Data *data, int i, const float f[3], float dfdx[3][3], float dfdv[3][3]);
128 struct Implicit_Data *data, int v1, int v2, int v3, const float (*winvec)[3]);
133 struct Implicit_Data *data, int v1, int v2, int v3, const float (*forcevec)[3]);
138 int v1,
139 int v2,
140 float radius1,
141 float radius2,
142 const float (*winvec)[3]);
147 int v,
148 float radius,
149 const float (*winvec)[3]);
154 int i,
155 int j,
156 float restlen,
157 float stiffness_tension,
158 float damping_tension,
159 float stiffness_compression,
160 float damping_compression,
161 bool resist_compress,
162 bool new_compress,
163 float clamp_force);
168 int i,
169 int j,
170 int *i_a,
171 int *i_b,
172 int len_a,
173 int len_b,
174 float restang,
175 float stiffness,
176 float damping);
181 struct Implicit_Data *data, int i, int j, float restlen, float kb, float cb);
186 int i,
187 int j,
188 int k,
189 const float target[3],
190 float stiffness,
191 float damping);
196 int i,
197 const float goal_x[3],
198 const float goal_v[3],
199 float stiffness,
200 float damping);
201
202float SIM_tri_tetra_volume_signed_6x(struct Implicit_Data *data, int v1, int v2, int v3);
203float SIM_tri_area(struct Implicit_Data *data, int v1, int v2, int v3);
204
206 int v1,
207 int v2,
208 int v3,
209 float common_pressure,
210 const float *vertex_pressure,
211 const float weights[3]);
212
213/* ======== Hair Volumetric Forces ======== */
214
215struct HairGrid;
216
217#define MAX_HAIR_GRID_RES 256
218
220 const float gmin[3],
221 const float gmax[3]);
224 struct HairGrid *grid, float *cellsize, int res[3], float gmin[3], float gmax[3]);
225
226void SIM_hair_volume_grid_clear(struct HairGrid *grid);
227void SIM_hair_volume_add_vertex(struct HairGrid *grid, const float x[3], const float v[3]);
228void SIM_hair_volume_add_segment(struct HairGrid *grid,
229 const float x1[3],
230 const float v1[3],
231 const float x2[3],
232 const float v2[3],
233 const float x3[3],
234 const float v3[3],
235 const float x4[3],
236 const float v4[3],
237 const float dir1[3],
238 const float dir2[3],
239 const float dir3[3]);
240
242
244 float dt,
245 float target_density,
246 float target_strength);
247#if 0 /* XXX weighting is incorrect, disabled for now */
248void SIM_hair_volume_vertex_grid_filter_box(struct HairVertexGrid *grid, int kernel_size);
249#endif
250
252 const float x[3],
253 float *density,
254 float velocity[3],
255 float velocity_smooth[3],
256 float density_gradient[3],
257 float velocity_gradient[3][3]);
258
265 struct HairGrid *grid, const float x[3], const float v[3], float fluid_factor, float r_v[3]);
274 const float x[3],
275 const float v[3],
276 float smoothfac,
277 float pressurefac,
278 float minpressure,
279 float f[3],
280 float dfdx[3][3],
281 float dfdv[3][3]);
282
283#ifdef __cplusplus
284}
285#endif
#define BLI_INLINE
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
#define printf
void SIM_mass_spring_force_vertex_wind(struct Implicit_Data *data, int v, float radius, const float(*winvec)[3])
void SIM_hair_volume_normalize_vertex_grid(struct HairGrid *grid)
void SIM_mass_spring_add_constraint_ndof1(struct Implicit_Data *data, int index, const float c1[3], const float c2[3], const float dV[3])
void SIM_hair_volume_grid_geometry(struct HairGrid *grid, float *cellsize, int res[3], float gmin[3], float gmax[3])
void SIM_hair_volume_add_vertex(struct HairGrid *grid, const float x[3], const float v[3])
float SIM_tri_tetra_volume_signed_6x(struct Implicit_Data *data, int v1, int v2, int v3)
void SIM_mass_spring_get_motion_state(struct Implicit_Data *data, int index, float x[3], float v[3])
void SIM_hair_volume_vertex_grid_forces(struct HairGrid *grid, const float x[3], const float v[3], float smoothfac, float pressurefac, float minpressure, float f[3], float dfdx[3][3], float dfdv[3][3])
void SIM_mass_spring_add_constraint_ndof0(struct Implicit_Data *data, int index, const float dV[3])
void SIM_mass_spring_force_reference_frame(struct Implicit_Data *data, int index, const float acceleration[3], const float omega[3], const float domega_dt[3], float mass)
void SIM_mass_spring_force_edge_wind(struct Implicit_Data *data, int v1, int v2, float radius1, float radius2, const float(*winvec)[3])
bool SIM_hair_volume_solve_divergence(struct HairGrid *grid, float dt, float target_density, float target_strength)
void SIM_mass_spring_set_new_velocity(struct Implicit_Data *data, int index, const float v[3])
bool SIM_mass_spring_force_spring_goal(struct Implicit_Data *data, int i, const float goal_x[3], const float goal_v[3], float stiffness, float damping)
float SIM_tri_area(struct Implicit_Data *data, int v1, int v2, int v3)
void SIM_mass_spring_set_vertex_mass(struct Implicit_Data *data, int index, float mass)
void SIM_mass_spring_force_face_extern(struct Implicit_Data *data, int v1, int v2, int v3, const float(*forcevec)[3])
void SIM_mass_spring_get_velocity(struct Implicit_Data *data, int index, float v[3])
void SIM_mass_spring_set_motion_state(struct Implicit_Data *data, int index, const float x[3], const float v[3])
void SIM_hair_volume_free_vertex_grid(struct HairGrid *grid)
void SIM_hair_volume_grid_velocity(struct HairGrid *grid, const float x[3], const float v[3], float fluid_factor, float r_v[3])
bool SIM_mass_spring_force_spring_linear(struct Implicit_Data *data, int i, int j, float restlen, float stiffness_tension, float damping_tension, float stiffness_compression, float damping_compression, bool resist_compress, bool new_compress, float clamp_force)
void SIM_mass_spring_get_new_position(struct Implicit_Data *data, int index, float x[3])
bool SIM_mass_spring_force_spring_bending(struct Implicit_Data *data, int i, int j, float restlen, float kb, float cb)
void SIM_mass_spring_apply_result(struct Implicit_Data *data)
void SIM_mass_spring_set_position(struct Implicit_Data *data, int index, const float x[3])
struct HairGrid * SIM_hair_volume_create_vertex_grid(float cellsize, const float gmin[3], const float gmax[3])
bool SIM_mass_spring_force_spring_bending_hair(struct Implicit_Data *data, int i, int j, int k, const float target[3], float stiffness, float damping)
void SIM_mass_spring_add_constraint_ndof2(struct Implicit_Data *data, int index, const float c1[3], const float dV[3])
void SIM_mass_spring_force_pressure(struct Implicit_Data *data, int v1, int v2, int v3, float common_pressure, const float *vertex_pressure, const float weights[3])
BLI_INLINE void implicit_print_matrix_elem(float v)
Definition implicit.h:47
void SIM_mass_spring_force_face_wind(struct Implicit_Data *data, int v1, int v2, int v3, const float(*winvec)[3])
void SIM_mass_spring_get_position(struct Implicit_Data *data, int index, float x[3])
bool SIM_mass_spring_solve_velocities(struct Implicit_Data *data, float dt, struct ImplicitSolverResult *result)
void SIM_mass_spring_set_new_position(struct Implicit_Data *data, int index, const float x[3])
void SIM_mass_spring_force_drag(struct Implicit_Data *data, float drag)
void SIM_mass_spring_clear_constraints(struct Implicit_Data *data)
bool SIM_mass_spring_solve_positions(struct Implicit_Data *data, float dt)
void SIM_mass_spring_get_new_velocity(struct Implicit_Data *data, int index, float v[3])
struct ImplicitSolverResult ImplicitSolverResult
void SIM_mass_spring_set_velocity(struct Implicit_Data *data, int index, const float v[3])
void SIM_hair_volume_add_segment(struct HairGrid *grid, const float x1[3], const float v1[3], const float x2[3], const float v2[3], const float x3[3], const float v3[3], const float x4[3], const float v4[3], const float dir1[3], const float dir2[3], const float dir3[3])
void SIM_hair_volume_grid_interpolate(struct HairGrid *grid, const float x[3], float *density, float velocity[3], float velocity_smooth[3], float density_gradient[3], float velocity_gradient[3][3])
bool SIM_mass_spring_force_spring_angular(struct Implicit_Data *data, int i, int j, int *i_a, int *i_b, int len_a, int len_b, float restang, float stiffness, float damping)
void SIM_mass_spring_force_extern(struct Implicit_Data *data, int i, const float f[3], float dfdx[3][3], float dfdv[3][3])
void SIM_mass_spring_force_gravity(struct Implicit_Data *data, int index, float mass, const float g[3])
void SIM_hair_volume_grid_clear(struct HairGrid *grid)
void SIM_mass_spring_set_rest_transform(struct Implicit_Data *data, int index, float tfm[3][3])
void SIM_mass_spring_clear_forces(struct Implicit_Data *data)
float gmax[3]
float gmin[3]
int res[3]
float cellsize