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:
parent
4af1af70ad
commit
336885beba
Notes:
blender-bot
2023-02-14 06:26:35 +01:00
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue