diff options
author | Germano Cavalcante <germano.costa@ig.com.br> | 2021-11-24 20:32:19 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2021-11-24 20:52:49 +0300 |
commit | 752c6d668bcb9a6b357734f7e124a6b605ac9d9b (patch) | |
tree | d71416b6e6dade5806a69705e188429af63fe7ec /source/blender/blenkernel/intern/object.cc | |
parent | 7a7ae4df436292345748ded71b2cefaf60a39fbd (diff) |
Fix T90808: wrong BoundBox after undo curve selection
There are two functions that recalculate the boundbox of an object:
- One that considers the evaluated geometry
- Another that only considers the object's `data`.
Most of the time, the bound box is calculated on the final object
(with modifiers), so it doesn't seem right to just rely on `ob->data`
to recalculate the `ob->runtime.bb`.
Be sure to calculate the BoundBox based on the final geometry and
only use `ob->data` as a fallback
Differential Revision: https://developer.blender.org/D12282
Diffstat (limited to 'source/blender/blenkernel/intern/object.cc')
-rw-r--r-- | source/blender/blenkernel/intern/object.cc | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index 4b01ee29828..45e14675107 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -3965,6 +3965,37 @@ void BKE_object_boundbox_calc_from_mesh(Object *ob, const Mesh *me_eval) ob->runtime.bb->flag &= ~BOUNDBOX_DIRTY; } +bool BKE_object_boundbox_calc_from_evaluated_geometry(Object *ob) +{ + blender::float3 min, max; + INIT_MINMAX(min, max); + + if (ob->runtime.geometry_set_eval) { + ob->runtime.geometry_set_eval->compute_boundbox_without_instances(&min, &max); + } + else if (const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob)) { + if (!BKE_mesh_wrapper_minmax(mesh_eval, min, max)) { + return false; + } + } + else if (ob->runtime.curve_cache) { + BKE_displist_minmax(&ob->runtime.curve_cache->disp, min, max); + } + else { + return false; + } + + if (ob->runtime.bb == nullptr) { + ob->runtime.bb = (BoundBox *)MEM_callocN(sizeof(BoundBox), __func__); + } + + BKE_boundbox_init_from_minmax(ob->runtime.bb, min, max); + + ob->runtime.bb->flag &= ~BOUNDBOX_DIRTY; + + return true; +} + /** \} */ /* -------------------------------------------------------------------- */ |