49 ebo->flag &= ~BONE_ROOTSEL;
57 ebo->flag &= ~BONE_SELECTED;
81 count += bone_func(ob, bone, data);
113 if (ebone->bbone_next == bone) {
114 ebone->bbone_next =
nullptr;
116 if (ebone->bbone_prev == bone) {
117 ebone->bbone_prev =
nullptr;
129 if (curBone->parent == exBone) {
130 curBone->parent = exBone->
parent;
131 if (clear_connected) {
132 curBone->
flag &= ~BONE_CONNECTED;
147 for (ebone_child = ebone_child->
parent; ebone_child; ebone_child = ebone_child->
parent) {
148 if (ebone_child == ebone_parent) {
157#define EBONE_TEMP_UINT(ebone) (*((uint *)(&((ebone)->temp))))
160 for (
uint i = 0; i < ebone_child_tot; i++) {
161 for (
EditBone *ebone_iter = ebone_child[i]; ebone_iter; ebone_iter = ebone_iter->
parent) {
167 for (
uint i = 0; i < ebone_child_tot; i++) {
168 for (
EditBone *ebone_iter = ebone_child[i]->parent; ebone_iter;
169 ebone_iter = ebone_iter->
parent)
176 for (
EditBone *ebone_iter = ebone_child[0]->parent; ebone_iter; ebone_iter = ebone_iter->
parent)
183#undef EBONE_TEMP_UINT
190 float delta[3], roll;
201 roll = ebone_parent->
roll;
258 if (ebo ==
nullptr) {
280 if (curBone->flag &
flag) {
283 ebone_mirr->
flag |= (curBone->flag &
flag);
300 curBone->flag &= ~BONE_DONE;
456 eBone->
flag = curBone->flag;
475 eBone->
flag &= ~BONE_ROOTSEL;
481 eBone->
roll = curBone->arm_roll;
484 eBone->
length = curBone->length;
485 eBone->
dist = curBone->dist;
486 eBone->
weight = curBone->weight;
487 eBone->
xwidth = curBone->xwidth;
488 eBone->
zwidth = curBone->zwidth;
489 eBone->
rad_head = curBone->rad_head;
490 eBone->
rad_tail = curBone->rad_tail;
491 eBone->
segments = curBone->segments;
492 eBone->
layer = curBone->layer;
495 eBone->
roll1 = curBone->roll1;
496 eBone->
roll2 = curBone->roll2;
501 eBone->
ease1 = curBone->ease1;
502 eBone->
ease2 = curBone->ease2;
515 eBone->
color = curBone->color;
525 if (curBone->childbase.first) {
528 eBoneAct = eBoneTest;
532 if (curBone == actBone) {
542 if (link !=
nullptr) {
544 if (ebone->temp.bone == link) {
560 Bone *bone = ebone->temp.bone;
588 if (curBone->parent) {
589 float parmat_inv[4][4];
594 sub_v3_v3v3(curBone->head, curBone->arm_head, curBone->parent->arm_tail);
595 sub_v3_v3v3(curBone->tail, curBone->arm_tail, curBone->parent->arm_tail);
611 if (ebone->temp.bone == curBone) {
627 printf(
"Bone %s\n", curBone->name);
631 printf(
"Roll = %f\n",
RAD2DEGF(-atan2(difmat[2][0], difmat[2][2])));
634 curBone->roll = -
atan2f(difmat[2][0], difmat[2][2]);
661 neBone = eBone->
next;
663 if (len_sq <=
square_f(0.000001f)) {
666 if (fBone->parent == eBone) {
671 printf(
"Warning: removed zero sized bone: %s\n", eBone->
name);
698 newBone->
roll = 0.0f;
734 "ED_armature_from_edit", *ref);
777 if (obt->
data == arm) {
822 for (ebone =
static_cast<EditBone *
>(lb->
first); ebone; ebone = ebone_next) {
823 ebone_next = ebone->
next;
843 if (ebone_dst->
prop) {
847 ebone_src->temp.ebone = ebone_dst;
853 if (ebone_dst->parent) {
854 ebone_dst->parent = ebone_dst->parent->temp.ebone;
856 if (ebone_dst->bbone_next) {
857 ebone_dst->bbone_next = ebone_dst->bbone_next->temp.ebone;
859 if (ebone_dst->bbone_prev) {
860 ebone_dst->bbone_prev = ebone_dst->bbone_prev->temp.ebone;
871 ebone->temp.p =
nullptr;
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
bool ANIM_bonecoll_is_visible_editbone(const bArmature *armature, const EditBone *ebone)
void ANIM_armature_bonecoll_reconstruct(bArmature *armature)
void BKE_armature_bone_hash_make(bArmature *arm)
void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, bool do_id_user)
void BKE_armature_bonelist_free(ListBase *lb, bool do_id_user)
void BKE_armature_where_is_bone(Bone *bone, const Bone *bone_parent, bool use_recursion)
void mat3_to_vec_roll(const float mat[3][3], float r_vec[3], float *r_roll)
void BKE_armature_bone_hash_free(bArmature *arm)
void vec_roll_to_mat3_normalized(const float nor[3], float roll, float r_mat[3][3])
void IDP_FreeProperty(IDProperty *prop)
IDProperty * IDP_CopyProperty_ex(const IDProperty *prop, int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_FreeProperty_ex(IDProperty *prop, bool do_id_user)
@ LIB_ID_CREATE_NO_USER_REFCOUNT
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define BLI_ASSERT_UNIT_M3(m)
MINLINE float square_f(float a)
void copy_m3_m4(float m1[3][3], const float m2[4][4])
bool invert_m3_m3(float inverse[3][3], const float mat[3][3])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void print_m4(const char *str, const float m[4][4])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
#define STRNCPY(dst, src)
size_t BLI_string_flip_side_name(char *name_dst, const char *name_src, bool strip_number, size_t name_dst_maxncpy) ATTR_NONNULL(1
void DEG_id_tag_update(ID *id, unsigned int flags)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
bool ED_armature_ebone_is_child_recursive(EditBone *ebone_parent, EditBone *ebone_child)
void ED_armature_ebone_selectflag_disable(EditBone *ebone, int flag)
void ED_armature_edit_transform_mirror_update(Object *obedit)
void ED_armature_ebone_transform_mirror_update(bArmature *arm, EditBone *ebo, bool check_select)
static EditBone * make_boneList_recursive(ListBase *edbo, ListBase *bones, EditBone *parent, Bone *actBone)
EditBone * ED_armature_ebone_find_name(const ListBase *edbo, const char *name)
void armature_tag_select_mirrored(bArmature *arm)
int bone_looper(Object *ob, Bone *bone, void *data, int(*bone_func)(Object *, Bone *, void *))
void ED_armature_ebone_listbase_temp_clear(ListBase *lb)
void ED_armature_ebone_from_mat3(EditBone *ebone, const float mat[3][3])
void ED_armature_ebone_to_mat4(EditBone *ebone, float r_mat[4][4])
void ED_armature_ebone_remove_ex(bArmature *arm, EditBone *exBone, bool clear_connected)
void ED_armature_edit_sync_selection(ListBase *edbo)
int ED_armature_ebone_selectflag_get(const EditBone *ebone)
void ED_armature_ebone_selectflag_set(EditBone *ebone, int flag)
void armature_select_mirrored_ex(bArmature *arm, const int flag)
void ED_armature_ebone_select_set(EditBone *ebone, bool select)
void ED_armature_edit_free(bArmature *arm)
static void copy_bonecollection_membership(EditBone *eBone, const Bone *bone)
void ED_armature_ebone_listbase_free(ListBase *lb, const bool do_id_user)
static void armature_finalize_restpose(ListBase *bonelist, ListBase *editbonelist)
void armature_select_mirrored(bArmature *arm)
EditBone * ED_armature_ebone_find_shared_parent(EditBone *ebone_child[], const uint ebone_child_tot)
void ED_armature_ebone_to_mat3(EditBone *ebone, float r_mat[3][3])
void ED_armature_ebone_listbase_copy(ListBase *lb_dst, ListBase *lb_src, const bool do_id_user)
void ED_armature_from_edit(Main *bmain, bArmature *arm)
void ED_armature_ebone_selectflag_enable(EditBone *ebone, int flag)
void armature_tag_unselect(bArmature *arm)
void ED_armature_ebone_remove(bArmature *arm, EditBone *exBone)
void ED_armature_ebone_from_mat4(EditBone *ebone, const float mat[4][4])
#define EBONE_TEMP_UINT(ebone)
EditBone * make_boneList(ListBase *edbo, ListBase *bones, Bone *actBone)
void bone_free(bArmature *arm, EditBone *bone)
void ED_armature_to_edit(bArmature *arm)
static EditBone * find_ebone_link(ListBase *edbo, Bone *link)
EditBone * ED_armature_ebone_get_mirrored(const ListBase *edbo, EditBone *ebo)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
ListBase bone_collections
eBone_BBoneMappingMode bbone_mapping_mode
struct EditBone * act_edbone