Blender
V3.3
|
#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) |
BVHTree * | bvhtree_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) |
ListBase * | BKE_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) |
ListBase * | BKE_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) |
typedef struct ColDetectData ColDetectData |
typedef struct SelfColDetectData SelfColDetectData |
|
static |
Definition at line 1219 of file collision.c.
References BKE_modifiers_findby_type(), BLI_addtail(), FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN, FOREACH_COLLECTION_OBJECT_RECURSIVE_END, Object::instance_collection, MEM_callocN, and CollisionRelation::ob.
Referenced by BKE_collision_relations_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().
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().
Object** BKE_collision_objects_create | ( | struct Depsgraph * | depsgraph, |
struct Object * | self, | ||
struct Collection * | collection, | ||
unsigned int * | numcollobj, | ||
unsigned int | modifier_type | ||
) |
Create effective list of colliders from relations built beforehand. Self will be excluded.
Definition at line 1275 of file collision.c.
References BLI_listbase_count(), PartDeflect::deflect, DEG_get_collision_relations(), DEG_get_evaluated_id(), depsgraph, eModifierType_Collision, LISTBASE_FOREACH, MEM_callocN, MEM_freeN, NULL, and Object::pd.
Referenced by ccd_build_deflector_hash(), ccd_update_deflector_hash(), cloth_bvh_collision(), dynamicPaint_doStep(), query_external_colliders(), and surface_getBrushFlags().
Definition at line 1315 of file collision.c.
References MEM_freeN.
Referenced by ccd_build_deflector_hash(), ccd_update_deflector_hash(), cloth_bvh_collision(), dynamicPaint_doStep(), query_external_colliders(), and surface_getBrushFlags().
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().
Definition at line 1267 of file collision.c.
References BLI_freelistN(), and MEM_freeN.
Referenced by blender::deg::clear_physics_relations().
BVHTree* bvhtree_build_from_mvert | ( | const MVert * | mvert, |
const struct MVertTri * | tri, | ||
int | tri_num, | ||
float | epsilon | ||
) |
Definition at line 95 of file collision.c.
References BLI_bvhtree_balance(), BLI_bvhtree_insert(), BLI_bvhtree_new(), MVert::co, copy_v3_v3(), blender::robust_pred::epsilon, tree, and MVertTri::tri.
void bvhtree_update_from_mvert | ( | BVHTree * | bvhtree, |
const MVert * | mvert, | ||
const MVert * | mvert_moving, | ||
const MVertTri * | tri, | ||
int | tri_num, | ||
bool | moving | ||
) |
Definition at line 121 of file collision.c.
References BLI_bvhtree_update_node(), BLI_bvhtree_update_tree(), MVert::co, copy_v3_v3(), NULL, ret, and MVertTri::tri.
Referenced by collision_move_object().
int cloth_bvh_collision | ( | Depsgraph * | depsgraph, |
Object * | ob, | ||
ClothModifierData * | clmd, | ||
float | step, | ||
float | dt | ||
) |
Definition at line 1541 of file collision.c.
References add_v3_v3v3(), BKE_collision_objects_create(), BKE_collision_objects_free(), BKE_modifiers_findby_type(), BLI_bvhtree_overlap(), Cloth::bvhselftree, Cloth::bvhtree, CollisionModifierData::bvhtree, bvhtree_update_from_cloth(), cloth_bvh_obj_overlap_cb(), cloth_bvh_objcollisions_nearcheck(), cloth_bvh_objcollisions_resolve(), cloth_bvh_self_overlap_cb(), cloth_bvh_selfcollisions_nearcheck(), cloth_bvh_selfcollisions_resolve(), CLOTH_COLLSETTINGS_FLAG_ENABLED, CLOTH_COLLSETTINGS_FLAG_SELF, CLOTH_SIMSETTINGS_FLAG_COLLOBJ, CLOTH_VERT_FLAG_PINNED, ClothModifierData::clothObject, ClothModifierData::coll_parms, collision_move_object(), depsgraph, eModifierType_Collision, PartDeflect::flag, ClothSimSettings::flags, ClothCollSettings::flags, ClothCollSettings::group, ClothModifierData::hairdata, ClothCollSettings::loop_count, MEM_callocN, MEM_freeN, MEM_mallocN, MEM_SAFE_FREE, MIN2, Cloth::mvert_num, NULL, Object::pd, PFIELD_CLOTH_USE_CULLING, PFIELD_CLOTH_USE_NORMAL, ret, ClothModifierData::sim_parms, Cloth::verts, verts, and ClothSimSettings::vgroup_mass.
Referenced by cloth_solve_collisions().
|
static |
Definition at line 988 of file collision.c.
References CLOTH_VERT_FLAG_NOOBJCOLL, CLOTH_VERT_FLAG_PINNED, MVertTri::tri, Cloth::verts, and verts.
Referenced by cloth_bvh_obj_overlap_cb().
|
static |
Definition at line 1512 of file collision.c.
References cloth_bvh_collision_is_active(), ClothModifierData::clothObject, and Cloth::tri.
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1368 of file collision.c.
References BLI_parallel_range_settings_defaults(), BLI_task_parallel_range(), cloth_collision(), data, hair_collision(), ClothModifierData::hairdata, MEM_mallocN, NULL, and TaskParallelSettings::use_threading.
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1418 of file collision.c.
References add_v3_v3(), BKE_modifiers_findby_type(), CollisionModifierData::bvhtree, cloth_collision_response_static(), ClothModifierData::clothObject, eModifierType_Collision, Cloth::mvert_num, NULL, result, ret, Cloth::verts, verts, and zero_v3().
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1524 of file collision.c.
References cloth_bvh_selfcollision_is_active(), ClothModifierData::clothObject, and Cloth::tri.
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1062 of file collision.c.
References BLI_edgeset_haskey(), CLOTH_SIMSETTINGS_FLAG_SEW, CLOTH_VERT_FLAG_NOSELFCOLL, CLOTH_VERT_FLAG_PINNED, ClothSimSettings::flags, Cloth::sew_edge_graph, ClothModifierData::sim_parms, MVertTri::tri, Cloth::verts, and verts.
Referenced by cloth_bvh_self_overlap_cb(), and cloth_selfcollision().
|
static |
Definition at line 1398 of file collision.c.
References BLI_parallel_range_settings_defaults(), BLI_task_parallel_range(), cloth_selfcollision(), data, and TaskParallelSettings::use_threading.
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1471 of file collision.c.
References add_v3_v3(), cloth_selfcollision_response_static(), ClothModifierData::clothObject, Cloth::mvert_num, NULL, result, ret, Cloth::verts, verts, and zero_v3().
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1005 of file collision.c.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, CollPair::ap3, BLI_bvhtree_get_epsilon(), CollPair::bp1, CollPair::bp2, CollPair::bp3, CollisionModifierData::bvhtree, ClothModifierData::clothObject, MVert::co, ClothModifierData::coll_parms, COLLISION_INACTIVE, compute_collision_point_tri_tri(), copy_v3_v3(), CollisionModifierData::current_xnew, data, CollPair::distance, blender::math::distance(), ClothCollSettings::epsilon, KDL::epsilon2, CollPair::flag, len_squared_v3(), normal, normalize_v3_v3(), Cloth::tri, MVertTri::tri, CollisionModifierData::tri, ClothVertex::tx, and Cloth::verts.
Referenced by cloth_bvh_objcollisions_nearcheck().
|
static |
Definition at line 631 of file collision.c.
References fabsf, ClothVertex::impulse, ClothVertex::impulse_count, and len_squared_v3().
Referenced by cloth_collision_response_static(), and cloth_selfcollision_response_static().
|
static |
Definition at line 656 of file collision.c.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, CollPair::ap3, BLI_bvhtree_get_epsilon(), CollPair::bp1, CollPair::bp2, CollPair::bp3, CollisionModifierData::bvhtree, ClothCollSettings::clamp, cloth_collision_impulse_vert(), ClothModifierData::clothObject, MVert::co, ClothModifierData::coll_parms, collision_compute_barycentric(), COLLISION_IN_FUTURE, COLLISION_INACTIVE, collision_interpolateOnTriangle(), copy_v3_v3(), CollisionModifierData::current_v, CollisionModifierData::current_xnew, CollPair::distance, dot_v3v3(), ClothSimSettings::dt, ClothCollSettings::epsilon, KDL::epsilon2, CollPair::flag, ClothModifierData::hairdata, i1, interp_v3_v3v3(), len_v3(), line_point_factor_v3(), max_ff(), MIN2, min_ff(), mul_v3_fl(), CollPair::normal, normalize_v3(), NULL, CollPair::pa, CollPair::pb, Object::pd, PartDeflect::pdef_cfrict, result, ClothModifierData::sim_parms, square_f(), sub_v3_v3v3(), ClothSimSettings::timescale, ClothVertex::tv, ClothVertex::tx, u1, u2, v1, v2, VECADDMUL, Cloth::verts, and zero_v3().
Referenced by cloth_bvh_objcollisions_resolve().
|
static |
Definition at line 1104 of file collision.c.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, CollPair::ap3, BLI_assert, CollPair::bp1, CollPair::bp2, CollPair::bp3, cloth_bvh_selfcollision_is_active(), ClothModifierData::clothObject, ClothModifierData::coll_parms, COLLISION_INACTIVE, compute_collision_point_tri_tri(), copy_v3_v3(), data, CollPair::distance, blender::math::distance(), blender::robust_pred::epsilon, CollPair::flag, len_squared_v3(), normal, normalize_v3_v3(), ClothCollSettings::selfepsilon, Cloth::tri, MVertTri::tri, ClothVertex::tx, and Cloth::verts.
Referenced by cloth_bvh_selfcollisions_nearcheck().
|
static |
Definition at line 823 of file collision.c.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, CollPair::ap3, CollPair::bp1, CollPair::bp2, CollPair::bp3, cloth_collision_impulse_vert(), ClothModifierData::clothObject, ClothModifierData::coll_parms, collision_compute_barycentric(), COLLISION_IN_FUTURE, COLLISION_INACTIVE, collision_interpolateOnTriangle(), copy_v3_v3(), CollPair::distance, dot_v3v3(), ClothSimSettings::dt, CollPair::flag, len_v3(), max_ff(), MIN2, min_ff(), mul_v3_fl(), CollPair::normal, normalize_v3(), CollPair::pa, CollPair::pb, result, ClothCollSettings::self_clamp, ClothCollSettings::self_friction, ClothCollSettings::selfepsilon, ClothModifierData::sim_parms, square_f(), sub_v3_v3v3(), ClothSimSettings::timescale, ClothVertex::tv, ClothVertex::tx, u1, u2, v1, v2, VECADDMUL, and Cloth::verts.
Referenced by cloth_bvh_selfcollisions_resolve().
|
static |
Definition at line 564 of file collision.c.
References Freestyle::a, ALMOST_ZERO, usdtokens::b(), Freestyle::c, double(), e, fabs(), float(), INPR, and sub_v3db_v3fl_v3fl().
Referenced by cloth_collision_response_static(), cloth_selfcollision_response_static(), and collision_get_collider_velocity().
void collision_get_collider_velocity | ( | float | vel_old[3], |
float | vel_new[3], | ||
CollisionModifierData * | collmd, | ||
CollPair * | collpair | ||
) |
Definition at line 1716 of file collision.c.
References CollPair::bp1, CollPair::bp2, CollPair::bp3, MVert::co, collision_compute_barycentric(), collision_interpolateOnTriangle(), copy_v3_v3(), CollisionModifierData::current_v, CollisionModifierData::current_x, CollPair::pb, u1, and u2.
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 | ||
) |
Definition at line 617 of file collision.c.
References v1, v2, VECADDMUL, and zero_v3().
Referenced by cloth_collision_response_static(), cloth_selfcollision_response_static(), and collision_get_collider_velocity().
void collision_move_object | ( | struct CollisionModifierData * | collmd, |
float | step, | ||
float | prevstep, | ||
bool | moving_bvh | ||
) |
Move Collision modifier object inter-frame with step = [0,1]
step | is limited from 0 (frame start position) to 1 (frame end position). |
Definition at line 65 of file collision.c.
References CollisionModifierData::bvhtree, bvhtree_update_from_mvert(), MVert::co, CollisionModifierData::current_v, CollisionModifierData::current_x, CollisionModifierData::current_xnew, interp_v3_v3v3(), CollisionModifierData::is_static, CollisionModifierData::mvert_num, sub_v3_v3v3(), CollisionModifierData::tri, CollisionModifierData::tri_num, CollisionModifierData::x, CollisionModifierData::xnew, and zero_v3().
Referenced by BKE_collider_cache_create(), cloth_brush_collider_cache_create(), and cloth_bvh_collision().
|
static |
Definition at line 390 of file collision.c.
References Freestyle::a, usdtokens::b(), closest_on_tri_to_point_v3(), closest_to_line_v3(), copy_v3_v3(), cross_v3_v3v3(), dot_v3v3(), interp_v3_v3v3(), isect_line_plane_v3(), isect_line_segment_tri_v3(), isect_ray_tri_v3(), isect_seg_seg_v3(), len_squared_v3v3(), len_v3(), madd_v3_v3v3fl(), mid_v3_v3v3v3(), negate_v3_v3(), next_ind(), normal, normal_tri_v3(), NULL, point_in_slice_seg(), sqrtf, and sub_v3_v3v3().
Referenced by hair_collision().
|
static |
Definition at line 179 of file collision.c.
References Freestyle::a, usdtokens::b(), closest_on_tri_to_point_v3(), closest_to_line_v3(), copy_v3_v3(), cross_v3_v3v3(), dot_v3v3(), isect_line_plane_v3(), isect_ray_tri_v3(), isect_seg_seg_v3(), isect_tri_tri_v3_ex(), len_squared_v3v3(), len_v3(), madd_v3_v3v3fl(), mid_v3_v3v3v3(), negate_v3(), negate_v3_v3(), next_ind(), normal, normal_tri_v3(), NULL, point_in_slice_seg(), sqrtf, and sub_v3_v3v3().
Referenced by cloth_collision(), and cloth_selfcollision().
|
static |
Definition at line 1161 of file collision.c.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, BLI_bvhtree_get_epsilon(), CollPair::bp1, CollPair::bp2, CollPair::bp3, CollisionModifierData::bvhtree, ClothModifierData::clothObject, MVert::co, ClothModifierData::coll_parms, COLLISION_INACTIVE, compute_collision_point_edge_tri(), copy_v3_v3(), CollisionModifierData::current_x, data, CollPair::distance, blender::math::distance(), Cloth::edges, ClothCollSettings::epsilon, KDL::epsilon2, CollPair::flag, len_squared_v3(), normal, normalize_v3_v3(), MVertTri::tri, CollisionModifierData::tri, ClothVertex::tx, MEdge::v1, MEdge::v2, and Cloth::verts.
Referenced by cloth_bvh_objcollisions_nearcheck().
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.
BLI_INLINE int next_ind | ( | int | i | ) |
Definition at line 174 of file collision.c.
Referenced by compute_collision_point_edge_tri(), and compute_collision_point_tri_tri().