Blender  V3.3
Classes | Macros | Typedefs | Functions
implicit.h File Reference
#include "stdio.h"
#include "BLI_utildefines.h"
#include "BKE_collision.h"

Go to the source code of this file.

Classes

struct  ImplicitSolverResult
 

Macros

#define IMPLICIT_SOLVER_BLENDER
 
#define CLOTH_ROOT_FRAME   /* enable use of root frame coordinate transform */
 
#define CLOTH_FORCE_GRAVITY
 
#define CLOTH_FORCE_DRAG
 
#define CLOTH_FORCE_SPRING_STRUCTURAL
 
#define CLOTH_FORCE_SPRING_SHEAR
 
#define CLOTH_FORCE_SPRING_BEND
 
#define CLOTH_FORCE_SPRING_GOAL
 
#define CLOTH_FORCE_EFFECTORS
 
#define MAX_HAIR_GRID_RES   256
 

Typedefs

typedef struct ImplicitSolverResult ImplicitSolverResult
 

Functions

BLI_INLINE void implicit_print_matrix_elem (float v)
 
void SIM_mass_spring_set_vertex_mass (struct Implicit_Data *data, int index, float mass)
 
void SIM_mass_spring_set_rest_transform (struct Implicit_Data *data, int index, float tfm[3][3])
 
void SIM_mass_spring_set_motion_state (struct Implicit_Data *data, int index, const float x[3], const float v[3])
 
void SIM_mass_spring_set_position (struct Implicit_Data *data, int index, const float x[3])
 
void SIM_mass_spring_set_velocity (struct Implicit_Data *data, int index, const float v[3])
 
void SIM_mass_spring_get_motion_state (struct Implicit_Data *data, int index, float x[3], float v[3])
 
void SIM_mass_spring_get_position (struct Implicit_Data *data, int index, float x[3])
 
void SIM_mass_spring_get_velocity (struct Implicit_Data *data, int index, float v[3])
 
void SIM_mass_spring_get_new_position (struct Implicit_Data *data, int index, float x[3])
 
void SIM_mass_spring_set_new_position (struct Implicit_Data *data, int index, const float x[3])
 
void SIM_mass_spring_get_new_velocity (struct Implicit_Data *data, int index, float v[3])
 
void SIM_mass_spring_set_new_velocity (struct Implicit_Data *data, int index, const float v[3])
 
void SIM_mass_spring_clear_constraints (struct Implicit_Data *data)
 
void SIM_mass_spring_add_constraint_ndof0 (struct Implicit_Data *data, int index, const float dV[3])
 
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_mass_spring_add_constraint_ndof2 (struct Implicit_Data *data, int index, const float c1[3], const float dV[3])
 
bool SIM_mass_spring_solve_velocities (struct Implicit_Data *data, float dt, struct ImplicitSolverResult *result)
 
bool SIM_mass_spring_solve_positions (struct Implicit_Data *data, float dt)
 
void SIM_mass_spring_apply_result (struct Implicit_Data *data)
 
void SIM_mass_spring_clear_forces (struct Implicit_Data *data)
 
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_gravity (struct Implicit_Data *data, int index, float mass, const float g[3])
 
void SIM_mass_spring_force_drag (struct Implicit_Data *data, float drag)
 
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_face_wind (struct Implicit_Data *data, int v1, int v2, int v3, const float(*winvec)[3])
 
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_force_edge_wind (struct Implicit_Data *data, int v1, int v2, float radius1, float radius2, const float(*winvec)[3])
 
void SIM_mass_spring_force_vertex_wind (struct Implicit_Data *data, int v, float radius, const float(*winvec)[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)
 
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)
 
bool SIM_mass_spring_force_spring_bending (struct Implicit_Data *data, int i, int j, float restlen, float kb, float cb)
 
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)
 
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_tetra_volume_signed_6x (struct Implicit_Data *data, int v1, int v2, int v3)
 
float SIM_tri_area (struct Implicit_Data *data, int v1, int v2, int v3)
 
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])
 
struct HairGridSIM_hair_volume_create_vertex_grid (float cellsize, const float gmin[3], const float gmax[3])
 
