Sculpt: minor speedup for dyntopo

Add retake to range-tree to avoid double lookup.
This commit is contained in:
Campbell Barton 2014-10-07 21:02:08 +02:00
parent 37474e50ce
commit a8705e99ee
4 changed files with 30 additions and 3 deletions

@ -92,6 +92,28 @@ struct RangeTree {
tree.insert(Range(t + 1, cur.max)); 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 /* Take the first element out of the first range in the
tree. Precondition: tree must not be empty. */ tree. Precondition: tree must not be empty. */
T take_any() { T take_any() {

@ -43,6 +43,11 @@ void range_tree_uint_take(RangeTreeUInt *rt, unsigned v)
rt->take(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) unsigned range_tree_uint_take_any(RangeTreeUInt *rt)
{ {
return rt->take_any(); return rt->take_any();

@ -35,6 +35,8 @@ void range_tree_uint_free(RangeTreeUInt *rt);
void range_tree_uint_take(RangeTreeUInt *rt, unsigned v); 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); unsigned range_tree_uint_take_any(RangeTreeUInt *rt);
void range_tree_uint_release(RangeTreeUInt *rt, unsigned v); void range_tree_uint_release(RangeTreeUInt *rt, unsigned v);

@ -423,9 +423,7 @@ static void bm_log_id_ghash_retake(RangeTreeUInt *unused_ids, GHash *id_ghash)
void *key = BLI_ghashIterator_getKey(&gh_iter); void *key = BLI_ghashIterator_getKey(&gh_iter);
unsigned int id = GET_UINT_FROM_POINTER(key); unsigned int id = GET_UINT_FROM_POINTER(key);
if (range_tree_uint_has(unused_ids, id)) { range_tree_uint_retake(unused_ids, id);
range_tree_uint_take(unused_ids, id);
}
} }
} }