Blender  V3.3
Macros
armature_utils.c File Reference
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_string_utils.h"
#include "BKE_armature.h"
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "DEG_depsgraph.h"
#include "ED_armature.h"
#include "ED_util.h"
#include "armature_intern.h"

Go to the source code of this file.

Macros

#define EBONE_TEMP_UINT(ebone)   (*((uint *)(&((ebone)->temp))))
 

Functions

Validation
void ED_armature_edit_sync_selection (ListBase *edbo)
 
void ED_armature_edit_validate_active (struct bArmature *arm)
 
void ED_armature_edit_refresh_layer_used (bArmature *arm)
 
Bone Operations
int bone_looper (Object *ob, Bone *bone, void *data, int(*bone_func)(Object *, Bone *, void *))
 
Bone Removal
void bone_free (bArmature *arm, EditBone *bone)
 
void ED_armature_ebone_remove_ex (bArmature *arm, EditBone *exBone, bool clear_connected)
 
void ED_armature_ebone_remove (bArmature *arm, EditBone *exBone)
 
bool ED_armature_ebone_is_child_recursive (EditBone *ebone_parent, EditBone *ebone_child)
 
EditBoneED_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_to_mat4 (EditBone *ebone, float r_mat[4][4])
 
void ED_armature_ebone_from_mat3 (EditBone *ebone, const float mat[3][3])
 
void ED_armature_ebone_from_mat4 (EditBone *ebone, const float mat[4][4])
 
EditBoneED_armature_ebone_find_name (const ListBase *edbo, const char *name)
 
Mirroring
EditBoneED_armature_ebone_get_mirrored (const ListBase *edbo, EditBone *ebo)
 
void armature_select_mirrored_ex (bArmature *arm, const int flag)
 
void armature_select_mirrored (bArmature *arm)
 
void armature_tag_select_mirrored (bArmature *arm)
 
void armature_tag_unselect (bArmature *arm)
 
void ED_armature_ebone_transform_mirror_update (bArmature *arm, EditBone *ebo, bool check_select)
 
void ED_armature_edit_transform_mirror_update (Object *obedit)
 
Armature EditMode Conversions
static EditBonemake_boneList_recursive (ListBase *edbo, ListBase *bones, EditBone *parent, Bone *actBone)
 
static EditBonefind_ebone_link (ListBase *edbo, Bone *link)
 
EditBonemake_boneList (ListBase *edbo, ListBase *bones, struct Bone *actBone)
 
static void armature_finalize_restpose (ListBase *bonelist, ListBase *editbonelist)
 
void ED_armature_from_edit (Main *bmain, bArmature *arm)
 
void ED_armature_edit_free (struct bArmature *arm)
 
void ED_armature_to_edit (bArmature *arm)
 
Used by Undo for Armature EditMode
void ED_armature_ebone_listbase_free (ListBase *lb, const bool do_id_user)
 
void ED_armature_ebone_listbase_copy (ListBase *lb_dst, ListBase *lb_src, const bool do_id_user)
 
void ED_armature_ebone_listbase_temp_clear (ListBase *lb)
 
Low Level Selection Functions

which hide connected-parent flag behavior which gets tricky to handle in selection operators. (no flushing in ED_armature_ebone_select.*, that should be explicit).

int ED_armature_ebone_selectflag_get (const EditBone *ebone)
 
void ED_armature_ebone_selectflag_set (EditBone *ebone, int flag)
 
void ED_armature_ebone_selectflag_enable (EditBone *ebone, int flag)
 
void ED_armature_ebone_selectflag_disable (EditBone *ebone, int flag)
 
void ED_armature_ebone_select_set (EditBone *ebone, bool select)
 

Macro Definition Documentation

◆ EBONE_TEMP_UINT

#define EBONE_TEMP_UINT (   ebone)    (*((uint *)(&((ebone)->temp))))

Function Documentation

◆ armature_finalize_restpose()

static void armature_finalize_restpose ( ListBase bonelist,
ListBase editbonelist 
)
static

This function:

Note
The order is crucial here, we can only handle child if all its parents in chain have already been handled (this is ensured by recursive process).

Definition at line 592 of file armature_utils.c.

References Bone::arm_head, Bone::arm_mat, Bone::arm_tail, KDL::atan2(), atan2f, BKE_armature_where_is_bone(), EditBone::bone, Bone::childbase, copy_m3_m4(), copy_v3_v3(), ED_armature_ebone_to_mat3(), ListBase::first, Bone::head, invert_m3_m3(), invert_m4_m4(), mul_m3_m3m3(), mul_mat3_m4_v3(), Bone::name, EditBone::next, Bone::next, Bone::parent, print_m4(), RAD2DEGF, Bone::roll, sub_v3_v3v3(), Bone::tail, and EditBone::temp.

Referenced by ED_armature_from_edit().

◆ armature_select_mirrored()

void armature_select_mirrored ( bArmature arm)

Definition at line 311 of file armature_utils.c.

References armature_select_mirrored_ex(), and BONE_SELECTED.

Referenced by armature_delete_selected_exec().

◆ armature_select_mirrored_ex()

