diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2021-01-08 13:02:40 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2021-01-11 19:34:33 +0300 |
commit | e44e0e4e78bed21846c4c2455f81d678f61d212e (patch) | |
tree | 8d175701f8fbac1dc8f3aac62cbdaafa35a50b62 /source/blender/blenkernel | |
parent | ac290bfbe434df43fea19f7130313a1769aefdad (diff) |
Cloth: add a vertex group setting to exclude from object collision.
This can be useful as a workaround on the boundary with the pinned
vertices in some situations among other things, and completely copies
the existing design of the self collision vertex group setting.
Differential Revision: https://developer.blender.org/D10043
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_cloth.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cloth.c | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/collision.c | 2 |
3 files changed, 12 insertions, 3 deletions
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index 20e2122a195..e9267955d70 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -50,6 +50,7 @@ struct Scene; typedef enum eClothVertexFlag { CLOTH_VERT_FLAG_PINNED = (1 << 0), CLOTH_VERT_FLAG_NOSELFCOLL = (1 << 1), /* vertex NOT used for self collisions */ + CLOTH_VERT_FLAG_NOOBJCOLL = (1 << 2), /* vertex NOT used for object collisions */ } eClothVertexFlag; typedef struct ClothHairData { diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c index e9df562a15f..c2d6d5c7594 100644 --- a/source/blender/blenkernel/intern/cloth.c +++ b/source/blender/blenkernel/intern/cloth.c @@ -611,6 +611,8 @@ int cloth_uses_vgroup(ClothModifierData *clmd) { return (((clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF) && (clmd->coll_parms->vgroup_selfcol > 0)) || + ((clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) && + (clmd->coll_parms->vgroup_objcol > 0)) || (clmd->sim_parms->vgroup_pressure > 0) || (clmd->sim_parms->vgroup_struct > 0) || (clmd->sim_parms->vgroup_bend > 0) || (clmd->sim_parms->vgroup_shrink > 0) || (clmd->sim_parms->vgroup_intern > 0) || (clmd->sim_parms->vgroup_mass > 0)); @@ -644,8 +646,8 @@ static void cloth_apply_vgroup(ClothModifierData *clmd, Mesh *mesh) verts->shrink_factor = 0.0f; /* Reset vertex flags */ - verts->flags &= ~CLOTH_VERT_FLAG_PINNED; - verts->flags &= ~CLOTH_VERT_FLAG_NOSELFCOLL; + verts->flags &= ~(CLOTH_VERT_FLAG_PINNED | CLOTH_VERT_FLAG_NOSELFCOLL | + CLOTH_VERT_FLAG_NOOBJCOLL); MDeformVert *dvert = CustomData_get(&mesh->vdata, i, CD_MDEFORMVERT); if (dvert) { @@ -682,6 +684,12 @@ static void cloth_apply_vgroup(ClothModifierData *clmd, Mesh *mesh) } } + if (dvert->dw[j].def_nr == (clmd->coll_parms->vgroup_objcol - 1)) { + if (dvert->dw[j].weight > 0.0f) { + verts->flags |= CLOTH_VERT_FLAG_NOOBJCOLL; + } + } + if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_shrink - 1)) { /* Used for linear interpolation between min and max * shrink factor based on weight. */ diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index b4d668c7f50..1c24dae430c 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -1012,7 +1012,7 @@ static bool cloth_bvh_collision_is_active(const ClothModifierData *UNUSED(clmd), const int flags_a = verts[tri_a->tri[0]].flags & verts[tri_a->tri[1]].flags & verts[tri_a->tri[2]].flags; - if (flags_a & CLOTH_VERT_FLAG_PINNED) { + if (flags_a & (CLOTH_VERT_FLAG_PINNED | CLOTH_VERT_FLAG_NOOBJCOLL)) { return false; } |