void SIM_hair_volume_free_vertex_grid (struct HairGrid *grid)
 
void SIM_hair_volume_grid_geometry (struct HairGrid *grid, float *cellsize, int res[3], float gmin[3], float gmax[3])
 
void SIM_hair_volume_grid_clear (struct HairGrid *grid)
 
void SIM_hair_volume_add_vertex (struct HairGrid *grid, const float x[3], 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_normalize_vertex_grid (struct HairGrid *grid)
 
bool SIM_hair_volume_solve_divergence (struct HairGrid *grid, float dt, float target_density, float target_strength)
 
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])
 
void SIM_hair_volume_grid_velocity (struct HairGrid *grid, const float x[3], const float v[3], float fluid_factor, float r_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])
 

Macro Definition Documentation

◆ CLOTH_FORCE_DRAG

#define CLOTH_FORCE_DRAG

Definition at line 26 of file implicit.h.

◆ CLOTH_FORCE_EFFECTORS

#define CLOTH_FORCE_EFFECTORS

Definition at line 31 of file implicit.h.

◆ CLOTH_FORCE_GRAVITY

#define CLOTH_FORCE_GRAVITY

Definition at line 25 of file implicit.h.

◆ CLOTH_FORCE_SPRING_BEND

#define CLOTH_FORCE_SPRING_BEND

Definition at line 29 of file implicit.h.

◆ CLOTH_FORCE_SPRING_GOAL

#define CLOTH_FORCE_SPRING_GOAL

Definition at line 30 of file implicit.h.

◆ CLOTH_FORCE_SPRING_SHEAR

#define CLOTH_FORCE_SPRING_SHEAR

Definition at line 28 of file implicit.h.

◆ CLOTH_FORCE_SPRING_STRUCTURAL

#define CLOTH_FORCE_SPRING_STRUCTURAL

Definition at line 27 of file implicit.h.

◆ CLOTH_ROOT_FRAME

#define CLOTH_ROOT_FRAME   /* enable use of root frame coordinate transform */

Definition at line 23 of file implicit.h.

◆ IMPLICIT_SOLVER_BLENDER

#define IMPLICIT_SOLVER_BLENDER

Definition at line 21 of file implicit.h.

◆ MAX_HAIR_GRID_RES

#define MAX_HAIR_GRID_RES   256

Definition at line 216 of file implicit.h.

Typedef Documentation

◆ ImplicitSolverResult

Function Documentation

◆ implicit_print_matrix_elem()

BLI_INLINE void implicit_print_matrix_elem ( float  v)

Definition at line 46 of file implicit.h.

References v.

Referenced by print_lmatrix().

◆ SIM_hair_volume_add_segment()

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] 
)

◆ SIM_hair_volume_add_vertex()

void SIM_hair_volume_add_vertex ( struct HairGrid grid,
const float  x[3],
const float  v[3] 
)

◆ SIM_hair_volume_create_vertex_grid()

struct HairGrid* SIM_hair_volume_create_vertex_grid ( float  cellsize,
const float  gmin[3],
const float  gmax[3] 
)

◆ SIM_hair_volume_free_vertex_grid()

void SIM_hair_volume_free_vertex_grid ( struct HairGrid grid)

Definition at line 1160 of file hair_volume.cpp.

References MEM_freeN, and HairGrid::verts.

Referenced by cloth_continuum_step().

◆ SIM_hair_volume_grid_clear()

void SIM_hair_volume_grid_clear ( struct HairGrid grid)

◆ SIM_hair_volume_grid_geometry()

void SIM_hair_volume_grid_geometry ( struct HairGrid grid,
float cellsize,
int  res[3],
float  gmin[3],
float  gmax[3] 
)

◆ SIM_hair_volume_grid_interpolate()

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] 
)

◆ SIM_hair_volume_grid_velocity()

void SIM_hair_volume_grid_velocity ( struct HairGrid grid,
const float  x[3],
const float  v[3],
float  fluid_factor,
float  r_v[3] 
)

Effect of fluid simulation grid on velocities. fluid_factor controls blending between PIC (Particle-in-Cell) and FLIP (Fluid-Implicit-Particle) methods (0 = only PIC, 1 = only FLIP)