void armature_select_mirrored_ex ( struct bArmature arm,
int  flag 
)

Helper function for tools to work on mirrored parts. it leaves mirrored bones selected then too, which is a good indication of what happened.

Definition at line 291 of file armature_utils.c.

References ARM_MIRROR_EDIT, BLI_assert, BONE_ROOTSEL, BONE_SELECTED, BONE_TIPSEL, ED_armature_ebone_get_mirrored(), bArmature::edbo, ListBase::first, EditBone::flag, bArmature::flag, EditBone::layer, bArmature::layer, and EditBone::next.

Referenced by armature_dissolve_selected_exec(), and armature_select_mirrored().

◆ armature_tag_select_mirrored()

void armature_tag_select_mirrored ( bArmature arm)

◆ armature_tag_unselect()

void armature_tag_unselect ( struct bArmature arm)

◆ bone_free()

void bone_free ( bArmature arm,
EditBone bone 
)

◆ bone_looper()

int bone_looper ( Object ob,
Bone bone,
void data,
int(*)(Object *, Bone *, void *)  bone_func 
)

Definition at line 87 of file armature_utils.c.

References Bone::childbase, count, data, ListBase::first, and Bone::next.

◆ ED_armature_ebone_find_name()

EditBone* ED_armature_ebone_find_name ( const ListBase edbo,
const char *  name 
)

◆ ED_armature_ebone_find_shared_parent()

EditBone* ED_armature_ebone_find_shared_parent ( struct EditBone ebone_child[],
unsigned int  ebone_child_tot 
)

Finds the first parent shared by ebone_child

Parameters
ebone_childChildren bones to search
ebone_child_totSize of the ebone_child array
Returns
The shared parent or NULL.

Definition at line 174 of file armature_utils.c.

References EBONE_TEMP_UINT, NULL, and EditBone::parent.

Referenced by armature_shortest_path_pick_invoke().

◆ ED_armature_ebone_from_mat3()

void ED_armature_ebone_from_mat3 ( EditBone ebone,
const float  mat[3][3] 
)

◆ ED_armature_ebone_from_mat4()

void ED_armature_ebone_from_mat4 ( EditBone ebone,
const float  mat[4][4] 
)

◆ ED_armature_ebone_get_mirrored()

EditBone* ED_armature_ebone_get_mirrored ( const ListBase edbo,
EditBone ebo 
)

◆ ED_armature_ebone_is_child_recursive()

bool ED_armature_ebone_is_child_recursive ( EditBone ebone_parent,
EditBone ebone_child 
)

◆ ED_armature_ebone_listbase_copy()

void ED_armature_ebone_listbase_copy ( ListBase lb_dst,
ListBase lb_src,
const bool  do_id_user 
)

◆ ED_armature_ebone_listbase_free()

void ED_armature_ebone_listbase_free ( struct ListBase lb,
bool  do_id_user 
)

Free's bones and their properties.

Definition at line 822 of file armature_utils.c.

References BLI_listbase_clear(), ListBase::first, IDP_FreeProperty_ex(), MEM_freeN, EditBone::next, and EditBone::prop.

Referenced by undoarm_free_data(), and undoarm_to_editarm().

◆ ED_armature_ebone_listbase_temp_clear()

void ED_armature_ebone_listbase_temp_clear ( ListBase lb)

◆ ED_armature_ebone_remove()

void ED_armature_ebone_remove ( bArmature arm,
EditBone exBone 
)

Definition at line 159 of file armature_utils.c.

References ED_armature_ebone_remove_ex().

Referenced by armature_delete_selected_exec().

◆ ED_armature_ebone_remove_ex()

void ED_armature_ebone_remove_ex ( struct bArmature arm,
struct EditBone exBone,
bool  clear_connected 
)
Parameters
clear_connectedWhen false caller is responsible for keeping the flag in a valid state.

Definition at line 142 of file armature_utils.c.

References BONE_CONNECTED, bone_free(), bArmature::edbo, ListBase::first, EditBone::flag, EditBone::next, and EditBone::parent.

Referenced by armature_dissolve_selected_exec(), and ED_armature_ebone_remove().

◆ ED_armature_ebone_select_set()

void ED_armature_ebone_select_set ( EditBone ebone,
bool  select 
)

◆ ED_armature_ebone_selectflag_disable()

void ED_armature_ebone_selectflag_disable ( EditBone ebone,
int  flag 
)

◆ ED_armature_ebone_selectflag_enable()

void ED_armature_ebone_selectflag_enable ( EditBone ebone,
int  flag 
)

◆ ED_armature_ebone_selectflag_get()

int ED_armature_ebone_selectflag_get ( const EditBone ebone)

◆ ED_armature_ebone_selectflag_set()

void ED_armature_ebone_selectflag_set ( EditBone ebone,
int  flag 
)

◆ ED_armature_ebone_to_mat3()

void ED_armature_ebone_to_mat3 ( EditBone ebone,
float  r_mat[3][3] 
)

◆ ED_armature_ebone_to_mat4()

void ED_armature_ebone_to_mat4 ( EditBone ebone,
float  r_mat[4][4] 
)

◆ ED_armature_ebone_transform_mirror_update()

