forked from bartvdbraak/blender
Sculpt: minor speedup for dyntopo
Add retake to range-tree to avoid double lookup.
This commit is contained in:
parent
37474e50ce
commit
a8705e99ee
22
extern/rangetree/range_tree.hh
vendored
22
extern/rangetree/range_tree.hh
vendored
@ -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() {
|
||||
|
5
extern/rangetree/range_tree_c_api.cc
vendored
5
extern/rangetree/range_tree_c_api.cc
vendored
@ -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();
|
||||
|
2
extern/rangetree/range_tree_c_api.h
vendored
2
extern/rangetree/range_tree_c_api.h
vendored
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user