Blender V4.3
collision.cc File Reference
#include <algorithm>
#include "MEM_guardedalloc.h"
#include "DNA_cloth_types.h"
#include "DNA_object_force_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_math_geom.h"
#include "BLI_math_vector.h"
#include "BLI_task.h"
#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "BKE_cloth.hh"
#include "BKE_collection.hh"
#include "BKE_modifier.hh"
#include "BKE_collision.h"
#include "BLI_kdopbvh.h"
#include "DEG_depsgraph.hh"
#include "DEG_depsgraph_physics.hh"
#include "DEG_depsgraph_query.hh"

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

Functions

void collision_move_object (CollisionModifierData *collmd, const float step, const float prevstep, const bool moving_bvh)
 
BVHTreebvhtree_build_from_mvert (const float(*positions)[3], const blender::int3 *vert_tris, int tri_num, float epsilon)
 
void bvhtree_update_from_mvert (BVHTree *bvhtree, const float(*positions)[3], const float(*positions_moving)[3], const blender::int3 *vert_tris, 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], 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 *, const Cloth *cloth, const blender::int3 vert_tri_a)
 
static void cloth_collision (void *__restrict userdata, const int index, const TaskParallelTLS *__restrict)
 
static bool cloth_bvh_selfcollision_is_active (const ClothModifierData *clmd, const Cloth *cloth, const blender::int3 vert_tri_a, const blender::int3 vert_tri_b)
 
static void cloth_selfcollision (void *__restrict userdata, const int index, const TaskParallelTLS *__restrict)
 
static void hair_collision (void *__restrict userdata, const int index, const TaskParallelTLS *__restrict)
 
static void add_collision_object (ListBase *relations, Object *ob, int level, const ModifierType modifier_type)
 
ListBaseBKE_collision_relations_create (Depsgraph *depsgraph, Collection *collection, uint modifier_type)
 
void BKE_collision_relations_free (ListBase *relations)
 
Object ** BKE_collision_objects_create (Depsgraph *depsgraph, Object *self, Collection *collection, uint *numcollobj, uint 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, int)
 
static bool cloth_bvh_self_overlap_cb (void *userdata, int index_a, int index_b, int)
 
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])

Function Documentation

◆ add_collision_object()

◆ 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 1335 of file collision.cc.

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, and self.

Referenced by dynamics_step(), and eff_calc_visibility().

◆ BKE_collider_cache_free()

void BKE_collider_cache_free ( ListBase ** colliders)

Definition at line 1372 of file collision.cc.

References BLI_freelistN(), and MEM_freeN().

Referenced by dynamics_step(), and eff_calc_visibility().

◆ 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 1259 of file collision.cc.

References add_collision_object(), BASE_ENABLED_RENDER, BASE_ENABLED_VIEWPORT, BKE_collection_or_layer_objects(), DAG_EVAL_RENDER, DEG_get_input_scene(), DEG_get_input_view_layer(), DEG_get_mode(), depsgraph, Base::flag, 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 1280 of file collision.cc.

References BLI_freelistN(), and MEM_freeN().

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

◆ bvhtree_build_from_mvert()

BVHTree * bvhtree_build_from_mvert ( const float(*) positions[3],
const blender::int3 * vert_tris,
int tri_num,
float epsilon )

Definition at line 90 of file collision.cc.

References BLI_bvhtree_balance(), BLI_bvhtree_insert(), BLI_bvhtree_new(), copy_v3_v3(), and tree.

Referenced by deform_verts().

◆ bvhtree_update_from_mvert()

void bvhtree_update_from_mvert ( BVHTree * bvhtree,
const float(*) positions[3],
const float(*) positions_moving[3],
const blender::int3 * vert_tris,
int tri_num,
bool moving )

◆ cloth_bvh_collision()

◆ cloth_bvh_collision_is_active()

static bool cloth_bvh_collision_is_active ( const ClothModifierData * ,
const Cloth * cloth,
const blender::int3 vert_tri_a )
static

◆ cloth_bvh_obj_overlap_cb()

static bool cloth_bvh_obj_overlap_cb ( void * userdata,
int index_a,
int ,
int  )
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  )
static

◆ cloth_bvh_selfcollision_is_active()

static bool cloth_bvh_selfcollision_is_active ( const ClothModifierData * clmd,
const Cloth * cloth,
const blender::int3 vert_tri_a,
const blender::int3 vert_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()

◆ cloth_collision_impulse_vert()

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

◆ cloth_collision_response_static()

◆ cloth_selfcollision()

◆ cloth_selfcollision_response_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()

◆ 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()

◆ 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()

◆ max_v3_v3v3()

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

Definition at line 1721 of file collision.cc.

References b, and max_ff().

◆ next_ind()

BLI_INLINE int next_ind ( int i)