From 394c0b5ae4d9b28e8624ea831e20e011a687f71e Mon Sep 17 00:00:00 2001 From: Sonny Campbell Date: Tue, 6 Sep 2022 13:09:01 -0500 Subject: Fix T99141: Crash with edit mode and copy location constraint The constraint attempted to access mesh normals on a mesh with wrapper type ME_WRAPPER_TYPE_BMESH. This commit reverses the if statements so that If there is an editmesh then we use that as the source of truth - otherwise use the evaluated mesh. Differential Revision: https://developer.blender.org/D15809 --- source/blender/blenkernel/intern/constraint.c | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index 50b620c42bb..bc59cd7fe05 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -528,7 +528,24 @@ static void contarget_get_mesh_mat(Object *ob, const char *substring, float mat[ float vec[3] = {0.0f, 0.0f, 0.0f}; float normal[3] = {0.0f, 0.0f, 0.0f}; float weightsum = 0.0f; - if (me_eval) { + if (em) { + if (CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)) { + BMVert *v; + BMIter iter; + + BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) { + MDeformVert *dv = CustomData_bmesh_get(&em->bm->vdata, v->head.data, CD_MDEFORMVERT); + MDeformWeight *dw = BKE_defvert_find_index(dv, defgroup); + + if (dw && dw->weight > 0.0f) { + madd_v3_v3fl(vec, v->co, dw->weight); + madd_v3_v3fl(normal, v->no, dw->weight); + weightsum += dw->weight; + } + } + } + } + else if (me_eval) { const float(*vert_normals)[3] = BKE_mesh_vertex_normals_ensure(me_eval); const MDeformVert *dvert = CustomData_get_layer(&me_eval->vdata, CD_MDEFORMVERT); const MVert *verts = BKE_mesh_vertices(me_eval); @@ -551,23 +568,6 @@ static void contarget_get_mesh_mat(Object *ob, const char *substring, float mat[ } } } - else if (em) { - if (CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)) { - BMVert *v; - BMIter iter; - - BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) { - MDeformVert *dv = CustomData_bmesh_get(&em->bm->vdata, v->head.data, CD_MDEFORMVERT); - MDeformWeight *dw = BKE_defvert_find_index(dv, defgroup); - - if (dw && dw->weight > 0.0f) { - madd_v3_v3fl(vec, v->co, dw->weight); - madd_v3_v3fl(normal, v->no, dw->weight); - weightsum += dw->weight; - } - } - } - } else { /* No valid edit or evaluated mesh, just abort. */ return; -- cgit v1.2.3