[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