Blender  V3.3
Classes | Macros | Typedefs | Functions
collision.c File Reference
#include "MEM_guardedalloc.h"
#include "DNA_cloth_types.h"
#include "DNA_collection_types.h"
#include "DNA_effect_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_force_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_blenlib.h"
#include "BLI_edgehash.h"
#include "BLI_linklist.h"
#include "BLI_math.h"
#include "BLI_task.h"
#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "BKE_cloth.h"
#include "BKE_collection.h"
#include "BKE_effect.h"
#include "BKE_layer.h"
#include "BKE_modifier.h"
#include "BKE_scene.h"
#include "BKE_collision.h"
#include "BLI_kdopbvh.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_physics.h"
#include "DEG_depsgraph_query.h"

Go to the source code of this file.

Classes

struct  ColDetectData
 
struct  SelfColDetectData
 

Macros

#define INPR(v1, v2)   ((v1)[0] * (v2)[0] + (v1)[1] * (v2)[1] + (v1)[2] * (v2)[2])
 

Typedefs

typedef struct ColDetectData ColDetectData
 
typedef struct SelfColDetectData SelfColDetectData
 

Functions

void collision_move_object (CollisionModifierData *collmd, const float step, const float prevstep, const bool moving_bvh)
 
BVHTreebvhtree_build_from_mvert (const MVert *mvert, const struct MVertTri *tri, int tri_num, float epsilon)
 
void bvhtree_update_from_mvert (BVHTree *bvhtree, const MVert *mvert, const MVert *mvert_moving, const MVertTri *tri, int tri_num, bool moving)
 
BLI_INLINE int next_ind (int i)
 
static float compute_collision_point_tri_tri (const float a1[3], const float a2[3], const float a3[3], const float b1[3], const float b2[3], const float b3[3], bool culling, bool use_normal, float r_a[3], float r_b[3], float r_vec[3])
 
static float compute_collision_point_edge_tri (const float a1[3], const float a2[3], const float b1[3], const float b2[3], const float b3[3], bool culling, bool use_normal, float r_a[3], float r_b[3], float r_vec[3])
 
static void collision_compute_barycentric (const float pv[3], const float p1[3], const float p2[3], const float p3[3], float *w1, float *w2, float *w3)
 
DO_INLINE void collision_interpolateOnTriangle (float to[3], const float v1[3], const float v2[3], const float v3[3], const double w1, const double w2, const double w3)
 
static void cloth_collision_impulse_vert (const float clamp_sq, const float impulse[3], struct ClothVertex *vert)
 
static int cloth_collision_response_static (ClothModifierData *clmd, CollisionModifierData *collmd, Object *collob, CollPair *collpair, uint collision_count, const float dt)
 
static int cloth_selfcollision_response_static (ClothModifierData *clmd, CollPair *collpair, uint collision_count, const float dt)
 
static bool cloth_bvh_collision_is_active (const ClothModifierData *UNUSED(clmd), const Cloth *cloth, const MVertTri *tri_a)
 
static void cloth_collision (void *__restrict userdata, const int index, const TaskParallelTLS *__restrict UNUSED(tls))
 
static bool cloth_bvh_selfcollision_is_active (const ClothModifierData *clmd, const Cloth *cloth, const MVertTri *tri_a, const MVertTri *tri_b)
 
static void cloth_selfcollision (void *__restrict userdata, const int index, const TaskParallelTLS *__restrict UNUSED(tls))
 
static void hair_collision (void *__restrict userdata, const int index, const TaskParallelTLS *__restrict UNUSED(tls))
 
static void add_collision_object (ListBase *relations, Object *ob, int level, unsigned int modifier_type)
 
ListBaseBKE_collision_relations_create (Depsgraph *depsgraph, Collection *collection, unsigned int modifier_type)
 
void BKE_collision_relations_free (ListBase *relations)
 
Object ** BKE_collision_objects_create (Depsgraph *depsgraph, Object *self, Collection *collection, unsigned int *numcollobj, unsigned int modifier_type)
 
void BKE_collision_objects_free (Object **objects)
 
ListBaseBKE_collider_cache_create (Depsgraph *depsgraph, Object *self, Collection *collection)
 
void BKE_collider_cache_free (ListBase **colliders)
 
static bool cloth_bvh_objcollisions_nearcheck (ClothModifierData *clmd, CollisionModifierData *collmd, CollPair **collisions, int numresult, BVHTreeOverlap *overlap, bool culling, bool use_normal)
 
static bool cloth_bvh_selfcollisions_nearcheck (ClothModifierData *clmd, CollPair *collisions, int numresult, BVHTreeOverlap *overlap)
 
