This PR changes the uses of `PBONE_SELECTED` and all the places where it *should* have been used with a new function `bone_is_selected` or `...editbone` and `...pose_bone` specializations. No functional changes intended. Do note that there are still places in the code where this function should probably be called, but this PR is very careful not to change any behavior, even if the current behavior is probably wrong. In preparation for storing pose bone selection state on the `bPoseChannel` Related to #138482 Pull Request: https://projects.blender.org/blender/blender/pulls/139496
62 lines
1.6 KiB
C++
62 lines
1.6 KiB
C++
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup bke
|
|
*/
|
|
|
|
#include "ANIM_armature.hh"
|
|
|
|
#include "BKE_armature.hh"
|
|
|
|
#include "BLI_listbase.h"
|
|
|
|
#include "DNA_armature_types.h"
|
|
|
|
namespace blender::bke {
|
|
|
|
namespace {
|
|
|
|
void find_selected_bones__visit_bone(const bArmature *armature,
|
|
SelectedBoneCallback callback,
|
|
SelectedBonesResult &result,
|
|
Bone *bone)
|
|
{
|
|
const bool is_selected = blender::animrig::bone_is_selected(armature, bone);
|
|
result.all_bones_selected &= is_selected;
|
|
result.no_bones_selected &= !is_selected;
|
|
|
|
if (is_selected) {
|
|
callback(bone);
|
|
}
|
|
|
|
LISTBASE_FOREACH (Bone *, child_bone, &bone->childbase) {
|
|
find_selected_bones__visit_bone(armature, callback, result, child_bone);
|
|
}
|
|
}
|
|
} // namespace
|
|
|
|
SelectedBonesResult BKE_armature_find_selected_bones(const bArmature *armature,
|
|
SelectedBoneCallback callback)
|
|
{
|
|
SelectedBonesResult result;
|
|
LISTBASE_FOREACH (Bone *, root_bone, &armature->bonebase) {
|
|
find_selected_bones__visit_bone(armature, callback, result, root_bone);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
BoneNameSet BKE_armature_find_selected_bone_names(const bArmature *armature)
|
|
{
|
|
BoneNameSet selected_bone_names;
|
|
|
|
/* Iterate over the selected bones to fill the set of bone names. */
|
|
auto callback = [&](Bone *bone) { selected_bone_names.add(bone->name); };
|
|
BKE_armature_find_selected_bones(armature, callback);
|
|
return selected_bone_names;
|
|
}
|
|
|
|
} // namespace blender::bke
|