[Bf-blender-cvs] [a8705e9] master: Sculpt: minor speedup for dyntopo
Campbell Barton
noreply at git.blender.org
Tue Oct 7 21:03:13 CEST 2014
Commit: a8705e99ee8ec9de2f25c3bac1e9895c2f98c224
Author: Campbell Barton
Date: Tue Oct 7 21:02:08 2014 +0200
Branches: master
https://developer.blender.org/rBa8705e99ee8ec9de2f25c3bac1e9895c2f98c224
Sculpt: minor speedup for dyntopo
Add retake to range-tree to avoid double lookup.
===================================================================
M extern/rangetree/range_tree.hh
M extern/rangetree/range_tree_c_api.cc
M extern/rangetree/range_tree_c_api.h
M source/blender/bmesh/intern/bmesh_log.c
===================================================================
diff --git a/extern/rangetree/range_tree.hh b/extern/rangetree/range_tree.hh
index 919e0b0..b247a0c 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 79d3df5..f040b5ea 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 d78dc95..f0a2af4 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 0bb1a89..709a174 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);
}
}
More information about the Bf-blender-cvs
mailing list