static int cloth_bvh_objcollisions_resolve (ClothModifierData *clmd, Object **collobjs, CollPair **collisions, uint *collision_counts, const uint numcollobj, const float dt)
 
static int cloth_bvh_selfcollisions_resolve (ClothModifierData *clmd, CollPair *collisions, int collision_count, const float dt)
 
static bool cloth_bvh_obj_overlap_cb (void *userdata, int index_a, int UNUSED(index_b), int UNUSED(thread))
 
static bool cloth_bvh_self_overlap_cb (void *userdata, int index_a, int index_b, int UNUSED(thread))
 
int cloth_bvh_collision (Depsgraph *depsgraph, Object *ob, ClothModifierData *clmd, float step, float dt)
 
BLI_INLINE void max_v3_v3v3 (float r[3], const float a[3], const float b[3])
 
void collision_get_collider_velocity (float vel_old[3], float vel_new[3], CollisionModifierData *collmd, CollPair *collpair)
 

Macro Definition Documentation

◆ INPR

#define INPR (   v1,
  v2 
)    ((v1)[0] * (v2)[0] + (v1)[1] * (v2)[1] + (v1)[2] * (v2)[2])

Typedef Documentation

◆ ColDetectData

typedef struct ColDetectData ColDetectData

◆ SelfColDetectData

Function Documentation

◆ add_collision_object()

static void add_collision_object ( ListBase relations,
Object ob,
int  level,
unsigned int  modifier_type 
)
static

◆ BKE_collider_cache_create()

ListBase* BKE_collider_cache_create ( struct Depsgraph depsgraph,
struct Object self,
struct Collection collection 
)

Create effective list of colliders from relations built beforehand. Self will be excluded.

Definition at line 1322 of file collision.c.

References BKE_modifiers_findby_type(), BLI_addtail(), CollisionModifierData::bvhtree, col, collision_move_object(), DEG_get_collision_relations(), DEG_get_evaluated_id(), depsgraph, eModifierType_Collision, LISTBASE_FOREACH, MEM_callocN, and NULL.

Referenced by dynamics_step(), and eff_calc_visibility().

◆ BKE_collider_cache_free()

void BKE_collider_cache_free ( ListBase **  colliders)

Definition at line 1359 of file collision.c.

References BLI_freelistN(), MEM_freeN, and NULL.

Referenced by dynamics_step(), eff_calc_visibility(), and SCULPT_cloth_simulation_free().

◆ BKE_collision_objects_create()

Object** BKE_collision_objects_create ( struct Depsgraph depsgraph,
struct Object self,
struct Collection collection,
unsigned int *  numcollobj,
unsigned int  modifier_type 
)

◆ BKE_collision_objects_free()

void BKE_collision_objects_free ( Object **  objects)

◆ BKE_collision_relations_create()

ListBase* BKE_collision_relations_create ( struct Depsgraph depsgraph,
struct Collection collection,
unsigned int  modifier_type 
)

Create list of collision relations in the collection or entire scene. This is used by the depsgraph to build relations, as well as faster lookup of colliders during evaluation.

Definition at line 1247 of file collision.c.

References add_collision_object(), BASE_ENABLED_RENDER, BASE_ENABLED_VIEWPORT, BKE_collection_or_layer_objects(), DAG_EVAL_RENDER, DEG_get_input_view_layer(), DEG_get_mode(), depsgraph, Base::flag, MEM_callocN, Base::next, and Base::object.

Referenced by blender::deg::build_collision_relations().

◆ BKE_collision_relations_free()

void BKE_collision_relations_free ( ListBase relations)

Definition at line 1267 of file collision.c.

References BLI_freelistN(), and MEM_freeN.

Referenced by blender::deg::clear_physics_relations().

◆ bvhtree_build_from_mvert()

BVHTree* bvhtree_build_from_mvert ( const MVert mvert,
const struct MVertTri tri,
int  tri_num,
float  epsilon 
)

◆ bvhtree_update_from_mvert()

void bvhtree_update_from_mvert ( BVHTree bvhtree,
const MVert mvert,
const MVert mvert_moving,
const MVertTri tri,
int  tri_num,
bool  moving 
)

◆ cloth_bvh_collision()

int cloth_bvh_collision ( Depsgraph depsgraph,
Object ob,
ClothModifierData clmd,
float  step,
float  dt 
)

◆ cloth_bvh_collision_is_active()

static bool cloth_bvh_collision_is_active ( const ClothModifierData UNUSEDclmd,
const Cloth cloth,
const MVertTri tri_a 
)
static

