117 EditBone *ebone, *newbone, *flipbone;
118 float mat[3][3], imat[3][3];
159 for (
a = 0;
a < 2;
a++) {
161 if (flipbone ==
NULL) {
187 newbone->
tail[0] = -newbone->
tail[0];
217 float tvec[3], oldcurs[3], mval_f[2];
247 ot->
name =
"Extrude to Cursor";
248 ot->
idname =
"ARMATURE_OT_click_extrude";
249 ot->
description =
"Create a new bone going from the last selected joint to the mouse position";
279 for (eBone = edbo->
first; eBone; eBone = eBone->
next) {
304 const char *name_src = pchan_src->
name;
310 if (pchan_dst ==
NULL) {
311 pchan_dst = pchan_src;
365 bool lookup_mirror_subtarget)
377 for (curcon = conlist->
first; curcon; curcon = curcon->
next) {
385 for (ct = targets.
first; ct; ct = ct->
next) {
397 else if (lookup_mirror_subtarget) {
435 float max_axis_val = 0;
438 for (
int i = 0; i < 3; i++) {
439 float cur_val =
fabsf(mat[0][i]);
440 if (cur_val > max_axis_val) {
442 max_axis_val = cur_val;
452 if (act_con->
type < 10 && act_con->
type != max_axis) {
454 act_con->
min = -act_con->
min;
455 act_con->
max = -act_con->
max;
457 else if (act_con->
type == max_axis + 10) {
460 else if (act_con->
type == max_axis + 20) {
466 float min_vec[3], max_vec[3];
471 min_vec[0] = act_con->
min;
472 max_vec[0] = act_con->
max;
485 act_con->
min = min_vec[0];
486 act_con->
max = max_vec[0];
496 FCurve *old_curve = ld->data;
500 char *old_path = new_curve->
rna_path;
508 for (i = 0, bezt = new_curve->
bezt; i < new_curve->totvert; i++, bezt++) {
509 const size_t slength = strlen(new_curve->
rna_path);
529 bezt->
vec[0][1] *= -1;
530 bezt->
vec[1][1] *= -1;
531 bezt->
vec[2][1] *= -1;
567 float local_mat[4][4], imat[4][4];
569 float min_vec[3], max_vec[3];
571 min_vec[0] = limit->
xmin;
572 min_vec[1] = limit->
ymin;
573 min_vec[2] = limit->
zmin;
575 max_vec[0] = limit->
xmax;
576 max_vec[1] = limit->
ymax;
577 max_vec[2] = limit->
zmax;
589 local_mat[3][0] = local_mat[3][1] = local_mat[3][2] = 0;
602 min_vec[1] = max_vec[1] * -1;
603 min_vec[2] = max_vec[2] * -1;
605 max_vec[1] = min_copy[1] * -1;
606 max_vec[2] = min_copy[2] * -1;
609 float min_x_copy = min_vec[0];
611 min_vec[0] = max_vec[0] * -1;
612 max_vec[0] = min_x_copy * -1;
619 limit->
xmin = min_vec[0];
620 limit->
ymin = min_vec[1];
621 limit->
zmin = min_vec[2];
623 limit->
xmax = max_vec[0];
624 limit->
ymax = max_vec[1];
625 limit->
zmax = max_vec[2];
634 float target_mat[4][4], own_mat[4][4], imat[4][4];
644 float old_min, old_max;
653 old_min = trans->from_min[0];
654 old_max = trans->from_max[0];
656 trans->from_min[0] = -old_max;
657 trans->from_max[0] = -old_min;
666 own_mat[3][0] = own_mat[3][1] = own_mat[3][2] = 0;
674 old_min = trans->from_min_rot[1];
675 old_max = trans->from_max_rot[1];
677 trans->from_min_rot[1] = old_max * -1;
678 trans->from_max_rot[1] = old_min * -1;
680 old_min = trans->from_min_rot[2];
681 old_max = trans->from_max_rot[2];
683 trans->from_min_rot[2] = old_max * -1;
684 trans->from_max_rot[2] = old_min * -1;
694 float imat_rot[4][4];
705 mul_m4_v3(target_mat, trans->to_min_scale);
706 mul_m4_v3(target_mat, trans->to_max_scale);
709 target_mat[3][0] = target_mat[3][1] = target_mat[3][2] = 0;
712 mul_m4_v3(target_mat, trans->to_min_rot);
713 mul_m4_v3(target_mat, trans->to_max_rot);
727 for (
int i = 0; i < 3; i++) {
733 trans->to_max_scale[i] = trans->to_min_scale[i];
734 trans->to_min_scale[i] = temp_vec[i];
740 trans->to_min[0] *= -1;
741 trans->to_max[0] *= -1;
745 for (
int i = 0; i < 3; i++) {
751 trans->to_max[i] = trans->to_min[i];
752 trans->to_min[i] = temp_vec[i];
758 trans->to_min_rot[2] *= -1;
759 trans->to_max_rot[2] *= -1;
764 trans->to_min_rot[1] *= -1;
765 trans->to_max_rot[1] *= -1;
770 for (
int i = 0; i < 3; i++) {
777 trans->to_max_rot[i] = trans->to_min_rot[i];
778 trans->to_min_rot[i] = temp_vec[i];
784 trans->to_max_rot[1] = -trans->to_min_rot[1];
785 trans->to_min_rot[1] = -temp_vec[1];
813 for (curcon = conlist->
first; curcon; curcon = curcon->
next) {
814 switch (curcon->
type) {
856 shape_ob = shape_ob == pchan->
custom ?
NULL : shape_ob;
858 if (shape_ob !=
NULL) {
872 if (src_bone->
prop) {
902 memcpy(e_bone, cur_bone,
sizeof(
EditBone));
934 uint objects_len = 0;
937 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
942 Object *ob = objects[ob_index];
951 for (ebone_iter = arm->
edbo->
first; ebone_iter; ebone_iter = ebone_iter->
next) {
964 for (ebone_iter = arm->
edbo->
first; ebone_iter && ebone_iter != ebone_first_dupe;
965 ebone_iter = ebone_iter->
next) {
969 char *new_bone_name = ebone_iter->
name;
973 new_bone_name_buff, ebone_iter->
name,
false,
sizeof(new_bone_name_buff));
978 new_bone_name = new_bone_name_buff;
984 if (!ebone_first_dupe) {
985 ebone_first_dupe = ebone;
991 for (ebone_iter = arm->
edbo->
first; ebone_iter && ebone_iter != ebone_first_dupe;
992 ebone_iter = ebone_iter->
next) {
996 if (!ebone_iter->
parent) {
1037 for (ebone_iter = arm->
edbo->
first; ebone_iter && ebone_iter != ebone_first_dupe;
1038 ebone_iter = ebone_iter->
next) {
1061 ot->
name =
"Duplicate Selected Bone(s)";
1062 ot->
idname =
"ARMATURE_OT_duplicate";
1063 ot->
description =
"Make copies of the selected bones within the same armature";
1077 "Try to flip names of the bones, if possible, instead of adding a number extension");
1091 return (mirror !=
NULL) ? mirror : bone;
1109 uint objects_len = 0;
1112 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1113 Object *obedit = objects[ob_index];
1125 for (ebone_iter = arm->
edbo->
first; ebone_iter; ebone_iter = ebone_iter->
next) {
1131 if (
STREQ(name_flip, ebone_iter->
name)) {
1147 axis_delta = ebone->
head[axis] - ebone_iter->
head[axis];
1148 if (axis_delta == 0.0f) {
1149 axis_delta = ebone->
tail[axis] - ebone_iter->
tail[axis];
1152 if (axis_delta == 0.0f) {
1162 if (((axis_delta < 0.0f) ? -1 : 1) == direction) {
1164 ebone_dst = ebone_iter;
1167 ebone_src = ebone_iter;
1181 for (ebone_iter = arm->
edbo->
first; ebone_iter && ebone_iter != ebone_first_dupe;
1182 ebone_iter = ebone_iter->
next) {
1203 if (!
STREQ(name_flip, ebone_iter->
name)) {
1208 if (!ebone_first_dupe) {
1209 ebone_first_dupe = ebone;
1216 for (ebone_iter = arm->
edbo->
first; ebone_iter && ebone_iter != ebone_first_dupe;
1217 ebone_iter = ebone_iter->
next) {
1225 ebone->
flag = (ebone->
flag & ~flag_copy) | (ebone_iter->
flag & flag_copy);
1238 if (ebone_parent == ebone_iter->
parent) {
1244 if (ebone->
head[axis] != 0.0f) {
1251 ebone->
parent = ebone_parent;
1284 for (ebone_iter = arm->
edbo->
first; ebone_iter && ebone_iter != ebone_first_dupe;
1285 ebone_iter = ebone_iter->
next) {
1292 for (ebone_iter = arm->
edbo->
first; ebone_iter && ebone_iter != ebone_first_dupe;
1293 ebone_iter = ebone_iter->
next) {
1323 {-1,
"NEGATIVE_X", 0,
"-X to +X",
""},
1324 {+1,
"POSITIVE_X", 0,
"+X to -X",
""},
1330 ot->
idname =
"ARMATURE_OT_symmetrize";
1331 ot->
description =
"Enforce symmetry, make copies of the selection or use existing";
1342 arm_symmetrize_direction_items,
1345 "Which sides to copy from and to (when both are selected)");
1357 bool changed_multi =
false;
1359 uint objects_len = 0;
1362 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
1363 Object *ob = objects[ob_index];
1365 bool forked_iter = forked;
1368 int a, totbone = 0, do_extrude;
1371 for (ebone = arm->
edbo->
first; ebone; ebone = ebone->next) {
1384 for (ebone = arm->
edbo->
first; ((ebone) && (ebone != first)); ebone = ebone->next) {
1393 if (ebone->parent && (ebone->parent->flag &
BONE_TIPSEL)) {
1413 if ((flipbone ==
NULL) && (forked_iter)) {
1418 for (
a = 0;
a < 2;
a++) {
1420 if (flipbone ==
NULL) {
1429 if (do_extrude ==
true) {
1453 newbone->
weight = ebone->weight;
1454 newbone->
dist = ebone->dist;
1455 newbone->
xwidth = ebone->xwidth;
1456 newbone->
zwidth = ebone->zwidth;
1457 newbone->
rad_head = ebone->rad_tail;
1458 newbone->
rad_tail = ebone->rad_tail;
1460 newbone->
layer = ebone->layer;
1463 newbone->
roll1 = ebone->roll1;
1464 newbone->
roll2 = ebone->roll2;
1469 newbone->
ease1 = ebone->ease1;
1470 newbone->
ease2 = ebone->ease2;
1477 if (flipbone && forked_iter) {
1480 strcat(newbone->
name,
"_L");
1483 strcat(newbone->
name,
"_R");
1496 if (
a == 1 && flipbone) {
1507 if (totbone == 1 && first) {
1518 changed_multi =
true;
1528 if (!changed_multi) {
1541 ot->
idname =
"ARMATURE_OT_extrude";
1542 ot->
description =
"Create new bones from the selected joints";
1564 float obmat[3][3], curs[3], viewmat[3][3], totmat[3][3], imat[3][3];
1614 ot->
idname =
"ARMATURE_OT_bone_primitive_add";
1615 ot->
description =
"Add a new bone located at the 3D cursor";
1647 for (i = cuts + 1; i > 1; i--) {
1649 float cutratio = 1.0f / (
float)i;
1650 float cutratioI = 1.0f - cutratio;
1665 val3[0] = val1[0] * cutratio + val2[0] * cutratioI;
1666 val3[1] = val1[1] * cutratio + val2[1] * cutratioI;
1667 val3[2] = val1[2] * cutratio + val2[2] * cutratioI;
1673 newbone->
rad_head = ((ebone->rad_head * cutratio) + (ebone->rad_tail * cutratioI));
1674 ebone->rad_tail = newbone->
rad_head;
1683 for (tbone = arm->edbo->first; tbone; tbone = tbone->
next) {
1684 if (tbone->
parent == ebone) {
1707 ot->
idname =
"ARMATURE_OT_subdivide";
1708 ot->
description =
"Break selected bones into chains of smaller bones";
1718 prop =
RNA_def_int(
ot->
srna,
"number_cuts", 1, 1, 1000,
"Number of Cuts",
"", 1, 10);
typedef float(TangentPoint)[2]
Blender kernel action and pose functionality.
struct bActionGroup * action_groups_add_new(struct bAction *act, const char name[])
void BKE_pose_channels_hash_free(struct bPose *pose)
struct bPoseChannel * BKE_pose_channel_find_name(const struct bPose *pose, const char *name)
void BKE_pose_channel_copy_data(struct bPoseChannel *pchan, const struct bPoseChannel *pchan_from)
void BKE_pose_channel_free(struct bPoseChannel *pchan)
struct bActionGroup * BKE_action_group_find_name(struct bAction *act, const char name[])
struct bPoseChannel * BKE_pose_channel_ensure(struct bPose *pose, const char *name)
void BKE_pose_channels_hash_ensure(struct bPose *pose)
void action_groups_add_channel(struct bAction *act, struct bActionGroup *agrp, struct FCurve *fcurve)
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)
struct Scene * CTX_data_scene(const bContext *C)
struct Object * CTX_data_edit_object(const bContext *C)
struct ViewLayer * CTX_data_view_layer(const bContext *C)
struct View3D * CTX_wm_view3d(const bContext *C)
#define CTX_DATA_COUNT(C, member)
struct ARegion * CTX_wm_region(const bContext *C)
struct Main * CTX_data_main(const bContext *C)
struct RegionView3D * CTX_wm_region_view3d(const bContext *C)
int BKE_fcurves_filter(ListBase *dst, ListBase *src, const char *dataPrefix, const char *dataName)
struct FCurve * BKE_fcurve_copy(const struct FCurve *fcu)
struct IDProperty * IDP_CopyProperty(const struct IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, v3d, r_len)
struct ID * BKE_libblock_find_name(struct Main *bmain, short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
#define LISTBASE_FOREACH(type, var, list)
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)
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])
void unit_m4(float m[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
bool invert_m3_m3(float R[3][3], const float A[3][3])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
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_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])
bool BLI_strn_endswith(const char *__restrict str, const char *__restrict end, size_t length) ATTR_NONNULL()
char * BLI_str_replaceN(const char *__restrict str, const char *__restrict substr_old, const char *__restrict substr_new) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
size_t BLI_string_flip_side_name(char *r_name, const char *from_name, bool strip_number, size_t name_len)
void DEG_id_tag_update(struct ID *id, int flag)
@ ID_RECALC_ANIMATION_NO_FLUSH
@ BONE_RELATIVE_PARENTING
@ CONSTRAINT_TYPE_TRANSFORM
@ CONSTRAINT_TYPE_ROTLIMIT
@ CONSTRAINT_TYPE_KINEMATIC
@ CONSTRAINT_TYPE_LOCLIMIT
Object is a sort of wrapper for general info.
#define EBONE_VISIBLE(arm, ebone)
#define EBONE_SELECTABLE(arm, ebone)
void ED_outliner_select_sync_from_edit_bone_tag(struct bContext *C)
bool ED_operator_editarmature(struct bContext *C)
void ED_view3d_win_to_3d(const struct View3D *v3d, const struct ARegion *region, const float depth_pt[3], const float mval[2], float r_out[3])
Read Guarded memory(de)allocation.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color or the default fallback if none is specified Separate Split a vector into its X
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color or the default fallback if none is specified Separate Split a vector into its Y
@ OPTYPE_DEPENDS_ON_CURSOR
static void updateDuplicateKinematicConstraintSettings(bConstraint *curcon)
void ARMATURE_OT_subdivide(wmOperatorType *ot)
static int armature_duplicate_selected_exec(bContext *C, wmOperator *op)
void postEditBoneDuplicate(struct ListBase *editbones, Object *ob)
static int armature_extrude_exec(bContext *C, wmOperator *op)
static void updateDuplicateSubtarget(EditBone *dup_bone, ListBase *editbones, Object *ob, bool lookup_mirror_subtarget)
static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op))
static EditBone * get_symmetrized_bone(bArmature *arm, EditBone *bone)
static void updateDuplicateTransformConstraintSettings(Object *ob, bPoseChannel *pchan, bConstraint *curcon)
void ARMATURE_OT_click_extrude(wmOperatorType *ot)
static void updateDuplicateConstraintSettings(EditBone *dup_bone, EditBone *orig_bone, Object *ob)
static void updateDuplicateActionConstraintSettings(EditBone *dup_bone, EditBone *orig_bone, Object *ob, bPoseChannel *pchan, bConstraint *curcon)
EditBone * ED_armature_ebone_add_primitive(Object *obedit_arm, float length, bool view_aligned)
void ARMATURE_OT_duplicate(wmOperatorType *ot)
void ARMATURE_OT_symmetrize(wmOperatorType *ot)
void ARMATURE_OT_extrude(wmOperatorType *ot)
static int armature_symmetrize_exec(bContext *C, wmOperator *op)
static int armature_click_extrude_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int armature_subdivide_exec(bContext *C, wmOperator *op)
EditBone * add_points_bone(Object *obedit, float head[3], float tail[3])
EditBone * ED_armature_ebone_add(bArmature *arm, const char *name)
void ARMATURE_OT_bone_primitive_add(wmOperatorType *ot)
static bPoseChannel * pchan_duplicate_map(const bPose *pose, GHash *name_map, bPoseChannel *pchan_src)
static void updateDuplicateLocRotConstraintSettings(Object *ob, bPoseChannel *pchan, bConstraint *curcon)
static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
EditBone * duplicateEditBone(EditBone *cur_bone, const char *name, ListBase *editbones, Object *ob)
void preEditBoneDuplicate(ListBase *editbones)
EditBone * duplicateEditBoneObjects(EditBone *cur_bone, const char *name, ListBase *editbones, Object *src_ob, Object *dst_ob)
static EditBone * get_named_editbone(ListBase *edbo, const char *name)
static void updateDuplicateCustomBoneShapes(bContext *C, EditBone *dup_bone, Object *ob)
static void copy_pchan(EditBone *src_bone, EditBone *dst_bone, 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)
void ED_armature_ebone_listbase_temp_clear(ListBase *lb)
void ED_armature_edit_refresh_layer_used(bArmature *arm)
void ED_armature_edit_sync_selection(ListBase *edbo)
void ED_armature_ebone_select_set(EditBone *ebone, bool select)
void ED_armature_edit_validate_active(struct bArmature *arm)
EditBone * ED_armature_ebone_find_name(const ListBase *edbo, const char *name)
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_mallocN)(size_t len, const char *str)
T length(const vec_base< T, Size > &a)
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_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, int maxlen, 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, int default_value, int hardmin, int hardmax, const char *ui_name, const char *ui_description, int softmin, int softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
struct EditBone * bbone_next
struct EditBone * bbone_prev
struct EditBone * act_edbone
struct Depsgraph * depsgraph
struct bConstraintTarget * next
struct bConstraint * next
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
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
int WM_operator_flag_only_pass_through_on_press(int retval, const struct wmEvent *event)