From a8705e99ee8ec9de2f25c3bac1e9895c2f98c224 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 7 Oct 2014 21:02:08 +0200 Subject: [PATCH] Sculpt: minor speedup for dyntopo Add retake to range-tree to avoid double lookup. --- extern/rangetree/range_tree.hh | 22 ++++++++++++++++++++++ extern/rangetree/range_tree_c_api.cc | 5 +++++ extern/rangetree/range_tree_c_api.h | 2 ++ source/blender/bmesh/intern/bmesh_log.c | 4 +--- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/extern/rangetree/range_tree.hh b/extern/rangetree/range_tree.hh index 919e0b04933..b247a0c6a1e 100644 --- a/extern/rangetree/range_tree.hh +++ b/extern/rangetree/range_tree.hh @@ -92,6 +92,28 @@ struct RangeTree { tree.insert(Range(t + 1, cur.max)); } + /* clone of 'take' that checks if the item exists */ + bool retake(T t) { + #if RANGE_TREE_DEBUG_PRINT_FUNCTION + std::cout << __func__ << "(" << t << ")\n"; + #endif + + TreeIter iter = tree.find(Range(t)); + if (iter == tree.end()) { + return false; + } + + Range cur = *iter; + tree.erase(iter); + if (t > cur.min) + tree.insert(Range(cur.min, t - 1)); + if (t + 1 <= cur.max) + tree.insert(Range(t + 1, cur.max)); + + return true; + } + + /* Take the first element out of the first range in the tree. Precondition: tree must not be empty. */ T take_any() { diff --git a/extern/rangetree/range_tree_c_api.cc b/extern/rangetree/range_tree_c_api.cc index 79d3df5792b..f040b5eaeb6 100644 --- a/extern/rangetree/range_tree_c_api.cc +++ b/extern/rangetree/range_tree_c_api.cc @@ -43,6 +43,11 @@ void range_tree_uint_take(RangeTreeUInt *rt, unsigned v) rt->take(v); } +bool range_tree_uint_retake(RangeTreeUInt *rt, unsigned v) +{ + return rt->retake(v); +} + unsigned range_tree_uint_take_any(RangeTreeUInt *rt) { return rt->take_any(); diff --git a/extern/rangetree/range_tree_c_api.h b/extern/rangetree/range_tree_c_api.h index d78dc959a6c..f0a2af4a29a 100644 --- a/extern/rangetree/range_tree_c_api.h +++ b/extern/rangetree/range_tree_c_api.h @@ -35,6 +35,8 @@ void range_tree_uint_free(RangeTreeUInt *rt); void range_tree_uint_take(RangeTreeUInt *rt, unsigned v); +bool range_tree_uint_retake(RangeTreeUInt *rt, unsigned v); + unsigned range_tree_uint_take_any(RangeTreeUInt *rt); void range_tree_uint_release(RangeTreeUInt *rt, unsigned v); diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c index 0bb1a892ffe..709a174731f 100644 --- a/source/blender/bmesh/intern/bmesh_log.c +++ b/source/blender/bmesh/intern/bmesh_log.c @@ -423,9 +423,7 @@ static void bm_log_id_ghash_retake(RangeTreeUInt *unused_ids, GHash *id_ghash) void *key = BLI_ghashIterator_getKey(&gh_iter); unsigned int id = GET_UINT_FROM_POINTER(key); - if (range_tree_uint_has(unused_ids, id)) { - range_tree_uint_take(unused_ids, id); - } + range_tree_uint_retake(unused_ids, id); } }