diff options
author | Chris Blackbourn <chrisbblend@gmail.com> | 2022-06-17 11:12:23 +0300 |
---|---|---|
committer | Chris Blackbourn <chrisbblend@gmail.com> | 2022-06-21 04:21:41 +0300 |
commit | 95465606b33c5d1b36f30d007b7ad6d9d6efba4c (patch) | |
tree | 4d5b9ea15134ee086b47ab9fbd7de6f657473d01 /source/blender/blenlib/intern/kdtree_impl.h | |
parent | a18c29143510e3f150cadaa45ac0e1944aba01ae (diff) |
Fix T99033: KDTree deduplication can erase values
Differential Revision: https://developer.blender.org/D15220
Diffstat (limited to 'source/blender/blenlib/intern/kdtree_impl.h')
-rw-r--r-- | source/blender/blenlib/intern/kdtree_impl.h | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/source/blender/blenlib/intern/kdtree_impl.h b/source/blender/blenlib/intern/kdtree_impl.h index d9ae826093c..6614f1bf964 100644 --- a/source/blender/blenlib/intern/kdtree_impl.h +++ b/source/blender/blenlib/intern/kdtree_impl.h @@ -927,6 +927,14 @@ int BLI_kdtree_nd_(calc_duplicates_fast)(const KDTree *tree, /** \name BLI_kdtree_3d_deduplicate * \{ */ +static int kdtree_cmp_bool(const bool a, const bool b) +{ + if (a == b) { + return 0; + } + return b ? -1 : 1; +} + static int kdtree_node_cmp_deduplicate(const void *n0_p, const void *n1_p) { const KDTreeNode *n0 = n0_p; @@ -939,17 +947,16 @@ static int kdtree_node_cmp_deduplicate(const void *n0_p, const void *n1_p) return 1; } } - /* Sort by pointer so the first added will be used. - * assignment below ignores const correctness, - * however the values aren't used for sorting and are to be discarded. */ - if (n0 < n1) { - ((KDTreeNode *)n1)->d = KD_DIMS; /* tag invalid */ - return -1; - } - else { - ((KDTreeNode *)n0)->d = KD_DIMS; /* tag invalid */ - return 1; + + if (n0->d != KD_DIMS && n1->d != KD_DIMS) { + /* Two nodes share identical `co` + * Both are still valid. + * Cast away `const` and tag one of them as invalid. */ + ((KDTreeNode *)n1)->d = KD_DIMS; } + + /* Keep sorting until each unique value has one and only one valid node. */ + return kdtree_cmp_bool(n0->d == KD_DIMS, n1->d == KD_DIMS); } /** |