Use BLI_heap_reinsert for decimate and beautify

Improves performance for high poly meshes,
~70% faster for decimate, only ~10% for beautify.
This commit is contained in:
Campbell Barton 2017-10-29 05:23:27 +11:00
parent 4af1af70ad
commit 336885beba
Notes: blender-bot 2023-02-14 06:26:35 +01:00
Referenced by issue #53683, 2.79a release
Referenced by issue #53183, Alpha issue with smoke / fire
2 changed files with 24 additions and 20 deletions

View File

@ -219,23 +219,23 @@ static void polyedge_beauty_cost_update_single(
Heap *eheap, HeapNode **eheap_table)
{
const uint i = e->base_index;
if (eheap_table[i]) {
BLI_heap_remove(eheap, eheap_table[i]);
eheap_table[i] = NULL;
}
{
/* recalculate edge */
const float cost = polyedge_rotate_beauty_calc(coords, edges, e);
/* We can get cases where both choices generate very small negative costs, which leads to infinite loop.
* Anyway, costs above that are not worth recomputing, maybe we could even optimize it to a smaller limit?
* Actually, FLT_EPSILON is too small in some cases, 1e-6f seems to work OK hopefully?
* See T43578, T49478. */
if (cost < -1e-6f) {
eheap_table[i] = BLI_heap_insert(eheap, cost, e);
/* recalculate edge */
const float cost = polyedge_rotate_beauty_calc(coords, edges, e);
/* We can get cases where both choices generate very small negative costs, which leads to infinite loop.
* Anyway, costs above that are not worth recomputing, maybe we could even optimize it to a smaller limit?
* Actually, FLT_EPSILON is too small in some cases, 1e-6f seems to work OK hopefully?
* See T43578, T49478. */
if (cost < -1e-6f) {
if (eheap_table[i]) {
BLI_heap_reinsert(eheap, eheap_table[i], cost);
}
else {
eheap_table[i] = BLI_heap_insert(eheap, cost, e);
}
}
else {
if (eheap_table[i]) {
BLI_heap_remove(eheap, eheap_table[i]);
eheap_table[i] = NULL;
}
}

View File

@ -256,10 +256,6 @@ static void bm_decim_build_edge_cost_single(
{
float cost;
if (eheap_table[BM_elem_index_get(e)]) {
BLI_heap_remove(eheap, eheap_table[BM_elem_index_get(e)]);
}
if (UNLIKELY(vweights &&
((vweights[BM_elem_index_get(e->v1)] == 0.0f) ||
(vweights[BM_elem_index_get(e->v2)] == 0.0f))))
@ -341,10 +337,18 @@ static void bm_decim_build_edge_cost_single(
}
}
eheap_table[BM_elem_index_get(e)] = BLI_heap_insert(eheap, cost, e);
if (eheap_table[BM_elem_index_get(e)]) {
BLI_heap_reinsert(eheap, eheap_table[BM_elem_index_get(e)], cost);
}
else {
eheap_table[BM_elem_index_get(e)] = BLI_heap_insert(eheap, cost, e);
}
return;
clear:
if (eheap_table[BM_elem_index_get(e)]) {
BLI_heap_remove(eheap, eheap_table[BM_elem_index_get(e)]);
}
eheap_table[BM_elem_index_get(e)] = NULL;
}