diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-08-24 20:06:18 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-08-24 20:06:18 +0400 |
commit | 585272fbcf2a23d7491b229736d8de6234ab290b (patch) | |
tree | 8fef123f9fa44e95e040b1c0df1b1f46392a4e75 | |
parent | 1ba29c3a4adde1d9b9a70b9e84745dd0ec5f9c4e (diff) |
cloth was using edgehash not quite correctly:
- was ordering vertex args unnecessarily.
- was adding the same edges multiple times into the edgehash.
-rw-r--r-- | source/blender/blenkernel/BKE_cloth.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cloth.c | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/collision.c | 3 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_edgehash.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/edgehash.c | 2 |
5 files changed, 10 insertions, 9 deletions
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index 947e680d119..1b61d0a5443 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -80,7 +80,7 @@ typedef struct Cloth { struct MFace *mfaces; struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */ struct Implicit_Data *implicitEM; /* our implicit solver connects to this pointer */ - struct EdgeHash *edgehash; /* used for selfcollisions */ + struct EdgeHash *edgehash; /* used for selfcollisions (currently used as a 'set', value is ignored) */ int last_frame, pad4; } Cloth; diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c index 1bf231ac218..e4c6f7790d7 100644 --- a/source/blender/blenkernel/intern/cloth.c +++ b/source/blender/blenkernel/intern/cloth.c @@ -1223,7 +1223,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) // check for existing spring // check also if startpoint is equal to endpoint if ((index2 != tspring2->ij) && - !BLI_edgehash_haskey(edgehash, MIN2(tspring2->ij, index2), MAX2(tspring2->ij, index2))) + !BLI_edgehash_haskey(edgehash, tspring2->ij, index2)) { spring = (ClothSpring *)MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" ); @@ -1283,16 +1283,18 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) } } + /* note: the edges may already exist so run reinsert */ + /* insert other near springs in edgehash AFTER bending springs are calculated (for selfcolls) */ for (i = 0; i < numedges; i++) { /* struct springs */ - BLI_edgehash_insert(edgehash, MIN2(medge[i].v1, medge[i].v2), MAX2(medge[i].v2, medge[i].v1), NULL); + BLI_edgehash_reinsert(edgehash, medge[i].v1, medge[i].v2, NULL); } for (i = 0; i < numfaces; i++) { /* edge springs */ if (mface[i].v4) { - BLI_edgehash_insert(edgehash, MIN2(mface[i].v1, mface[i].v3), MAX2(mface[i].v3, mface[i].v1), NULL); + BLI_edgehash_reinsert(edgehash, mface[i].v1, mface[i].v3, NULL); - BLI_edgehash_insert(edgehash, MIN2(mface[i].v2, mface[i].v4), MAX2(mface[i].v2, mface[i].v4), NULL); + BLI_edgehash_reinsert(edgehash, mface[i].v2, mface[i].v4, NULL); } } diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index 91a09bb8554..9a457882ad5 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -865,8 +865,7 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa if ( ( ABS ( temp[0] ) > mindistance ) || ( ABS ( temp[1] ) > mindistance ) || ( ABS ( temp[2] ) > mindistance ) ) continue; - // check for adjacent points (i must be smaller j) - if ( BLI_edgehash_haskey ( cloth->edgehash, MIN2(i, j), MAX2(i, j) ) ) { + if (BLI_edgehash_haskey(cloth->edgehash, i, j)) { continue; } diff --git a/source/blender/blenlib/BLI_edgehash.h b/source/blender/blenlib/BLI_edgehash.h index 55efa49b262..b79fe669f20 100644 --- a/source/blender/blenlib/BLI_edgehash.h +++ b/source/blender/blenlib/BLI_edgehash.h @@ -45,7 +45,7 @@ EdgeHash *BLI_edgehash_new_ex(const char *info, EdgeHash *BLI_edgehash_new(const char *info); void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP valfreefp); void BLI_edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val); -void BLI_edgehash_assign(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val); +void BLI_edgehash_reinsert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val); void *BLI_edgehash_lookup(EdgeHash *eh, unsigned int v0, unsigned int v1); void **BLI_edgehash_lookup_p(EdgeHash *eh, unsigned int v0, unsigned int v1); bool BLI_edgehash_haskey(EdgeHash *eh, unsigned int v0, unsigned int v1); diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c index b7f607193a0..66c9eedaf1b 100644 --- a/source/blender/blenlib/intern/edgehash.c +++ b/source/blender/blenlib/intern/edgehash.c @@ -205,7 +205,7 @@ void BLI_edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *v /** * Assign a new value to a key that may already be in edgehash. */ -void BLI_edgehash_assign(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val) +void BLI_edgehash_reinsert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val) { unsigned int hash; EdgeEntry *e; |