Blender V5.0
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_listbase.h"
#include "BLI_math_geom.h"
#include "BLI_math_vector.h"
#include "BLI_task.h"
#include "BKE_cloth.hh"
#include "BKE_collection.hh"
#include "BKE_modifier.hh"
#include "BKE_collision.h"
#include "BLI_kdopbvh.hh"
#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)

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 )
Value:
((v1)[0] * (v2)[0] + (v1)[1] * (v2)[1] + (v1)[2] * (v2)[2])
ATTR_WARN_UNUSED_RESULT const BMVert * v2

Referenced by collision_compute_barycentric().

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

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

Referenced by dynamics_step(), and eff_calc_visibility().

◆ BKE_collider_cache_free()

void BKE_collider_cache_free ( ListBase ** colliders)

Definition at line 1365 of file collision.cc.

References BLI_freelistN(), and MEM_freeN().

Referenced by 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 1252 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, 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 1273 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 89 of file collision.cc.

References BLI_bvhtree_balance(), BLI_bvhtree_insert(), BLI_bvhtree_new(), copy_v3_v3(), i, 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()

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

Definition at line 941 of file collision.cc.

References CLOTH_VERT_FLAG_NOOBJCOLL, CLOTH_VERT_FLAG_PINNED, Cloth::verts, and verts.

Referenced by cloth_bvh_obj_overlap_cb().

◆ cloth_bvh_obj_overlap_cb()

bool cloth_bvh_obj_overlap_cb ( void * userdata,
int index_a,
int ,
int  )
static

◆ cloth_bvh_objcollisions_nearcheck()

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

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

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

◆ cloth_bvh_selfcollision_is_active()

◆ cloth_bvh_selfcollisions_nearcheck()

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

◆ cloth_bvh_selfcollisions_resolve()

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

◆ cloth_collision()

◆ cloth_collision_impulse_vert()

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

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

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

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

References b, BLI_INLINE, and max_ff().

◆ next_ind()

BLI_INLINE int next_ind ( int i)

Definition at line 164 of file collision.cc.

References BLI_INLINE, and i.

Referenced by compute_collision_point_edge_tri(), and compute_collision_point_tri_tri().