Blender  V3.3
implicit.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright Blender Foundation. All rights reserved. */
3 
4 #pragma once
5 
10 #include "stdio.h"
11 
12 #include "BLI_utildefines.h"
13 
14 #include "BKE_collision.h"
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 //#define IMPLICIT_SOLVER_EIGEN
21 #define IMPLICIT_SOLVER_BLENDER
22 
23 #define CLOTH_ROOT_FRAME /* enable use of root frame coordinate transform */
24 
25 #define CLOTH_FORCE_GRAVITY
26 #define CLOTH_FORCE_DRAG
27 #define CLOTH_FORCE_SPRING_STRUCTURAL
28 #define CLOTH_FORCE_SPRING_SHEAR
29 #define CLOTH_FORCE_SPRING_BEND
30 #define CLOTH_FORCE_SPRING_GOAL
31 #define CLOTH_FORCE_EFFECTORS
32 
33 //#define IMPLICIT_PRINT_SOLVER_INPUT_OUTPUT
34 
35 //#define IMPLICIT_ENABLE_EIGEN_DEBUG
36 
37 struct Implicit_Data;
38 
39 typedef struct ImplicitSolverResult {
40  int status;
41 
43  float error;
45 
47 {
48  printf("%-8.3f", v);
49 }
50 
51 void SIM_mass_spring_set_vertex_mass(struct Implicit_Data *data, int index, float mass);
52 void SIM_mass_spring_set_rest_transform(struct Implicit_Data *data, int index, float tfm[3][3]);
53 
55  int index,
56  const float x[3],
57  const float v[3]);
58 void SIM_mass_spring_set_position(struct Implicit_Data *data, int index, const float x[3]);
59 void SIM_mass_spring_set_velocity(struct Implicit_Data *data, int index, const float v[3]);
61  int index,
62  float x[3],
63  float v[3]);
64 void SIM_mass_spring_get_position(struct Implicit_Data *data, int index, float x[3]);
65 void SIM_mass_spring_get_velocity(struct Implicit_Data *data, int index, float v[3]);
66 
67 /* Access to modified motion state during solver step. */
68 
69 void SIM_mass_spring_get_new_position(struct Implicit_Data *data, int index, float x[3]);
70 void SIM_mass_spring_set_new_position(struct Implicit_Data *data, int index, const float x[3]);
71 void SIM_mass_spring_get_new_velocity(struct Implicit_Data *data, int index, float v[3]);
72 void SIM_mass_spring_set_new_velocity(struct Implicit_Data *data, int index, const float v[3]);
73 
76  int index,
77  const float dV[3]);
79  int index,
80  const float c1[3],
81  const float c2[3],
82  const float dV[3]);
84  int index,
85  const float c1[3],
86  const float dV[3]);
87 
89  float dt,
91 bool SIM_mass_spring_solve_positions(struct Implicit_Data *data, float dt);
93 
102  int index,
103  const float acceleration[3],
104  const float omega[3],
105  const float domega_dt[3],
106  float mass);
111  int index,
112  float mass,
113  const float g[3]);
117 void SIM_mass_spring_force_drag(struct Implicit_Data *data, float drag);
122  struct Implicit_Data *data, int i, const float f[3], float dfdx[3][3], float dfdv[3][3]);
127  struct Implicit_Data *data, int v1, int v2, int v3, const float (*winvec)[3]);
132  struct Implicit_Data *data, int v1, int v2, int v3, const float (*forcevec)[3]);
137  int v1,
138  int v2,
139  float radius1,
140  float radius2,
141  const float (*winvec)[3]);
146  int v,
147  float radius,
148  const float (*winvec)[3]);
153  int i,
154  int j,
155  float restlen,
156  float stiffness_tension,
157  float damping_tension,
158  float stiffness_compression,
159  float damping_compression,
160  bool resist_compress,
161  bool new_compress,
162  float clamp_force);
167  int i,
168  int j,
169  int *i_a,
170  int *i_b,
171  int len_a,
172  int len_b,
173  float restang,
174  float stiffness,
175  float damping);
180  struct Implicit_Data *data, int i, int j, float restlen, float kb, float cb);
185  int i,
186  int j,
187  int k,
188  const float target[3],
189  float stiffness,
190  float damping);
195  int i,
196  const float goal_x[3],
197  const float goal_v[3],
198  float stiffness,
199  float damping);
200 
201 float SIM_tri_tetra_volume_signed_6x(struct Implicit_Data *data, int v1, int v2, int v3);
202 float SIM_tri_area(struct Implicit_Data *data, int v1, int v2, int v3);
203 
205  int v1,
206  int v2,
207  int v3,
208  float common_pressure,
209  const float *vertex_pressure,
210  const float weights[3]);
211 
212 /* ======== Hair Volumetric Forces ======== */
213 
214 struct HairGrid;
215 
216 #define MAX_HAIR_GRID_RES 256
217 
219  const float gmin[3],
220  const float gmax[3]);
221 void SIM_hair_volume_free_vertex_grid(struct HairGrid *grid);
223  struct HairGrid *grid, float *cellsize, int res[3], float gmin[3], float gmax[3]);
224 
225 void SIM_hair_volume_grid_clear(struct HairGrid *grid);
226 void SIM_hair_volume_add_vertex(struct HairGrid *grid, const float x[3], const float v[3]);
228  const float x1[3],
229  const float v1[3],
230  const float x2[3],
231  const float v2[3],
232  const float x3[3],
233  const float v3[3],
234  const float x4[3],
235  const float v4[3],
236  const float dir1[3],
237  const float dir2[3],
238  const float dir3[3]);
239 
241 
243  float dt,
244  float target_density,
245  float target_strength);
246 #if 0 /* XXX weighting is incorrect, disabled for now */
247 void SIM_hair_volume_vertex_grid_filter_box(struct HairVertexGrid *grid, int kernel_size);
248 #endif
249 
251  const float x[3],
252  float *density,
253  float velocity[3],
254  float velocity_smooth[3],
255  float density_gradient[3],
256  float velocity_gradient[3][3]);
257 
264  struct HairGrid *grid, const float x[3], const float v[3], float fluid_factor, float r_v[3]);
273  const float x[3],
274  const float v[3],
275  float smoothfac,
276  float pressurefac,
277  float minpressure,
278  float f[3],
279  float dfdx[3][3],
280  float dfdv[3][3]);
281 
282 #ifdef __cplusplus
283 }
284 #endif
#define BLI_INLINE
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble x2
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
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])
struct HairGrid * SIM_hair_volume_create_vertex_grid(float cellsize, const float gmin[3], const float gmax[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])
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:46
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)
static const pxr::TfToken g("g", pxr::TfToken::Immortal)
static const pxr::TfToken density("density", pxr::TfToken::Immortal)
float gmax[3]
Definition: hair_volume.cpp:66
float gmin[3]
Definition: hair_volume.cpp:66
int res[3]
Definition: hair_volume.cpp:65
float cellsize
Definition: hair_volume.cpp:67