35# include "eltopo-capi.h"
62 const bool moving_bvh)
97 for (
int i = 0;
i < tri_num;
i++) {
114 const float (*positions)[3],
115 const float (*positions_moving)[3],
121 if ((bvhtree ==
nullptr) || (positions ==
nullptr)) {
125 if (positions_moving ==
nullptr) {
129 for (
int i = 0;
i < tri_num;
i++) {
139 float co_moving[3][3];
141 copy_v3_v3(co_moving[0], positions_moving[vert_tris[
i][0]]);
142 copy_v3_v3(co_moving[1], positions_moving[vert_tris[
i][1]]);
143 copy_v3_v3(co_moving[2], positions_moving[vert_tris[
i][2]]);
166 return (++
i < 3) ?
i : 0;
184 float tmp_co1[3], tmp_co2[3];
185 float isect_a[3], isect_b[3];
186 float tmp, tmp_vec[3];
187 float normal[3], cent[3];
188 bool backside =
false;
199 int tri_a_edge_isect_count;
201 a,
b, isect_a, isect_b, &tri_a_edge_isect_count);
208 if (!is_intersecting) {
209 for (
int i = 0;
i < 3;
i++) {
211 if (
dot_v3v3(tmp_vec, normal) < 0.0f) {
217 else if (tri_a_edge_isect_count != 1) {
222 else if (use_normal) {
226 if (tri_a_edge_isect_count == 1) {
242 float maxdist = 0.0f;
246 for (
int i = 0;
i < 3;
i++) {
259 for (
int i = 0;
i < 3;
i++) {
273 for (
int i = 0;
i < 3;
i++) {
279 for (
int j = 0; j < 3; j++) {
288 if ((tmp > maxdist) && (
dot_v3v3(tmp_vec, normal) < 0.0f)) {
303 if (
dot_v3v3(normal, r_vec) >= 0.0f) {
316 for (
int i = 0;
i < 3;
i++) {
327 for (
int i = 0;
i < 3;
i++) {
339 if (!is_intersecting) {
340 for (
int i = 0;
i < 3;
i++) {
341 for (
int j = 0; j < 3; j++) {
354 if (!is_intersecting) {
363 if (culling && use_normal) {
366 else if (use_normal) {
367 if (
dot_v3v3(normal, r_vec) >= 0.0f) {
374 else if (culling && (
dot_v3v3(r_vec, normal) < 0.0f)) {
395 float tmp_co1[3], tmp_co2[3];
398 float tmp, tmp_vec[3];
399 float normal[3], cent[3];
400 bool backside =
false;
425 for (
int i = 0;
i < 2;
i++) {
427 if (
dot_v3v3(tmp_vec, normal) < 0.0f) {
446 float maxdist = 0.0f;
450 for (
int i = 0;
i < 2;
i++) {
462 for (
int i = 0;
i < 3;
i++) {
476 if ((tmp > maxdist) && (
dot_v3v3(tmp_vec, normal) < 0.0f)) {
490 if (
dot_v3v3(normal, r_vec) >= 0.0f) {
503 for (
int i = 0;
i < 2;
i++) {
516 for (
int j = 0; j < 3; j++) {
537 if (culling && use_normal) {
540 else if (use_normal) {
541 if (
dot_v3v3(normal, r_vec) >= 0.0f) {
548 else if (culling && (
dot_v3v3(r_vec, normal) < 0.0f)) {
565#define INPR(v1, v2) ((v1)[0] * (v2)[0] + (v1)[1] * (v2)[1] + (v1)[2] * (v2)[2])
567 double tempV1[3], tempV2[3], tempV4[3];
568 double a,
b, c, d,
e, f;
574 a =
INPR(tempV1, tempV1);
575 b =
INPR(tempV1, tempV2);
576 c =
INPR(tempV2, tempV2);
577 e =
INPR(tempV1, tempV4);
578 f =
INPR(tempV2, tempV4);
583 *w1 = *w2 = *w3 = 1.0 / 3.0;
587 w1[0] =
float((
e * c -
b * f) / d);
588 w1[0] = std::max<float>(w1[0], 0);
590 w2[0] =
float((f -
b *
double(w1[0])) / c);
591 w2[0] = std::max<float>(w2[0], 0);
593 w3[0] = 1.0f - w1[0] - w2[0];
599# pragma GCC diagnostic push
600# pragma GCC diagnostic ignored "-Wdouble-promotion"
618 const float impulse[3],
623 if ((clamp_sq > 0.0f) && (impulse_len_sq > clamp_sq)) {
646 uint collision_count,
654 const float min_distance = (clmd->
coll_parms->
epsilon + epsilon2) * (8.0f / 9.0f);
656 const bool is_hair = (clmd->
hairdata !=
nullptr);
657 for (
int i = 0;
i < collision_count;
i++, collpair++) {
658 float i1[3], i2[3], i3[3];
659 float v1[3],
v2[3], relativeVelocity[3];
670 float w1 = collpair->
aw1, w2 = collpair->
aw2, w3 = collpair->
aw3;
671 float u1 = collpair->
bw1, u2 = collpair->
bw2, u3 = collpair->
bw3;
698 const float magrelVel =
dot_v3v3(relativeVelocity, collpair->
normal);
699 const float d = min_distance - collpair->
distance;
702 if (magrelVel > 0.0f) {
704 float magtangent = 0, repulse = 0;
705 double impulse = 0.0;
723 impulse = magtangent / 1.5;
725 VECADDMUL(i1, vrel_t_pre,
double(w1) * impulse);
726 VECADDMUL(i2, vrel_t_pre,
double(w2) * impulse);
729 VECADDMUL(i3, vrel_t_pre,
double(w3) * impulse);
734 impulse = magrelVel / 1.5f;
742 if ((magrelVel < 0.1f * d * time_multiplier) && (d >
ALMOST_ZERO)) {
743 repulse = std::min(d / time_multiplier, 0.1f * d * time_multiplier - magrelVel);
747 repulse =
min_ff(repulse, 5.0f * impulse);
750 repulse =
max_ff(impulse, repulse);
752 impulse = repulse / 1.5f;
765 float repulse = d / time_multiplier;
766 float impulse = repulse / 4.5f;
792 uint collision_count,
801 for (
int i = 0;
i < collision_count;
i++, collpair++) {
802 float ia[3][3] = {{0.0f}};
803 float ib[3][3] = {{0.0f}};
804 float v1[3],
v2[3], relativeVelocity[3];
812 float w1 = collpair->
aw1, w2 = collpair->
aw2, w3 = collpair->
aw3;
813 float u1 = collpair->
bw1, u2 = collpair->
bw2, u3 = collpair->
bw3;
836 const float magrelVel =
dot_v3v3(relativeVelocity, collpair->
normal);
837 const float d = min_distance - collpair->
distance;
843 if (magrelVel > 0.0f) {
845 float magtangent = 0, repulse = 0;
846 double impulse = 0.0;
864 impulse = magtangent / 1.5;
866 VECADDMUL(ia[0], vrel_t_pre,
double(w1) * impulse);
867 VECADDMUL(ia[1], vrel_t_pre,
double(w2) * impulse);
868 VECADDMUL(ia[2], vrel_t_pre,
double(w3) * impulse);
870 VECADDMUL(ib[0], vrel_t_pre,
double(u1) * -impulse);
871 VECADDMUL(ib[1], vrel_t_pre,
double(u2) * -impulse);
872 VECADDMUL(ib[2], vrel_t_pre,
double(u3) * -impulse);
876 impulse = magrelVel / 3.0f;
886 if ((magrelVel < 0.1f * d * time_multiplier) && (d >
ALMOST_ZERO)) {
887 repulse = std::min(d / time_multiplier, 0.1f * d * time_multiplier - magrelVel);
890 repulse =
min_ff(repulse, 5.0 * impulse);
893 repulse =
max_ff(impulse, repulse);
894 impulse = repulse / 1.5f;
909 float repulse = d * 1.0f / time_multiplier;
910 float impulse = repulse / 9.0f;
938# pragma GCC diagnostic pop
948 const int flags_a =
verts[vert_tri_a[0]].flags &
verts[vert_tri_a[1]].flags &
949 verts[vert_tri_a[2]].flags;
971 float pa[3], pb[3], vect[3];
978 verts1[vert_tri_a[1]].tx,
979 verts1[vert_tri_a[2]].tx,
990 collpair[index].
ap1 = vert_tri_a[0];
991 collpair[index].
ap2 = vert_tri_a[1];
992 collpair[index].
ap3 = vert_tri_a[2];
994 collpair[index].
bp1 = vert_tri_b[0];
995 collpair[index].
bp2 = vert_tri_b[1];
996 collpair[index].
bp3 = vert_tri_b[2];
1005 collpair[index].
flag = 0;
1007 data->collided =
true;
1011 verts1[vert_tri_a[0]].tx,
1012 verts1[vert_tri_a[1]].tx,
1013 verts1[vert_tri_a[2]].tx,
1014 &collpair[index].aw1,
1015 &collpair[index].aw2,
1016 &collpair[index].aw3);
1022 &collpair[index].
bw1,
1023 &collpair[index].
bw2,
1024 &collpair[index].
bw3);
1039 const int flags_a =
verts[vert_tri_a[0]].flags &
verts[vert_tri_a[1]].flags &
1040 verts[vert_tri_a[2]].flags;
1041 const int flags_b =
verts[vert_tri_b[0]].flags &
verts[vert_tri_b[1]].flags &
1042 verts[vert_tri_b[2]].flags;
1056 for (
uint i = 0;
i < 3;
i++) {
1057 for (
uint j = 0; j < 3; j++) {
1058 if (vert_tri_a[
i] == vert_tri_b[j]) {
1062 if (sewing_active) {
1084 float pa[3], pb[3], vect[3];
1087 int indexA =
data->overlap[index].indexA, indexB =
data->overlap[index].indexB;
1089 if (indexA > indexB) {
1090 std::swap(indexA, indexB);
1100 verts1[vert_tri_a[1]].tx,
1101 verts1[vert_tri_a[2]].tx,
1102 verts1[vert_tri_b[0]].tx,
1103 verts1[vert_tri_b[1]].tx,
1104 verts1[vert_tri_b[2]].tx,
1112 collpair[index].
ap1 = vert_tri_a[0];
1113 collpair[index].
ap2 = vert_tri_a[1];
1114 collpair[index].
ap3 = vert_tri_a[2];
1116 collpair[index].
bp1 = vert_tri_b[0];
1117 collpair[index].
bp2 = vert_tri_b[1];
1118 collpair[index].
bp3 = vert_tri_b[2];
1127 collpair[index].
flag = 0;
1129 data->collided =
true;
1133 verts1[vert_tri_a[0]].tx,
1134 verts1[vert_tri_a[1]].tx,
1135 verts1[vert_tri_a[2]].tx,
1136 &collpair[index].aw1,
1137 &collpair[index].aw2,
1138 &collpair[index].aw3);
1141 verts1[vert_tri_b[0]].tx,
1142 verts1[vert_tri_b[1]].tx,
1143 verts1[vert_tri_b[2]].tx,
1144 &collpair[index].bw1,
1145 &collpair[index].bw2,
1146 &collpair[index].bw3);
1166 float pa[3], pb[3], vect[3];
1176 verts1[edge_coll[1]].tx,
1187 collpair[index].
ap1 = edge_coll[0];
1188 collpair[index].
ap2 = edge_coll[1];
1190 collpair[index].
bp1 = tri_coll[0];
1191 collpair[index].
bp2 = tri_coll[1];
1192 collpair[index].
bp3 = tri_coll[2];
1201 collpair[index].
flag = 0;
1203 data->collided =
true;
1207 pa, verts1[edge_coll[0]].tx, verts1[edge_coll[1]].tx);
1209 collpair[index].
aw1 = 1.0f - collpair[index].
aw2;
1215 &collpair[index].
bw1,
1216 &collpair[index].
bw2,
1217 &collpair[index].
bw3);
1264 for (; base; base = base->
next) {
1265 if (base->
flag & base_flag) {
1349 if (cache ==
nullptr) {
1370 *colliders =
nullptr;
1382 const bool is_hair = (clmd->
hairdata !=
nullptr);
1387 data.collmd = collmd;
1388 data.overlap = overlap;
1389 data.collisions = *collisions;
1390 data.culling = culling;
1391 data.use_normal = use_normal;
1392 data.collided =
false;
1400 return data.collided;
1410 data.overlap = overlap;
1411 data.collisions = collisions;
1412 data.collided =
false;
1419 return data.collided;
1425 uint *collision_counts,
1426 const uint numcollobj,
1430 int i = 0, j = 0, mvert_num = 0;
1440 for (j = 0; j < 2; j++) {
1443 for (
i = 0;
i < numcollobj;
i++) {
1450 clmd, collmd, collob, collisions[
i], collision_counts[
i], dt);
1456 for (
i = 0;
i < mvert_num;
i++) {
1458 if (
verts[
i].impulse_count) {
1462 verts[
i].impulse_count = 0;
1477 int collision_count,
1481 int i = 0, j = 0, mvert_num = 0;
1489 for (j = 0; j < 2; j++) {
1496 for (
i = 0;
i < mvert_num;
i++) {
1497 if (
verts[
i].impulse_count) {
1502 verts[
i].impulse_count = 0;
1529 if (index_a != index_b) {
1547 uint i = 0, mvert_num = 0;
1550 int ret = 0, ret2 = 0;
1551 Object **collobjs =
nullptr;
1552 uint numcollobj = 0;
1553 uint *coll_counts_obj =
nullptr;
1555 uint coll_count_self = 0;
1557 bool bvh_updated =
false;
1571 const bool is_hair = (clmd->
hairdata !=
nullptr);
1574 is_hair ?
nullptr : ob,
1583 for (
i = 0;
i < numcollobj;
i++) {
1597 &coll_counts_obj[
i],
1619 bool collided =
false;
1623 for (
i = 0;
i < numcollobj;
i++) {
1632 if (coll_counts_obj[
i] && overlap_obj[
i]) {
1647 clmd, collobjs, collisions, coll_counts_obj, numcollobj, dt);
1651 for (
i = 0;
i < numcollobj;
i++) {
1666 if (coll_count_self && overlap_self) {
1682 for (
i = 0;
i < mvert_num;
i++) {
1697 for (
i = 0;
i < numcollobj;
i++) {
1710 return std::min(
ret, 1);
@ CLOTH_VERT_FLAG_NOSELFCOLL
@ CLOTH_VERT_FLAG_NOOBJCOLL
void bvhtree_update_from_cloth(ClothModifierData *clmd, bool moving, bool self)
#define VECADDMUL(v1, v2, aS)
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_END
Base * BKE_collection_or_layer_objects(const Scene *scene, ViewLayer *view_layer, Collection *collection)
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object)
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
BVHTree * BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis)
void BLI_bvhtree_balance(BVHTree *tree)
void BLI_bvhtree_update_tree(BVHTree *tree)
void BLI_bvhtree_insert(BVHTree *tree, int index, const float co[3], int numpoints)
BVHTreeOverlap * BLI_bvhtree_overlap_self(const BVHTree *tree, unsigned int *r_overlap_num, BVHTree_OverlapCallback callback, void *userdata)
bool BLI_bvhtree_update_node(BVHTree *tree, int index, const float co[3], const float co_moving[3], int numpoints)
float BLI_bvhtree_get_epsilon(const BVHTree *tree)
BVHTreeOverlap * BLI_bvhtree_overlap(const BVHTree *tree1, const BVHTree *tree2, unsigned int *r_overlap_num, BVHTree_OverlapCallback callback, void *userdata)
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE float max_ff(float a, float b)
MINLINE float min_ff(float a, float b)
MINLINE float square_f(float a)
bool isect_ray_tri_v3(const float ray_origin[3], const float ray_direction[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2])
void isect_seg_seg_v3(const float a0[3], const float a1[3], const float b0[3], const float b1[3], float r_a[3], float r_b[3])
bool point_in_slice_seg(float p[3], float l1[3], float l2[3])
void closest_on_tri_to_point_v3(float r[3], const float p[3], const float v1[3], const float v2[3], const float v3[3])
bool isect_tri_tri_v3_ex(const float tri_a[3][3], const float tri_b[3][3], float r_i1[3], float r_i2[3], int *r_tri_a_edge_isect_count)
float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3])
float closest_to_line_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3])
bool isect_line_plane_v3(float r_isect_co[3], const float l1[3], const float l2[3], const float plane_co[3], const float plane_no[3]) ATTR_WARN_UNUSED_RESULT
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
bool isect_line_segment_tri_v3(const float p1[3], const float p2[3], const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2])
MINLINE void sub_v3db_v3fl_v3fl(double r[3], const float a[3], const float b[3])
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void negate_v3(float r[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
ATTR_WARN_UNUSED_RESULT const size_t num
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
ListBase * DEG_get_collision_relations(const Depsgraph *depsgraph, Collection *collection, unsigned int modifier_type)
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
ViewLayer * DEG_get_input_view_layer(const Depsgraph *graph)
Scene * DEG_get_input_scene(const Depsgraph *graph)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ CLOTH_COLLSETTINGS_FLAG_ENABLED
@ CLOTH_COLLSETTINGS_FLAG_SELF
@ CLOTH_SIMSETTINGS_FLAG_SEW
@ CLOTH_SIMSETTINGS_FLAG_COLLOBJ
@ eModifierType_Collision
@ PFIELD_CLOTH_USE_NORMAL
@ PFIELD_CLOTH_USE_CULLING
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
BPy_StructRNA * depsgraph
bool contains(const Key &key) const
void BKE_collider_cache_free(ListBase **colliders)
Object ** BKE_collision_objects_create(Depsgraph *depsgraph, Object *self, Collection *collection, uint *numcollobj, uint modifier_type)
static void add_collision_object(ListBase *relations, Object *ob, int level, const ModifierType modifier_type)
static int cloth_collision_response_static(ClothModifierData *clmd, CollisionModifierData *collmd, Object *collob, CollPair *collpair, uint collision_count, const float dt)
static void cloth_collision(void *__restrict userdata, const int index, const TaskParallelTLS *__restrict)
static bool cloth_bvh_selfcollisions_nearcheck(ClothModifierData *clmd, CollPair *collisions, int numresult, BVHTreeOverlap *overlap)
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])
BLI_INLINE void max_v3_v3v3(float r[3], const float a[3], const float b[3])
static int cloth_bvh_objcollisions_resolve(ClothModifierData *clmd, Object **collobjs, CollPair **collisions, uint *collision_counts, const uint numcollobj, const float dt)
static bool cloth_bvh_collision_is_active(const ClothModifierData *, const Cloth *cloth, const blender::int3 vert_tri_a)
static int cloth_bvh_selfcollisions_resolve(ClothModifierData *clmd, CollPair *collisions, int collision_count, const float dt)
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)
BVHTree * bvhtree_build_from_mvert(const float(*positions)[3], const blender::int3 *vert_tris, int tri_num, float epsilon)
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)
void BKE_collision_relations_free(ListBase *relations)
ListBase * BKE_collision_relations_create(Depsgraph *depsgraph, Collection *collection, uint modifier_type)
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 bool cloth_bvh_objcollisions_nearcheck(ClothModifierData *clmd, CollisionModifierData *collmd, CollPair **collisions, int numresult, BVHTreeOverlap *overlap, bool culling, bool use_normal)
void collision_get_collider_velocity(float vel_old[3], float vel_new[3], CollisionModifierData *collmd, CollPair *collpair)
void BKE_collision_objects_free(Object **objects)
BLI_INLINE int next_ind(int i)
static bool cloth_bvh_obj_overlap_cb(void *userdata, int index_a, int, int)
int cloth_bvh_collision(Depsgraph *depsgraph, Object *ob, ClothModifierData *clmd, float step, float dt)
ListBase * BKE_collider_cache_create(Depsgraph *depsgraph, Object *self, Collection *collection)
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])
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)
void collision_move_object(CollisionModifierData *collmd, const float step, const float prevstep, const bool moving_bvh)
static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair *collpair, uint collision_count, const float dt)
static bool cloth_bvh_self_overlap_cb(void *userdata, int index_a, int index_b, int)
static void cloth_collision_impulse_vert(const float clamp_sq, const float impulse[3], ClothVertex *vert)
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)
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
float distance(VecOp< float, D >, VecOp< float, D >) RET
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 fabs(const float2 a)
VecBase< int32_t, 2 > int2
VecBase< int32_t, 3 > int3
struct Collection * group
struct ClothHairData * hairdata
struct Cloth * clothObject
struct ClothSimSettings * sim_parms
struct ClothCollSettings * coll_parms
unsigned int impulse_count
const blender::int2 * edges
blender::int3 * vert_tris
blender::Set< blender::OrderedEdge > sew_edge_graph
CollisionModifierData * collmd
struct Collection * instance_collection