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:
Sybren A. Stüvel
2023-07-27 14:14:40 +02:00
parent 6a03f3a575
commit e604f3db91
33 changed files with 271 additions and 39 deletions
+1
View File
@@ -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)
@@ -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
View 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()
@@ -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);
}
+1
View File
@@ -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) {
+4 -2
View File
@@ -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
+3 -1
View File
@@ -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);
+1
View File
@@ -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