|
Blender V4.3
|
#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) |
| BVHTree * | bvhtree_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) |
| ListBase * | BKE_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) |
| 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, 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) |
Referenced by collision_compute_barycentric().
|
static |
Definition at line 1231 of file collision.cc.
References add_collision_object(), BKE_modifiers_findby_type(), BLI_addtail(), FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN, FOREACH_COLLECTION_OBJECT_RECURSIVE_END, Object::instance_collection, and CollisionRelation::ob.
Referenced by add_collision_object(), and 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 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().
| 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().
| 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 1288 of file collision.cc.
References BLI_listbase_count(), PartDeflect::deflect, DEG_get_collision_relations(), DEG_get_evaluated_id(), depsgraph, eModifierType_Collision, LISTBASE_FOREACH, MEM_freeN(), Object::pd, and self.
Referenced by ccd_build_deflector_hash(), ccd_update_deflector_hash(), cloth_bvh_collision(), dynamicPaint_doStep(), query_external_colliders(), and surface_getBrushFlags().
| void BKE_collision_objects_free | ( | Object ** | objects | ) |
Definition at line 1328 of file collision.cc.
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 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().
| 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 * 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().
| 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 ) |
Definition at line 114 of file collision.cc.
References BLI_bvhtree_update_node(), BLI_bvhtree_update_tree(), copy_v3_v3(), and ret.
Referenced by collision_move_object(), and deform_verts().
| int cloth_bvh_collision | ( | Depsgraph * | depsgraph, |
| Object * | ob, | ||
| ClothModifierData * | clmd, | ||
| float | step, | ||
| float | dt ) |
Definition at line 1549 of file collision.cc.
References add_v3_v3v3(), BKE_collision_objects_create(), BKE_collision_objects_free(), BKE_modifiers_findby_type(), BLI_bvhtree_overlap(), BLI_bvhtree_overlap_self(), 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, ClothCollSettings::flags, ClothSimSettings::flags, ClothCollSettings::group, ClothModifierData::hairdata, ClothCollSettings::loop_count, MEM_freeN(), MEM_mallocN, MEM_SAFE_FREE, Object::pd, PFIELD_CLOTH_USE_CULLING, PFIELD_CLOTH_USE_NORMAL, ret, ClothModifierData::sim_parms, verts, and ClothSimSettings::vgroup_mass.
Referenced by cloth_solve_collisions().
|
static |
Definition at line 948 of file collision.cc.
References CLOTH_VERT_FLAG_NOOBJCOLL, CLOTH_VERT_FLAG_PINNED, ClothVertex::flags, and verts.
Referenced by cloth_bvh_obj_overlap_cb().
Definition at line 1523 of file collision.cc.
References cloth_bvh_collision_is_active(), ClothModifierData::clothObject, and Cloth::vert_tris.
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1381 of file collision.cc.
References BLI_parallel_range_settings_defaults(), BLI_task_parallel_range(), ColDetectData::clmd, cloth_collision(), hair_collision(), ClothModifierData::hairdata, and MEM_mallocN.
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1429 of file collision.cc.
References add_v3_v3(), BKE_modifiers_findby_type(), CollisionModifierData::bvhtree, cloth_collision_response_static(), ClothModifierData::clothObject, eModifierType_Collision, Cloth::mvert_num, ret, verts, and zero_v3().
Referenced by cloth_bvh_collision().
Definition at line 1532 of file collision.cc.
References cloth_bvh_selfcollision_is_active(), ClothModifierData::clothObject, and Cloth::vert_tris.
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1038 of file collision.cc.
References CLOTH_SIMSETTINGS_FLAG_SEW, CLOTH_VERT_FLAG_NOSELFCOLL, CLOTH_VERT_FLAG_PINNED, ClothSimSettings::flags, ClothVertex::flags, ClothModifierData::sim_parms, and verts.
Referenced by cloth_bvh_self_overlap_cb(), and cloth_selfcollision().
|
static |
Definition at line 1410 of file collision.cc.
References BLI_parallel_range_settings_defaults(), BLI_task_parallel_range(), SelfColDetectData::clmd, and cloth_selfcollision().
Referenced by cloth_bvh_collision().
|
static |
Definition at line 1482 of file collision.cc.
References add_v3_v3(), cloth_selfcollision_response_static(), ClothModifierData::clothObject, Cloth::mvert_num, ret, verts, and zero_v3().
Referenced by cloth_bvh_collision().
|
static |
Definition at line 965 of file collision.cc.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, CollPair::ap3, BLI_bvhtree_get_epsilon(), CollPair::bp1, CollPair::bp2, CollPair::bp3, CollisionModifierData::bvhtree, CollPair::bw1, CollPair::bw2, CollPair::bw3, ClothModifierData::clothObject, ClothModifierData::coll_parms, collision_compute_barycentric(), COLLISION_INACTIVE, compute_collision_point_tri_tri(), copy_v3_v3(), CollisionModifierData::current_xnew, CollPair::distance, distance(), ClothCollSettings::epsilon, CollPair::flag, len_squared_v3(), normalize_v3_v3(), Cloth::vert_tris, CollisionModifierData::vert_tris, and Cloth::verts.
Referenced by cloth_bvh_objcollisions_nearcheck().
|
static |
Definition at line 624 of file collision.cc.
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 649 of file collision.cc.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, CollPair::ap3, CollPair::aw1, CollPair::aw2, CollPair::aw3, BLI_bvhtree_get_epsilon(), CollPair::bp1, CollPair::bp2, CollPair::bp3, CollisionModifierData::bvhtree, CollPair::bw1, CollPair::bw2, CollPair::bw3, ClothCollSettings::clamp, cloth_collision_impulse_vert(), ClothModifierData::clothObject, ClothModifierData::coll_parms, COLLISION_IN_FUTURE, COLLISION_INACTIVE, collision_interpolateOnTriangle(), copy_v3_v3(), CollisionModifierData::current_v, CollPair::distance, dot_v3v3(), ClothSimSettings::dt, ClothCollSettings::epsilon, CollPair::flag, ClothModifierData::hairdata, interp_v3_v3v3(), len_v3(), max_ff(), min_ff(), mul_v3_fl(), CollPair::normal, normalize_v3(), Object::pd, PartDeflect::pdef_cfrict, result, ClothModifierData::sim_parms, square_f(), sub_v3_v3v3(), ClothSimSettings::timescale, v2, VECADDMUL, and zero_v3().
Referenced by cloth_bvh_objcollisions_resolve().
|
static |
Definition at line 1080 of file collision.cc.
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_compute_barycentric(), COLLISION_INACTIVE, compute_collision_point_tri_tri(), copy_v3_v3(), CollPair::distance, distance(), CollPair::flag, len_squared_v3(), normalize_v3_v3(), ClothCollSettings::selfepsilon, Cloth::vert_tris, and Cloth::verts.
Referenced by cloth_bvh_selfcollisions_nearcheck().
|
static |
Definition at line 797 of file collision.cc.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, CollPair::ap3, CollPair::aw1, CollPair::aw2, CollPair::aw3, CollPair::bp1, CollPair::bp2, CollPair::bp3, CollPair::bw1, CollPair::bw2, CollPair::bw3, cloth_collision_impulse_vert(), ClothModifierData::clothObject, ClothModifierData::coll_parms, COLLISION_IN_FUTURE, COLLISION_INACTIVE, collision_interpolateOnTriangle(), copy_v3_v3(), CollPair::distance, dot_v3v3(), ClothSimSettings::dt, CollPair::flag, len_v3(), max_ff(), min_ff(), mul_v3_fl(), CollPair::normal, normalize_v3(), result, ClothCollSettings::self_clamp, ClothCollSettings::self_friction, ClothCollSettings::selfepsilon, ClothModifierData::sim_parms, square_f(), sub_v3_v3v3(), ClothSimSettings::timescale, v2, and VECADDMUL.
Referenced by cloth_bvh_selfcollisions_resolve().
|
static |
Definition at line 557 of file collision.cc.
References ALMOST_ZERO, b, double(), e, fabs(), float, INPR, and sub_v3db_v3fl_v3fl().
Referenced by cloth_collision(), cloth_selfcollision(), collision_get_collider_velocity(), and hair_collision().
| void collision_get_collider_velocity | ( | float | vel_old[3], |
| float | vel_new[3], | ||
| CollisionModifierData * | collmd, | ||
| CollPair * | collpair ) |
Definition at line 1728 of file collision.cc.
References CollPair::bp1, CollPair::bp2, CollPair::bp3, collision_compute_barycentric(), collision_interpolateOnTriangle(), copy_v3_v3(), CollisionModifierData::current_v, CollisionModifierData::current_x, and CollPair::pb.
| 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 610 of file collision.cc.
References 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 60 of file collision.cc.
References CollisionModifierData::bvhtree, bvhtree_update_from_mvert(), CollisionModifierData::current_v, CollisionModifierData::current_x, CollisionModifierData::current_xnew, interp_v3_v3v3(), CollisionModifierData::is_static, CollisionModifierData::mvert_num, sub_v3_v3v3(), CollisionModifierData::tri_num, CollisionModifierData::vert_tris, CollisionModifierData::x, CollisionModifierData::xnew, and zero_v3().
Referenced by BKE_collider_cache_create(), blender::ed::sculpt_paint::cloth::cloth_brush_collider_cache_create(), and cloth_bvh_collision().
|
static |
Definition at line 382 of file collision.cc.
References b, closest_on_tri_to_point_v3(), closest_to_line_v3(), copy_v3_v3(), cross_v3_v3v3(), dot_v3v3(), FLT_MAX, 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_tri_v3(), point_in_slice_seg(), sqrtf, and sub_v3_v3v3().
Referenced by hair_collision().
|
static |
Definition at line 170 of file collision.cc.
References b, closest_on_tri_to_point_v3(), closest_to_line_v3(), copy_v3_v3(), cross_v3_v3v3(), dot_v3v3(), FLT_MAX, 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_tri_v3(), point_in_slice_seg(), sqrtf, and sub_v3_v3v3().
Referenced by cloth_collision(), and cloth_selfcollision().
|
static |
Definition at line 1160 of file collision.cc.
References ALMOST_ZERO, CollPair::ap1, CollPair::ap2, CollPair::aw1, CollPair::aw2, BLI_bvhtree_get_epsilon(), CollPair::bp1, CollPair::bp2, CollPair::bp3, CollisionModifierData::bvhtree, CollPair::bw1, CollPair::bw2, CollPair::bw3, ClothModifierData::clothObject, ClothModifierData::coll_parms, collision_compute_barycentric(), COLLISION_INACTIVE, compute_collision_point_edge_tri(), copy_v3_v3(), CollisionModifierData::current_x, CollisionModifierData::current_xnew, CollPair::distance, distance(), Cloth::edges, ClothCollSettings::epsilon, CollPair::flag, len_squared_v3(), line_point_factor_v3(), normalize_v3_v3(), CollisionModifierData::vert_tris, 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 1721 of file collision.cc.
| BLI_INLINE int next_ind | ( | int | i | ) |
Definition at line 165 of file collision.cc.
Referenced by compute_collision_point_edge_tri(), and compute_collision_point_tri_tri().