Blender V5.0
implicit_blender.cc File Reference
#include "implicit.h"
#include "MEM_guardedalloc.h"
#include "BLI_math_geom.h"
#include "BLI_math_matrix.h"
#include "BLI_math_vector.h"
#include "BLI_task.hh"
#include "BKE_cloth.hh"
#include "SIM_mass_spring.h"

Go to the source code of this file.

Classes

struct  fmatrix3x3
struct  Implicit_Data

Macros

#define CLOTH_PARALLEL_LIMIT   1024

Typedefs

using lfVector = float[3]

Functions

DO_INLINE void mul_fvector_S (float to[3], const float from[3], float scalar)
DO_INLINE void mul_fvectorT_fvector (float to[3][3], const float vectorA[3], const float vectorB[3])
DO_INLINE void mul_fvectorT_fvectorS (float to[3][3], float vectorA[3], float vectorB[3], float aS)
DO_INLINE lfVectorcreate_lfvector (uint verts)
DO_INLINE void del_lfvector (float(*fLongVector)[3])
DO_INLINE void cp_lfvector (float(*to)[3], float(*from)[3], uint verts)
DO_INLINE void init_lfvector (float(*fLongVector)[3], const float vector[3], uint verts)
DO_INLINE void zero_lfvector (float(*to)[3], uint verts)
DO_INLINE void mul_lfvectorS (float(*to)[3], float(*fLongVector)[3], float scalar, uint verts)
DO_INLINE void submul_lfvectorS (float(*to)[3], float(*fLongVector)[3], float scalar, uint verts)
DO_INLINE float dot_lfvector (float(*fLongVectorA)[3], float(*fLongVectorB)[3], uint verts)
DO_INLINE void add_lfvector_lfvector (float(*to)[3], float(*fLongVectorA)[3], float(*fLongVectorB)[3], uint verts)
DO_INLINE void add_lfvector_lfvectorS (float(*to)[3], float(*fLongVectorA)[3], float(*fLongVectorB)[3], float bS, uint verts)
DO_INLINE void add_lfvectorS_lfvectorS (float(*to)[3], float(*fLongVectorA)[3], float aS, float(*fLongVectorB)[3], float bS, uint verts)
DO_INLINE void sub_lfvector_lfvectorS (float(*to)[3], float(*fLongVectorA)[3], float(*fLongVectorB)[3], float bS, uint verts)
DO_INLINE void sub_lfvector_lfvector (float(*to)[3], float(*fLongVectorA)[3], float(*fLongVectorB)[3], uint verts)
DO_INLINE void cp_fmatrix (float to[3][3], const float from[3][3])
DO_INLINE void initdiag_fmatrixS (float to[3][3], float aS)
DO_INLINE void mul_fmatrix_S (float matrix[3][3], float scalar)
DO_INLINE void mul_fvector_fmatrix (float *to, const float *from, const float matrix[3][3])
DO_INLINE void mul_fmatrix_fvector (float *to, const float matrix[3][3], const float from[3])
DO_INLINE void add_fmatrix_fmatrix (float to[3][3], const float matrixA[3][3], const float matrixB[3][3])
DO_INLINE void subadd_fmatrixS_fmatrixS (float to[3][3], const float matrixA[3][3], float aS, const float matrixB[3][3], float bS)
DO_INLINE void sub_fmatrix_fmatrix (float to[3][3], const float matrixA[3][3], const float matrixB[3][3])
DO_INLINE void muladd_fmatrix_fvector (float to[3], const float matrix[3][3], const float from[3])
DO_INLINE void muladd_fmatrixT_fvector (float to[3], const float matrix[3][3], const float from[3])
BLI_INLINE void outerproduct (float r[3][3], const float a[3], const float b[3])
BLI_INLINE void cross_m3_v3m3 (float r[3][3], const float v[3], const float m[3][3])
BLI_INLINE void cross_v3_identity (float r[3][3], const float v[3])
BLI_INLINE void madd_m3_m3fl (float r[3][3], const float m[3][3], float f)
BLI_INLINE void init_fmatrix (fmatrix3x3 *matrix, int r, int c)
DO_INLINE fmatrix3x3create_bfmatrix (uint verts, uint springs)
DO_INLINE void del_bfmatrix (fmatrix3x3 *matrix)
DO_INLINE void cp_bfmatrix (fmatrix3x3 *to, fmatrix3x3 *from)
DO_INLINE void init_bfmatrix (fmatrix3x3 *matrix, float m3[3][3])
DO_INLINE void initdiag_bfmatrix (fmatrix3x3 *matrix, float m3[3][3])
DO_INLINE void mul_bfmatrix_lfvector (float(*to)[3], fmatrix3x3 *from, lfVector *fLongVector)
DO_INLINE void subadd_bfmatrixS_bfmatrixS (fmatrix3x3 *to, fmatrix3x3 *from, float aS, fmatrix3x3 *matrix, float bS)
Implicit_DataSIM_mass_spring_solver_create (int numverts, int numsprings)
void SIM_mass_spring_solver_free (Implicit_Data *id)
BLI_INLINE void world_to_root_v3 (Implicit_Data *data, int index, float r[3], const float v[3])
BLI_INLINE void root_to_world_v3 (Implicit_Data *data, int index, float r[3], const float v[3])
BLI_INLINE void world_to_root_m3 (Implicit_Data *data, int index, float r[3][3], const float m[3][3])
BLI_INLINE void root_to_world_m3 (Implicit_Data *data, int index, float r[3][3], const float m[3][3])
DO_INLINE void filter (lfVector *V, fmatrix3x3 *S)
static int cg_filtered (lfVector *ldV, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, ImplicitSolverResult *result)
bool SIM_mass_spring_solve_velocities (Implicit_Data *data, float dt, ImplicitSolverResult *result)
bool SIM_mass_spring_solve_positions (Implicit_Data *data, float dt)
void SIM_mass_spring_apply_result (Implicit_Data *data)
void SIM_mass_spring_set_vertex_mass (Implicit_Data *data, int index, float mass)
void SIM_mass_spring_set_rest_transform (Implicit_Data *data, int index, float tfm[3][3])
void SIM_mass_spring_set_motion_state (Implicit_Data *data, int index, const float x[3], const float v[3])
void SIM_mass_spring_set_position (Implicit_Data *data, int index, const float x[3])
void SIM_mass_spring_set_velocity (Implicit_Data *data, int index, const float v[3])
void SIM_mass_spring_get_motion_state (Implicit_Data *data, int index, float x[3], float v[3])
void SIM_mass_spring_get_position (Implicit_Data *data, int index, float x[3])
void SIM_mass_spring_get_velocity (Implicit_Data *data, int index, float v[3])
void SIM_mass_spring_get_new_position (Implicit_Data *data, int index, float x[3])
void SIM_mass_spring_set_new_position (Implicit_Data *data, int index, const float x[3])
void SIM_mass_spring_get_new_velocity (Implicit_Data *data, int index, float v[3])
void SIM_mass_spring_set_new_velocity (Implicit_Data *data, int index, const float v[3])
static int SIM_mass_spring_add_block (Implicit_Data *data, int v1, int v2)
void SIM_mass_spring_clear_constraints (Implicit_Data *data)
void SIM_mass_spring_add_constraint_ndof0 (Implicit_Data *data, int index, const float dV[3])
void SIM_mass_spring_add_constraint_ndof1 (Implicit_Data *data, int index, const float c1[3], const float c2[3], const float dV[3])
void SIM_mass_spring_add_constraint_ndof2 (Implicit_Data *data, int index, const float c1[3], const float dV[3])
void SIM_mass_spring_clear_forces (Implicit_Data *data)
void SIM_mass_spring_force_reference_frame (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 (Implicit_Data *data, int index, float mass, const float g[3])
void SIM_mass_spring_force_drag (Implicit_Data *data, float drag)
void SIM_mass_spring_force_extern (Implicit_Data *data, int i, const float f[3], float dfdx[3][3], float dfdv[3][3])
static float calc_nor_area_tri (float nor[3], const float v1[3], const float v2[3], const float v3[3])
void SIM_mass_spring_force_face_wind (Implicit_Data *data, int v1, int v2, int v3, const float(*winvec)[3])
void SIM_mass_spring_force_face_extern (Implicit_Data *data, int v1, int v2, int v3, const float(*forcevec)[3])
float SIM_tri_tetra_volume_signed_6x (Implicit_Data *data, int v1, int v2, int v3)
float SIM_tri_area (Implicit_Data *data, int v1, int v2, int v3)
void SIM_mass_spring_force_pressure (Implicit_Data *data, int v1, int v2, int v3, float common_pressure, const float *vertex_pressure, const float weights[3])
static void edge_wind_vertex (const float dir[3], float length, float radius, const float wind[3], float f[3], float[3][3], float[3][3])
void SIM_mass_spring_force_edge_wind (Implicit_Data *data, int v1, int v2, float radius1, float radius2, const float(*winvec)[3])
void SIM_mass_spring_force_vertex_wind (Implicit_Data *data, int v, float, const float(*winvec)[3])
BLI_INLINE void dfdx_spring (float to[3][3], const float dir[3], float length, float L, float k)
BLI_INLINE void dfdv_damp (float to[3][3], const float dir[3], float damping)
BLI_INLINE float fb (float length, float L)
BLI_INLINE float fbderiv (float length, float L)
BLI_INLINE float fbstar (float length, float L, float kb, float cb)
BLI_INLINE float fbstar_jacobi (float length, float L, float kb, float cb)
BLI_INLINE bool spring_length (Implicit_Data *data, int i, int j, float r_extent[3], float r_dir[3], float *r_length, float r_vel[3])
BLI_INLINE void apply_spring (Implicit_Data *data, int i, int j, const float f[3], const float dfdx[3][3], const float dfdv[3][3])
bool SIM_mass_spring_force_spring_linear (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_bending (Implicit_Data *data, int i, int j, float restlen, float kb, float cb)
BLI_INLINE void poly_avg (lfVector *data, const int *inds, int len, float r_avg[3])
BLI_INLINE void poly_norm (lfVector *data, int i, int j, int *inds, int len, float r_dir[3])
BLI_INLINE void edge_avg (lfVector *data, int i, int j, float r_avg[3])
BLI_INLINE void edge_norm (lfVector *data, int i, int j, float r_dir[3])
BLI_INLINE float bend_angle (const float dir_a[3], const float dir_b[3], const float dir_e[3])
BLI_INLINE void spring_angle (Implicit_Data *data, int i, int j, int *i_a, int *i_b, int len_a, int len_b, float r_dir_a[3], float r_dir_b[3], float *r_angle, float r_vel_a[3], float r_vel_b[3])
bool SIM_mass_spring_force_spring_angular (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)
BLI_INLINE void spring_grad_dir (Implicit_Data *data, int i, int j, float edge[3], float dir[3], float grad_dir[3][3])
BLI_INLINE void spring_hairbend_forces (Implicit_Data *data, int i, int j, int k, const float goal[3], float stiffness, float damping, int q, const float dx[3], const float dv[3], float r_f[3])
BLI_INLINE void spring_hairbend_estimate_dfdx (Implicit_Data *data, int i, int j, int k, const float goal[3], float stiffness, float damping, int q, float dfdx[3][3])
BLI_INLINE void spring_hairbend_estimate_dfdv (Implicit_Data *data, int i, int j, int k, const float goal[3], float stiffness, float damping, int q, float dfdv[3][3])
bool SIM_mass_spring_force_spring_bending_hair (Implicit_Data *data, int i, int j, int k, const float target[3], float stiffness, float damping)
bool SIM_mass_spring_force_spring_goal (Implicit_Data *data, int i, const float goal_x[3], const float goal_v[3], float stiffness, float damping)

Variables

static float I [3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
static float ZERO [3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}

Macro Definition Documentation

◆ CLOTH_PARALLEL_LIMIT

#define CLOTH_PARALLEL_LIMIT   1024

Definition at line 28 of file implicit_blender.cc.

Referenced by dot_lfvector(), and mul_bfmatrix_lfvector().

Typedef Documentation

◆ lfVector

using lfVector = float[3]

Definition at line 53 of file implicit_blender.cc.

Function Documentation

◆ add_fmatrix_fmatrix()

DO_INLINE void add_fmatrix_fmatrix ( float to[3][3],
const float matrixA[3][3],
const float matrixB[3][3] )

Definition at line 422 of file implicit_blender.cc.

References add_v3_v3v3(), and DO_INLINE.

◆ add_lfvector_lfvector()

DO_INLINE void add_lfvector_lfvector ( float(*) to[3],
float(*) fLongVectorA[3],
float(*) fLongVectorB[3],
uint verts )

Definition at line 192 of file implicit_blender.cc.

References add_v3_v3v3(), DO_INLINE, i, and verts.

Referenced by mul_bfmatrix_lfvector(), and SIM_mass_spring_solve_velocities().

◆ add_lfvector_lfvectorS()

DO_INLINE void add_lfvector_lfvectorS ( float(*) to[3],
float(*) fLongVectorA[3],
float(*) fLongVectorB[3],
float bS,
uint verts )

Definition at line 204 of file implicit_blender.cc.

References DO_INLINE, i, VECADDS, and verts.

Referenced by cg_filtered(), and SIM_mass_spring_solve_positions().

◆ add_lfvectorS_lfvectorS()

DO_INLINE void add_lfvectorS_lfvectorS ( float(*) to[3],
float(*) fLongVectorA[3],
float aS,
float(*) fLongVectorB[3],
float bS,
uint verts )

Definition at line 214 of file implicit_blender.cc.

References DO_INLINE, i, VECADDSS, and verts.

Referenced by SIM_mass_spring_solve_velocities().

◆ apply_spring()

BLI_INLINE void apply_spring ( Implicit_Data * data,
int i,
int j,
const float f[3],
const float dfdx[3][3],
const float dfdv[3][3] )

◆ bend_angle()

BLI_INLINE float bend_angle ( const float dir_a[3],
const float dir_b[3],
const float dir_e[3] )

Definition at line 1888 of file implicit_blender.cc.

References atan2f, BLI_INLINE, cos, cross_v3_v3v3(), dot_v3v3(), and sin.

Referenced by spring_angle().

◆ calc_nor_area_tri()

float calc_nor_area_tri ( float nor[3],
const float v1[3],
const float v2[3],
const float v3[3] )
static

◆ cg_filtered()

◆ cp_bfmatrix()

DO_INLINE void cp_bfmatrix ( fmatrix3x3 * to,
fmatrix3x3 * from )

Definition at line 555 of file implicit_blender.cc.

References DO_INLINE.

Referenced by SIM_mass_spring_solve_velocities().

◆ cp_fmatrix()

DO_INLINE void cp_fmatrix ( float to[3][3],
const float from[3][3] )

Definition at line 338 of file implicit_blender.cc.

References copy_v3_v3(), and DO_INLINE.

Referenced by init_bfmatrix(), initdiag_bfmatrix(), and initdiag_fmatrixS().

◆ cp_lfvector()

DO_INLINE void cp_lfvector ( float(*) to[3],
float(*) from[3],
uint verts )

Definition at line 129 of file implicit_blender.cc.

References DO_INLINE, and verts.

Referenced by cg_filtered(), and SIM_mass_spring_apply_result().

◆ create_bfmatrix()

DO_INLINE fmatrix3x3 * create_bfmatrix ( uint verts,
uint springs )

◆ create_lfvector()

◆ cross_m3_v3m3()

BLI_INLINE void cross_m3_v3m3 ( float r[3][3],
const float v[3],
const float m[3][3] )

Definition at line 473 of file implicit_blender.cc.

References BLI_INLINE, cross_v3_v3v3(), and v.

Referenced by SIM_mass_spring_force_reference_frame().

◆ cross_v3_identity()

BLI_INLINE void cross_v3_identity ( float r[3][3],
const float v[3] )

Definition at line 480 of file implicit_blender.cc.

References BLI_INLINE, and v.

Referenced by SIM_mass_spring_force_reference_frame().

◆ del_bfmatrix()

DO_INLINE void del_bfmatrix ( fmatrix3x3 * matrix)

Definition at line 547 of file implicit_blender.cc.

References DO_INLINE, and MEM_freeN().

Referenced by SIM_mass_spring_solver_free().

◆ del_lfvector()

DO_INLINE void del_lfvector ( float(*) fLongVector[3])

◆ dfdv_damp()

BLI_INLINE void dfdv_damp ( float to[3][3],
const float dir[3],
float damping )

◆ dfdx_spring()

BLI_INLINE void dfdx_spring ( float to[3][3],
const float dir[3],
float length,
float L,
float k )

◆ dot_lfvector()

DO_INLINE float dot_lfvector ( float(*) fLongVectorA[3],
float(*) fLongVectorB[3],
uint verts )

◆ edge_avg()

BLI_INLINE void edge_avg ( lfVector * data,
int i,
int j,
float r_avg[3] )

Definition at line 1875 of file implicit_blender.cc.

References BLI_INLINE, data, and i.

Referenced by spring_angle().

◆ edge_norm()

BLI_INLINE void edge_norm ( lfVector * data,
int i,
int j,
float r_dir[3] )

Definition at line 1882 of file implicit_blender.cc.

References BLI_INLINE, data, i, normalize_v3(), and sub_v3_v3v3().

Referenced by spring_angle().

◆ edge_wind_vertex()

void edge_wind_vertex ( const float dir[3],
float length,
float radius,
const float wind[3],
float f[3],
float [3][3],
float [3][3] )
static

◆ fb()

BLI_INLINE float fb ( float length,
float L )

Definition at line 1669 of file implicit_blender.cc.

References BLI_INLINE, L, length(), and x.

Referenced by blender::gpu::Texture::attach_to(), EPA< btConvexTemplate >::bind(), gjkepa2_impl::EPA::bind(), BM_edge_calc_rotate(), BM_edge_rotate(), BM_edge_rotate_check(), BPyGPUFrameBuffer_CreatePyObject(), blender::gpu::GLTexture::check_feedback_loop(), blender::gpu::GLTexture::clear(), blender::gpu::MTLTexture::clear(), convertJoints(), blender::gpu::Texture::detach_from(), ED_region_do_draw(), edbm_edge_rotate_selected_exec(), blender::gpu::MTLContext::ensure_depth_stencil_state(), blender::draw::command::Clear::execute(), blender::draw::command::ClearMulti::execute(), fbstar(), fbstar_jacobi(), GPU_framebuffer_bind(), GPU_framebuffer_bind_loadstore(), GPU_framebuffer_bind_no_srgb(), GPU_framebuffer_clear_color(), GPU_framebuffer_clear_color_depth(), GPU_framebuffer_clear_color_depth_stencil(), GPU_framebuffer_clear_depth(), GPU_framebuffer_clear_depth_stencil(), GPU_framebuffer_clear_stencil(), GPU_framebuffer_config_array(), GPU_framebuffer_free(), GPU_framebuffer_get_name(), GPU_framebuffer_multi_clear(), GPU_framebuffer_push(), GPU_framebuffer_py_reference_get(), GPU_framebuffer_py_reference_set(), GPU_framebuffer_read_color(), GPU_framebuffer_read_depth(), GPU_framebuffer_subpass_transition_array(), GPU_framebuffer_texture_attach(), GPU_framebuffer_texture_cubeface_attach(), GPU_framebuffer_texture_detach(), GPU_framebuffer_texture_layer_attach(), GPU_offscreen_bind(), GPU_offscreen_create(), GPU_offscreen_unbind(), gpu_select_pick_load_id(), blender::gpu::tests::gpu_shader_lib_test(), GPU_viewport_bind_from_offscreen(), IMB_rectfill_area(), internalInitMultipleJoints(), lineart_bounding_area_triangle_intersect(), pygpu_framebuffer_free_if_possible(), pygpu_framebuffer_stack_pop_and_restore_or_error(), pygpu_framebuffer_stack_push_and_bind_or_error(), pygpu_state_active_framebuffer_get(), blender::gpu::Texture::read(), blender::gpu::MTLRenderPassState::reset_state(), blender::ed::vse::sequencer_ibuf_get(), blender::draw::test_draw_curves_lib(), blender::draw::test_draw_pass_all_commands(), blender::ed::vse::update_gpu_scopes(), blender::gpu::tests::ShaderSpecializationConst::validate(), write_render_color_output(), write_render_z_output(), and writeBackJoints().

◆ fbderiv()

BLI_INLINE float fbderiv ( float length,
float L )

Definition at line 1678 of file implicit_blender.cc.

References BLI_INLINE, L, length(), and x.

Referenced by fbstar_jacobi().

◆ fbstar()

BLI_INLINE float fbstar ( float length,
float L,
float kb,
float cb )

◆ fbstar_jacobi()

BLI_INLINE float fbstar_jacobi ( float length,
float L,
float kb,
float cb )

◆ filter()

DO_INLINE void filter ( lfVector * V,
fmatrix3x3 * S )

Definition at line 743 of file implicit_blender.cc.

References DO_INLINE, i, mul_m3_v3(), and V.

◆ init_bfmatrix()

DO_INLINE void init_bfmatrix ( fmatrix3x3 * matrix,
float m3[3][3] )

◆ init_fmatrix()

BLI_INLINE void init_fmatrix ( fmatrix3x3 * matrix,
int r,
int c )

Definition at line 523 of file implicit_blender.cc.

References BLI_INLINE, fmatrix3x3::c, and fmatrix3x3::r.

Referenced by create_bfmatrix(), and SIM_mass_spring_add_block().

◆ init_lfvector()

DO_INLINE void init_lfvector ( float(*) fLongVector[3],
const float vector[3],
uint verts )

Definition at line 134 of file implicit_blender.cc.

References copy_v3_v3(), DO_INLINE, i, and verts.

◆ initdiag_bfmatrix()

DO_INLINE void initdiag_bfmatrix ( fmatrix3x3 * matrix,
float m3[3][3] )

◆ initdiag_fmatrixS()

DO_INLINE void initdiag_fmatrixS ( float to[3][3],
float aS )

Definition at line 347 of file implicit_blender.cc.

References cp_fmatrix(), DO_INLINE, and ZERO.

◆ madd_m3_m3fl()

BLI_INLINE void madd_m3_m3fl ( float r[3][3],
const float m[3][3],
float f )

Definition at line 493 of file implicit_blender.cc.

References BLI_INLINE.

Referenced by SIM_mass_spring_force_spring_bending_hair().

◆ mul_bfmatrix_lfvector()

◆ mul_fmatrix_fvector()

DO_INLINE void mul_fmatrix_fvector ( float * to,
const float matrix[3][3],
const float from[3] )

Definition at line 415 of file implicit_blender.cc.

References DO_INLINE, and dot_v3v3().

◆ mul_fmatrix_S()

DO_INLINE void mul_fmatrix_S ( float matrix[3][3],
float scalar )

Definition at line 397 of file implicit_blender.cc.

References DO_INLINE, and mul_fvector_S().

◆ mul_fvector_fmatrix()

DO_INLINE void mul_fvector_fmatrix ( float * to,
const float * from,
const float matrix[3][3] )

Definition at line 406 of file implicit_blender.cc.

References DO_INLINE.

◆ mul_fvector_S()

DO_INLINE void mul_fvector_S ( float to[3],
const float from[3],
float scalar )

Definition at line 68 of file implicit_blender.cc.

References DO_INLINE.

Referenced by mul_fmatrix_S(), mul_fvectorT_fvector(), mul_fvectorT_fvectorS(), and mul_lfvectorS().

◆ mul_fvectorT_fvector()

DO_INLINE void mul_fvectorT_fvector ( float to[3][3],
const float vectorA[3],
const float vectorB[3] )

◆ mul_fvectorT_fvectorS()

DO_INLINE void mul_fvectorT_fvectorS ( float to[3][3],
float vectorA[3],
float vectorB[3],
float aS )

Definition at line 84 of file implicit_blender.cc.

References DO_INLINE, mul_fvector_S(), and mul_fvectorT_fvector().

◆ mul_lfvectorS()

DO_INLINE void mul_lfvectorS ( float(*) to[3],
float(*) fLongVector[3],
float scalar,
uint verts )

Definition at line 147 of file implicit_blender.cc.

References DO_INLINE, i, mul_fvector_S(), and verts.

◆ muladd_fmatrix_fvector()

DO_INLINE void muladd_fmatrix_fvector ( float to[3],
const float matrix[3][3],
const float from[3] )

Definition at line 452 of file implicit_blender.cc.

References DO_INLINE, and dot_v3v3().

Referenced by mul_bfmatrix_lfvector().

◆ muladd_fmatrixT_fvector()

DO_INLINE void muladd_fmatrixT_fvector ( float to[3],
const float matrix[3][3],
const float from[3] )

Definition at line 459 of file implicit_blender.cc.

References DO_INLINE.

Referenced by mul_bfmatrix_lfvector().

◆ outerproduct()

BLI_INLINE void outerproduct ( float r[3][3],
const float a[3],
const float b[3] )

◆ poly_avg()

BLI_INLINE void poly_avg ( lfVector * data,
const int * inds,
int len,
float r_avg[3] )

Definition at line 1855 of file implicit_blender.cc.

References BLI_INLINE, data, float, i, len, madd_v3_v3fl(), and zero_v3().

Referenced by poly_norm(), and spring_angle().

◆ poly_norm()

BLI_INLINE void poly_norm ( lfVector * data,
int i,
int j,
int * inds,
int len,
float r_dir[3] )

Definition at line 1866 of file implicit_blender.cc.

References BLI_INLINE, data, i, len, normal_tri_v3(), and poly_avg().

Referenced by spring_angle().

◆ root_to_world_m3()

BLI_INLINE void root_to_world_m3 ( Implicit_Data * data,
int index,
float r[3][3],
const float m[3][3] )

Definition at line 733 of file implicit_blender.cc.

References BLI_INLINE, data, and mul_m3_m3m3().

◆ root_to_world_v3()

◆ SIM_mass_spring_add_block()

int SIM_mass_spring_add_block ( Implicit_Data * data,
int v1,
int v2 )
static

Definition at line 1255 of file implicit_blender.cc.

References BLI_assert, data, init_fmatrix(), M, and v2.

Referenced by apply_spring(), and SIM_mass_spring_force_spring_bending_hair().

◆ SIM_mass_spring_add_constraint_ndof0()

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

Definition at line 1282 of file implicit_blender.cc.

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 ( 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 ( Implicit_Data * data,
int index,
const float c1[3],
const float dV[3] )

◆ SIM_mass_spring_apply_result()

void SIM_mass_spring_apply_result ( Implicit_Data * data)

Definition at line 1171 of file implicit_blender.cc.

References cp_lfvector(), and data.

Referenced by SIM_cloth_solve().

◆ SIM_mass_spring_clear_constraints()

void SIM_mass_spring_clear_constraints ( Implicit_Data * data)

Definition at line 1273 of file implicit_blender.cc.

References data, i, 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 1328 of file implicit_blender.cc.

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 1403 of file implicit_blender.cc.

References add_m3_m3m3(), copy_m3_m3(), data, I, 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 1600 of file implicit_blender.cc.

References add_v3_v3(), data, edge_wind_vertex(), length(), normalize_v3(), sub_v3_v3v3(), 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 1418 of file implicit_blender.cc.

References add_m3_m3m3(), add_v3_v3(), data, i, 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 1488 of file implicit_blender.cc.

References add_v3_v3(), calc_nor_area_tri(), data, i, mul_v3_fl(), nor, 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 1445 of file implicit_blender.cc.

References calc_nor_area_tri(), data, dot_v3v3(), i, madd_v3_v3fl(), mul_v3_fl(), nor, 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 1393 of file implicit_blender.cc.

References add_v3_v3(), data, mul_v3_fl(), and world_to_root_v3().

Referenced by cloth_calc_force().

◆ SIM_mass_spring_force_pressure()

void SIM_mass_spring_force_pressure ( Implicit_Data * data,
int v1,
int v2,
int v3,
float common_pressure,
const float * vertex_pressure,
const float weights[3] )

Definition at line 1532 of file implicit_blender.cc.

References calc_nor_area_tri(), copy_v3_fl3(), data, madd_v3_v3fl(), mul_v3_fl(), nor, v2, and zero_v3().

Referenced by cloth_calc_force().

◆ 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 1338 of file implicit_blender.cc.

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(), 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 1932 of file implicit_blender.cc.

References add_v3_v3(), add_v3_v3v3(), angle(), data, dot_v3v3(), i, 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 1826 of file implicit_blender.cc.

References apply_spring(), data, fbstar(), fbstar_jacobi(), i, 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.

Definition at line 1618 of file implicit_blender.cc.

References add_v3_v3(), data, mul_v3_v3fl(), v, and world_to_root_v3().

Referenced by cloth_calc_force().

◆ SIM_mass_spring_get_motion_state()

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

◆ SIM_mass_spring_get_new_position()

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

Definition at line 1233 of file implicit_blender.cc.

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 ( Implicit_Data * data,
int index,
float v[3] )

◆ SIM_mass_spring_get_position()

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

◆ SIM_mass_spring_get_velocity()

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

Definition at line 1228 of file implicit_blender.cc.

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 ( Implicit_Data * data,
int index,
const float x[3],
const float v[3] )

Definition at line 1194 of file implicit_blender.cc.

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 ( Implicit_Data * data,
int index,
const float x[3] )

Definition at line 1238 of file implicit_blender.cc.

References data, world_to_root_v3(), and x.

◆ SIM_mass_spring_set_new_velocity()

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

Definition at line 1248 of file implicit_blender.cc.

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 ( Implicit_Data * data,
int index,
const float x[3] )

Definition at line 1203 of file implicit_blender.cc.

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 ( Implicit_Data * data,
int index,
float tfm[3][3] )

Definition at line 1184 of file implicit_blender.cc.

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

Referenced by SIM_cloth_solver_set_positions().

◆ SIM_mass_spring_set_velocity()

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

Definition at line 1208 of file implicit_blender.cc.

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 ( Implicit_Data * data,
int index,
float mass )

Definition at line 1178 of file implicit_blender.cc.

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 ( Implicit_Data * data,
float dt )

Definition at line 1161 of file implicit_blender.cc.

References add_lfvector_lfvectorS(), and data.

Referenced by cloth_solve_collisions(), and SIM_cloth_solve().

◆ SIM_mass_spring_solve_velocities()

◆ SIM_mass_spring_solver_create()

Implicit_Data * SIM_mass_spring_solver_create ( int numverts,
int numsprings )

◆ SIM_mass_spring_solver_free()

◆ SIM_tri_area()

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

Definition at line 1525 of file implicit_blender.cc.

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

Referenced by cloth_calc_average_pressure().

◆ SIM_tri_tetra_volume_signed_6x()

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

Definition at line 1519 of file implicit_blender.cc.

References data, v2, and volume_tri_tetrahedron_signed_v3_6x().

Referenced by cloth_calc_volume().

◆ spring_angle()

BLI_INLINE void spring_angle ( Implicit_Data * data,
int i,
int j,
int * i_a,
int * i_b,
int len_a,
int len_b,
float r_dir_a[3],
float r_dir_b[3],
float * r_angle,
float r_vel_a[3],
float r_vel_b[3] )

◆ spring_grad_dir()

BLI_INLINE void spring_grad_dir ( Implicit_Data * data,
int i,
int j,
float edge[3],
float dir[3],
float grad_dir[3][3] )

◆ spring_hairbend_estimate_dfdv()

BLI_INLINE void spring_hairbend_estimate_dfdv ( Implicit_Data * data,
int i,
int j,
int k,
const float goal[3],
float stiffness,
float damping,
int q,
float dfdv[3][3] )

◆ spring_hairbend_estimate_dfdx()

BLI_INLINE void spring_hairbend_estimate_dfdx ( Implicit_Data * data,
int i,
int j,
int k,
const float goal[3],
float stiffness,
float damping,
int q,
float dfdx[3][3] )

◆ spring_hairbend_forces()

BLI_INLINE void spring_hairbend_forces ( Implicit_Data * data,
int i,
int j,
int k,
const float goal[3],
float stiffness,
float damping,
int q,
const float dx[3],
const float dv[3],
float r_f[3] )

◆ spring_length()

BLI_INLINE bool spring_length ( Implicit_Data * data,
int i,
int j,
float r_extent[3],
float r_dir[3],
float * r_length,
float r_vel[3] )

◆ sub_fmatrix_fmatrix()

DO_INLINE void sub_fmatrix_fmatrix ( float to[3][3],
const float matrixA[3][3],
const float matrixB[3][3] )

Definition at line 439 of file implicit_blender.cc.

References DO_INLINE, and sub_v3_v3v3().

◆ sub_lfvector_lfvector()

DO_INLINE void sub_lfvector_lfvector ( float(*) to[3],
float(*) fLongVectorA[3],
float(*) fLongVectorB[3],
uint verts )

Definition at line 237 of file implicit_blender.cc.

References DO_INLINE, i, sub_v3_v3v3(), and verts.

Referenced by cg_filtered().

◆ sub_lfvector_lfvectorS()

DO_INLINE void sub_lfvector_lfvectorS ( float(*) to[3],
float(*) fLongVectorA[3],
float(*) fLongVectorB[3],
float bS,
uint verts )

Definition at line 228 of file implicit_blender.cc.

References DO_INLINE, i, VECSUBS, and verts.

◆ subadd_bfmatrixS_bfmatrixS()

DO_INLINE void subadd_bfmatrixS_bfmatrixS ( fmatrix3x3 * to,
fmatrix3x3 * from,
float aS,
fmatrix3x3 * matrix,
float bS )

◆ subadd_fmatrixS_fmatrixS()

DO_INLINE void subadd_fmatrixS_fmatrixS ( float to[3][3],
const float matrixA[3][3],
float aS,
const float matrixB[3][3],
float bS )

Definition at line 431 of file implicit_blender.cc.

References DO_INLINE, and VECSUBADDSS.

Referenced by subadd_bfmatrixS_bfmatrixS().

◆ submul_lfvectorS()

DO_INLINE void submul_lfvectorS ( float(*) to[3],
float(*) fLongVector[3],
float scalar,
uint verts )

Definition at line 157 of file implicit_blender.cc.

References DO_INLINE, i, VECSUBMUL, and verts.

◆ world_to_root_m3()

BLI_INLINE void world_to_root_m3 ( Implicit_Data * data,
int index,
float r[3][3],
const float m[3][3] )

Definition at line 722 of file implicit_blender.cc.

References BLI_INLINE, copy_m3_m3(), data, mul_m3_m3m3(), and transpose_m3().

Referenced by SIM_mass_spring_force_extern().

◆ world_to_root_v3()

◆ zero_lfvector()

DO_INLINE void zero_lfvector ( float(*) to[3],
uint verts )

Variable Documentation

◆ I

float I[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
static

Definition at line 36 of file implicit_blender.cc.

◆ ZERO

float ZERO[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}
static

Definition at line 37 of file implicit_blender.cc.