Definition at line 253 of file hair_volume.cpp.

References add_v3_v3(), copy_v3_v3(), HairGrid::gmin, hair_grid_interpolate(), interp_v3_v3v3(), HairGrid::inv_cellsize, HairGrid::res, sub_v3_v3v3(), v, HairGrid::verts, and x.

Referenced by cloth_continuum_step().

◆ SIM_hair_volume_normalize_vertex_grid()

void SIM_hair_volume_normalize_vertex_grid ( struct HairGrid grid)

◆ SIM_hair_volume_solve_divergence()

bool SIM_hair_volume_solve_divergence ( struct HairGrid grid,
float  dt,
float  target_density,
float  target_strength 
)

◆ SIM_hair_volume_vertex_grid_forces()

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] 
)

WARNING: expressing grid effects on velocity as a force is not very stable, due to discontinuities in interpolated values! Better use hybrid approaches such as described in "Detail Preserving Continuum Simulation of Straight Hair" (McAdams, Selle 2009)

Definition at line 194 of file hair_volume.cpp.

References HairGrid::gmin, hair_grid_interpolate(), I, HairGrid::inv_cellsize, madd_v3_v3fl(), mul_m3_fl(), mul_v3_fl(), mul_v3_v3fl(), normalize_v3(), HairGrid::res, sub_m3_m3m3(), sub_v3_v3(), v, HairGrid::verts, x, zero_m3(), and zero_v3().

◆ SIM_mass_spring_add_constraint_ndof0()

void SIM_mass_spring_add_constraint_ndof0 ( struct Implicit_Data data,
int  index,
const float  dV[3] 
)

Definition at line 1299 of file implicit_blender.c.

References data, world_to_root_v3(), and zero_m3().

Referenced by cloth_setup_constraints().

◆ SIM_mass_spring_add_constraint_ndof1()

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] 
)

◆ SIM_mass_spring_add_constraint_ndof2()

void SIM_mass_spring_add_constraint_ndof2 ( struct Implicit_Data data,
int  index,
const float  c1[3],
const float  dV[3] 
)

◆ SIM_mass_spring_apply_result()

void SIM_mass_spring_apply_result ( struct Implicit_Data data)

Definition at line 1185 of file implicit_blender.c.

References cp_lfvector(), and data.

Referenced by SIM_cloth_solve().

◆ SIM_mass_spring_clear_constraints()

void SIM_mass_spring_clear_constraints ( struct Implicit_Data data)

Definition at line 1290 of file implicit_blender.c.

References data, unit_m3(), and zero_v3().

Referenced by cloth_setup_constraints().

◆ SIM_mass_spring_clear_forces()

void SIM_mass_spring_clear_forces ( struct Implicit_Data data)

Clear the force vector at the beginning of the time step.

Definition at line 1345 of file implicit_blender.c.

References data, init_bfmatrix(), ZERO, and zero_lfvector().

Referenced by SIM_cloth_solve().

◆ SIM_mass_spring_force_drag()

void SIM_mass_spring_force_drag ( struct Implicit_Data data,
float  drag 
)

Global drag force (velocity damping).

Definition at line 1420 of file implicit_blender.c.

References add_m3_m3m3(), copy_m3_m3(), data, I, madd_v3_v3fl(), and mul_m3_fl().

Referenced by cloth_calc_force().

◆ SIM_mass_spring_force_edge_wind()

void SIM_mass_spring_force_edge_wind ( struct Implicit_Data data,
int  v1,
int  v2,
float  radius1,
float  radius2,
const float(*)  winvec[3] 
)

Wind force, acting on an edge.

Definition at line 1617 of file implicit_blender.c.

References add_v3_v3(), data, edge_wind_vertex(), blender::math::length(), normalize_v3(), sub_v3_v3v3(), v1, v2, and world_to_root_v3().

Referenced by cloth_calc_force().

◆ SIM_mass_spring_force_extern()

void SIM_mass_spring_force_extern ( struct Implicit_Data data,
int  i,
const float  f[3],
float  dfdx[3][3],
float  dfdv[3][3] 
)

Custom external force.

