tornavis/source/blender/editors/armature/armature_intern.hh

302 lines
10 KiB
C++

/* SPDX-FileCopyrightText: 2009 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup edarmature
*/
#pragma once
struct bArmature;
struct Base;
struct bContext;
struct Bone;
struct bPoseChannel;
struct EditBone;
struct GPUSelectResult;
struct LinkData;
struct ListBase;
struct Object;
struct Scene;
struct wmOperatorType;
/* -------------------------------------------------------------------- */
/** \name Armature EditMode Operators
* \{ */
void ARMATURE_OT_bone_primitive_add(wmOperatorType *ot);
void ARMATURE_OT_align(wmOperatorType *ot);
void ARMATURE_OT_calculate_roll(wmOperatorType *ot);
void ARMATURE_OT_roll_clear(wmOperatorType *ot);
void ARMATURE_OT_switch_direction(wmOperatorType *ot);
void ARMATURE_OT_subdivide(wmOperatorType *ot);
void ARMATURE_OT_parent_set(wmOperatorType *ot);
void ARMATURE_OT_parent_clear(wmOperatorType *ot);
void ARMATURE_OT_select_all(wmOperatorType *ot);
void ARMATURE_OT_select_mirror(wmOperatorType *ot);
void ARMATURE_OT_select_more(wmOperatorType *ot);
void ARMATURE_OT_select_less(wmOperatorType *ot);
void ARMATURE_OT_select_hierarchy(wmOperatorType *ot);
void ARMATURE_OT_select_linked_pick(wmOperatorType *ot);
void ARMATURE_OT_select_linked(wmOperatorType *ot);
void ARMATURE_OT_select_similar(wmOperatorType *ot);
void ARMATURE_OT_shortest_path_pick(wmOperatorType *ot);
void ARMATURE_OT_delete(wmOperatorType *ot);
void ARMATURE_OT_dissolve(wmOperatorType *ot);
void ARMATURE_OT_duplicate(wmOperatorType *ot);
void ARMATURE_OT_symmetrize(wmOperatorType *ot);
void ARMATURE_OT_extrude(wmOperatorType *ot);
void ARMATURE_OT_hide(wmOperatorType *ot);
void ARMATURE_OT_reveal(wmOperatorType *ot);
void ARMATURE_OT_click_extrude(wmOperatorType *ot);
void ARMATURE_OT_fill(wmOperatorType *ot);
void ARMATURE_OT_separate(wmOperatorType *ot);
void ARMATURE_OT_split(wmOperatorType *ot);
void ARMATURE_OT_autoside_names(wmOperatorType *ot);
void ARMATURE_OT_flip_names(wmOperatorType *ot);
void ARMATURE_OT_collection_add(wmOperatorType *ot);
void ARMATURE_OT_collection_remove(wmOperatorType *ot);
void ARMATURE_OT_collection_move(wmOperatorType *ot);
void ARMATURE_OT_collection_assign(wmOperatorType *ot);
void ARMATURE_OT_collection_create_and_assign(wmOperatorType *ot);
void ARMATURE_OT_collection_unassign(wmOperatorType *ot);
void ARMATURE_OT_collection_unassign_named(wmOperatorType *ot);
void ARMATURE_OT_collection_select(wmOperatorType *ot);
void ARMATURE_OT_collection_deselect(wmOperatorType *ot);
void ARMATURE_OT_move_to_collection(wmOperatorType *ot);
void ARMATURE_OT_assign_to_collection(wmOperatorType *ot);
/** \} */
/* -------------------------------------------------------------------- */
/** \name Pose-Mode Operators
* \{ */
void POSE_OT_hide(wmOperatorType *ot);
void POSE_OT_reveal(wmOperatorType *ot);
void POSE_OT_armature_apply(wmOperatorType *ot);
void POSE_OT_visual_transform_apply(wmOperatorType *ot);
void POSE_OT_rot_clear(wmOperatorType *ot);
void POSE_OT_loc_clear(wmOperatorType *ot);
void POSE_OT_scale_clear(wmOperatorType *ot);
void POSE_OT_transforms_clear(wmOperatorType *ot);
void POSE_OT_user_transforms_clear(wmOperatorType *ot);
void POSE_OT_copy(wmOperatorType *ot);
void POSE_OT_paste(wmOperatorType *ot);
void POSE_OT_select_all(wmOperatorType *ot);
void POSE_OT_select_parent(wmOperatorType *ot);
void POSE_OT_select_hierarchy(wmOperatorType *ot);
void POSE_OT_select_linked(wmOperatorType *ot);
void POSE_OT_select_linked_pick(wmOperatorType *ot);
void POSE_OT_select_constraint_target(wmOperatorType *ot);
void POSE_OT_select_grouped(wmOperatorType *ot);
void POSE_OT_select_mirror(wmOperatorType *ot);
void POSE_OT_paths_calculate(wmOperatorType *ot);
void POSE_OT_paths_update(wmOperatorType *ot);
void POSE_OT_paths_clear(wmOperatorType *ot);
void POSE_OT_paths_range_update(wmOperatorType *ot);
void POSE_OT_autoside_names(wmOperatorType *ot);
void POSE_OT_flip_names(wmOperatorType *ot);
void POSE_OT_rotation_mode_set(wmOperatorType *ot);
void POSE_OT_quaternions_flip(wmOperatorType *ot);
/** \} */
/* -------------------------------------------------------------------- */
/** \name Pose Tool Utilities (for PoseLib, Pose Sliding, etc.)
* \{ */
/* `pose_utils.cc` */
/* Temporary data linking PoseChannels with the F-Curves they affect */
struct tPChanFCurveLink {
tPChanFCurveLink *next, *prev;
/** Object this Pose Channel belongs to. */
Object *ob;
/** F-Curves for this PoseChannel (wrapped with LinkData) */
ListBase fcurves;
/** Pose Channel which data is attached to */
bPoseChannel *pchan;
/** RNA Path to this Pose Channel (needs to be freed when we're done) */
char *pchan_path;
/** transform values at start of operator (to be restored before each modal step) */
float oldloc[3];
float oldrot[3];
float oldscale[3];
float oldquat[4];
float oldangle;
float oldaxis[3];
/** old bbone values (to be restored along with the transform properties) */
float roll1, roll2;
/** (NOTE: we haven't renamed these this time, as their names are already long enough) */
float curve_in_x, curve_in_z;
float curve_out_x, curve_out_z;
float ease1, ease2;
float scale_in[3];
float scale_out[3];
/** copy of custom properties at start of operator (to be restored before each modal step) */
IDProperty *oldprops;
};
/* ----------- */
/** Returns a valid pose armature for this object, else returns NULL. */
Object *poseAnim_object_get(Object *ob_);
/** Get sets of F-Curves providing transforms for the bones in the Pose. */
void poseAnim_mapping_get(bContext *C, ListBase *pfLinks);
/** Free F-Curve <-> PoseChannel links. */
void poseAnim_mapping_free(ListBase *pfLinks);
/**
* Helper for apply() / reset() - refresh the data.
*/
void poseAnim_mapping_refresh(bContext *C, Scene *scene, Object *ob);
/**
* Reset changes made to current pose.
*/
void poseAnim_mapping_reset(ListBase *pfLinks);
/** Perform auto-key-framing after changes were made + confirmed. */
void poseAnim_mapping_autoKeyframe(bContext *C, Scene *scene, ListBase *pfLinks, float cframe);
/**
* Find the next F-Curve for a PoseChannel with matching path.
* - `path` is not just the #tPChanFCurveLink (`pfl`) rna_path,
* since that path doesn't have property info yet.
*/
LinkData *poseAnim_mapping_getNextFCurve(ListBase *fcuLinks, LinkData *prev, const char *path);
/** \} */
/* -------------------------------------------------------------------- */
/** \name PoseLib
* \{ */
/* `pose_lib_2.cc` */
void POSELIB_OT_apply_pose_asset(wmOperatorType *ot);
void POSELIB_OT_blend_pose_asset(wmOperatorType *ot);
/** \} */
/* -------------------------------------------------------------------- */
/** \name Pose Sliding Tools
* \{ */
/* `pose_slide.cc` */
void POSE_OT_push(wmOperatorType *ot);
void POSE_OT_relax(wmOperatorType *ot);
void POSE_OT_blend_with_rest(wmOperatorType *ot);
void POSE_OT_breakdown(wmOperatorType *ot);
void POSE_OT_blend_to_neighbors(wmOperatorType *ot);
void POSE_OT_propagate(wmOperatorType *ot);
/** \} */
/* -------------------------------------------------------------------- */
/** \name Various Armature Edit/Pose Editing API's
* \{ */
/* Ideally, many of these defines would not be needed as everything would be strictly
* self-contained within each file,
* but some tools still have a bit of overlap which makes things messy -- Feb 2013
*/
EditBone *make_boneList(ListBase *edbo, ListBase *bones, Bone *actBone);
/* Duplicate method. */
/** Call this before doing any duplications. */
void preEditBoneDuplicate(ListBase *editbones);
void postEditBoneDuplicate(ListBase *editbones, Object *ob);
EditBone *duplicateEditBone(EditBone *cur_bone, const char *name, ListBase *editbones, Object *ob);
/* Duplicate method (cross objects). */
/**
* \param editbones: The target list.
*/
EditBone *duplicateEditBoneObjects(
EditBone *cur_bone, const char *name, ListBase *editbones, Object *src_ob, Object *dst_ob);
/** Adds an EditBone between the nominated locations (should be in the right space). */
EditBone *add_points_bone(Object *obedit, float head[3], float tail[3]);
void bone_free(bArmature *arm, EditBone *bone);
void armature_tag_select_mirrored(bArmature *arm);
/**
* Helper function for tools to work on mirrored parts.
* it leaves mirrored bones selected then too, which is a good indication of what happened.
*/
void armature_select_mirrored_ex(bArmature *arm, int flag);
void armature_select_mirrored(bArmature *arm);
/** Only works when tagged. */
void armature_tag_unselect(bArmature *arm);
/** \} */
/* -------------------------------------------------------------------- */
/** \name Selection Picking
* \{ */
EditBone *ED_armature_pick_ebone(bContext *C, const int xy[2], bool findunsel, Base **r_base);
bPoseChannel *ED_armature_pick_pchan(bContext *C, const int xy[2], bool findunsel, Base **r_base);
Bone *ED_armature_pick_bone(bContext *C, const int xy[2], bool findunsel, Base **r_base);
EditBone *ED_armature_pick_ebone_from_selectbuffer(blender::Span<Base *> bases,
const GPUSelectResult *hit_results,
int hits,
bool findunsel,
bool do_nearest,
Base **r_base);
bPoseChannel *ED_armature_pick_pchan_from_selectbuffer(blender::Span<Base *> bases,
const GPUSelectResult *hit_results,
int hits,
bool findunsel,
bool do_nearest,
Base **r_base);
Bone *ED_armature_pick_bone_from_selectbuffer(blender::Span<Base *> bases,
const GPUSelectResult *hit_results,
int hits,
bool findunsel,
bool do_nearest,
Base **r_base);
/** \} */
/* -------------------------------------------------------------------- */
/** \name Iteration
* \{ */
/**
* XXX: bone_looper is only to be used when we want to access settings
* (i.e. editability/visibility/selected) that context doesn't offer.
*/
int bone_looper(Object *ob, Bone *bone, void *data, int (*bone_func)(Object *, Bone *, void *));
/** \} */