106 const bool view_aligned)
141 EditBone *ebone, *newbone, *flipbone;
142 float mat[3][3], imat[3][3];
161 if (ebone ==
nullptr) {
170 if (ebone ==
nullptr) {
185 for (a = 0; a < 2; a++) {
187 if (flipbone ==
nullptr) {
190 std::swap(flipbone, ebone);
213 newbone->
tail[0] = -newbone->
tail[0];
216 copy_m3_m4(mat, obedit->object_to_world().ptr());
245 float tvec[3], oldcurs[3], mval_f[2];
275 ot->name =
"Extrude to Cursor";
276 ot->idname =
"ARMATURE_OT_click_extrude";
277 ot->description =
"Create a new bone going from the last selected joint to the mouse position";
318 const char *name_src = pchan_src->
name;
324 if (pchan_dst ==
nullptr) {
325 pchan_dst = pchan_src;
333 if (ob->
pose ==
nullptr) {
349 name_map.
add_as(ebone_src->name, ebone_dst->
name);
383 const bool lookup_mirror_subtarget)
401 ListBase targets = {
nullptr,
nullptr};
407 if (!ct->tar || !ct->subtarget[0]) {
410 Object *target_ob = ct->tar;
423 oldtarget = (ob == target_ob) ?
426 if (oldtarget && oldtarget->
temp.
ebone) {
430 else if (lookup_mirror_subtarget) {
433 STRNCPY(ct->subtarget, flipped_bone->name);
460 float max_axis_val = 0;
463 for (
int i = 0;
i < 3;
i++) {
464 float cur_val =
fabsf(mat[0][
i]);
465 if (cur_val > max_axis_val) {
467 max_axis_val = cur_val;
477 if (act_con->
type < 10 && act_con->
type != max_axis) {
479 act_con->
min = -act_con->
min;
480 act_con->
max = -act_con->
max;
482 else if (act_con->
type == max_axis + 10) {
485 else if (act_con->
type == max_axis + 20) {
491 float min_vec[3], max_vec[3];
496 min_vec[0] = act_con->
min;
497 max_vec[0] = act_con->
max;
510 act_con->
min = min_vec[0];
511 act_con->
max = max_vec[0];
522 auto bone_name_filter = [&](
const FCurve &fcurve) ->
bool {
524 fcurve,
"pose.bones[", orig_bone->
name);
528 for (
const FCurve *old_curve : fcurves) {
530 char *old_path = new_curve->
rna_path;
541 const size_t slength = strlen(new_curve->
rna_path);
565 bezt->
vec[0][1] *= -1;
566 bezt->
vec[1][1] *= -1;
567 bezt->
vec[2][1] *= -1;
574 if (agrp ==
nullptr) {
582 BLI_assert_msg(cbag,
"If there are F-Curves for this slot, there should be a channelbag");
609 float local_mat[4][4], imat[4][4];
611 float min_vec[3], max_vec[3];
613 min_vec[0] = limit->
xmin;
614 min_vec[1] = limit->
ymin;
615 min_vec[2] = limit->
zmin;
617 max_vec[0] = limit->
xmax;
618 max_vec[1] = limit->
ymax;
619 max_vec[2] = limit->
zmax;
635 local_mat[3][0] = local_mat[3][1] = local_mat[3][2] = 0;
648 min_vec[1] = max_vec[1] * -1;
649 min_vec[2] = max_vec[2] * -1;
651 max_vec[1] = min_copy[1] * -1;
652 max_vec[2] = min_copy[2] * -1;
655 float min_x_copy = min_vec[0];
657 min_vec[0] = max_vec[0] * -1;
658 max_vec[0] = min_x_copy * -1;
673 limit->
xmin = min_vec[0];
674 limit->
ymin = min_vec[1];
675 limit->
zmin = min_vec[2];
677 limit->
xmax = max_vec[0];
678 limit->
ymax = max_vec[1];
679 limit->
zmax = max_vec[2];
688 float target_mat[4][4], own_mat[4][4], imat[4][4];
702 float old_min, old_max;
724 own_mat[3][0] = own_mat[3][1] = own_mat[3][2] = 0;
752 float imat_rot[4][4];
767 target_mat[3][0] = target_mat[3][1] = target_mat[3][2] = 0;
785 for (
int i = 0;
i < 3;
i++) {
804 for (
int i = 0;
i < 3;
i++) {
831 for (
int i = 0;
i < 3;
i++) {
924 switch (curcon->type) {
956 if (ob->
pose ==
nullptr) {
962 if (pchan->
custom !=
nullptr) {
980 if (shape_ob !=
nullptr) {
997 float limit_min = pose_bone->
limitmin[2];
999 pose_bone->
limitmax[2] = -limit_min;
1006 BLI_assert_msg(armature.
edbo !=
nullptr,
"Expecting the armature to be in edit mode");
1017 if (
STREQ(name_flip, collection->
name)) {
1022 if (!flipped_collection) {
1030 unassign_collections.
append(collection);
1031 assign_collections.
append(flipped_collection);
1048 if (src_bone->
prop) {
1077 memcpy(dest, source,
sizeof(*dest));
1092 if (name !=
nullptr) {
1099 copy_pchan(cur_bone, e_bone, src_ob, dst_ob);
1122 for (
Object *ob : objects) {
1125 EditBone *ebone_first_dupe =
nullptr;
1151 ebone_iter && ebone_iter != ebone_first_dupe;
1152 ebone_iter = ebone_iter->
next)
1159 const char *new_bone_name = ebone_iter->
name;
1161 if (do_flip_names) {
1163 new_bone_name_buff, ebone_iter->
name,
false,
sizeof(new_bone_name_buff));
1168 new_bone_name = new_bone_name_buff;
1174 if (!ebone_first_dupe) {
1175 ebone_first_dupe = ebone;
1182 ebone_iter && ebone_iter != ebone_first_dupe;
1183 ebone_iter = ebone_iter->
next)
1190 if (!ebone_iter->
parent) {
1230 ebone_iter && ebone_iter != ebone_first_dupe;
1231 ebone_iter = ebone_iter->
next)
1252 ot->name =
"Duplicate Selected Bone(s)";
1253 ot->idname =
"ARMATURE_OT_duplicate";
1254 ot->description =
"Make copies of the selected bones within the same armature";
1268 "Try to flip names of the bones, if possible, instead of adding a number extension");
1274 if (bone ==
nullptr) {
1282 return (mirror !=
nullptr) ? mirror : bone;
1304 for (
Object *obedit : objects) {
1307 EditBone *ebone_first_dupe =
nullptr;
1329 if (ebone_iter ==
nullptr) {
1335 if (
STREQ(name_flip, ebone_iter->
name)) {
1353 axis_delta = ebone->
head[axis] - ebone_iter->
head[axis];
1354 if (axis_delta == 0.0f) {
1356 axis_delta = ebone->
tail[axis] - ebone_iter->
tail[axis];
1358 if (axis_delta == 0.0f) {
1368 if (((axis_delta < 0.0f) ? -1 : 1) == direction) {
1384 ebone_iter && ebone_iter != ebone_first_dupe;
1385 ebone_iter = ebone_iter->
next)
1390 if (ebone_iter->
temp.
ebone !=
nullptr) {
1410 if (!
STREQ(name_flip, ebone_iter->
name)) {
1415 if (!ebone_first_dupe) {
1416 ebone_first_dupe = ebone;
1424 ebone_iter && ebone_iter != ebone_first_dupe;
1425 ebone_iter = ebone_iter->
next)
1434 ebone->
flag = (ebone->
flag & ~flag_copy) | (ebone_iter->
flag & flag_copy);
1438 if (copy_bone_colors) {
1446 if (ebone_iter->
parent ==
nullptr) {
1457 if (ebone_parent == ebone_iter->
parent) {
1463 if (ebone->
head[axis] != 0.0f) {
1470 ebone->
parent = ebone_parent;
1506 ebone_iter && ebone_iter != ebone_first_dupe;
1507 ebone_iter = ebone_iter->
next)
1516 ebone_iter && ebone_iter != ebone_first_dupe;
1517 ebone_iter = ebone_iter->
next)
1545 {-1,
"NEGATIVE_X", 0,
"-X to +X",
""},
1546 {+1,
"POSITIVE_X", 0,
"+X to -X",
""},
1547 {0,
nullptr, 0,
nullptr,
nullptr},
1551 ot->name =
"Symmetrize";
1552 ot->idname =
"ARMATURE_OT_symmetrize";
1553 ot->description =
"Enforce symmetry, make copies of the selection or use existing";
1564 arm_symmetrize_direction_items,
1567 "Which sides to copy from and to (when both are selected)");
1569 ot->srna,
"copy_bone_colors",
false,
"Bone Colors",
"Copy colors to existing bones");
1582 bool changed_multi =
false;
1592 for (
Object *ob : objects) {
1594 bool forked_iter = forked;
1596 EditBone *newbone =
nullptr, *ebone, *flipbone, *first =
nullptr;
1598 ExtrudePoint do_extrude;
1614 for (ebone =
static_cast<EditBone *
>(arm->
edbo->
first); ((ebone) && (ebone != first));
1615 ebone = ebone->
next)
1621 do_extrude = SKIP_EXTRUDE;
1623 do_extrude = TIP_EXTRUDE;
1627 if (ebone->parent && (ebone->parent->flag &
BONE_TIPSEL)) {
1631 do_extrude = ROOT_EXTRUDE;
1641 forked_iter =
false;
1647 if ((flipbone ==
nullptr) && (forked_iter)) {
1652 for (a = 0; a < 2; a++) {
1654 if (flipbone ==
nullptr) {
1657 std::swap(flipbone, ebone);
1663 if (do_extrude == TIP_EXTRUDE) {
1675 else if (do_extrude == ROOT_EXTRUDE) {
1687 newbone->
color = ebone->color;
1688 newbone->
drawtype = ebone->drawtype;
1690 newbone->
weight = ebone->weight;
1691 newbone->
dist = ebone->dist;
1692 newbone->
xwidth = ebone->xwidth;
1693 newbone->
zwidth = ebone->zwidth;
1694 newbone->
rad_head = ebone->rad_tail;
1695 newbone->
rad_tail = ebone->rad_tail;
1697 newbone->
layer = ebone->layer;
1700 newbone->
roll1 = ebone->roll1;
1701 newbone->
roll2 = ebone->roll2;
1706 newbone->
ease1 = ebone->ease1;
1707 newbone->
ease2 = ebone->ease2;
1714 if (flipbone && forked_iter) {
1731 if (a == 1 && flipbone) {
1732 std::swap(flipbone, ebone);
1741 if (totbone == 1 && first) {
1752 changed_multi =
true;
1761 if (!changed_multi) {
1773 ot->name =
"Extrude";
1774 ot->idname =
"ARMATURE_OT_extrude";
1775 ot->description =
"Create new bones from the selected joints";
1797 float obmat[3][3], curs[3], viewmat[3][3], totmat[3][3], imat[3][3];
1806 mul_m4_v3(obedit->world_to_object().ptr(), curs);
1815 copy_m3_m4(viewmat, obedit->object_to_world().ptr());
1830 "Bone that is not visible due to its bone collections MUST be assigned to at "
1831 "least one of them.");
1834 "Bone was added to a hidden collection '%s'",
1858 ot->name =
"Add Bone";
1859 ot->idname =
"ARMATURE_OT_bone_primitive_add";
1860 ot->description =
"Add a new bone located at the 3D cursor";
1893 EditBone *last_bone_before_cutting =
static_cast<EditBone *
>(arm->edbo->last);
1895 "If there is no bone before subdividing, which bone is being subdivided here?");
1897 for (
i = cuts + 1;
i > 1;
i--) {
1899 float cutratio = 1.0f / float(
i);
1900 float cutratioI = 1.0f - cutratio;
1915 val3[0] = val1[0] * cutratio + val2[0] * cutratioI;
1916 val3[1] = val1[1] * cutratio + val2[1] * cutratioI;
1917 val3[2] = val1[2] * cutratio + val2[2] * cutratioI;
1923 newbone->
rad_head = ((ebone->rad_head * cutratio) + (ebone->rad_tail * cutratioI));
1924 ebone->rad_tail = newbone->
rad_head;
1927 newbone->
prop =
nullptr;
1932 if (tbone->parent == ebone) {
1933 tbone->parent = newbone;
1955 new_bones.
first = last_bone_before_cutting->
next;
1956 new_bones.
last =
static_cast<EditBone *
>(arm->edbo->last);
1976 ot->name =
"Subdivide";
1977 ot->idname =
"ARMATURE_OT_subdivide";
1978 ot->description =
"Break selected bones into chains of smaller bones";
1988 prop =
RNA_def_int(
ot->srna,
"number_cuts", 1, 1, 1000,
"Number of Cuts",
"", 1, 10);
Functions and classes to work with Actions.
Functions to deal with Armatures.
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)
bool ANIM_armature_bonecoll_unassign_editbone(BoneCollection *bcoll, EditBone *ebone)
void ANIM_armature_bonecoll_assign_active(const bArmature *armature, EditBone *ebone)
BoneCollection * ANIM_armature_bonecoll_new(bArmature *armature, const char *name, int parent_index=-1)
BoneCollection * ANIM_armature_bonecoll_get_by_name(bArmature *armature, const char *name) ATTR_WARN_UNUSED_RESULT
bool ANIM_armature_bonecoll_assign_editbone(BoneCollection *bcoll, EditBone *ebone)
Blender kernel action and pose functionality.
void BKE_pose_channel_copy_data(bPoseChannel *pchan, const bPoseChannel *pchan_from)
void BKE_pose_channels_hash_free(bPose *pose) ATTR_NONNULL(1)
void action_groups_add_channel(bAction *act, bActionGroup *agrp, FCurve *fcurve)
void BKE_pose_channels_hash_ensure(bPose *pose) ATTR_NONNULL(1)
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
void BKE_pose_channel_free(bPoseChannel *pchan) ATTR_NONNULL(1)
bPoseChannel * BKE_pose_channel_ensure(bPose *pose, const char *name) ATTR_NONNULL(2)
bActionGroup * action_groups_add_new(bAction *act, const char name[])
bActionGroup * BKE_action_group_find_name(bAction *act, const char name[])
void BKE_constraint_targets_flush(struct bConstraint *con, struct ListBase *targets, bool no_copy)
void BKE_constraint_mat_convertspace(struct Object *ob, struct bPoseChannel *pchan, struct bConstraintOb *cob, float mat[4][4], short from, short to, bool keep_scale)
int BKE_constraint_targets_get(struct bConstraint *con, struct ListBase *r_targets)
void BKE_constraint_custom_object_space_init(struct bConstraintOb *cob, struct bConstraint *con)
#define CTX_DATA_BEGIN_WITH_ID(C, Type, instance, member, Type_id, instance_id)
#define CTX_DATA_COUNT(C, member)
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
Main * CTX_data_main(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
FCurve * BKE_fcurve_copy(const FCurve *fcu)
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
ID * BKE_libblock_find_name(Main *bmain, short type, const char *name, const std::optional< Library * > lib=std::nullopt) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void void void void BLI_duplicatelist(ListBase *dst, const ListBase *src) ATTR_NONNULL(1
void mul_m3_v3(const float M[3][3], float r[3])
void unit_m3(float m[3][3])
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 mul_m4_v3(const float M[4][4], float r[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 unit_m4(float m[4][4])
float angle_wrap_rad(float angle)
MINLINE void copy_v2fl_v2i(float r[2], const int a[2])
MINLINE float len_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_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void zero_v3(float r[3])
int bool bool bool BLI_strn_endswith(const char *__restrict str, const char *__restrict end, size_t str_len) ATTR_NONNULL(1
char char size_t char * BLI_strncat(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
char * STRNCPY(char(&dst)[N], const char *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
char * BLI_string_replaceN(const char *__restrict str, const char *__restrict substr_old, const char *__restrict substr_new) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_ANIMATION_NO_FLUSH
@ BONE_RELATIVE_PARENTING
@ ARM_DRAW_TYPE_ARMATURE_DEFINED
@ CONSTRAINT_TYPE_TRACKTO
@ CONSTRAINT_TYPE_TRANSFORM
@ CONSTRAINT_TYPE_SHRINKWRAP
@ CONSTRAINT_TYPE_ROTLIMIT
@ CONSTRAINT_TYPE_KINEMATIC
@ CONSTRAINT_TYPE_LOCLIMIT
@ CONSTRAINT_TYPE_LOCKTRACK
@ CONSTRAINT_TYPE_DAMPTRACK
Object is a sort of wrapper for general info.
#define EBONE_SELECTABLE(arm, ebone)
void ED_outliner_select_sync_from_edit_bone_tag(bContext *C)
bool ED_operator_editarmature(bContext *C)
void ED_view3d_win_to_3d(const View3D *v3d, const ARegion *region, const float depth_pt[3], const float mval[2], float r_out[3])
Read Guarded memory(de)allocation.
@ OPTYPE_DEPENDS_ON_CURSOR
EditBone * ED_armature_ebone_add(bArmature *arm, const char *name)
void ARMATURE_OT_subdivide(wmOperatorType *ot)
EditBone * ED_armature_ebone_add_primitive(Object *obedit_arm, const float length, const bool view_aligned)
static void update_duplicate_constraint_settings(EditBone *dup_bone, EditBone *orig_bone, Object *ob)
EditBone * duplicateEditBone(EditBone *cur_bone, const char *name, ListBase *editbones, Object *ob)
static void track_axis_x_swap(int &value)
static void update_duplicate_action_constraint_settings(EditBone *dup_bone, EditBone *orig_bone, Object *ob, bPoseChannel *pchan, bConstraint *curcon)
static wmOperatorStatus armature_subdivide_exec(bContext *C, wmOperator *op)
static wmOperatorStatus armature_click_extrude_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus armature_duplicate_selected_exec(bContext *C, wmOperator *op)
static void update_duplicate_transform_constraint_settings(Object *ob, bPoseChannel *pchan, bConstraint *curcon)
static void update_duplicate_kinematics_constraint_settings(bConstraint *curcon)
static EditBone * get_symmetrized_bone(bArmature *arm, EditBone *bone)
void ED_armature_ebone_copy(EditBone *dest, const EditBone *source)
void ARMATURE_OT_click_extrude(wmOperatorType *ot)
static wmOperatorStatus armature_click_extrude_exec(bContext *C, wmOperator *)
static wmOperatorStatus armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
static void mirror_bone_collection_assignments(bArmature &armature, EditBone &source_bone, EditBone &target_bone)
static void update_duplicate_subtarget(EditBone *dup_bone, Object *ob, const bool lookup_mirror_subtarget)
static wmOperatorStatus armature_extrude_exec(bContext *C, wmOperator *op)
static void update_duplicate_constraint_shrinkwrap_settings(bConstraint *curcon)
static void update_duplicate_constraint_damp_track_settings(bConstraint *curcon)
void ARMATURE_OT_duplicate(wmOperatorType *ot)
void ARMATURE_OT_symmetrize(wmOperatorType *ot)
void ARMATURE_OT_extrude(wmOperatorType *ot)
static void pre_edit_bone_duplicate(ListBase *editbones)
static void mirror_pose_bone(Object &ob, EditBone &ebone)
static bPoseChannel * pchan_duplicate_map(const bPose *pose, const blender::Map< blender::StringRefNull, blender::StringRefNull > &name_map, bPoseChannel *pchan_src)
void ARMATURE_OT_bone_primitive_add(wmOperatorType *ot)
static void pose_edit_bone_duplicate(ListBase *editbones, Object *ob)
static void update_duplicate_constraint_lock_track_settings(bConstraint *curcon)
static void update_duplicate_custom_bone_shapes(bContext *C, EditBone *dup_bone, Object *ob)
static wmOperatorStatus armature_symmetrize_exec(bContext *C, wmOperator *op)
static void update_duplicate_constraint_track_to_settings(bConstraint *curcon)
static void update_duplicate_loc_rot_constraint_settings(Object *ob, bPoseChannel *pchan, bConstraint *curcon)
static void copy_pchan(EditBone *src_bone, EditBone *dst_bone, Object *src_ob, Object *dst_ob)
EditBone * add_points_bone(Object *obedit, float head[3], float tail[3])
EditBone * duplicateEditBoneObjects(EditBone *cur_bone, const char *name, ListBase *editbones, Object *src_ob, Object *dst_ob)
void ED_armature_ebone_unique_name(ListBase *ebones, char *name, EditBone *bone)
bool ED_armature_edit_deselect_all(Object *obedit)
void ED_armature_edit_transform_mirror_update(Object *obedit)
EditBone * ED_armature_ebone_find_name(const ListBase *edbo, const char *name)
void ED_armature_ebone_listbase_temp_clear(ListBase *lb)
void ED_armature_edit_sync_selection(ListBase *edbo)
void ED_armature_ebone_select_set(EditBone *ebone, bool select)
EditBone * ED_armature_ebone_get_mirrored(const ListBase *edbo, EditBone *ebo)
BMesh const char void * data
Value lookup_default(const Key &key, const Value &default_value) const
bool add_as(ForwardKey &&key, ForwardValue &&...value)
constexpr bool is_empty() const
constexpr const char * c_str() const
void append(const T &value)
bool is_action_legacy() const
bool fcurve_assign_to_channel_group(FCurve &fcurve, bActionGroup &to_group)
void fcurve_append(FCurve &fcurve)
bActionGroup & channel_group_ensure(StringRefNull name)
float length(VecOp< float, D >) RET
void * MEM_mallocN(size_t len, const char *str)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
bool fcurve_matches_collection_path(const FCurve &fcurve, StringRefNull collection_rna_path, StringRefNull data_name)
bool bone_is_visible_editbone(const bArmature *armature, const EditBone *ebone)
Vector< FCurve * > fcurves_in_action_slot_filtered(bAction *act, slot_handle_t slot_handle, FunctionRef< bool(const FCurve &fcurve)> predicate)
const animrig::Channelbag * channelbag_for_action_slot(const Action &action, slot_handle_t slot_handle)
int armature_bonecoll_find_index(const bArmature *armature, const ::BoneCollection *bcoll)
int armature_bonecoll_find_parent_index(const bArmature *armature, int bcoll_index)
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
int RNA_int_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
struct BoneCollection * bcoll
ListBase bone_collections
union EditBone::@061331032346151154065124154371375335047127225354 temp
IDProperty * system_properties
eBone_BBoneMappingMode bbone_mapping_mode
ObjectRuntimeHandle * runtime
int32_t action_slot_handle
struct BoneCollection * active_collection
struct EditBone * act_edbone
struct bArmature_Runtime runtime
struct bPoseChannel * pchan
struct Depsgraph * depsgraph
float custom_scale_xyz[3]
float custom_rotation_euler[3]
struct bPoseChannel * custom_tx
struct bPoseChannel * bbone_next
float custom_translation[3]
struct bPoseChannel * bbone_prev
struct ReportList * reports
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorStatus WM_operator_flag_only_pass_through_on_press(wmOperatorStatus retval, const wmEvent *event)