87 *temp_con_data = *targetless_con;
113 for (; con; con = con->
next) {
119 if (
data->tar ==
nullptr) {
139 if (pchan ==
nullptr) {
154 if (con->enforce != 0.0f) {
159 if (
data->rootbone == 0) {
223 data->max_rootbone =
data->rootbone;
233 short wentdeeper = 0, added = 0;
242 if (wentdeeper == 0) {
271 for (bonec =
static_cast<Bone *
>(pchan->bone->childbase.first); bonec; bonec = bonec->
next)
277 if ((pchan->bone->flag &
BONE_CONNECTED) == 0 && (bonec ==
nullptr)) {
285 for (parent = pchan->
parent; parent; parent = parent->
parent) {
290 if (parent ==
nullptr) {
307 return (tot_ik) ? 1 : 0;
343 bool is_mirror_relative)
364 if (is_mirror_relative) {
365 float pchan_mtx[4][4];
366 float pchan_mtx_mirror[4][4];
368 float flip_mtx[4][4];
375 mul_m4_m4m4(pchan_mtx_mirror, pchan_mtx_mirror, flip_mtx);
376 mul_m4_m4m4(pchan_mtx_mirror, flip_mtx, pchan_mtx_mirror);
395 float pmat[3][3], omat[3][3];
396 float cmat[3][3], tmat[3][3];
449 copy_m3_m4(omat, ob->object_to_world().ptr());
564 bool has_translate_rotate_buf[2] = {
false,
false};
565 bool *has_translate_rotate = (t->
mode ==
TFM_TRANSLATION) ? has_translate_rotate_buf :
nullptr;
575 if ((arm ==
nullptr) || (pose ==
nullptr)) {
586 Bone *bone = pchan->bone;
593 if (has_translate_rotate !=
nullptr) {
594 if (has_translate_rotate[0] && has_translate_rotate[1]) {
601 has_translate_rotate[0] =
true;
606 has_translate_rotate[0] =
true;
610 has_translate_rotate[1] =
true;
614 has_translate_rotate[0] =
true;
619 if (tc->data_len == 0) {
632 int total_mirrored = 0;
645 "PoseInitData_Mirror");
648 pid[total_mirrored].
pchan =
nullptr;
651 tc->custom.type.use_free =
true;
656 if (tc->data_len == 0) {
668 if (pose ==
nullptr) {
681 for (
i = 0;
i < tc->data_len;
i++, td++, tdx++) {
703 has_translate_rotate[0] =
true;
716 if (td != (tc->data + tc->data_len)) {
728 if (has_translate_rotate[1]) {
745 int total_mirrored = 0;
749 const int data_len_prev = tc->data_len;
774 if (mirror && (data_len_prev < tc->data_len)) {
789 bid[total_mirrored].
bone =
nullptr;
791 tc->custom.type.data = bid;
792 tc->custom.type.use_free =
true;
808 float mtx[3][3], smtx[3][3], bonemat[3][3];
812 copy_m3_m4(mtx, tc->obedit->object_to_world().ptr());
822 ebo->oldlength = ebo->length;
829 td->
val = &ebo->rad_head;
844 td->
val = &ebo->rad_tail;
862 td->
val = &ebo->dist;
863 td->
ival = ebo->dist;
867 td->
loc = &ebo->xwidth;
890 td->
val = &(ebo->roll);
891 td->
ival = ebo->roll;
931 td->
ival = ebo->roll;
954 td->
ival = ebo->roll;
964 if (mirror && (td_old != td)) {
967 bid[
i].
bone = eboflip;
984 bid[
i].
bone =
nullptr;
1024 if ((ebo_child->flag &
BONE_CONNECTED) && (ebo_child->parent == ebo)) {
1026 ebo_child->rad_head = ebo->
rad_tail;
1103 for (
i = 0;
i < tc->data_len;
i++, td++) {
1105 float vec[3], up_axis[3];
1154 float flip_mtx[4][4];
1156 flip_mtx[0][0] = -1;
1175 if (pchan ==
nullptr) {
1189 float pchan_mtx_final[4][4];
1191 mul_m4_m4m4(pchan_mtx_final, pchan_mtx_final, flip_mtx);
1192 mul_m4_m4m4(pchan_mtx_final, flip_mtx, pchan_mtx_final);
1204 if (
data ==
nullptr) {
1274 const bool targetless_ik,
1275 const bool is_connected,
1276 const bool transforming_more_than_one_bone)
1282 if (transforming_more_than_one_bone &&
1285 rna_paths.
append({
"location"});
1288 rna_paths.
append({
"location"});
1316 if (!is_connected) {
1319 if (targetless_ik) {
1320 rna_paths.
append({rotation_path});
1327 rna_paths.
append({rotation_path});
1333 rna_paths.
append({
"scale"});
1346 short targetless_ik,
1348 const bool transforming_more_than_one_bone)
1364 const bool is_connected = pchan->bone->parent !=
nullptr &&
1371 transforming_more_than_one_bone);
1374 rna_paths = {{
"location"}, {rotation_path}, {
"scale"}};
1388 Object *ob = tc->poseobj;
1414 Object *ob = tc->poseobj;
1453 GSET_ITER (gs_iter, motionpath_updates) {
1471 for (; bone; bone = bone->
next) {
1527 int segcount, apply = 0;
1544 for (; parchan; parchan = parchan->
parent) {
1545 chanlist[segcount] = parchan;
1548 if (segcount ==
data->rootbone || segcount > 255) {
1552 for (; segcount; segcount--) {
1561 parchan = chanlist[segcount - 1];
1562 bone = parchan->
bone;
1568 float rmat3[3][3], qrmat[3][3], imat3[3][3], smat[3][3];
1609 bool relations_changed =
false;
1618 for (con =
static_cast<bConstraint *
>(pchan->constraints.first); con; con =
next) {
1623 relations_changed =
true;
1641 if (relations_changed) {
1670 short targetless_ik = 0;
1678 Object *pose_ob = tc->poseobj;
1723 GSET_ITER (gs_iter, motionpath_updates) {
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).
Functions to insert, delete or modify keyframes.
Helper functions for animation to interact with the RNA system.
void BIK_clear_data(struct bPose *pose)
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
bPoseChannel * BKE_pose_channel_get_mirrored(const bPose *pose, const char *name) ATTR_WARN_UNUSED_RESULT
bool BKE_pose_is_bonecoll_visible(const bArmature *arm, const bPoseChannel *pchan) ATTR_WARN_UNUSED_RESULT
void BKE_pchan_rot_to_mat3(const bPoseChannel *pchan, float r_mat[3][3])
bArmature * BKE_armature_from_object(Object *ob)
void BKE_pchan_apply_mat4(bPoseChannel *pchan, const float mat[4][4], bool use_compat)
void BKE_pchan_to_mat4(const bPoseChannel *pchan, float r_chanmat[4][4])
void BKE_pose_where_is(Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_bone_parent_transform_calc_from_pchan(const bPoseChannel *pchan, BoneParentTransform *r_bpt)
void BKE_pchan_mat3_to_rot(bPoseChannel *pchan, const float mat[3][3], bool use_compat)
void BKE_armature_mat_pose_to_bone(const bPoseChannel *pchan, const float inmat[4][4], float outmat[4][4])
struct bConstraint * BKE_constraint_add_for_pose(struct Object *ob, struct bPoseChannel *pchan, const char *name, short type)
Main * CTX_data_main(const bContext *C)
void BKE_report(ReportList *reports, eReportType type, const char *message)
GSet * BLI_gset_ptr_new(const char *info)
void BLI_gset_insert(GSet *gs, void *key)
BLI_INLINE void * BLI_gsetIterator_getKey(GSetIterator *gsi)
#define GSET_ITER(gs_iter_, gset_)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
#define LISTBASE_FOREACH(type, var, list)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void pseudoinverse_m3_m3(float inverse[3][3], const float mat[3][3], float epsilon)
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
#define PSEUDOINVERSE_EPSILON
bool invert_m3_m3(float inverse[3][3], const float mat[3][3])
void normalize_m3(float R[3][3]) ATTR_NONNULL()
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4(float mat[4][4])
#define mul_m3_series(...)
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void mat3_to_size(float size[3], const float M[3][3])
void unit_m4(float m[4][4])
float angle_compat_rad(float angle, float angle_compat)
void rotation_between_vecs_to_quat(float q[4], const float v1[3], const float v2[3])
void mul_qt_v3(const float q[4], float r[3])
void copy_qt_qt(float q[4], const float a[4])
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 float normalize_v3(float n[3])
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ MOTIONPATH_BAKE_HAS_PATHS
@ BONE_HINGE_CHILD_TRANSFORM
@ CONSTRAINT_TYPE_KINEMATIC
@ AUTOKEY_FLAG_INSERTNEEDED
@ V3D_AROUND_LOCAL_ORIGINS
@ POSE_PATH_CALC_RANGE_CURRENT_FRAME
@ POSE_PATH_CALC_RANGE_CHANGED
Read Guarded memory(de)allocation.
void ANIM_deselect_keys_in_animation_editors(bContext *C)
float ED_armature_ebone_roll_to_vector(const EditBone *bone, const float align_axis[3], const bool axis_only)
void ED_armature_edit_transform_mirror_update(Object *obedit)
void ED_armature_ebone_to_mat3(EditBone *ebone, float r_mat[3][3])
EditBone * ED_armature_ebone_get_mirrored(const ListBase *edbo, EditBone *ebo)
BMesh const char void * data
void append(const T &value)
void append_non_duplicates(const T &value)
Span< T > as_span() const
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
size_t(* MEM_allocN_len)(const void *vmemh)
void MEM_freeN(void *vmemh)
bool bone_is_visible_editbone(const bArmature *armature, const EditBone *ebone)
bool is_autokey_on(const Scene *scene)
bool autokeyframe_cfra_can_key(const Scene *scene, ID *id)
StringRef get_rotation_mode_path(eRotationModes rotation_mode)
bool bone_is_visible_pchan(const bArmature *armature, const bPoseChannel *pchan)
bool is_keying_flag(const Scene *scene, eKeying_Flag flag)
void autokeyframe_pose_channel(bContext *C, Scene *scene, Object *ob, bPoseChannel *pose_channel, Span< RNAPath > rna_paths, short targetless_ik)
void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob, ePosePathCalcRange range)
struct ToolSettings * toolsettings
struct bConstraint * next
struct bPoseChannel * parent