Blender V4.5
BKE_armature.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
10
11#include <optional>
12
13#include "BLI_bounds_types.hh"
14#include "BLI_function_ref.hh"
17#include "BLI_set.hh"
18
19#include "DNA_armature_types.h"
20
21struct BMEditMesh;
22struct Bone;
23struct Depsgraph;
24struct IDProperty;
25struct ListBase;
26struct Main;
27struct Mesh;
28struct Object;
29struct PoseTree;
30struct Scene;
31struct bArmature;
32struct bConstraint;
33struct bPose;
34struct bPoseChannel;
35struct MDeformVert;
36
37struct EditBone {
54 char name[/*MAXBONENAME*/ 64];
61 float roll;
62
64 float head[3];
65 float tail[3];
71 int flag;
72 int layer;
73 int drawtype; /* eArmature_Drawtype */
75
76 /* Envelope distance & weight */
77 float dist, weight;
81
82 /* Bendy-Bone parameters */
83 short segments;
84 float roll1, roll2;
87 float ease1, ease2;
88 float scale_in[3], scale_out[3];
89
91 float oldlength;
92
105
106 /* Used for display */
108 float disp_mat[4][4];
110 float disp_tail_mat[4][4];
112 float disp_bbone_mat[/*MAX_BBONE_SUBDIV*/ 32][4][4];
113
116
117 ::BoneColor color; /* MUST be named the same as in bPoseChannel and Bone structs. */
118 ListBase /*BoneCollectionReference*/ bone_collections;
119
120 /* Used to store temporary data */
121 union {
124 void *p;
125 int i;
127};
128
131
132 bConstraint *con; /* the constraint of this target */
133 int tip; /* index of tip pchan in PoseTree */
134};
135
136struct PoseTree {
138
139 int type; /* type of IK that this serves (CONSTRAINT_TYPE_KINEMATIC or ..._SPLINEIK) */
140 int totchannel; /* number of pose channels */
141
142 ListBase targets; /* list of targets of the tree */
143 bPoseChannel **pchan; /* array of pose channels */
144 int *parent; /* and their parents */
145
146 float (*basis_change)[3][3]; /* basis change result from solver */
147 int iterations; /* iterations from the constraint */
148 int stretch; /* disable stretching */
149};
150
151/* Core armature functionality. */
152
153bArmature *BKE_armature_add(Main *bmain, const char *name);
156void BKE_armature_bonelist_free(ListBase *lb, bool do_id_user);
157void BKE_armature_editbonelist_free(ListBase *lb, bool do_id_user);
158
159void BKE_armature_copy_bone_transforms(bArmature *armature_dst, const bArmature *armature_src);
160
161void BKE_armature_transform(bArmature *arm, const float mat[4][4], bool do_props);
162
166std::optional<blender::Bounds<blender::float3>> BKE_armature_min_max(const Object *ob);
167
183void BKE_pchan_minmax(const Object *ob,
184 const bPoseChannel *pchan,
185 const bool use_empty_drawtype,
186 blender::float3 &r_min,
187 blender::float3 &r_max);
200std::optional<blender::Bounds<blender::float3>> BKE_pose_minmax(const Object *ob, bool use_select);
201
210bool bone_autoside_name(char name[64], int strip_number, short axis, float head, float tail);
211
219Bone *BKE_armature_find_bone_name(bArmature *arm, const char *name);
220
223
224bool BKE_armature_bone_flag_test_recursive(const Bone *bone, int flag);
225
230 const float vec[3], const float b1[3], const float b2[3], float rad1, float rad2, float rdist);
231
241void BKE_armature_where_is_bone(Bone *bone, const Bone *bone_parent, bool use_recursion);
247void BKE_pose_remap_bone_pointers(bArmature *armature, bPose *pose);
252void BKE_pose_channels_clear_with_null_bone(bPose *pose, bool do_id_user);
260void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, bool do_id_user);
266void BKE_pose_ensure(Main *bmain, Object *ob, bArmature *arm, bool do_id_user);
271void BKE_pose_where_is(Depsgraph *depsgraph, Scene *scene, Object *ob);
278void BKE_pose_where_is_bone(Depsgraph *depsgraph,
279 Scene *scene,
280 Object *ob,
281 bPoseChannel *pchan,
282 float ctime,
283 bool do_extra);
288
289void vec_roll_to_mat3(const float vec[3], float roll, float r_mat[3][3]);
290
294void vec_roll_to_mat3_normalized(const float nor[3], float roll, float r_mat[3][3]);
299void mat3_to_vec_roll(const float mat[3][3], float r_vec[3], float *r_roll);
304void mat3_vec_to_roll(const float mat[3][3], const float vec[3], float *r_roll);
305
306/* Common Conversions Between Co-ordinate Spaces */
307
311void BKE_armature_mat_world_to_pose(Object *ob, const float inmat[4][4], float outmat[4][4]);
317void BKE_armature_loc_world_to_pose(Object *ob, const float inloc[3], float outloc[3]);
324 const float inmat[4][4],
325 float outmat[4][4]);
332 const float inloc[3],
333 float outloc[3]);
338 const float inmat[4][4],
339 float outmat[4][4]);
345void BKE_armature_mat_pose_to_delta(float delta_mat[4][4],
346 float pose_mat[4][4],
347 float arm_mat[4][4]);
348
350 Object *ob,
351 const bPoseChannel *pchan,
352 const float inmat[4][4],
353 float outmat[4][4]);
354
358void BKE_pchan_mat3_to_rot(bPoseChannel *pchan, const float mat[3][3], bool use_compat);
362void BKE_pchan_rot_to_mat3(const bPoseChannel *pchan, float r_mat[3][3]);
367void BKE_pchan_apply_mat4(bPoseChannel *pchan, const float mat[4][4], bool use_compat);
371void BKE_pchan_to_mat4(const bPoseChannel *pchan, float r_chanmat[4][4]);
372
378
383void BKE_bone_offset_matrix_get(const Bone *bone, float offs_bone[4][4]);
384
385/* Transformation inherited from the parent bone. These matrices apply the effects of
386 * HINGE/NO_SCALE/NO_LOCAL_LOCATION options over the pchan loc/rot/scale transformations. */
388 float rotscale_mat[4][4]; /* parent effect on rotation & scale pose channels */
389 float loc_mat[4][4]; /* parent effect on location pose channel */
390 float post_scale[3]; /* additional scale to apply with post-multiply */
391};
392
393/* Matrix-like algebra operations on the transform */
397 const BoneParentTransform *in2,
399
401 const float inmat[4][4],
402 float outmat[4][4]);
403
426 BoneParentTransform *r_bpt);
437 int inherit_scale_mode,
438 const float offs_bone[4][4],
439 const float parent_arm_mat[4][4],
440 const float parent_pose_mat[4][4],
441 BoneParentTransform *r_bpt);
442
451 float quat[4], float eul[3], float axis[3], float *angle, short oldMode, short newMode);
452
453/* B-Bone support */
454#define MAX_BBONE_SUBDIV 32
455
456struct Mat4 {
457 float mat[4][4];
458};
459
462 float length;
463
464 /* Non-uniform scale correction. */
466 float scale[3];
467
468 /* Handle control bone data. */
471
472 float prev_h[3], next_h[3];
473 float prev_mat[4][4], next_mat[4][4];
474
475 /* Control values. */
476 float ease1, ease2;
477 float roll1, roll2;
478 float scale_in[3], scale_out[3];
480};
481
483void BKE_pchan_protected_location_set(bPoseChannel *pchan, const float location[3]);
485void BKE_pchan_protected_scale_set(bPoseChannel *pchan, const float scale[3]);
487void BKE_pchan_protected_rotation_quaternion_set(bPoseChannel *pchan, const float quat[4]);
489void BKE_pchan_protected_rotation_euler_set(bPoseChannel *pchan, const float rotation_euler[3]);
492 const float axis[3],
493 float angle);
494
499 bPoseChannel **r_prev,
500 bPoseChannel **r_next);
505 bool rest,
506 BBoneSplineParameters *param);
507
513 bool rest,
514 bool for_deform,
515 Mat4 *result_array);
516
521 float h1[3],
522 float *r_roll1,
523 float h2[3],
524 float *r_roll2,
525 bool ease,
526 bool offsets);
532 bool for_deform,
533 Mat4 *result_array);
534
543
554 float head_tail,
555 int *r_index,
556 float *r_blend_next);
557
568 const float *co,
569 int *r_index,
570 float *r_blend_next);
571
572#define PBONE_SELECTABLE(arm, bone) \
573 (blender::animrig::bone_is_visible(arm, bone) && !((bone)->flag & BONE_UNSELECTABLE))
574
575#define PBONE_SELECTED(arm, bone) \
576 (((bone)->flag & BONE_SELECTED) & blender::animrig::bone_is_visible(arm, bone))
577
578/* context.selected_pose_bones */
579#define FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN(_ob, _pchan) \
580 for (bPoseChannel *_pchan = (bPoseChannel *)(_ob)->pose->chanbase.first; _pchan; \
581 _pchan = _pchan->next) \
582 { \
583 if (blender::animrig::bone_is_visible(((bArmature *)(_ob)->data), (_pchan)->bone) && \
584 ((_pchan)->bone->flag & BONE_SELECTED)) \
585 {
586#define FOREACH_PCHAN_SELECTED_IN_OBJECT_END \
587 } \
588 } \
589 ((void)0)
590/* context.visible_pose_bones */
591#define FOREACH_PCHAN_VISIBLE_IN_OBJECT_BEGIN(_ob, _pchan) \
592 for (bPoseChannel *_pchan = (bPoseChannel *)(_ob)->pose->chanbase.first; _pchan; \
593 _pchan = _pchan->next) \
594 { \
595 if (blender::animrig::bone_is_visible(((bArmature *)(_ob)->data), (_pchan)->bone)) {
596#define FOREACH_PCHAN_VISIBLE_IN_OBJECT_END \
597 } \
598 } \
599 ((void)0)
600
601/* Evaluation helpers */
603struct bPose;
605
609
610void BKE_pose_splineik_init_tree(Scene *scene, Object *ob, float ctime);
612 Depsgraph *depsgraph, Scene *scene, Object *ob, bPoseChannel *pchan_root, float ctime);
613
615
616void BKE_pose_eval_init(Depsgraph *depsgraph, Scene *scene, Object *object);
617
618void BKE_pose_eval_init_ik(Depsgraph *depsgraph, Scene *scene, Object *object);
619
620void BKE_pose_eval_bone(Depsgraph *depsgraph, Scene *scene, Object *object, int pchan_index);
621
623 Scene *scene,
624 Object *object,
625 int pchan_index);
626
627void BKE_pose_bone_done(Depsgraph *depsgraph, Object *object, int pchan_index);
628
629void BKE_pose_eval_bbone_segments(Depsgraph *depsgraph, Object *object, int pchan_index);
630
631void BKE_pose_iktree_evaluate(Depsgraph *depsgraph,
632 Scene *scene,
633 Object *object,
634 int rootchan_index);
635
637 Scene *scene,
638 Object *object,
639 int rootchan_index);
640
641void BKE_pose_eval_done(Depsgraph *depsgraph, Object *object);
642
643void BKE_pose_eval_cleanup(Depsgraph *depsgraph, Scene *scene, Object *object);
644
645/* -------------------------------------------------------------------- */
648
649/* Note that we could have a #BKE_armature_deform_coords that doesn't take object data
650 * currently there are no callers for this though. */
651
653 const Object &ob_arm,
654 const Object &ob_target,
655 const ListBase *defbase,
657 std::optional<blender::Span<blender::float3>> vert_coords_prev,
658 std::optional<blender::MutableSpan<blender::float3x3>> vert_deform_mats,
660 int deformflag,
661 blender::StringRefNull defgrp_name);
662
664 const Object *ob_target,
665 float (*vert_coords)[3],
666 float (*vert_deform_mats)[3][3],
667 int vert_coords_len,
668 int deformflag,
669 float (*vert_coords_prev)[3],
670 const char *defgrp_name,
671 const Mesh *me_target);
672
674 const Object *ob_target,
675 float (*vert_coords)[3],
676 float (*vert_deform_mats)[3][3],
677 int vert_coords_len,
678 int deformflag,
679 float (*vert_coords_prev)[3],
680 const char *defgrp_name,
681 const BMEditMesh *em_target);
682
684
685namespace blender::bke {
686
689 bool no_bones_selected = true;
690};
691
694 SelectedBoneCallback callback);
695
701
702}; // namespace blender::bke
void BKE_pchan_rot_to_mat3(const bPoseChannel *pchan, float r_mat[3][3])
Definition armature.cc:2365
void BKE_splineik_execute_tree(Depsgraph *depsgraph, Scene *scene, Object *ob, bPoseChannel *pchan_root, float ctime)
void BKE_pose_eval_init_ik(Depsgraph *depsgraph, Scene *scene, Object *object)
void BKE_pose_splineik_evaluate(Depsgraph *depsgraph, Scene *scene, Object *object, int rootchan_index)
void BKE_pchan_protected_rotation_axisangle_set(bPoseChannel *pchan, const float axis[3], float angle)
Definition armature.cc:2522
void BKE_armature_bone_hash_make(bArmature *arm)
Definition armature.cc:847
void BKE_pchan_bbone_spline_setup(bPoseChannel *pchan, bool rest, bool for_deform, Mat4 *result_array)
Definition armature.cc:1365
void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, bool do_id_user)
Definition armature.cc:2877
bArmature * BKE_armature_from_object(Object *ob)
Definition armature.cc:546
bPoseChannel * BKE_armature_ik_solver_find_root(bPoseChannel *pchan, bKinematicConstraint *data)
Definition armature.cc:3240
void BKE_pose_pchan_index_rebuild(bPose *pose)
void BKE_bone_parent_transform_clear(BoneParentTransform *bpt)
Definition armature.cc:2242
void BKE_armature_deform_coords_with_editmesh(const Object *ob_arm, const Object *ob_target, float(*vert_coords)[3], float(*vert_deform_mats)[3][3], int vert_coords_len, int deformflag, float(*vert_coords_prev)[3], const char *defgrp_name, const BMEditMesh *em_target)
void BKE_armature_deform_coords_with_curves(const Object &ob_arm, const Object &ob_target, const ListBase *defbase, blender::MutableSpan< blender::float3 > vert_coords, std::optional< blender::Span< blender::float3 > > vert_coords_prev, std::optional< blender::MutableSpan< blender::float3x3 > > vert_deform_mats, blender::Span< MDeformVert > dverts, int deformflag, blender::StringRefNull defgrp_name)
void BKE_pchan_bbone_deform_segment_index(const bPoseChannel *pchan, const float *co, int *r_index, float *r_blend_next)
Definition armature.cc:1999
void BKE_bone_parent_transform_combine(const BoneParentTransform *in1, const BoneParentTransform *in2, BoneParentTransform *result)
Definition armature.cc:2256
void BKE_pchan_bbone_spline_params_get(bPoseChannel *pchan, bool rest, BBoneSplineParameters *param)
Definition armature.cc:1118
void BKE_pose_where_is_bone(Depsgraph *depsgraph, Scene *scene, Object *ob, bPoseChannel *pchan, float ctime, bool do_extra)
Definition armature.cc:2987
int BKE_armature_bonelist_count(const ListBase *lb)
Definition armature.cc:554
void BKE_pose_splineik_init_tree(Scene *scene, Object *ob, float ctime)
void BKE_armature_mat_pose_to_bone_ex(Depsgraph *depsgraph, Object *ob, const bPoseChannel *pchan, const float inmat[4][4], float outmat[4][4])
Definition armature.cc:2323
void BKE_bone_parent_transform_invert(BoneParentTransform *bpt)
Definition armature.cc:2249
void mat3_vec_to_roll(const float mat[3][3], const float vec[3], float *r_roll)
Definition armature.cc:2577
void BKE_pchan_protected_location_set(bPoseChannel *pchan, const float location[3])
Definition armature.cc:2467
void BKE_pchan_calc_mat(bPoseChannel *pchan)
Definition armature.cc:2970
void BKE_armature_bonelist_free(ListBase *lb, bool do_id_user)
Definition armature.cc:564
void BKE_pose_where_is_bone_tail(bPoseChannel *pchan)
Definition armature.cc:2978
void BKE_pchan_apply_mat4(bPoseChannel *pchan, const float mat[4][4], bool use_compat)
Definition armature.cc:2389
void BKE_pose_iktree_evaluate(Depsgraph *depsgraph, Scene *scene, Object *object, int rootchan_index)
void BKE_pose_eval_cleanup(Depsgraph *depsgraph, Scene *scene, Object *object)
float distfactor_to_bone(const float vec[3], const float b1[3], const float b2[3], float rad1, float rad2, float rdist)
void BKE_armature_mat_bone_to_pose(const bPoseChannel *pchan, const float inmat[4][4], float outmat[4][4])
Definition armature.cc:2289
void BKE_pchan_minmax(const Object *ob, const bPoseChannel *pchan, const bool use_empty_drawtype, blender::float3 &r_min, blender::float3 &r_max)
Definition armature.cc:3139
void BKE_pose_eval_init(Depsgraph *depsgraph, Scene *scene, Object *object)
void BKE_armature_where_is_bone(Bone *bone, const Bone *bone_parent, bool use_recursion)
Definition armature.cc:2735
void BKE_armature_loc_pose_to_bone(const bPoseChannel *pchan, const float inloc[3], float outloc[3])
Definition armature.cc:2299
void BKE_pchan_rebuild_bbone_handles(bPose *pose, bPoseChannel *pchan)
Definition armature.cc:2860
void BKE_armature_deform_coords_with_mesh(const Object *ob_arm, const Object *ob_target, float(*vert_coords)[3], float(*vert_deform_mats)[3][3], int vert_coords_len, int deformflag, float(*vert_coords_prev)[3], const char *defgrp_name, const Mesh *me_target)
void BKE_pose_clear_pointers(bPose *pose)
Definition armature.cc:2839
bool BKE_armature_bone_flag_test_recursive(const Bone *bone, int flag)
Definition armature.cc:868
void BKE_pchan_to_mat4(const bPoseChannel *pchan, float r_chanmat[4][4])
Definition armature.cc:2947
void BKE_armature_copy_bone_transforms(bArmature *armature_dst, const bArmature *armature_src)
Definition armature.cc:673
void BKE_rotMode_change_values(float quat[4], float eul[3], float axis[3], float *angle, short oldMode, short newMode)
Definition armature.cc:2414
void BKE_armature_transform(bArmature *arm, const float mat[4][4], bool do_props)
Definition armature.cc:776
void BKE_bone_parent_transform_apply(const BoneParentTransform *bpt, const float inmat[4][4], float outmat[4][4])
Definition armature.cc:2265
void BKE_pchan_bbone_segments_cache_copy(bPoseChannel *pchan, bPoseChannel *pchan_from)
Definition armature.cc:1793
void BKE_armature_mat_pose_to_delta(float delta_mat[4][4], float pose_mat[4][4], float arm_mat[4][4])
Definition armature.cc:2396
void vec_roll_to_mat3(const float vec[3], float roll, float r_mat[3][3])
Definition armature.cc:2721
void BKE_pose_eval_bbone_segments(Depsgraph *depsgraph, Object *object, int pchan_index)
void BKE_pose_ensure(Main *bmain, Object *ob, bArmature *arm, bool do_id_user)
Definition armature.cc:2932
void BKE_pose_where_is(Depsgraph *depsgraph, Scene *scene, Object *ob)
Definition armature.cc:3051
void BKE_bone_parent_transform_calc_from_pchan(const bPoseChannel *pchan, BoneParentTransform *r_bpt)
Definition armature.cc:2068
void BKE_armature_editbonelist_free(ListBase *lb, bool do_id_user)
Definition armature.cc:580
void BKE_pchan_protected_scale_set(bPoseChannel *pchan, const float scale[3])
Definition armature.cc:2480
void BKE_pchan_mat3_to_rot(bPoseChannel *pchan, const float mat[3][3], bool use_compat)
Definition armature.cc:2343
void mat3_to_vec_roll(const float mat[3][3], float r_vec[3], float *r_roll)
Definition armature.cc:2566
void BKE_pchan_bbone_segments_cache_compute(bPoseChannel *pchan)
Definition armature.cc:1734
void BKE_bone_parent_transform_calc_from_matrices(int bone_flag, int inherit_scale_mode, const float offs_bone[4][4], const float parent_arm_mat[4][4], const float parent_pose_mat[4][4], BoneParentTransform *r_bpt)
Definition armature.cc:2097
void BKE_pchan_bbone_handles_get(bPoseChannel *pchan, bPoseChannel **r_prev, bPoseChannel **r_next)
Definition armature.cc:1092
void BKE_armature_mat_pose_to_bone(const bPoseChannel *pchan, const float inmat[4][4], float outmat[4][4])
Definition armature.cc:2278
void BKE_bone_offset_matrix_get(const Bone *bone, float offs_bone[4][4])
Definition armature.cc:2054
std::optional< blender::Bounds< blender::float3 > > BKE_armature_min_max(const Object *ob)
Definition armature.cc:3134
Bone * BKE_armature_find_bone_name(bArmature *arm, const char *name)
Definition armature.cc:812
void BKE_armature_bone_hash_free(bArmature *arm)
Definition armature.cc:854
void BKE_armature_where_is(bArmature *arm)
Definition armature.cc:2773
void BKE_pchan_protected_rotation_euler_set(bPoseChannel *pchan, const float rotation_euler[3])
Definition armature.cc:2509
void BKE_pose_bone_done(Depsgraph *depsgraph, Object *object, int pchan_index)
void BKE_pchan_bbone_deform_clamp_segment_index(const bPoseChannel *pchan, float head_tail, int *r_index, float *r_blend_next)
Definition armature.cc:1829
void BKE_pchan_protected_rotation_quaternion_set(bPoseChannel *pchan, const float quat[4])
Definition armature.cc:2493
void BKE_armature_mat_world_to_pose(Object *ob, const float inmat[4][4], float outmat[4][4])
Definition armature.cc:2018
void BKE_pose_constraints_evaluate(Depsgraph *depsgraph, Scene *scene, Object *object, int pchan_index)
void BKE_pose_eval_done(Depsgraph *depsgraph, Object *object)
void vec_roll_to_mat3_normalized(const float nor[3], float roll, float r_mat[3][3])
Definition armature.cc:2592
int BKE_pchan_bbone_spline_compute(BBoneSplineParameters *param, bool for_deform, Mat4 *result_array)
Definition armature.cc:1537
bPoseChannel * BKE_armature_splineik_solver_find_root(bPoseChannel *pchan, bSplineIKConstraint *data)
Definition armature.cc:3261
bool bone_autoside_name(char name[64], int strip_number, short axis, float head, float tail)
void BKE_pose_channels_clear_with_null_bone(bPose *pose, bool do_id_user)
Definition armature.cc:2866
void BKE_pose_remap_bone_pointers(bArmature *armature, bPose *pose)
Definition armature.cc:2847
void BKE_pose_eval_bone(Depsgraph *depsgraph, Scene *scene, Object *object, int pchan_index)
void BKE_armature_loc_world_to_pose(Object *ob, const float inloc[3], float outloc[3])
Definition armature.cc:2034
std::optional< blender::Bounds< blender::float3 > > BKE_pose_minmax(const Object *ob, bool use_select)
Definition armature.cc:3196
void BKE_pchan_bbone_handles_compute(const BBoneSplineParameters *param, float h1[3], float *r_roll1, float h2[3], float *r_roll2, bool ease, bool offsets)
Definition armature.cc:1377
bArmature * BKE_armature_add(Main *bmain, const char *name)
Definition armature.cc:538
eBone_BBoneMappingMode
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:117
BMesh const char void * data
BPy_StructRNA * depsgraph
uint nor
SelectedBonesResult BKE_armature_find_selected_bones(const bArmature *armature, SelectedBoneCallback callback)
blender::FunctionRef< void(Bone *bone)> SelectedBoneCallback
BoneNameSet BKE_armature_find_selected_bone_names(const bArmature *armature)
blender::Set< std::string > BoneNameSet
VecBase< float, 3 > float3
float rotscale_mat[4][4]
float curve_out_z
float scale_in[3]
char name[64]
short bbone_prev_flag
float ease2
float weight
float oldlength
float roll1
::BoneColor color
short segments
float tail[3]
IDProperty * prop
char bbone_prev_type
EditBone * parent
float roll2
ListBase bone_collections
float disp_bbone_mat[32][4][4]
float curve_in_x
float disp_mat[4][4]
float zwidth
union EditBone::@313026223344046157307162027212134045115206003172 temp
short bbone_next_flag
float curve_in_z
float length
Bone * bone
float xwidth
float disp_tail_mat[4][4]
EditBone * next
EditBone * prev
EditBone * bbone_prev
char bbone_next_type
IDProperty * system_properties
float rad_tail
EditBone * bbone_next
EditBone * ebone
EditBone * bbone_child
float ease1
eBone_BBoneMappingMode bbone_mapping_mode
float rad_head
float scale_out[3]
char inherit_scale_mode
float curve_out_x
float head[3]
float mat[4][4]
PoseTarget * next
bConstraint * con
PoseTarget * prev
float(* basis_change)[3][3]
bPoseChannel ** pchan
PoseTree * prev
ListBase targets
PoseTree * next
uint8_t flag
Definition wm_window.cc:139