From 5a8d2b6624b8ccdc3a4d4965dac0fdef50799ed3 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 9 Oct 2025 16:49:42 +0200 Subject: [PATCH 1/2] Fix #147710: Crash binding Surface Deform modifier to faceless mesh - Add an explicit check with a better error message than "Out of memory" - Initialize SDefVert so the later null checks don't try to free uninitialized data. Pull Request: https://projects.blender.org/blender/blender/pulls/147723 --- source/blender/modifiers/intern/MOD_surfacedeform.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.cc b/source/blender/modifiers/intern/MOD_surfacedeform.cc index 343c5e55913..2a77dd08721 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.cc +++ b/source/blender/modifiers/intern/MOD_surfacedeform.cc @@ -1183,6 +1183,11 @@ static bool surfacedeformBind(Object *ob, uint tedges_num = target->edges_num; int adj_result; + if (target->faces_num == 0) { + BKE_modifier_set_error(ob, (ModifierData *)smd_eval, "Target has no faces"); + return false; + } + SDefAdjacencyArray *vert_edges = MEM_calloc_arrayN(target_verts_num, "SDefVertEdgeMap"); if (vert_edges == nullptr) { @@ -1206,7 +1211,7 @@ static bool surfacedeformBind(Object *ob, return false; } - smd_orig->verts = MEM_malloc_arrayN(size_t(verts_num), "SDefBindVerts"); + smd_orig->verts = MEM_calloc_arrayN(size_t(verts_num), "SDefBindVerts"); if (smd_orig->verts == nullptr) { BKE_modifier_set_error(ob, (ModifierData *)smd_eval, "Out of memory"); freeAdjacencyMap(vert_edges, adj_array, edge_polys); From d68680ed61c6b9c67c1131bbd41d72ab4aa1824d Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Thu, 9 Oct 2025 16:52:06 +0200 Subject: [PATCH 2/2] Fix #147709: Use correct property for bone selection in Python Replace all calls to `pose_bone.bone.select` with `pose_bone.select` since that is where the property lives now Pull Request: https://projects.blender.org/blender/blender/pulls/147725 --- .../addons_core/pose_library/pose_usage.py | 2 +- scripts/addons_core/rigify/rig_ui_template.py | 20 ++++---- scripts/addons_core/rigify/ui.py | 50 +++++++++---------- .../bl_operators/bone_selection_sets.py | 4 +- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/scripts/addons_core/pose_library/pose_usage.py b/scripts/addons_core/pose_library/pose_usage.py index 25e772db28e..b2ce848b66b 100644 --- a/scripts/addons_core/pose_library/pose_usage.py +++ b/scripts/addons_core/pose_library/pose_usage.py @@ -76,7 +76,7 @@ def select_bones(arm_object: Object, action: Action, *, select: bool, flipped: b except KeyError: continue - pose_bone.bone.select = select + pose_bone.select = select if __name__ == '__main__': diff --git a/scripts/addons_core/rigify/rig_ui_template.py b/scripts/addons_core/rigify/rig_ui_template.py index df594b6644c..dd469523d57 100644 --- a/scripts/addons_core/rigify/rig_ui_template.py +++ b/scripts/addons_core/rigify/rig_ui_template.py @@ -596,10 +596,10 @@ def rotPoleToggle(rig, limb_type, controls, ik_ctrl, fk_ctrl, parent, pole): if limb_type == 'arm': func1 = arm_fk2ik func2 = arm_ik2fk - rig.pose.bones[controls[0]].bone.select = not new_pole_vector_value - rig.pose.bones[controls[4]].bone.select = not new_pole_vector_value - rig.pose.bones[parent].bone.select = not new_pole_vector_value - rig.pose.bones[pole].bone.select = new_pole_vector_value + rig.pose.bones[controls[0]].select = not new_pole_vector_value + rig.pose.bones[controls[4]].select = not new_pole_vector_value + rig.pose.bones[parent].select = not new_pole_vector_value + rig.pose.bones[pole].select = new_pole_vector_value kwargs1 = {'uarm_fk': controls[1], 'farm_fk': controls[2], 'hand_fk': controls[3], 'uarm_ik': controls[0], 'farm_ik': ik_ctrl[1], @@ -610,11 +610,11 @@ def rotPoleToggle(rig, limb_type, controls, ik_ctrl, fk_ctrl, parent, pole): else: func1 = leg_fk2ik func2 = leg_ik2fk - rig.pose.bones[controls[0]].bone.select = not new_pole_vector_value - rig.pose.bones[controls[6]].bone.select = not new_pole_vector_value - rig.pose.bones[controls[5]].bone.select = not new_pole_vector_value - rig.pose.bones[parent].bone.select = not new_pole_vector_value - rig.pose.bones[pole].bone.select = new_pole_vector_value + rig.pose.bones[controls[0]].select = not new_pole_vector_value + rig.pose.bones[controls[6]].select = not new_pole_vector_value + rig.pose.bones[controls[5]].select = not new_pole_vector_value + rig.pose.bones[parent].select = not new_pole_vector_value + rig.pose.bones[pole].select = new_pole_vector_value kwargs1 = {'thigh_fk': controls[1], 'shin_fk': controls[2], 'foot_fk': controls[3], 'mfoot_fk': controls[7], 'thigh_ik': controls[0], 'shin_ik': ik_ctrl[1], @@ -787,7 +787,7 @@ class Rigify_Rot2PoleSwitch(bpy.types.Operator): if self.bone_name: bpy.ops.pose.select_all(action='DESELECT') - rig.pose.bones[self.bone_name].bone.select = True + rig.pose.bones[self.bone_name].select = True rotPoleToggle(rig, self.limb_type, self.controls, self.ik_ctrl, self.fk_ctrl, self.parent, self.pole) diff --git a/scripts/addons_core/rigify/ui.py b/scripts/addons_core/rigify/ui.py index 23341441814..7b3dcb23d35 100644 --- a/scripts/addons_core/rigify/ui.py +++ b/scripts/addons_core/rigify/ui.py @@ -1353,10 +1353,10 @@ def fk_to_ik(rig: ArmatureObject, window='ALL'): # fk_ctrl = names['fk_ctrl'] parent = names['parent'] pole = names['pole'] - rig.pose.bones[controls[0]].bone.select = True - rig.pose.bones[controls[4]].bone.select = True - rig.pose.bones[pole].bone.select = True - rig.pose.bones[parent].bone.select = True + rig.pose.bones[controls[0]].select = True + rig.pose.bones[controls[4]].select = True + rig.pose.bones[pole].select = True + rig.pose.bones[parent].select = True kwargs = {'uarm_fk': controls[1], 'farm_fk': controls[2], 'hand_fk': controls[3], 'uarm_ik': controls[0], 'farm_ik': ik_ctrl[1], 'hand_ik': controls[4], 'pole': pole, 'main_parent': parent} @@ -1369,11 +1369,11 @@ def fk_to_ik(rig: ArmatureObject, window='ALL'): # fk_ctrl = names['fk_ctrl'] parent = names['parent'] pole = names['pole'] - rig.pose.bones[controls[0]].bone.select = True - rig.pose.bones[controls[6]].bone.select = True - rig.pose.bones[controls[5]].bone.select = True - rig.pose.bones[pole].bone.select = True - rig.pose.bones[parent].bone.select = True + rig.pose.bones[controls[0]].select = True + rig.pose.bones[controls[6]].select = True + rig.pose.bones[controls[5]].select = True + rig.pose.bones[pole].select = True + rig.pose.bones[parent].select = True # noinspection SpellCheckingInspection kwargs = {'thigh_fk': controls[1], 'shin_fk': controls[2], 'foot_fk': controls[3], 'mfoot_fk': controls[7], 'thigh_ik': controls[0], 'shin_ik': ik_ctrl[1], @@ -1432,9 +1432,9 @@ def ik_to_fk(rig: ArmatureObject, window='ALL'): # fk_ctrl = names['fk_ctrl'] parent = names['parent'] pole = names['pole'] - rig.pose.bones[controls[1]].bone.select = True - rig.pose.bones[controls[2]].bone.select = True - rig.pose.bones[controls[3]].bone.select = True + rig.pose.bones[controls[1]].select = True + rig.pose.bones[controls[2]].select = True + rig.pose.bones[controls[3]].select = True kwargs = {'uarm_fk': controls[1], 'farm_fk': controls[2], 'hand_fk': controls[3], 'uarm_ik': controls[0], 'farm_ik': ik_ctrl[1], 'hand_ik': controls[4]} @@ -1447,9 +1447,9 @@ def ik_to_fk(rig: ArmatureObject, window='ALL'): # fk_ctrl = names['fk_ctrl'] parent = names['parent'] pole = names['pole'] - rig.pose.bones[controls[1]].bone.select = True - rig.pose.bones[controls[2]].bone.select = True - rig.pose.bones[controls[3]].bone.select = True + rig.pose.bones[controls[1]].select = True + rig.pose.bones[controls[2]].select = True + rig.pose.bones[controls[3]].select = True # noinspection SpellCheckingInspection kwargs = {'thigh_fk': controls[1], 'shin_fk': controls[2], 'foot_fk': controls[3], 'mfoot_fk': controls[7], 'thigh_ik': controls[0], 'shin_ik': ik_ctrl[1], @@ -1550,10 +1550,10 @@ def rot_pole_toggle(rig: ArmatureObject, window='ALL', value=False, toggle=False # fk_ctrl = names['fk_ctrl'] parent = names['parent'] pole = names['pole'] - rig.pose.bones[controls[0]].bone.select = not new_pole_vector_value - rig.pose.bones[controls[4]].bone.select = not new_pole_vector_value - rig.pose.bones[parent].bone.select = not new_pole_vector_value - rig.pose.bones[pole].bone.select = new_pole_vector_value + rig.pose.bones[controls[0]].select = not new_pole_vector_value + rig.pose.bones[controls[4]].select = not new_pole_vector_value + rig.pose.bones[parent].select = not new_pole_vector_value + rig.pose.bones[pole].select = new_pole_vector_value kwargs1 = {'uarm_fk': controls[1], 'farm_fk': controls[2], 'hand_fk': controls[3], 'uarm_ik': controls[0], 'farm_ik': ik_ctrl[1], @@ -1570,11 +1570,11 @@ def rot_pole_toggle(rig: ArmatureObject, window='ALL', value=False, toggle=False # fk_ctrl = names['fk_ctrl'] parent = names['parent'] pole = names['pole'] - rig.pose.bones[controls[0]].bone.select = not new_pole_vector_value - rig.pose.bones[controls[6]].bone.select = not new_pole_vector_value - rig.pose.bones[controls[5]].bone.select = not new_pole_vector_value - rig.pose.bones[parent].bone.select = not new_pole_vector_value - rig.pose.bones[pole].bone.select = new_pole_vector_value + rig.pose.bones[controls[0]].select = not new_pole_vector_value + rig.pose.bones[controls[6]].select = not new_pole_vector_value + rig.pose.bones[controls[5]].select = not new_pole_vector_value + rig.pose.bones[parent].select = not new_pole_vector_value + rig.pose.bones[pole].select = new_pole_vector_value # noinspection SpellCheckingInspection kwargs1 = {'thigh_fk': controls[1], 'shin_fk': controls[2], 'foot_fk': controls[3], @@ -1711,7 +1711,7 @@ class OBJECT_OT_Rot2Pole(bpy.types.Operator): if self.bone_name: bpy.ops.pose.select_all(action='DESELECT') - rig.pose.bones[self.bone_name].bone.select = True + rig.pose.bones[self.bone_name].select = True rot_pole_toggle(rig, window=self.window, toggle=self.toggle, value=self.value, bake=self.bake) return {'FINISHED'} diff --git a/scripts/startup/bl_operators/bone_selection_sets.py b/scripts/startup/bl_operators/bone_selection_sets.py index f2be9944755..d97101d4471 100644 --- a/scripts/startup/bl_operators/bone_selection_sets.py +++ b/scripts/startup/bl_operators/bone_selection_sets.py @@ -247,7 +247,7 @@ class POSE_OT_selection_set_select(_NeedSelSetMixin, Operator): for bone in context.visible_pose_bones: if bone.name in sel_set.bone_ids: - bone.bone.select = True + bone.select = True return {'FINISHED'} @@ -264,7 +264,7 @@ class POSE_OT_selection_set_deselect(_NeedSelSetMixin, Operator): for bone in context.selected_pose_bones: if bone.name in act_sel_set.bone_ids: - bone.bone.select = False + bone.select = False return {'FINISHED'}