Blender V4.3
armature_utils.cc File Reference
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math_matrix.h"
#include "BLI_math_vector.h"
#include "BLI_string_utils.hh"
#include "BKE_armature.hh"
#include "BKE_global.hh"
#include "BKE_idprop.hh"
#include "BKE_lib_id.hh"
#include "BKE_main.hh"
#include "DEG_depsgraph.hh"
#include "ED_armature.hh"
#include "ANIM_bone_collections.hh"
#include "armature_intern.hh"
#include <cstring>

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)
 
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 void copy_bonecollection_membership (EditBone *eBone, const Bone *bone)
 
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, 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 (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 582 of file armature_utils.cc.

References armature_finalize_restpose(), atan2f, BKE_armature_where_is_bone(), copy_m3_m4(), copy_v3_v3(), ED_armature_ebone_to_mat3(), invert_m3_m3(), invert_m4_m4(), LISTBASE_FOREACH, mul_m3_m3m3(), mul_mat3_m4_v3(), print_m4(), printf, RAD2DEGF, and sub_v3_v3v3().

Referenced by armature_finalize_restpose(), and ED_armature_from_edit().

◆ armature_select_mirrored()

void armature_select_mirrored ( bArmature * arm)

Definition at line 291 of file armature_utils.cc.

References armature_select_mirrored_ex(), and BONE_SELECTED.

Referenced by armature_delete_selected_exec().

◆ armature_select_mirrored_ex()

void armature_select_mirrored_ex ( 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 273 of file armature_utils.cc.

References ANIM_bonecoll_is_visible_editbone(), ARM_MIRROR_EDIT, BLI_assert, BONE_ROOTSEL, BONE_SELECTED, BONE_TIPSEL, ED_armature_ebone_get_mirrored(), bArmature::edbo, bArmature::flag, EditBone::flag, flag, and LISTBASE_FOREACH.

Referenced by armature_dissolve_selected_exec(), and armature_select_mirrored().

◆ armature_tag_select_mirrored()

◆ armature_tag_unselect()

void armature_tag_unselect ( bArmature * arm)

Only works when tagged.

Definition at line 325 of file armature_utils.cc.

References BONE_DONE, BONE_ROOTSEL, BONE_SELECTED, BONE_TIPSEL, bArmature::edbo, and LISTBASE_FOREACH.

Referenced by armature_switch_direction_exec().

◆ bone_free()

◆ bone_looper()

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

XXX: bone_looper is only to be used when we want to access settings (i.e. editability/visibility/selected) that context doesn't offer.

Definition at line 69 of file armature_utils.cc.

References bone_looper(), Bone::childbase, count, ListBase::first, and Bone::next.

Referenced by add_verts_to_dgroups(), bone_looper(), ED_object_vgroup_calc_from_armature(), pose_hide_exec(), and pose_reveal_exec().

◆ copy_bonecollection_membership()

static void copy_bonecollection_membership ( EditBone * eBone,
const Bone * bone )
static

Copy the bone collection membership info from the bones to the edit-bones.

Operations on edit-bones (like subdividing, extruding, etc.) will have to deal with collection assignments of those edit-bones as well.

Definition at line 431 of file armature_utils.cc.

References BLI_assert, BLI_duplicatelist(), BLI_listbase_is_empty(), EditBone::bone_collections, Bone_Runtime::collections, and Bone::runtime.

Referenced by make_boneList_recursive().

◆ ED_armature_ebone_find_name()

◆ ED_armature_ebone_find_shared_parent()

EditBone * ED_armature_ebone_find_shared_parent ( 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 155 of file armature_utils.cc.

References EBONE_TEMP_UINT, 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()

◆ 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 ( ListBase * lb,
bool do_id_user )

◆ 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 140 of file armature_utils.cc.

References ED_armature_ebone_remove_ex().

Referenced by armature_delete_selected_exec().

◆ ED_armature_ebone_remove_ex()

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

Definition at line 125 of file armature_utils.cc.

References bone_free(), bArmature::edbo, EditBone::flag, LISTBASE_FOREACH, and EditBone::parent.

Referenced by armature_dissolve_selected_exec(), and ED_armature_ebone_remove().

◆ ED_armature_ebone_select_set()

◆ 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()

◆ ED_armature_ebone_selectflag_set()

◆ ED_armature_ebone_to_mat3()

◆ ED_armature_ebone_to_mat4()

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

◆ ED_armature_ebone_transform_mirror_update()

◆ ED_armature_edit_free()

◆ ED_armature_edit_sync_selection()

◆ ED_armature_edit_transform_mirror_update()

void ED_armature_edit_transform_mirror_update ( Object * obedit)

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

Definition at line 411 of file armature_utils.cc.

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_from_edit()

void ED_armature_from_edit ( Main * bmain,
bArmature * arm )

Put edit-mode back in Object.

Definition at line 647 of file armature_utils.cc.

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

Referenced by apply_armature_pose2bones_exec(), ED_armature_join_objects_exec(), ED_armature_origin_set(), blender::ed::object::editmode_load_free_ex(), blender::io::usd::import_skeleton(), ArmatureImporter::make_armatures(), blender::ed::object::modifier_skin_armature_create(), separate_armature_bones(), and separate_armature_exec().

◆ ED_armature_to_edit()

◆ find_ebone_link()

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

Definition at line 540 of file armature_utils.cc.

References LISTBASE_FOREACH.

Referenced by make_boneList().

◆ make_boneList()

◆ make_boneList_recursive()