◆ cloth_bvh_obj_overlap_cb()

static bool cloth_bvh_obj_overlap_cb ( void userdata,
int  index_a,
int   UNUSEDindex_b,
int   UNUSEDthread 
)
static

◆ cloth_bvh_objcollisions_nearcheck()

static bool cloth_bvh_objcollisions_nearcheck ( ClothModifierData clmd,
CollisionModifierData collmd,
CollPair **  collisions,
int  numresult,
BVHTreeOverlap overlap,
bool  culling,
bool  use_normal 
)
static

◆ cloth_bvh_objcollisions_resolve()

static int cloth_bvh_objcollisions_resolve ( ClothModifierData clmd,
Object **  collobjs,
CollPair **  collisions,
uint collision_counts,
const uint  numcollobj,
const float  dt 
)
static

◆ cloth_bvh_self_overlap_cb()

static bool cloth_bvh_self_overlap_cb ( void userdata,
int  index_a,
int  index_b,
int   UNUSEDthread 
)
static

◆ cloth_bvh_selfcollision_is_active()

static bool cloth_bvh_selfcollision_is_active ( const ClothModifierData clmd,
const Cloth cloth,
const MVertTri tri_a,
const MVertTri tri_b 
)
static

◆ cloth_bvh_selfcollisions_nearcheck()

static bool cloth_bvh_selfcollisions_nearcheck ( ClothModifierData clmd,
CollPair collisions,
int  numresult,
BVHTreeOverlap overlap 
)
static

◆ cloth_bvh_selfcollisions_resolve()

static int cloth_bvh_selfcollisions_resolve ( ClothModifierData clmd,
CollPair collisions,
int  collision_count,
const float  dt 
)
static

◆ cloth_collision()

static void cloth_collision ( void *__restrict  userdata,
const int  index,
const TaskParallelTLS *__restrict   UNUSEDtls 
)
static

◆ cloth_collision_impulse_vert()

static void cloth_collision_impulse_vert ( const float  clamp_sq,
const float  impulse[3],
struct ClothVertex vert 
)
static

◆ cloth_collision_response_static()

static int cloth_collision_response_static ( ClothModifierData clmd,
CollisionModifierData collmd,
Object collob,
CollPair collpair,
uint  collision_count,
const float  dt 
)
static

◆ cloth_selfcollision()

static void cloth_selfcollision ( void *__restrict  userdata,
const int  index,
const TaskParallelTLS *__restrict   UNUSEDtls 
)
static

◆ cloth_selfcollision_response_static()

static int cloth_selfcollision_response_static ( ClothModifierData clmd,
CollPair collpair,
uint  collision_count,
const float  dt 
)
static

◆ collision_compute_barycentric()

static void collision_compute_barycentric ( const float  pv[3],
const float  p1[3],
const float  p2[3],
const float  p3[3],
float w1,
float w2,
float w3 
)
static

◆ collision_get_collider_velocity()

void collision_get_collider_velocity ( float  vel_old[3],
float  vel_new[3],
CollisionModifierData collmd,
CollPair collpair 
)

◆ collision_interpolateOnTriangle()

DO_INLINE void collision_interpolateOnTriangle ( float  to[3],
const float  v1[3],
const float  v2[3],
const float  v3[3],
const double  w1,
const double  w2,
const double  w3 
)

◆ collision_move_object()

void collision_move_object ( struct CollisionModifierData collmd,
float  step,
float  prevstep,
bool  moving_bvh 
)

◆ compute_collision_point_edge_tri()

static float compute_collision_point_edge_tri ( const float  a1[3],
const float  a2[3],
const float  b1[3],
const float  b2[3],
const float  b3[3],
bool  culling,
bool  use_normal,
float  r_a[3],
float  r_b[3],
float  r_vec[3] 
)
static

◆ compute_collision_point_tri_tri()

static float compute_collision_point_tri_tri ( const float  a1[3],
const float  a2[3],
const float  a3[3],
const float  b1[3],
const float  b2[3],
const float  b3[3],
bool  culling,
bool  use_normal,
float  r_a[3],
float  r_b[3],
float  r_vec[3] 
)
static

◆ hair_collision()

static void hair_collision ( void *__restrict  userdata,
const int  index,
const TaskParallelTLS *__restrict   UNUSEDtls 
)
static

◆ max_v3_v3v3()

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

Definition at line 1709 of file collision.c.

References Freestyle::a, usdtokens::b(), max_ff(), and r.

◆ next_ind()

BLI_INLINE int next_ind ( int  i)