Fix: Assert finishing transformation with an 'Affect Only' option active

Attempt to use C-style MEM_freeN on a pointer created with CPP-style
MEM_new

Pull Request: https://projects.blender.org/blender/blender/pulls/141999
This commit is contained in:
Germano Cavalcante
2025-07-15 23:54:48 +02:00
committed by Germano Cavalcante
parent 0781b90962
commit a2a2638a57

View File

@@ -167,10 +167,6 @@ bool calc_active_center(Object *ob, const bool select_only, float r_center[3])
*
* \{ */
struct XFormObjectSkipChild_Container {
GHash *obchild_in_obmode_map = nullptr;
};
struct XFormObjectSkipChild {
float obmat_orig[4][4] = {};
float parent_obmat_orig[4][4] = {};
@@ -181,12 +177,13 @@ struct XFormObjectSkipChild {
int mode = OB_MODE_OBJECT;
};
struct XFormObjectSkipChild_Container {
Map<Object *, std::unique_ptr<XFormObjectSkipChild>> obchild_in_obmode_map;
};
XFormObjectSkipChild_Container *xform_skip_child_container_create()
{
XFormObjectSkipChild_Container *xcs = MEM_new<XFormObjectSkipChild_Container>(__func__);
if (xcs->obchild_in_obmode_map == nullptr) {
xcs->obchild_in_obmode_map = BLI_ghash_ptr_new(__func__);
}
return xcs;
}
@@ -248,7 +245,6 @@ void xform_skip_child_container_item_ensure_from_array(XFormObjectSkipChild_Cont
void object_xform_skip_child_container_destroy(XFormObjectSkipChild_Container *xcs)
{
BLI_ghash_free(xcs->obchild_in_obmode_map, nullptr, MEM_freeN);
MEM_delete(xcs);
}
@@ -257,9 +253,8 @@ void object_xform_skip_child_container_item_ensure(XFormObjectSkipChild_Containe
Object *ob_parent_recurse,
int mode)
{
void **xf_p;
if (!BLI_ghash_ensure_p(xcs->obchild_in_obmode_map, ob, &xf_p)) {
XFormObjectSkipChild *xf = MEM_new<XFormObjectSkipChild>(__func__);
xcs->obchild_in_obmode_map.lookup_or_add_cb(ob, [&]() {
std::unique_ptr<XFormObjectSkipChild> xf = std::make_unique<XFormObjectSkipChild>();
copy_m4_m4(xf->parentinv_orig, ob->parentinv);
copy_m4_m4(xf->obmat_orig, ob->object_to_world().ptr());
copy_m4_m4(xf->parent_obmat_orig, ob->parent->object_to_world().ptr());
@@ -269,8 +264,8 @@ void object_xform_skip_child_container_item_ensure(XFormObjectSkipChild_Containe
}
xf->mode = mode;
xf->ob_parent_recurse = ob_parent_recurse;
*xf_p = xf;
}
return xf;
});
}
void object_xform_skip_child_container_update_all(XFormObjectSkipChild_Container *xcs,
@@ -279,11 +274,9 @@ void object_xform_skip_child_container_update_all(XFormObjectSkipChild_Container
{
BKE_scene_graph_evaluated_ensure(depsgraph, bmain);
GHashIterator gh_iter;
GHASH_ITER (gh_iter, xcs->obchild_in_obmode_map) {
Object *ob = static_cast<Object *>(BLI_ghashIterator_getKey(&gh_iter));
XFormObjectSkipChild *xf = static_cast<XFormObjectSkipChild *>(
BLI_ghashIterator_getValue(&gh_iter));
for (auto item : xcs->obchild_in_obmode_map.items()) {
Object *ob = item.key;
XFormObjectSkipChild *xf = item.value.get();
/* The following blocks below assign 'dmat'. */
float dmat[4][4];