Definition at line 1435 of file implicit_blender.c.

References add_m3_m3m3(), add_v3_v3(), data, world_to_root_m3(), and world_to_root_v3().

◆ SIM_mass_spring_force_face_extern()

void SIM_mass_spring_force_face_extern ( struct Implicit_Data data,
int  v1,
int  v2,
int  v3,
const float(*)  forcevec[3] 
)

Arbitrary per-unit-area vector force field acting on a face..

Definition at line 1505 of file implicit_blender.c.

References add_v3_v3(), blender::compositor::area(), calc_nor_area_tri(), data, mul_v3_fl(), nor, v1, v2, world_to_root_v3(), and zero_v3().

Referenced by cloth_calc_force().

◆ SIM_mass_spring_force_face_wind()

void SIM_mass_spring_force_face_wind ( struct Implicit_Data data,
int  v1,
int  v2,
int  v3,
const float(*)  winvec[3] 
)

Wind force, acting on a face (only generates pressure from the normal component).

Definition at line 1462 of file implicit_blender.c.

References blender::compositor::area(), calc_nor_area_tri(), data, dot_v3v3(), madd_v3_v3fl(), mul_v3_fl(), nor, v1, v2, and world_to_root_v3().

Referenced by cloth_calc_force().

◆ SIM_mass_spring_force_gravity()

void SIM_mass_spring_force_gravity ( struct Implicit_Data data,
int  index,
float  mass,
const float  g[3] 
)

Simple uniform gravity force.

Definition at line 1410 of file implicit_blender.c.

References add_v3_v3(), data, usdtokens::g(), mul_v3_fl(), and world_to_root_v3().

Referenced by cloth_calc_force().

◆ SIM_mass_spring_force_pressure()

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] 
)

◆ SIM_mass_spring_force_reference_frame()

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 
)

Fictitious forces introduced by moving coordinate systems.

Definition at line 1355 of file implicit_blender.c.

References add_m3_m3m3(), add_v3_v3(), copy_m3_m3(), cross_m3_v3m3(), cross_v3_identity(), cross_v3_v3v3(), data, mul_m3_fl(), mul_v3_fl(), negate_m3(), sub_v3_v3(), sub_v3_v3v3(), void, w(), and world_to_root_v3().

◆ SIM_mass_spring_force_spring_angular()

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 
)

Angular spring force between two polygons.

Definition at line 1948 of file implicit_blender.c.

References add_v3_v3(), add_v3_v3v3(), angle(), data, dot_v3v3(), mul_v3_v3fl(), spring_angle(), sub_v3_v3(), and x.

Referenced by cloth_calc_spring_force().

◆ SIM_mass_spring_force_spring_bending()

bool SIM_mass_spring_force_spring_bending ( struct Implicit_Data data,
int  i,
int  j,
float  restlen,
float  kb,
float  cb 
)

Bending force, forming a triangle at the base of two structural springs.

Definition at line 1842 of file implicit_blender.c.

References apply_spring(), data, fbstar(), fbstar_jacobi(), blender::math::length(), mul_m3_fl(), mul_v3_v3fl(), outerproduct(), spring_length(), and zero_m3().

Referenced by cloth_calc_spring_force().

◆ SIM_mass_spring_force_spring_bending_hair()

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 
)

◆ SIM_mass_spring_force_spring_goal()

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 
)

◆ SIM_mass_spring_force_spring_linear()

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 
)

◆ SIM_mass_spring_force_vertex_wind()

void SIM_mass_spring_force_vertex_wind ( struct Implicit_Data data,
int  v,
float  radius,
const float(*)  winvec[3] 
)

Wind force, acting on a vertex.

Referenced by cloth_calc_force().

◆ SIM_mass_spring_get_motion_state()

void SIM_mass_spring_get_motion_state ( struct Implicit_Data data,
int  index,
float  x[3],
float  v[3] 
)

◆ SIM_mass_spring_get_new_position()

void SIM_mass_spring_get_new_position ( struct Implicit_Data data,
int  index,
float  x[3] 
)

Definition at line 1250 of file implicit_blender.c.

References data, root_to_world_v3(), and x.

Referenced by cloth_solve_collisions().

