static int armature_dissolve_selected_exec(bContext *C, wmOperator *UNUSED(op)) { bArmature *arm; EditBone *ebone, *ebone_next; Object *obedit = CTX_data_edit_object(C); bool changed = false; /* store for mirror */ GHash *ebone_flag_orig = NULL; int ebone_num = 0; arm = obedit->data; for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { ebone->temp.p = NULL; ebone->flag &= ~BONE_DONE; ebone_num++; } if (arm->flag & ARM_MIRROR_EDIT) { GHashIterator gh_iter; ebone_flag_orig = BLI_ghash_ptr_new_ex(__func__, ebone_num); for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { union { int flag; void *p; } val = {0}; val.flag = ebone->flag; BLI_ghash_insert(ebone_flag_orig, ebone, val.p); } armature_select_mirrored_ex(arm, BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL); GHASH_ITER (gh_iter, ebone_flag_orig) { union { int flag; void *p; } *val_p = (void *)BLI_ghashIterator_getValue_p(&gh_iter); ebone = BLI_ghashIterator_getKey(&gh_iter); val_p->flag = ebone->flag & ~val_p->flag; } }
void armature_select_mirrored(bArmature *arm) { armature_select_mirrored_ex(arm, BONE_SELECTED); }