Refactor: Anim, abstractions for armature layers
Add an API for armature layer access. Instead of accessing `arm->layer` and friends directly, the code now uses this API. This will make things easier to replace by bone collections in the future. The functions are named "bonecoll" (short for "bone collection"), as that's the soon-to-be-introduced replacement for armature layers. This API is the first step towards that replacement, and should help to reduce the changes necessary when functional changes are committed. This also creates a new module `source/blender/animrig` for Animation & Rigging code. This will, for example, house the bone collection system in the near future. There is a bunch of code currently spread across blenkernel and editors in a rather ad-hoc way; it is intended that at some point that code gets moved into `animrig` as well (or at least the subset of that code where such a move makes sense; brain still required). Ref: #108941 No functional changes.
This commit is contained in:
@@ -131,6 +131,7 @@ set(SRC_DNA_DEFAULTS_INC
|
||||
add_subdirectory(datatoc)
|
||||
add_subdirectory(editors)
|
||||
add_subdirectory(windowmanager)
|
||||
add_subdirectory(animrig)
|
||||
add_subdirectory(asset_system)
|
||||
add_subdirectory(blenkernel)
|
||||
add_subdirectory(blenlib)
|
||||
|
||||
83
source/blender/animrig/ANIM_bone_collections.h
Normal file
83
source/blender/animrig/ANIM_bone_collections.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/* SPDX-FileCopyrightText: 2023 Blender Foundation
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
/** \file
|
||||
* \ingroup animrig
|
||||
*
|
||||
* \brief Functions to deal with Armature collections (i.e. the successor of bone layers).
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "BLI_math_bits.h"
|
||||
|
||||
#include "BKE_armature.h"
|
||||
|
||||
#include "DNA_action_types.h"
|
||||
#include "DNA_armature_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct bArmature;
|
||||
struct Bone;
|
||||
struct bPoseChannel;
|
||||
struct EditBone;
|
||||
|
||||
/**
|
||||
* Armature/Bone Layer abstractions. These functions are intended as the sole
|
||||
* accessors for `bone->layer`, `armature->layer`, etc. to get a grip on which
|
||||
* queries & operations are performed.
|
||||
*
|
||||
* The functions are named "bonecoll" (short for "bone collection"), as that's
|
||||
* the soon-to-be-introduced replacement for armature layers. This API is the
|
||||
* first step towards replacement.
|
||||
*/
|
||||
|
||||
inline bool ANIM_bonecoll_is_visible(const struct bArmature *armature, const struct Bone *bone)
|
||||
{
|
||||
return armature->layer & bone->layer;
|
||||
}
|
||||
|
||||
inline bool ANIM_bone_is_visible(const struct bArmature *armature, const struct Bone *bone)
|
||||
{
|
||||
const bool bone_itself_visible = (bone->flag & (BONE_HIDDEN_P | BONE_HIDDEN_PG)) == 0;
|
||||
return bone_itself_visible && ANIM_bonecoll_is_visible(armature, bone);
|
||||
}
|
||||
|
||||
inline bool ANIM_bonecoll_is_visible_editbone(const struct bArmature *armature,
|
||||
const struct EditBone *ebone)
|
||||
{
|
||||
return armature->layer & ebone->layer;
|
||||
}
|
||||
|
||||
inline bool ANIM_bonecoll_is_visible_pchan(const struct bArmature *armature,
|
||||
const struct bPoseChannel *pchan)
|
||||
{
|
||||
return ANIM_bonecoll_is_visible(armature, pchan->bone);
|
||||
}
|
||||
|
||||
inline bool ANIM_bonecoll_is_visible_actbone(const struct bArmature *armature)
|
||||
{
|
||||
return ANIM_bonecoll_is_visible(armature, armature->act_bone);
|
||||
}
|
||||
|
||||
void ANIM_armature_enable_layers(struct bArmature *armature, const int layers);
|
||||
void ANIM_armature_disable_all_layers(struct bArmature *armature);
|
||||
void ANIM_bone_set_layer_ebone(struct EditBone *ebone, int layer);
|
||||
void ANIM_bone_set_ebone_layer_from_armature(struct EditBone *ebone,
|
||||
const struct bArmature *armature);
|
||||
void ANIM_armature_ensure_first_layer_enabled(struct bArmature *armature);
|
||||
void ANIM_armature_ensure_layer_enabled_from_bone(struct bArmature *armature,
|
||||
const struct Bone *bone);
|
||||
void ANIM_armature_ensure_layer_enabled_from_ebone(struct bArmature *armature,
|
||||
const struct EditBone *ebone);
|
||||
void ANIM_armature_ensure_layer_enabled_from_pchan(struct bArmature *armature,
|
||||
const struct bPoseChannel *pchan);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
39
source/blender/animrig/CMakeLists.txt
Normal file
39
source/blender/animrig/CMakeLists.txt
Normal file
@@ -0,0 +1,39 @@
|
||||
# SPDX-FileCopyrightText: 2023 Blender Foundation
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
set(INC
|
||||
PUBLIC .
|
||||
intern
|
||||
|
||||
../blenkernel
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
)
|
||||
|
||||
set(SRC
|
||||
intern/bone_collections.cc
|
||||
|
||||
ANIM_bone_collections.h
|
||||
)
|
||||
|
||||
set(LIB
|
||||
bf_blenkernel
|
||||
bf::blenlib
|
||||
bf::dna
|
||||
)
|
||||
|
||||
|
||||
blender_add_lib(bf_animrig "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
|
||||
add_library(bf::animrig ALIAS bf_animrig)
|
||||
|
||||
# if(WITH_GTESTS)
|
||||
# set(TEST_SRC
|
||||
# )
|
||||
# set(TEST_LIB
|
||||
# PRIVATE bf::animrig
|
||||
# )
|
||||
# include(GTestTesting)
|
||||
# blender_add_test_lib(bf_animrig_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB};${TEST_LIB}")
|
||||
# endif()
|
||||
62
source/blender/animrig/intern/bone_collections.cc
Normal file
62
source/blender/animrig/intern/bone_collections.cc
Normal file
@@ -0,0 +1,62 @@
|
||||
/* SPDX-FileCopyrightText: 2023 Blender Foundation
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
/** \file
|
||||
* \ingroup animrig
|
||||
*/
|
||||
|
||||
#include "DNA_armature_types.h"
|
||||
|
||||
#include "BLI_math_bits.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
/* ********************************* */
|
||||
/* Armature Layers transitional API. */
|
||||
|
||||
void ANIM_armature_enable_layers(bArmature *armature, const int layers)
|
||||
{
|
||||
armature->layer |= layers;
|
||||
}
|
||||
|
||||
void ANIM_armature_disable_all_layers(bArmature *armature)
|
||||
{
|
||||
armature->layer = 0;
|
||||
}
|
||||
|
||||
void ANIM_bone_set_layer_ebone(EditBone *ebone, const int layer)
|
||||
{
|
||||
ebone->layer = layer;
|
||||
}
|
||||
|
||||
void ANIM_bone_set_ebone_layer_from_armature(EditBone *ebone, const bArmature *armature)
|
||||
{
|
||||
ebone->layer = armature->layer;
|
||||
}
|
||||
|
||||
void ANIM_armature_ensure_first_layer_enabled(bArmature *armature)
|
||||
{
|
||||
armature->layer = 1;
|
||||
}
|
||||
|
||||
void ANIM_armature_ensure_layer_enabled_from_bone(bArmature *armature, const Bone *bone)
|
||||
{
|
||||
if (ANIM_bonecoll_is_visible(armature, bone)) {
|
||||
return;
|
||||
}
|
||||
armature->layer |= 1U << bitscan_forward_uint(bone->layer);
|
||||
}
|
||||
|
||||
void ANIM_armature_ensure_layer_enabled_from_ebone(bArmature *armature, const EditBone *ebone)
|
||||
{
|
||||
if (ANIM_bonecoll_is_visible_editbone(armature, ebone)) {
|
||||
return;
|
||||
}
|
||||
armature->layer |= 1U << bitscan_forward_uint(ebone->layer);
|
||||
}
|
||||
|
||||
void ANIM_armature_ensure_layer_enabled_from_pchan(bArmature *armature, const bPoseChannel *pchan)
|
||||
{
|
||||
ANIM_armature_ensure_layer_enabled_from_bone(armature, pchan->bone);
|
||||
}
|
||||
@@ -814,6 +814,7 @@ endforeach()
|
||||
blender_add_lib(bf_draw_shaders "${GLSL_C}" "" "" "")
|
||||
|
||||
list(APPEND LIB
|
||||
PRIVATE bf::animrig
|
||||
bf_draw_shaders
|
||||
)
|
||||
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
#include "ED_armature.h"
|
||||
#include "ED_view3d.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "UI_resources.h"
|
||||
|
||||
#include "draw_common.h"
|
||||
@@ -2560,7 +2562,7 @@ static void draw_armature_edit(const ArmatureDrawContext *ctx)
|
||||
eBone;
|
||||
eBone = eBone->next, index += 0x10000)
|
||||
{
|
||||
if ((eBone->layer & arm->layer) == 0) {
|
||||
if (!ANIM_bonecoll_is_visible_editbone(arm, eBone)) {
|
||||
continue;
|
||||
}
|
||||
if (eBone->flag & BONE_HIDDEN_A) {
|
||||
|
||||
@@ -44,6 +44,7 @@ set(SRC
|
||||
|
||||
set(LIB
|
||||
bf_blenkernel
|
||||
PRIVATE bf::animrig
|
||||
PRIVATE bf::blenlib
|
||||
PRIVATE bf::dna
|
||||
PRIVATE bf::intern::guardedalloc
|
||||
|
||||
@@ -89,6 +89,8 @@
|
||||
#include "SEQ_sequencer.h"
|
||||
#include "SEQ_utils.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "UI_resources.h" /* for TH_KEYFRAME_SCALE lookup */
|
||||
|
||||
/* ************************************************************ */
|
||||
@@ -1038,7 +1040,7 @@ static bool skip_fcurve_selected_data(bDopeSheet *ads, FCurve *fcu, ID *owner_id
|
||||
bArmature *arm = (bArmature *)ob->data;
|
||||
|
||||
/* skipping - not visible on currently visible layers */
|
||||
if ((arm->layer & pchan->bone->layer) == 0) {
|
||||
if (!ANIM_bonecoll_is_visible_pchan(arm, pchan)) {
|
||||
return true;
|
||||
}
|
||||
/* skipping - is currently hidden */
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
#include "ED_anim_api.h"
|
||||
#include "ED_keyframes_keylist.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "CLG_log.h"
|
||||
|
||||
static CLG_LogRef LOG = {"ed.anim.motion_paths"};
|
||||
@@ -112,7 +114,7 @@ void animviz_get_object_motionpaths(Object *ob, ListBase *targets)
|
||||
|
||||
for (pchan = static_cast<bPoseChannel *>(ob->pose->chanbase.first); pchan; pchan = pchan->next)
|
||||
{
|
||||
if ((pchan->bone) && (arm->layer & pchan->bone->layer) && (pchan->mpath)) {
|
||||
if ((pchan->bone) && ANIM_bonecoll_is_visible_pchan(arm, pchan) && (pchan->mpath)) {
|
||||
/* new target for bone */
|
||||
mpt = static_cast<MPathTarget *>(MEM_callocN(sizeof(MPathTarget), "MPathTarget PoseBone"));
|
||||
BLI_addtail(targets, mpt);
|
||||
|
||||
@@ -57,6 +57,8 @@
|
||||
#include "ED_object.h"
|
||||
#include "ED_screen.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
#include "UI_resources.h"
|
||||
|
||||
@@ -2436,7 +2438,7 @@ static int delete_key_v3d_without_keying_set(bContext *C, wmOperator *op)
|
||||
bArmature *arm = (bArmature *)ob->data;
|
||||
|
||||
/* skipping - not visible on currently visible layers */
|
||||
if ((arm->layer & pchan->bone->layer) == 0) {
|
||||
if (!ANIM_bonecoll_is_visible_pchan(arm, pchan)) {
|
||||
continue;
|
||||
}
|
||||
/* skipping - is currently hidden */
|
||||
|
||||
@@ -46,6 +46,7 @@ set(SRC
|
||||
)
|
||||
|
||||
set(LIB
|
||||
PRIVATE bf::animrig
|
||||
bf_blenkernel
|
||||
PRIVATE bf::blenlib
|
||||
PRIVATE bf::dna
|
||||
|
||||
@@ -43,6 +43,8 @@
|
||||
#include "ED_screen.h"
|
||||
#include "ED_view3d.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "armature_intern.h"
|
||||
@@ -66,7 +68,7 @@ EditBone *ED_armature_ebone_add(bArmature *arm, const char *name)
|
||||
bone->rad_head = 0.10f;
|
||||
bone->rad_tail = 0.05f;
|
||||
bone->segments = 1;
|
||||
bone->layer = arm->layer;
|
||||
ANIM_bone_set_ebone_layer_from_armature(bone, arm);
|
||||
|
||||
/* Bendy-Bone parameters */
|
||||
bone->roll1 = 0.0f;
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
#include "ED_screen.h"
|
||||
#include "ED_view3d.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "armature_intern.h"
|
||||
@@ -1221,7 +1223,7 @@ static bool armature_delete_ebone_cb(const char *bone_name, void *arm_p)
|
||||
EditBone *ebone;
|
||||
|
||||
ebone = ED_armature_ebone_find_name(arm->edbo, bone_name);
|
||||
return (ebone && (ebone->flag & BONE_SELECTED) && (arm->layer & ebone->layer));
|
||||
return (ebone && (ebone->flag & BONE_SELECTED) && ANIM_bonecoll_is_visible_editbone(arm, ebone));
|
||||
}
|
||||
|
||||
/* previously delete_armature */
|
||||
@@ -1252,7 +1254,7 @@ static int armature_delete_selected_exec(bContext *C, wmOperator * /*op*/)
|
||||
|
||||
for (curBone = static_cast<EditBone *>(arm->edbo->first); curBone; curBone = ebone_next) {
|
||||
ebone_next = curBone->next;
|
||||
if (arm->layer & curBone->layer) {
|
||||
if (ANIM_bonecoll_is_visible_editbone(arm, curBone)) {
|
||||
if (curBone->flag & BONE_SELECTED) {
|
||||
if (curBone == arm->act_edbone) {
|
||||
arm->act_edbone = nullptr;
|
||||
@@ -1384,13 +1386,13 @@ static int armature_dissolve_selected_exec(bContext *C, wmOperator * /*op*/)
|
||||
|
||||
for (ebone = static_cast<EditBone *>(arm->edbo->first); ebone; ebone = ebone->next) {
|
||||
/* break connections for unseen bones */
|
||||
if (((arm->layer & ebone->layer) &&
|
||||
if ((ANIM_bonecoll_is_visible_editbone(arm, ebone) &&
|
||||
(ED_armature_ebone_selectflag_get(ebone) & (BONE_TIPSEL | BONE_SELECTED))) == 0)
|
||||
{
|
||||
ebone->temp.ebone = nullptr;
|
||||
}
|
||||
|
||||
if (((arm->layer & ebone->layer) &&
|
||||
if ((ANIM_bonecoll_is_visible_editbone(arm, ebone) &&
|
||||
(ED_armature_ebone_selectflag_get(ebone) & (BONE_ROOTSEL | BONE_SELECTED))) == 0)
|
||||
{
|
||||
if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
|
||||
@@ -1565,7 +1567,7 @@ static int armature_reveal_exec(bContext *C, wmOperator *op)
|
||||
bool changed = false;
|
||||
|
||||
LISTBASE_FOREACH (EditBone *, ebone, arm->edbo) {
|
||||
if (arm->layer & ebone->layer) {
|
||||
if (ANIM_bonecoll_is_visible_editbone(arm, ebone)) {
|
||||
if (ebone->flag & BONE_HIDDEN_A) {
|
||||
if (!(ebone->flag & BONE_UNSELECTABLE)) {
|
||||
SET_FLAG_FROM_TEST(ebone->flag, select, (BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL));
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
#include "ED_armature.h"
|
||||
#include "ED_mesh.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "armature_intern.h"
|
||||
#include "meshlaplacian.h"
|
||||
|
||||
@@ -159,7 +161,9 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
|
||||
segments = 1;
|
||||
}
|
||||
|
||||
if (!data->is_weight_paint || ((arm->layer & bone->layer) && (bone->flag & BONE_SELECTED))) {
|
||||
if (!data->is_weight_paint ||
|
||||
(ANIM_bonecoll_is_visible(arm, bone) && (bone->flag & BONE_SELECTED)))
|
||||
{
|
||||
if (!(defgroup = BKE_object_defgroup_find_name(ob, bone->name))) {
|
||||
defgroup = BKE_object_defgroup_add_name(ob, bone->name);
|
||||
}
|
||||
@@ -376,7 +380,7 @@ static void add_verts_to_dgroups(ReportList *reports,
|
||||
|
||||
/* set selected */
|
||||
if (wpmode) {
|
||||
if ((arm->layer & bone->layer) && (bone->flag & BONE_SELECTED)) {
|
||||
if (ANIM_bonecoll_is_visible(arm, bone) && (bone->flag & BONE_SELECTED)) {
|
||||
selected[j] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include "ED_armature.h"
|
||||
#include "ED_util.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "armature_intern.h"
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
@@ -297,7 +299,7 @@ void armature_select_mirrored_ex(bArmature *arm, const int flag)
|
||||
EditBone *curBone, *ebone_mirr;
|
||||
|
||||
for (curBone = static_cast<EditBone *>(arm->edbo->first); curBone; curBone = curBone->next) {
|
||||
if (arm->layer & curBone->layer) {
|
||||
if (ANIM_bonecoll_is_visible_editbone(arm, curBone)) {
|
||||
if (curBone->flag & flag) {
|
||||
ebone_mirr = ED_armature_ebone_get_mirrored(arm->edbo, curBone);
|
||||
if (ebone_mirr) {
|
||||
@@ -326,7 +328,7 @@ void armature_tag_select_mirrored(bArmature *arm)
|
||||
/* Select mirrored bones */
|
||||
if (arm->flag & ARM_MIRROR_EDIT) {
|
||||
for (curBone = static_cast<EditBone *>(arm->edbo->first); curBone; curBone = curBone->next) {
|
||||
if (arm->layer & curBone->layer) {
|
||||
if (ANIM_bonecoll_is_visible_editbone(arm, curBone)) {
|
||||
if (curBone->flag & (BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL)) {
|
||||
EditBone *ebone_mirr = ED_armature_ebone_get_mirrored(arm->edbo, curBone);
|
||||
if (ebone_mirr && (ebone_mirr->flag & BONE_SELECTED) == 0) {
|
||||
|
||||
@@ -50,6 +50,8 @@
|
||||
#include "ED_screen.h"
|
||||
#include "ED_view3d.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
|
||||
#include "armature_intern.h"
|
||||
@@ -995,7 +997,7 @@ static int hide_pose_bone_fn(Object *ob, Bone *bone, void *ptr)
|
||||
bArmature *arm = static_cast<bArmature *>(ob->data);
|
||||
const bool hide_select = bool(POINTER_AS_INT(ptr));
|
||||
int count = 0;
|
||||
if (arm->layer & bone->layer) {
|
||||
if (ANIM_bonecoll_is_visible(arm, bone)) {
|
||||
if (((bone->flag & BONE_SELECTED) != 0) == hide_select) {
|
||||
bone->flag |= BONE_HIDDEN_P;
|
||||
/* only needed when 'hide_select' is true, but harmless. */
|
||||
@@ -1065,7 +1067,7 @@ static int show_pose_bone_cb(Object *ob, Bone *bone, void *data)
|
||||
|
||||
bArmature *arm = static_cast<bArmature *>(ob->data);
|
||||
int count = 0;
|
||||
if (arm->layer & bone->layer) {
|
||||
if (ANIM_bonecoll_is_visible(arm, bone)) {
|
||||
if (bone->flag & BONE_HIDDEN_P) {
|
||||
if (!(bone->flag & BONE_UNSELECTABLE)) {
|
||||
SET_FLAG_FROM_TEST(bone->flag, select, BONE_SELECTED);
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
#include "ED_screen.h"
|
||||
#include "ED_util.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
#include "UI_resources.h"
|
||||
|
||||
@@ -605,7 +607,7 @@ static void set_pose_keys(Object *ob)
|
||||
if (ob->pose) {
|
||||
for (chan = static_cast<bPoseChannel *>(ob->pose->chanbase.first); chan; chan = chan->next) {
|
||||
Bone *bone = chan->bone;
|
||||
if ((bone) && (bone->flag & BONE_SELECTED) && (arm->layer & bone->layer)) {
|
||||
if ((bone) && (bone->flag & BONE_SELECTED) && ANIM_bonecoll_is_visible(arm, bone)) {
|
||||
chan->flag |= POSE_KEY;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -57,6 +57,7 @@ set(SRC
|
||||
)
|
||||
|
||||
set(LIB
|
||||
PRIVATE bf::animrig
|
||||
bf_blenkernel
|
||||
PRIVATE bf::blenlib
|
||||
PRIVATE bf::dna
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
#include "ED_mesh.h"
|
||||
#include "ED_object.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
@@ -203,7 +205,7 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
|
||||
segments = 1;
|
||||
}
|
||||
|
||||
if (arm->layer & bone->layer) {
|
||||
if (ANIM_bonecoll_is_visible(arm, bone)) {
|
||||
if (!(defgroup = BKE_object_defgroup_find_name(ob, bone->name))) {
|
||||
defgroup = BKE_object_defgroup_add_name(ob, bone->name);
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ set(SRC
|
||||
)
|
||||
|
||||
set(LIB
|
||||
PRIVATE bf::animrig
|
||||
bf_blenkernel
|
||||
PRIVATE bf::blenlib
|
||||
PRIVATE bf::dna
|
||||
|
||||
@@ -89,6 +89,8 @@
|
||||
#include "ED_screen.h"
|
||||
#include "ED_sculpt.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
@@ -2957,7 +2959,7 @@ static Object *modifier_skin_armature_create(Depsgraph *depsgraph, Main *bmain,
|
||||
Object *arm_ob = BKE_object_add(bmain, scene, view_layer, OB_ARMATURE, nullptr);
|
||||
BKE_object_transform_copy(arm_ob, skin_ob);
|
||||
bArmature *arm = static_cast<bArmature *>(arm_ob->data);
|
||||
arm->layer = 1;
|
||||
ANIM_armature_ensure_first_layer_enabled(arm);
|
||||
arm_ob->dtx |= OB_DRAW_IN_FRONT;
|
||||
arm->drawtype = ARM_LINE;
|
||||
arm->edbo = MEM_cnew<ListBase>("edbo armature");
|
||||
|
||||
@@ -61,6 +61,8 @@
|
||||
#include "ED_screen.h"
|
||||
#include "ED_select_utils.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
#include "UI_resources.h"
|
||||
|
||||
@@ -311,10 +313,7 @@ bool ED_object_jump_to_bone(bContext *C,
|
||||
if (reveal_hidden) {
|
||||
/* Unhide the bone. */
|
||||
ebone->flag &= ~BONE_HIDDEN_A;
|
||||
|
||||
if ((arm->layer & ebone->layer) == 0) {
|
||||
arm->layer |= 1U << bitscan_forward_uint(ebone->layer);
|
||||
}
|
||||
ANIM_armature_ensure_layer_enabled_from_ebone(arm, ebone);
|
||||
}
|
||||
|
||||
/* Select it. */
|
||||
@@ -338,10 +337,7 @@ bool ED_object_jump_to_bone(bContext *C,
|
||||
if (reveal_hidden) {
|
||||
/* Unhide the bone. */
|
||||
pchan->bone->flag &= ~BONE_HIDDEN_P;
|
||||
|
||||
if ((arm->layer & pchan->bone->layer) == 0) {
|
||||
arm->layer |= 1U << bitscan_forward_uint(pchan->bone->layer);
|
||||
}
|
||||
ANIM_armature_ensure_layer_enabled_from_pchan(arm, pchan);
|
||||
}
|
||||
|
||||
/* Select it. */
|
||||
|
||||
@@ -78,6 +78,7 @@ set(SRC
|
||||
)
|
||||
|
||||
set(LIB
|
||||
PRIVATE bf::animrig
|
||||
PRIVATE bf::blenlib
|
||||
PRIVATE bf::dna
|
||||
bf_editor_curves
|
||||
|
||||
@@ -55,6 +55,8 @@
|
||||
#include "ED_object.h"
|
||||
#include "ED_screen.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
#include "UI_resources.h"
|
||||
|
||||
@@ -1630,7 +1632,7 @@ static void v3d_editarmature_buts(uiLayout *layout, Object *ob)
|
||||
|
||||
ebone = arm->act_edbone;
|
||||
|
||||
if (!ebone || (ebone->layer & arm->layer) == 0) {
|
||||
if (!ebone || !ANIM_bonecoll_is_visible_editbone(arm, ebone)) {
|
||||
uiItemL(layout, IFACE_("Nothing selected"), ICON_NONE);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
#include "ED_view3d_offscreen.h"
|
||||
#include "ED_viewer_path.hh"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "GPU_batch.h"
|
||||
@@ -1371,7 +1373,7 @@ static void draw_selected_name(
|
||||
else if (ob->mode & OB_MODE_POSE) {
|
||||
if (arm->act_bone) {
|
||||
|
||||
if (arm->act_bone->layer & arm->layer) {
|
||||
if (ANIM_bonecoll_is_visible_actbone(arm)) {
|
||||
info_array[i++] = msg_sep;
|
||||
info_array[i++] = arm->act_bone->name;
|
||||
}
|
||||
@@ -1386,7 +1388,7 @@ static void draw_selected_name(
|
||||
if (armobj && armobj->mode & OB_MODE_POSE) {
|
||||
bArmature *arm = static_cast<bArmature *>(armobj->data);
|
||||
if (arm->act_bone) {
|
||||
if (arm->act_bone->layer & arm->layer) {
|
||||
if (ANIM_bonecoll_is_visible_actbone(arm)) {
|
||||
info_array[i++] = msg_sep;
|
||||
info_array[i++] = arm->act_bone->name;
|
||||
}
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
#include "ED_screen.h"
|
||||
#include "ED_transverts.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "view3d_intern.h"
|
||||
|
||||
static bool snap_curs_to_sel_ex(bContext *C, const int pivot_point, float r_cursor[3]);
|
||||
@@ -125,7 +127,7 @@ static int snap_sel_to_grid_exec(bContext *C, wmOperator * /*op*/)
|
||||
pchan_eval = pchan_eval->next)
|
||||
{
|
||||
if (pchan_eval->bone->flag & BONE_SELECTED) {
|
||||
if (pchan_eval->bone->layer & arm_eval->layer) {
|
||||
if (ANIM_bonecoll_is_visible_pchan(arm_eval, pchan_eval)) {
|
||||
if ((pchan_eval->bone->flag & BONE_CONNECTED) == 0) {
|
||||
float nLoc[3];
|
||||
|
||||
@@ -843,7 +845,7 @@ static bool snap_curs_to_sel_ex(bContext *C, const int pivot_point, float r_curs
|
||||
for (pchan = static_cast<bPoseChannel *>(obact_eval->pose->chanbase.first); pchan;
|
||||
pchan = pchan->next)
|
||||
{
|
||||
if (arm->layer & pchan->bone->layer) {
|
||||
if (ANIM_bonecoll_is_visible_pchan(arm, pchan)) {
|
||||
if (pchan->bone->flag & BONE_SELECTED) {
|
||||
copy_v3_v3(vec, pchan->pose_head);
|
||||
mul_m4_v3(obact_eval->object_to_world, vec);
|
||||
|
||||
@@ -115,6 +115,7 @@ set(SRC
|
||||
)
|
||||
|
||||
set(LIB
|
||||
PRIVATE bf::animrig
|
||||
bf_blenfont
|
||||
bf_blenkernel
|
||||
PRIVATE bf::blenlib
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
|
||||
#include "ED_armature.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "SEQ_select.h"
|
||||
|
||||
#include "transform.hh"
|
||||
@@ -551,7 +553,7 @@ static int armature_bone_transflags_update_recursive(bArmature *arm,
|
||||
bone->flag &= ~BONE_TRANSFORM;
|
||||
do_next = do_it;
|
||||
if (do_it) {
|
||||
if (bone->layer & arm->layer) {
|
||||
if (ANIM_bonecoll_is_visible(arm, bone)) {
|
||||
if (bone->flag & BONE_SELECTED) {
|
||||
bone->flag |= BONE_TRANSFORM;
|
||||
total++;
|
||||
@@ -1302,7 +1304,7 @@ int getTransformOrientation_ex(const Scene *scene,
|
||||
zero_v3(fallback_plane);
|
||||
|
||||
for (ebone = static_cast<EditBone *>(arm->edbo->first); ebone; ebone = ebone->next) {
|
||||
if (arm->layer & ebone->layer) {
|
||||
if (ANIM_bonecoll_is_visible_editbone(arm, ebone)) {
|
||||
if (ebone->flag & BONE_SELECTED) {
|
||||
ED_armature_ebone_to_mat3(ebone, tmat);
|
||||
add_v3_v3(normal, tmat[2]);
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
#include "ED_transform_snap_object_context.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "transform_snap_object.hh"
|
||||
|
||||
using blender::float4x4;
|
||||
@@ -56,7 +58,7 @@ eSnapMode snapArmature(SnapObjectContext *sctx,
|
||||
|
||||
if (arm->edbo) {
|
||||
LISTBASE_FOREACH (EditBone *, eBone, arm->edbo) {
|
||||
if (eBone->layer & arm->layer) {
|
||||
if (ANIM_bonecoll_is_visible_editbone(arm, eBone)) {
|
||||
if (eBone->flag & BONE_HIDDEN_A) {
|
||||
/* Skip hidden bones. */
|
||||
continue;
|
||||
|
||||
@@ -107,6 +107,7 @@ set(SRC
|
||||
)
|
||||
|
||||
set(LIB
|
||||
PRIVATE bf::animrig
|
||||
PRIVATE bf::blenlib
|
||||
PRIVATE bf::dna
|
||||
PRIVATE bf::intern::guardedalloc
|
||||
|
||||
@@ -34,6 +34,8 @@
|
||||
#include "ED_armature.h"
|
||||
#include "ED_curves.hh"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "ED_transverts.h" /* own include */
|
||||
|
||||
void ED_transverts_update_obedit(TransVertStore *tvs, Object *obedit)
|
||||
@@ -327,7 +329,7 @@ void ED_transverts_create_from_obedit(TransVertStore *tvs, const Object *obedit,
|
||||
MEM_callocN(totmalloc * sizeof(TransVert), __func__));
|
||||
|
||||
for (ebo = static_cast<EditBone *>(arm->edbo->first); ebo; ebo = ebo->next) {
|
||||
if (ebo->layer & arm->layer) {
|
||||
if (ANIM_bonecoll_is_visible_editbone(arm, ebo)) {
|
||||
const bool tipsel = (ebo->flag & BONE_TIPSEL) != 0;
|
||||
const bool rootsel = (ebo->flag & BONE_ROOTSEL) != 0;
|
||||
const bool rootok = !(ebo->parent && (ebo->flag & BONE_CONNECTED) &&
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#include "BLI_string.h"
|
||||
#include "ED_armature.h"
|
||||
|
||||
#include "ANIM_bone_collections.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "ArmatureImporter.h"
|
||||
@@ -139,9 +141,10 @@ int ArmatureImporter::create_bone(SkinInfo *skin,
|
||||
BoneExtended &be = add_bone_extended(bone, node, totchild, layer_labels, extended_bones);
|
||||
int layer = be.get_bone_layers();
|
||||
if (layer) {
|
||||
bone->layer = layer;
|
||||
ANIM_bone_set_layer_ebone(bone, layer);
|
||||
}
|
||||
arm->layer |= layer; /* ensure that all populated bone layers are visible after import */
|
||||
/* Ensure that all populated bone layers are visible after import. */
|
||||
ANIM_armature_enable_layers(arm, layer);
|
||||
|
||||
float *tail = be.get_tail();
|
||||
int use_connect = be.get_use_connect();
|
||||
@@ -486,7 +489,8 @@ void ArmatureImporter::create_armature_bones(Main *bmain, std::vector<Object *>
|
||||
}
|
||||
|
||||
ED_armature_to_edit(armature);
|
||||
armature->layer = 0; /* layer is set according to imported bone set in create_bone() */
|
||||
/* Layers are enabled according to imported bone set in create_bone(). */
|
||||
ANIM_armature_disable_all_layers(armature);
|
||||
|
||||
create_bone(
|
||||
nullptr, node, nullptr, node->getChildNodes().getCount(), nullptr, armature, layer_labels);
|
||||
|
||||
@@ -114,6 +114,7 @@ set(LIB
|
||||
${OPENCOLLADA_LIBRARIES}
|
||||
${PCRE_LIBRARIES}
|
||||
${XML2_LIBRARIES}
|
||||
PRIVATE bf::animrig
|
||||
PRIVATE bf::blenlib
|
||||
PRIVATE bf::dna
|
||||
PRIVATE bf::intern::guardedalloc
|
||||
|
||||
Reference in New Issue
Block a user