diff options
Diffstat (limited to 'source/blender/blenkernel/BKE_armature.h')
-rw-r--r-- | source/blender/blenkernel/BKE_armature.h | 198 |
1 files changed, 149 insertions, 49 deletions
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h index efd665b070a..bc91ffeb504 100644 --- a/source/blender/blenkernel/BKE_armature.h +++ b/source/blender/blenkernel/BKE_armature.h @@ -33,7 +33,9 @@ * \author nzc */ +struct bPose; struct Bone; +struct Depsgraph; struct GHash; struct Main; struct bArmature; @@ -97,17 +99,19 @@ float distfactor_to_bone(const float vec[3], const float b1[3], const float b2[3 void BKE_armature_where_is(struct bArmature *arm); void BKE_armature_where_is_bone(struct Bone *bone, struct Bone *prevbone, const bool use_recursion); void BKE_pose_clear_pointers(struct bPose *pose); -void BKE_pose_rebuild(struct Object *ob, struct bArmature *arm); -void BKE_pose_rebuild_ex(struct Object *ob, struct bArmature *arm, const bool sort_bones); -void BKE_pose_where_is(struct Scene *scene, struct Object *ob); -void BKE_pose_where_is_bone(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime, bool do_extra); +void BKE_pose_remap_bone_pointers(struct bArmature *armature, struct bPose *pose); +void BKE_pchan_rebuild_bbone_handles(struct bPose *pose, struct bPoseChannel *pchan); +void BKE_pose_rebuild(struct Main *bmain, struct Object *ob, struct bArmature *arm, const bool do_id_user); +void BKE_pose_where_is(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob); +void BKE_pose_where_is_bone(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime, bool do_extra); void BKE_pose_where_is_bone_tail(struct bPoseChannel *pchan); /* get_objectspace_bone_matrix has to be removed still */ void get_objectspace_bone_matrix(struct Bone *bone, float M_accumulatedMatrix[4][4], int root, int posed); void vec_roll_to_mat3(const float vec[3], const float roll, float mat[3][3]); void vec_roll_to_mat3_normalized(const float nor[3], const float roll, float mat[3][3]); -void mat3_to_vec_roll(float mat[3][3], float r_vec[3], float *r_roll); +void mat3_to_vec_roll(const float mat[3][3], float r_vec[3], float *r_roll); +void mat3_vec_to_roll(const float mat[3][3], const float vec[3], float *r_roll); /* Common Conversions Between Co-ordinate Spaces */ void BKE_armature_mat_world_to_pose(struct Object *ob, float inmat[4][4], float outmat[4][4]); @@ -117,7 +121,7 @@ void BKE_armature_loc_pose_to_bone(struct bPoseChannel *pchan, const float inloc void BKE_armature_mat_bone_to_pose(struct bPoseChannel *pchan, float inmat[4][4], float outmat[4][4]); void BKE_armature_mat_pose_to_delta(float delta_mat[4][4], float pose_mat[4][4], float arm_mat[4][4]); -void BKE_armature_mat_pose_to_bone_ex(struct Object *ob, struct bPoseChannel *pchan, float inmat[4][4], float outmat[4][4]); +void BKE_armature_mat_pose_to_bone_ex(struct Depsgraph *depsgraph, struct Object *ob, struct bPoseChannel *pchan, float inmat[4][4], float outmat[4][4]); void BKE_pchan_mat3_to_rot(struct bPoseChannel *pchan, float mat[3][3], bool use_compat); void BKE_pchan_apply_mat4(struct bPoseChannel *pchan, float mat[4][4], bool use_comat); @@ -138,8 +142,48 @@ typedef struct Mat4 { float mat[4][4]; } Mat4; -void equalize_bbone_bezier(float *data, int desired); -void BKE_pchan_bbone_spline_setup(struct bPoseChannel *pchan, int rest, Mat4 result_array[MAX_BBONE_SUBDIV]); +typedef struct BBoneSplineParameters { + int segments; + float length; + + /* Non-uniform scale correction. */ + bool do_scale; + float scale[3]; + + /* Handle control bone data. */ + bool use_prev, prev_bbone; + bool use_next, next_bbone; + + float prev_h[3], next_h[3]; + float prev_mat[4][4], next_mat[4][4]; + + /* Control values. */ + float ease1, ease2; + float roll1, roll2; + float scaleIn, scaleOut; + float curveInX, curveInY, curveOutX, curveOutY; +} BBoneSplineParameters; + +void BKE_pchan_bbone_handles_get( + struct bPoseChannel *pchan, struct bPoseChannel **r_prev, struct bPoseChannel **r_next); +void BKE_pchan_bbone_spline_params_get( + struct bPoseChannel *pchan, const bool rest, struct BBoneSplineParameters *r_param); + +void BKE_pchan_bbone_spline_setup( + struct bPoseChannel *pchan, const bool rest, Mat4 result_array[MAX_BBONE_SUBDIV]); + +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); +int BKE_pchan_bbone_spline_compute( + struct BBoneSplineParameters *param, Mat4 result_array[MAX_BBONE_SUBDIV]); + +void BKE_pchan_bbone_segments_cache_compute( + struct bPoseChannel *pchan); +void BKE_pchan_bbone_segments_cache_copy( + struct bPoseChannel *pchan, struct bPoseChannel *pchan_from); /* like EBONE_VISIBLE */ #define PBONE_VISIBLE(arm, bone) ( \ @@ -151,11 +195,27 @@ void BKE_pchan_bbone_spline_setup(struct bPoseChannel *pchan, int rest, Mat4 res #define PBONE_SELECTABLE(arm, bone) \ (PBONE_VISIBLE(arm, bone) && !((bone)->flag & BONE_UNSELECTABLE)) + +/* context.selected_pose_bones */ +#define FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN(_ob, _pchan) \ + for (bPoseChannel *_pchan = (_ob)->pose->chanbase.first; _pchan; _pchan = _pchan->next) { \ + if (PBONE_VISIBLE(((bArmature *)(_ob)->data), (_pchan)->bone) && ((_pchan)->bone->flag & BONE_SELECTED)) { +#define FOREACH_PCHAN_SELECTED_IN_OBJECT_END \ + } \ + } ((void)0) +/* context.visible_pose_bones */ +#define FOREACH_PCHAN_VISIBLE_IN_OBJECT_BEGIN(_ob, _pchan) \ + for (bPoseChannel *_pchan = (_ob)->pose->chanbase.first; _pchan; _pchan = _pchan->next) { \ + if (PBONE_VISIBLE(((bArmature *)(_ob)->data), (_pchan)->bone)) { +#define FOREACH_PCHAN_VISIBLE_IN_OBJECT_END \ + } \ + } ((void)0) + + /* Evaluation helpers */ struct bKinematicConstraint; struct bPose; struct bSplineIKConstraint; -struct EvaluationContext; struct bPoseChannel *BKE_armature_ik_solver_find_root( struct bPoseChannel *pchan, @@ -165,46 +225,86 @@ struct bPoseChannel *BKE_armature_splineik_solver_find_root( struct bSplineIKConstraint *data); void BKE_pose_splineik_init_tree(struct Scene *scene, struct Object *ob, float ctime); -void BKE_splineik_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan_root, float ctime); - -void BKE_pose_eval_init(struct EvaluationContext *eval_ctx, - struct Scene *scene, - struct Object *ob); - -void BKE_pose_eval_init_ik(struct EvaluationContext *eval_ctx, - struct Scene *scene, - struct Object *ob); - -void BKE_pose_eval_bone(struct EvaluationContext *eval_ctx, - struct Scene *scene, - struct Object *ob, - int pchan_index); - -void BKE_pose_constraints_evaluate(struct EvaluationContext *eval_ctx, - struct Scene *scene, - struct Object *ob, - int pchan_index); - -void BKE_pose_bone_done(struct EvaluationContext *eval_ctx, - struct Object *ob, - int pchan_index); - -void BKE_pose_iktree_evaluate(struct EvaluationContext *eval_ctx, - struct Scene *scene, - struct Object *ob, - int rootchan_index); - -void BKE_pose_splineik_evaluate(struct EvaluationContext *eval_ctx, - struct Scene *scene, - struct Object *ob, - int rootchan_index); - -void BKE_pose_eval_flush(struct EvaluationContext *eval_ctx, - struct Scene *scene, - struct Object *ob); - -void BKE_pose_eval_proxy_copy(struct EvaluationContext *eval_ctx, - struct Object *ob); +void BKE_splineik_execute_tree( + struct Depsgraph *depsgraph, struct Scene *scene, + struct Object *ob, struct bPoseChannel *pchan_root, float ctime); + +void BKE_pose_eval_init( + struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob); + +void BKE_pose_eval_init_ik( + struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob); + +void BKE_pose_eval_bone( + struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob, + int pchan_index); + +void BKE_pose_constraints_evaluate( + struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob, + int pchan_index); + +void BKE_pose_bone_done( + struct Depsgraph *depsgraph, + struct Object *ob, + int pchan_index); + +void BKE_pose_eval_bbone_segments( + struct Depsgraph *depsgraph, + struct Object *ob, + int pchan_index); + +void BKE_pose_iktree_evaluate( + struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob, + int rootchan_index); + +void BKE_pose_splineik_evaluate( + struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob, + int rootchan_index); + +void BKE_pose_eval_done( + struct Depsgraph *depsgraph, + struct Object *object); + +void BKE_pose_eval_cleanup( + struct Depsgraph *depsgraph, + struct Scene *scene, + struct Object *ob); + +void BKE_pose_eval_proxy_init(struct Depsgraph *depsgraph, + struct Object *object); +void BKE_pose_eval_proxy_done(struct Depsgraph *depsgraph, + struct Object *object); +void BKE_pose_eval_proxy_cleanup(struct Depsgraph *depsgraph, + struct Object *object); + +void BKE_pose_eval_proxy_copy_bone( + struct Depsgraph *depsgraph, + struct Object *object, + int pchan_index); + +/* BBOne deformation cache. + * + * The idea here is to pre-calculate deformation queternions, matricies and such + * used by armature_deform_verts(). + */ +struct ObjectBBoneDeform; +struct ObjectBBoneDeform * BKE_armature_cached_bbone_deformation_get( + struct Object *object); +void BKE_armature_cached_bbone_deformation_free_data(struct Object *object); +void BKE_armature_cached_bbone_deformation_free(struct Object *object); +void BKE_armature_cached_bbone_deformation_update(struct Object *object); #ifdef __cplusplus } |