From 87c39f11231b165ce913673676f57d6a013c23c4 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 2 Jul 2019 16:48:28 +0200 Subject: Fix T65798: Incorrect auto-tex space for Curves There are several aspects to the fix: - Always calculate bounding box for meshes and curves from dependency graph evaluation function. There is a reason why mesh was tagged for geometry update, so can not be spare here in attempts to avoid calculation. - Copy bounding box and texture space to original object for active dependency graph. This matches object-level bounding box and allows to remove bounding box evaluation from RNA. --- source/blender/blenkernel/intern/curve.c | 16 ++++++++++++++-- source/blender/blenkernel/intern/mesh.c | 18 +++++++++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 5945fa4bf33..8a2450efa55 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -54,6 +54,7 @@ #include "BKE_material.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" #include "CLG_log.h" @@ -5431,8 +5432,19 @@ void BKE_curve_rect_from_textbox(const struct Curve *cu, void BKE_curve_eval_geometry(Depsgraph *depsgraph, Curve *curve) { DEG_debug_print_eval(depsgraph, __func__, curve->id.name, curve); - if (curve->bb == NULL || (curve->bb->flag & BOUNDBOX_DIRTY)) { - BKE_curve_texspace_calc(curve); + BKE_curve_texspace_calc(curve); + if (DEG_is_active(depsgraph)) { + Curve *curve_orig = (Curve *)DEG_get_original_id(&curve->id); + BoundBox *bb = curve->bb; + if (bb != NULL) { + if (curve_orig->bb == NULL) { + curve_orig->bb = MEM_mallocN(sizeof(*curve_orig->bb), __func__); + } + *curve_orig->bb = *bb; + copy_v3_v3(curve_orig->loc, curve->loc); + copy_v3_v3(curve_orig->size, curve->size); + copy_v3_v3(curve_orig->rot, curve->rot); + } } } diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 755a8036e8e..e6fbc386b77 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -50,6 +50,7 @@ #include "BKE_editmesh.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" enum { MESHCMP_DVERT_WEIGHTMISMATCH = 1, @@ -1995,9 +1996,7 @@ void BKE_mesh_split_faces(Mesh *mesh, bool free_loop_normals) void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh) { DEG_debug_print_eval(depsgraph, __func__, mesh->id.name, mesh); - if (mesh->bb == NULL || (mesh->bb->flag & BOUNDBOX_DIRTY)) { - BKE_mesh_texspace_calc(mesh); - } + BKE_mesh_texspace_calc(mesh); /* Clear autospace flag in evaluated mesh, so that texspace does not get recomputed when bbox is * (e.g. after modifiers, etc.) */ mesh->texflag &= ~ME_AUTOSPACE; @@ -2009,4 +2008,17 @@ void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh) BKE_id_free(NULL, mesh->runtime.mesh_eval); mesh->runtime.mesh_eval = NULL; } + if (DEG_is_active(depsgraph)) { + Mesh *mesh_orig = (Mesh *)DEG_get_original_id(&mesh->id); + BoundBox *bb = mesh->bb; + if (bb != NULL) { + if (mesh_orig->bb == NULL) { + mesh_orig->bb = MEM_mallocN(sizeof(*mesh_orig->bb), __func__); + } + *mesh_orig->bb = *bb; + copy_v3_v3(mesh_orig->loc, mesh->loc); + copy_v3_v3(mesh_orig->size, mesh->size); + copy_v3_v3(mesh_orig->rot, mesh->rot); + } + } } -- cgit v1.2.3