void ED_armature_ebone_transform_mirror_update ( bArmature arm,
EditBone ebo,
bool  check_select 
)

◆ ED_armature_edit_free()

void ED_armature_edit_free ( struct bArmature arm)

◆ ED_armature_edit_refresh_layer_used()

void ED_armature_edit_refresh_layer_used ( struct bArmature arm)

Update the layers_used variable after bones are moved between layer

Note
Used to be done in drawing code in 2.7, but that won't work with Copy-on-Write, as drawing uses evaluated copies.

Definition at line 73 of file armature_utils.c.

References bArmature::edbo, bArmature::layer_used, and LISTBASE_FOREACH.

Referenced by armature_bone_layers_exec(), armature_bone_primitive_add_exec(), armature_delete_selected_exec(), armature_dissolve_selected_exec(), armature_fill_bones_exec(), and separate_armature_exec().

◆ ED_armature_edit_sync_selection()

void ED_armature_edit_sync_selection ( struct ListBase edbo)

◆ ED_armature_edit_transform_mirror_update()

void ED_armature_edit_transform_mirror_update ( struct Object obedit)

If edit-bone (partial) selected, copy data. context; edit-mode armature, with mirror editing enabled.

Definition at line 436 of file armature_utils.c.

References Object::data, ED_armature_ebone_transform_mirror_update(), bArmature::edbo, and LISTBASE_FOREACH.

Referenced by armature_symmetrize_exec(), ED_transverts_update_obedit(), recalcData_edit_armature(), and recalcData_pose().

◆ ED_armature_edit_validate_active()

void ED_armature_edit_validate_active ( struct bArmature arm)

◆ ED_armature_from_edit()

void ED_armature_from_edit ( struct Main bmain,
struct bArmature arm 
)

Put edit-mode back in Object.

Definition at line 660 of file armature_utils.c.

References bArmature::act_bone, bArmature::act_edbone, Bone::arm_head, Bone::arm_roll, Bone::arm_tail, armature_finalize_restpose(), EditBone::bbone_flag, Bone::bbone_flag, EditBone::bbone_next, Bone::bbone_next, EditBone::bbone_next_flag, Bone::bbone_next_flag, EditBone::bbone_next_type, Bone::bbone_next_type, EditBone::bbone_prev, Bone::bbone_prev, EditBone::bbone_prev_flag, Bone::bbone_prev_flag, EditBone::bbone_prev_type, Bone::bbone_prev_type, BKE_armature_bone_hash_free(), BKE_armature_bone_hash_make(), BKE_armature_bonelist_free(), BKE_pose_rebuild(), BLI_addtail(), BLI_strncpy(), EditBone::bone, bone_free(), bArmature::bonebase, Bone::childbase, copy_v3_v3(), EditBone::curve_in_x, Bone::curve_in_x, EditBone::curve_in_z, Bone::curve_in_z, EditBone::curve_out_x, Bone::curve_out_x, EditBone::curve_out_z, Bone::curve_out_z, Object::data, DEG_id_tag_update(), EditBone::dist, Bone::dist, EditBone::ease1, Bone::ease1, EditBone::ease2, Bone::ease2, bArmature::edbo, ListBase::first, EditBone::flag, Bone::flag, G, G_DEBUG, EditBone::head, bArmature::id, Object::id, IDP_CopyProperty(), EditBone::inherit_scale_mode, Bone::inherit_scale_mode, EditBone::layer, Bone::layer, len_squared_v3v3(), MEM_callocN, EditBone::name, Bone::name, EditBone::next, ID::next, NULL, Main::objects, EditBone::parent, Bone::parent, EditBone::prop, Bone::prop, EditBone::rad_head, Bone::rad_head, EditBone::rad_tail, Bone::rad_tail, EditBone::roll, Bone::roll, EditBone::roll1, Bone::roll1, EditBone::roll2, Bone::roll2, EditBone::scale_in, Bone::scale_in, EditBone::scale_out, Bone::scale_out, EditBone::segments, Bone::segments, square_f(), EditBone::tail, EditBone::temp, EditBone::weight, Bone::weight, EditBone::xwidth, Bone::xwidth, EditBone::zwidth, and Bone::zwidth.

Referenced by apply_armature_pose2bones_exec(), ED_armature_join_objects_exec(), ED_armature_origin_set(), ED_object_editmode_load_free_ex(), ArmatureImporter::make_armatures(), modifier_skin_armature_create(), separate_armature_bones(), and separate_armature_exec().

◆ ED_armature_to_edit()

void ED_armature_to_edit ( struct bArmature arm)

◆ find_ebone_link()

static EditBone* find_ebone_link ( ListBase edbo,
Bone link 
)
static

Definition at line 550 of file armature_utils.c.

References LISTBASE_FOREACH, and NULL.

Referenced by make_boneList().

◆ make_boneList()

EditBone* make_boneList ( ListBase edbo,
ListBase bones,
struct Bone actBone 
)

◆ make_boneList_recursive()

static EditBone* make_boneList_recursive ( ListBase edbo,
ListBase bones,
EditBone parent,
Bone actBone 
)
static