From 12817083ec615f9d3e3f0261d5d4247b81bfbbf8 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 6 Jul 2020 14:44:30 -0300 Subject: Cleanup: Use the BLI_edgehash API in the sewing simulation of cloths Also remove the code in the ghash that is no longer used. This change simplifies the existing code. Differential Revision: https://developer.blender.org/D8219 --- source/blender/blenkernel/BKE_cloth.h | 8 ++++---- source/blender/blenkernel/intern/cloth.c | 26 ++++++------------------- source/blender/blenkernel/intern/collision.c | 14 ++----------- source/blender/blenlib/BLI_ghash.h | 14 ------------- source/blender/blenlib/intern/BLI_ghash_utils.c | 19 ------------------ 5 files changed, 12 insertions(+), 69 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index f25482570b1..cd78746a3f0 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -93,10 +93,10 @@ typedef struct Cloth { struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */ struct EdgeSet *edgeset; /* used for selfcollisions */ int last_frame; - float initial_mesh_volume; /* Initial volume of the mesh. Used for pressure */ - float average_acceleration[3]; /* Moving average of overall acceleration. */ - struct MEdge *edges; /* Used for hair collisions. */ - struct GHash *sew_edge_graph; /* Sewing edges represented using a GHash */ + float initial_mesh_volume; /* Initial volume of the mesh. Used for pressure */ + float average_acceleration[3]; /* Moving average of overall acceleration. */ + struct MEdge *edges; /* Used for hair collisions. */ + struct EdgeSet *sew_edge_graph; /* Sewing edges represented using a GHash */ } Cloth; /** diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c index 6b25095a87a..7c8c1cf6653 100644 --- a/source/blender/blenkernel/intern/cloth.c +++ b/source/blender/blenkernel/intern/cloth.c @@ -30,7 +30,6 @@ #include "DNA_scene_types.h" #include "BLI_edgehash.h" -#include "BLI_ghash.h" #include "BLI_linklist.h" #include "BLI_math.h" #include "BLI_rand.h" @@ -587,7 +586,7 @@ void cloth_free_modifier(ClothModifierData *clmd) } if (cloth->sew_edge_graph) { - BLI_ghash_free(cloth->sew_edge_graph, MEM_freeN, NULL); + BLI_edgeset_free(cloth->sew_edge_graph); cloth->sew_edge_graph = NULL; } @@ -669,7 +668,7 @@ void cloth_free_modifier_extern(ClothModifierData *clmd) } if (cloth->sew_edge_graph) { - BLI_ghash_free(cloth->sew_edge_graph, MEM_freeN, NULL); + BLI_edgeset_free(cloth->sew_edge_graph); cloth->sew_edge_graph = NULL; } @@ -1557,9 +1556,8 @@ static bool find_internal_spring_target_vertex(BVHTreeFromMesh *treedata, *r_tar_v_idx = vert_idx; return true; } - - return false; - + + return false; } static int cloth_build_springs(ClothModifierData *clmd, Mesh *mesh) @@ -1693,8 +1691,7 @@ static int cloth_build_springs(ClothModifierData *clmd, Mesh *mesh) if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW) { /* cloth->sew_edge_graph should not exist before this */ BLI_assert(cloth->sew_edge_graph == NULL); - cloth->sew_edge_graph = BLI_ghash_new( - BLI_ghashutil_inthash_v2_p, BLI_ghashutil_inthash_v2_cmp, "cloth_sewing_edges_graph"); + cloth->sew_edge_graph = BLI_edgeset_new("cloth_sewing_edges_graph"); } /* Structural springs. */ @@ -1709,18 +1706,7 @@ static int cloth_build_springs(ClothModifierData *clmd, Mesh *mesh) spring->lin_stiffness = 1.0f; spring->type = CLOTH_SPRING_TYPE_SEWING; - /* set indices of verts of the sewing edge symmetrically in sew_edge_graph */ - unsigned int *vertex_index_pair = MEM_mallocN(sizeof(unsigned int) * 2, - "sewing_edge_index_pair_01"); - if (medge[i].v1 < medge[i].v2) { - vertex_index_pair[0] = medge[i].v1; - vertex_index_pair[1] = medge[i].v2; - } - else { - vertex_index_pair[0] = medge[i].v2; - vertex_index_pair[1] = medge[i].v1; - } - BLI_ghash_insert(cloth->sew_edge_graph, vertex_index_pair, NULL); + BLI_edgeset_insert(cloth->sew_edge_graph, medge[i].v1, medge[i].v2); } else { shrink_factor = cloth_shrink_factor(clmd, cloth->verts, spring->ij, spring->kl); diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index daf1602319f..31d49dd4508 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -32,7 +32,7 @@ #include "DNA_scene_types.h" #include "BLI_blenlib.h" -#include "BLI_ghash.h" +#include "BLI_edgehash.h" #include "BLI_linklist.h" #include "BLI_math.h" #include "BLI_task.h" @@ -1153,17 +1153,7 @@ static bool cloth_bvh_selfcollision_is_active(const Cloth *cloth, } if (sewing_active) { - unsigned int vertex_index_pair[2]; - /* The indices pair are ordered, thus must ensure the same here as well */ - if (tri_a->tri[i] < tri_b->tri[j]) { - vertex_index_pair[0] = tri_a->tri[i]; - vertex_index_pair[1] = tri_b->tri[j]; - } - else { - vertex_index_pair[0] = tri_b->tri[j]; - vertex_index_pair[1] = tri_a->tri[i]; - } - if (BLI_ghash_haskey(cloth->sew_edge_graph, vertex_index_pair)) { + if (BLI_edgeset_haskey(cloth->sew_edge_graph, tri_a->tri[i], tri_b->tri[j])) { return false; } } diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h index 141c631381b..31a9658bd7e 100644 --- a/source/blender/blenlib/BLI_ghash.h +++ b/source/blender/blenlib/BLI_ghash.h @@ -371,20 +371,6 @@ unsigned int BLI_ghashutil_uinthash_v4_murmur(const unsigned int key[4]); bool BLI_ghashutil_uinthash_v4_cmp(const void *a, const void *b); #define BLI_ghashutil_inthash_v4_cmp BLI_ghashutil_uinthash_v4_cmp -unsigned int BLI_ghashutil_uinthash_v2(const unsigned int key[2]); -#define BLI_ghashutil_inthash_v2(key) \ - (CHECK_TYPE_ANY(key, int *, const int *), BLI_ghashutil_uinthash_v2((const unsigned int *)key)) -#define BLI_ghashutil_inthash_v2_p ((GSetHashFP)BLI_ghashutil_uinthash_v2) -#define BLI_ghashutil_uinthash_v2_p ((GSetHashFP)BLI_ghashutil_uinthash_v2) -unsigned int BLI_ghashutil_uinthash_v2_murmur(const unsigned int key[2]); -#define BLI_ghashutil_inthash_v2_murmur(key) \ - (CHECK_TYPE_ANY(key, int *, const int *), \ - BLI_ghashutil_uinthash_v2_murmur((const unsigned int *)key)) -#define BLI_ghashutil_inthash_v2_p_murmur ((GSetHashFP)BLI_ghashutil_uinthash_v2_murmur) -#define BLI_ghashutil_uinthash_v2_p_murmur ((GSetHashFP)BLI_ghashutil_uinthash_v2_murmur) -bool BLI_ghashutil_uinthash_v2_cmp(const void *a, const void *b); -#define BLI_ghashutil_inthash_v2_cmp BLI_ghashutil_uinthash_v2_cmp - typedef struct GHashPair { const void *first; const void *second; diff --git a/source/blender/blenlib/intern/BLI_ghash_utils.c b/source/blender/blenlib/intern/BLI_ghash_utils.c index 83bf0373ae7..d6a4b24682f 100644 --- a/source/blender/blenlib/intern/BLI_ghash_utils.c +++ b/source/blender/blenlib/intern/BLI_ghash_utils.c @@ -86,25 +86,6 @@ bool BLI_ghashutil_uinthash_v4_cmp(const void *a, const void *b) return (memcmp(a, b, sizeof(uint[4])) != 0); } -uint BLI_ghashutil_uinthash_v2(const uint key[2]) -{ - uint hash; - hash = key[0]; - hash *= 37; - hash += key[1]; - return hash; -} - -uint BLI_ghashutil_uinthash_v2_murmur(const uint key[2]) -{ - return BLI_hash_mm2((const unsigned char *)key, sizeof(int) * 2 /* sizeof(key) */, 0); -} - -bool BLI_ghashutil_uinthash_v2_cmp(const void *a, const void *b) -{ - return (memcmp(a, b, sizeof(uint[2])) != 0); -} - uint BLI_ghashutil_uinthash(uint key) { key += ~(key << 16); -- cgit v1.2.3