◆ SIM_mass_spring_get_new_velocity()

void SIM_mass_spring_get_new_velocity ( struct Implicit_Data data,
int  index,
float  v[3] 
)

◆ SIM_mass_spring_get_position()

void SIM_mass_spring_get_position ( struct Implicit_Data data,
int  index,
float  x[3] 
)

◆ SIM_mass_spring_get_velocity()

void SIM_mass_spring_get_velocity ( struct Implicit_Data data,
int  index,
float  v[3] 
)

Definition at line 1245 of file implicit_blender.c.

References data, root_to_world_v3(), and v.

Referenced by cloth_calc_average_acceleration().

◆ SIM_mass_spring_set_motion_state()

void SIM_mass_spring_set_motion_state ( struct Implicit_Data data,
int  index,
const float  x[3],
const float  v[3] 
)

Definition at line 1208 of file implicit_blender.c.

References data, v, world_to_root_v3(), and x.

Referenced by SIM_cloth_solver_init(), and SIM_cloth_solver_set_positions().

◆ SIM_mass_spring_set_new_position()

void SIM_mass_spring_set_new_position ( struct Implicit_Data data,
int  index,
const float  x[3] 
)

Definition at line 1255 of file implicit_blender.c.

References data, world_to_root_v3(), and x.

◆ SIM_mass_spring_set_new_velocity()

void SIM_mass_spring_set_new_velocity ( struct Implicit_Data data,
int  index,
const float  v[3] 
)

Definition at line 1265 of file implicit_blender.c.

References data, v, and world_to_root_v3().

Referenced by cloth_continuum_step(), and cloth_solve_collisions().

◆ SIM_mass_spring_set_position()

void SIM_mass_spring_set_position ( struct Implicit_Data data,
int  index,
const float  x[3] 
)

Definition at line 1217 of file implicit_blender.c.

References data, world_to_root_v3(), and x.

Referenced by SIM_cloth_solve().

◆ SIM_mass_spring_set_rest_transform()

void SIM_mass_spring_set_rest_transform ( struct Implicit_Data data,
int  index,
float  tfm[3][3] 
)

Definition at line 1198 of file implicit_blender.c.

References copy_m3_m3(), data, unit_m3(), and void.

Referenced by SIM_cloth_solver_set_positions().

◆ SIM_mass_spring_set_velocity()

void SIM_mass_spring_set_velocity ( struct Implicit_Data data,
int  index,
const float  v[3] 
)

Definition at line 1222 of file implicit_blender.c.

References data, v, and world_to_root_v3().

Referenced by SIM_cloth_solve().

◆ SIM_mass_spring_set_vertex_mass()

void SIM_mass_spring_set_vertex_mass ( struct Implicit_Data data,
int  index,
float  mass 
)

Definition at line 1192 of file implicit_blender.c.

References data, mul_m3_fl(), and unit_m3().

Referenced by SIM_mass_spring_set_implicit_vertex_mass().

◆ SIM_mass_spring_solve_positions()

bool SIM_mass_spring_solve_positions ( struct Implicit_Data data,
float  dt 
)

Definition at line 1175 of file implicit_blender.c.

References add_lfvector_lfvectorS(), and data.

Referenced by cloth_solve_collisions(), and SIM_cloth_solve().

◆ SIM_mass_spring_solve_velocities()

bool SIM_mass_spring_solve_velocities ( struct Implicit_Data data,
float  dt,
struct ImplicitSolverResult result 
)

◆ SIM_tri_area()

float SIM_tri_area ( struct Implicit_Data data,
int  v1,
int  v2,
int  v3 
)

Definition at line 1542 of file implicit_blender.c.

References calc_nor_area_tri(), data, nor, v1, and v2.

Referenced by cloth_calc_average_pressure().

◆ SIM_tri_tetra_volume_signed_6x()

float SIM_tri_tetra_volume_signed_6x ( struct Implicit_Data data,
int  v1,
int  v2,
int  v3 
)

Definition at line 1536 of file implicit_blender.c.

References data, v1, v2, and volume_tri_tetrahedron_signed_v3_6x().

Referenced by cloth_calc_volume().