diff options
author | mano-wii <germano.costa@ig.com.br> | 2020-02-16 00:43:58 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2020-02-16 00:44:11 +0300 |
commit | 071639442344bc8fd689456108bbea0bfd527037 (patch) | |
tree | 8eb7ec87ba9211e4c64eab0ee72b2e4558615239 /source/blender | |
parent | 322dc723165a705c34df1e3246e500da1a9927de (diff) |
Cleanup: Transform: Rearrange definitions and declarations
Diffstat (limited to 'source/blender')
8 files changed, 223 insertions, 213 deletions
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 34b6d5d3d19..5efa562a4e4 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -270,114 +270,6 @@ typedef struct TransDataNla { int handle; } TransDataNla; -struct LinkNode; - -/* header of TransDataEdgeSlideVert, TransDataEdgeSlideEdge */ -typedef struct TransDataGenericSlideVert { - struct BMVert *v; - struct LinkNode **cd_loop_groups; - float co_orig_3d[3]; -} TransDataGenericSlideVert; - -typedef struct TransDataEdgeSlideVert { - /** #TransDataGenericSlideVert (header) */ - struct BMVert *v; - struct LinkNode **cd_loop_groups; - float v_co_orig[3]; - /* end generic */ - - float edge_len; - - struct BMVert *v_side[2]; - - /* add origvert.co to get the original locations */ - float dir_side[2][3]; - - int loop_nr; -} TransDataEdgeSlideVert; - -typedef struct EdgeSlideData { - TransDataEdgeSlideVert *sv; - int totsv; - - int mval_start[2], mval_end[2]; - int curr_sv_index; - - /** when un-clamped - use this index: #TransDataEdgeSlideVert.dir_side */ - int curr_side_unclamp; -} EdgeSlideData; - -typedef struct EdgeSlideParams { - float perc; - - bool use_even; - bool flipped; -} EdgeSlideParams; - -typedef struct TransDataVertSlideVert { - /** #TransDataGenericSlideVert (header) */ - struct BMVert *v; - struct LinkNode **cd_loop_groups; - float co_orig_3d[3]; - /* end generic */ - - float (*co_link_orig_3d)[3]; - int co_link_tot; - int co_link_curr; -} TransDataVertSlideVert; - -typedef struct VertSlideData { - TransDataVertSlideVert *sv; - int totsv; - int curr_sv_index; - - /* result of ED_view3d_ob_project_mat_get */ - float proj_mat[4][4]; -} VertSlideData; - -typedef struct VertSlideParams { - float perc; - - bool use_even; - bool flipped; -} VertSlideParams; - -typedef struct BoneInitData { - struct EditBone *bone; - float tail[3]; - float rad_head; - float rad_tail; - float roll; - float head[3]; - float dist; - float xwidth; - float zwidth; -} BoneInitData; - -typedef struct PoseInitData_Mirror { - /** Points to the bone which this info is initialized & restored to. - * A NULL value is used to terminate the array. */ - struct bPoseChannel *pchan; - struct { - float loc[3]; - float size[3]; - union { - float eul[3]; - float quat[4]; - float axis_angle[4]; - }; - float curve_in_x; - float curve_out_x; - float roll1; - float roll2; - } orig; - /** - * An extra offset to apply after mirroring. - * Use with #POSE_MIRROR_RELATIVE. - */ - float offset_mtx[4][4]; -} PoseInitData_Mirror; - typedef struct TransData { /** Distance needed to affect element (for Proportionnal Editing). */ float dist; diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 7fde1a4f6b6..027ae04795a 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -1870,13 +1870,9 @@ void special_aftertrans_update(bContext *C, TransInfo *t) } else { if (t->mode == TFM_EDGE_SLIDE) { - EdgeSlideParams *slp = t->custom.mode.data; - slp->perc = 0.0; projectEdgeSlideData(t, false); } else if (t->mode == TFM_VERT_SLIDE) { - EdgeSlideParams *slp = t->custom.mode.data; - slp->perc = 0.0; projectVertSlideData(t, false); } } diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h index e81a896e062..075bf0a5a4b 100644 --- a/source/blender/editors/transform/transform_convert.h +++ b/source/blender/editors/transform/transform_convert.h @@ -63,6 +63,7 @@ void clipUVData(TransInfo *t); void flushTransIntFrameActionData(TransInfo *t); /* transform_convert_armature.c */ +void pose_transform_mirror_update(TransInfo *t, TransDataContainer *tc, Object *ob); void restoreMirrorPoseBones(TransDataContainer *tc); void restoreBones(TransDataContainer *tc); diff --git a/source/blender/editors/transform/transform_convert_armature.c b/source/blender/editors/transform/transform_convert_armature.c index 0edf55ece7e..4e8e0cc2369 100644 --- a/source/blender/editors/transform/transform_convert_armature.c +++ b/source/blender/editors/transform/transform_convert_armature.c @@ -45,24 +45,17 @@ #include "transform.h" #include "transform_convert.h" -bKinematicConstraint *has_targetless_ik(bPoseChannel *pchan) -{ - bConstraint *con = pchan->constraints.first; - - for (; con; con = con->next) { - if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce != 0.0f)) { - bKinematicConstraint *data = con->data; - - if (data->tar == NULL) { - return data; - } - if (data->tar->type == OB_ARMATURE && data->subtarget[0] == 0) { - return data; - } - } - } - return NULL; -} +typedef struct BoneInitData { + struct EditBone *bone; + float tail[3]; + float rad_head; + float rad_tail; + float roll; + float head[3]; + float dist; + float xwidth; + float zwidth; +} BoneInitData; static void add_pose_transdata( TransInfo *t, bPoseChannel *pchan, Object *ob, TransDataContainer *tc, TransData *td) @@ -218,6 +211,29 @@ static void add_pose_transdata( td->con = pchan->constraints.first; } +/* -------------------------------------------------------------------- */ +/** \name Pose Auto-IK + * \{ */ + +bKinematicConstraint *has_targetless_ik(bPoseChannel *pchan) +{ + bConstraint *con = pchan->constraints.first; + + for (; con; con = con->next) { + if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce != 0.0f)) { + bKinematicConstraint *data = con->data; + + if (data->tar == NULL) { + return data; + } + if (data->tar->type == OB_ARMATURE && data->subtarget[0] == 0) { + return data; + } + } + } + return NULL; +} + /* adds the IK to pchan - returns if added */ static short pose_grab_with_ik_add(bPoseChannel *pchan) { @@ -406,6 +422,36 @@ static short pose_grab_with_ik(Main *bmain, Object *ob) return (tot_ik) ? 1 : 0; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Pose Mirror + * \{ */ + +typedef struct PoseInitData_Mirror { + /** Points to the bone which this info is initialized & restored to. + * A NULL value is used to terminate the array. */ + struct bPoseChannel *pchan; + struct { + float loc[3]; + float size[3]; + union { + float eul[3]; + float quat[4]; + float axis_angle[4]; + }; + float curve_in_x; + float curve_out_x; + float roll1; + float roll2; + } orig; + /** + * An extra offset to apply after mirroring. + * Use with #POSE_MIRROR_RELATIVE. + */ + float offset_mtx[4][4]; +} PoseInitData_Mirror; + static void pose_mirror_info_init(PoseInitData_Mirror *pid, bPoseChannel *pchan, bPoseChannel *pchan_orig, @@ -475,6 +521,89 @@ static void pose_mirror_info_restore(const PoseInitData_Mirror *pid) } /** + * if pose bone (partial) selected, copy data. + * context; posemode armature, with mirror editing enabled. + */ +void pose_transform_mirror_update(TransInfo *t, TransDataContainer *tc, Object *ob) +{ + float flip_mtx[4][4]; + unit_m4(flip_mtx); + flip_mtx[0][0] = -1; + + bPose *pose = ob->pose; + PoseInitData_Mirror *pid = NULL; + if ((t->mode != TFM_BONESIZE) && (pose->flag & POSE_MIRROR_RELATIVE)) { + pid = tc->custom.type.data; + } + + TransData *td = tc->data; + for (int i = tc->data_len; i--; td++) { + bPoseChannel *pchan_orig = td->extra; + BLI_assert(pchan_orig->bone->flag & BONE_TRANSFORM); + /* No layer check, correct mirror is more important. */ + bPoseChannel *pchan = BKE_pose_channel_get_mirrored(pose, pchan_orig->name); + if (pchan == NULL) { + continue; + } + + /* Also do bbone scaling. */ + pchan->bone->xwidth = pchan_orig->bone->xwidth; + pchan->bone->zwidth = pchan_orig->bone->zwidth; + + /* We assume X-axis flipping for now. */ + pchan->curve_in_x = pchan_orig->curve_in_x * -1; + pchan->curve_out_x = pchan_orig->curve_out_x * -1; + pchan->roll1 = pchan_orig->roll1 * -1; // XXX? + pchan->roll2 = pchan_orig->roll2 * -1; // XXX? + + float pchan_mtx_final[4][4]; + BKE_pchan_to_mat4(pchan_orig, pchan_mtx_final); + mul_m4_m4m4(pchan_mtx_final, pchan_mtx_final, flip_mtx); + mul_m4_m4m4(pchan_mtx_final, flip_mtx, pchan_mtx_final); + if (pid) { + mul_m4_m4m4(pchan_mtx_final, pid->offset_mtx, pchan_mtx_final); + } + BKE_pchan_apply_mat4(pchan, pchan_mtx_final, false); + + /* In this case we can do target-less IK grabbing. */ + if (t->mode == TFM_TRANSLATION) { + bKinematicConstraint *data = has_targetless_ik(pchan); + if (data == NULL) { + continue; + } + mul_v3_m4v3(data->grabtarget, flip_mtx, td->loc); + if (pid) { + /* TODO(germano): Realitve Mirror support */ + } + data->flag |= CONSTRAINT_IK_AUTO; + } + + if (pid) { + pid++; + } + } +} + +void restoreMirrorPoseBones(TransDataContainer *tc) +{ + bPose *pose = tc->poseobj->pose; + + if (!(pose->flag & POSE_MIRROR_EDIT)) { + return; + } + + for (PoseInitData_Mirror *pid = tc->custom.type.data; pid->pchan; pid++) { + pose_mirror_info_restore(pid); + } +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Convert Armature + * \{ */ + +/** * When objects array is NULL, use 't->data_container' as is. */ void createTransPose(TransInfo *t) @@ -620,19 +749,6 @@ void createTransPose(TransInfo *t) t->flag &= ~T_PROP_EDIT_ALL; } -void restoreMirrorPoseBones(TransDataContainer *tc) -{ - bPose *pose = tc->poseobj->pose; - - if (!(pose->flag & POSE_MIRROR_EDIT)) { - return; - } - - for (PoseInitData_Mirror *pid = tc->custom.type.data; pid->pchan; pid++) { - pose_mirror_info_restore(pid); - } -} - void restoreBones(TransDataContainer *tc) { bArmature *arm; @@ -682,7 +798,6 @@ void restoreBones(TransDataContainer *tc) } } -/* ********************* armature ************** */ void createTransArmatureVerts(TransInfo *t) { t->data_len_all = 0; @@ -936,3 +1051,5 @@ void createTransArmatureVerts(TransInfo *t) } } } + +/** \} */ diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 922b8dd01d8..9a524351982 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -783,69 +783,6 @@ static void recalcData_spaceclip(TransInfo *t) } } -/** - * if pose bone (partial) selected, copy data. - * context; posemode armature, with mirror editing enabled. - * - * \param pid: Optional, apply relative transform when set (has no effect on mirrored bones). - */ -static void pose_transform_mirror_update(TransInfo *t, - TransDataContainer *tc, - Object *ob, - PoseInitData_Mirror *pid) -{ - float flip_mtx[4][4]; - unit_m4(flip_mtx); - flip_mtx[0][0] = -1; - - TransData *td = tc->data; - for (int i = tc->data_len; i--; td++) { - bPoseChannel *pchan_orig = td->extra; - BLI_assert(pchan_orig->bone->flag & BONE_TRANSFORM); - /* No layer check, correct mirror is more important. */ - bPoseChannel *pchan = BKE_pose_channel_get_mirrored(ob->pose, pchan_orig->name); - if (pchan == NULL) { - continue; - } - - /* Also do bbone scaling. */ - pchan->bone->xwidth = pchan_orig->bone->xwidth; - pchan->bone->zwidth = pchan_orig->bone->zwidth; - - /* We assume X-axis flipping for now. */ - pchan->curve_in_x = pchan_orig->curve_in_x * -1; - pchan->curve_out_x = pchan_orig->curve_out_x * -1; - pchan->roll1 = pchan_orig->roll1 * -1; // XXX? - pchan->roll2 = pchan_orig->roll2 * -1; // XXX? - - float pchan_mtx_final[4][4]; - BKE_pchan_to_mat4(pchan_orig, pchan_mtx_final); - mul_m4_m4m4(pchan_mtx_final, pchan_mtx_final, flip_mtx); - mul_m4_m4m4(pchan_mtx_final, flip_mtx, pchan_mtx_final); - if (pid) { - mul_m4_m4m4(pchan_mtx_final, pid->offset_mtx, pchan_mtx_final); - } - BKE_pchan_apply_mat4(pchan, pchan_mtx_final, false); - - /* In this case we can do target-less IK grabbing. */ - if (t->mode == TFM_TRANSLATION) { - bKinematicConstraint *data = has_targetless_ik(pchan); - if (data == NULL) { - continue; - } - mul_v3_m4v3(data->grabtarget, flip_mtx, td->loc); - if (pid) { - /* TODO(germano): Realitve Mirror support */ - } - data->flag |= CONSTRAINT_IK_AUTO; - } - - if (pid) { - pid++; - } - } -} - /* helper for recalcData() - for object transforms, typically in the 3D view */ static void recalcData_objects(TransInfo *t) { @@ -1058,7 +995,7 @@ static void recalcData_objects(TransInfo *t) DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); bPose *pose = ob->pose; if (arm->flag & ARM_MIRROR_EDIT || pose->flag & POSE_MIRROR_EDIT) { - pose_transform_mirror_update(t, tc, ob, NULL); + pose_transform_mirror_update(t, tc, ob); } } } @@ -1072,11 +1009,7 @@ static void recalcData_objects(TransInfo *t) if (pose->flag & POSE_MIRROR_EDIT) { if (t->state != TRANS_CANCEL) { - PoseInitData_Mirror *pid = NULL; - if (pose->flag & POSE_MIRROR_RELATIVE) { - pid = tc->custom.type.data; - } - pose_transform_mirror_update(t, tc, ob, pid); + pose_transform_mirror_update(t, tc, ob); } else { restoreMirrorPoseBones(tc); diff --git a/source/blender/editors/transform/transform_mode.h b/source/blender/editors/transform/transform_mode.h index dee6634c935..bb036a69a88 100644 --- a/source/blender/editors/transform/transform_mode.h +++ b/source/blender/editors/transform/transform_mode.h @@ -26,10 +26,18 @@ #define __TRANSFORM_MODE_H__ struct AnimData; +struct LinkNode; struct TransInfo; struct TransDataContainer; struct TransData; +/* header of TransDataEdgeSlideVert, TransDataEdgeSlideEdge */ +typedef struct TransDataGenericSlideVert { + struct BMVert *v; + struct LinkNode **cd_loop_groups; + float co_orig_3d[3]; +} TransDataGenericSlideVert; + /* transform_mode.c */ bool transdata_check_local_center(TransInfo *t, short around); void protectedTransBits(short protectflag, float vec[3]); diff --git a/source/blender/editors/transform/transform_mode_edge_slide.c b/source/blender/editors/transform/transform_mode_edge_slide.c index 70f4c94876c..27b5dbba488 100644 --- a/source/blender/editors/transform/transform_mode_edge_slide.c +++ b/source/blender/editors/transform/transform_mode_edge_slide.c @@ -60,6 +60,41 @@ /** \name Transform Edge Slide * \{ */ +typedef struct TransDataEdgeSlideVert { + /** #TransDataGenericSlideVert (header) */ + struct BMVert *v; + struct LinkNode **cd_loop_groups; + float v_co_orig[3]; + /* end generic */ + + float edge_len; + + struct BMVert *v_side[2]; + + /* add origvert.co to get the original locations */ + float dir_side[2][3]; + + int loop_nr; +} TransDataEdgeSlideVert; + +typedef struct EdgeSlideData { + TransDataEdgeSlideVert *sv; + int totsv; + + int mval_start[2], mval_end[2]; + int curr_sv_index; + + /** when un-clamped - use this index: #TransDataEdgeSlideVert.dir_side */ + int curr_side_unclamp; +} EdgeSlideData; + +typedef struct EdgeSlideParams { + float perc; + + bool use_even; + bool flipped; +} EdgeSlideParams; + /** * Get the first valid EdgeSlideData. * diff --git a/source/blender/editors/transform/transform_mode_vert_slide.c b/source/blender/editors/transform/transform_mode_vert_slide.c index d3798cce9f8..4009a0fb3f9 100644 --- a/source/blender/editors/transform/transform_mode_vert_slide.c +++ b/source/blender/editors/transform/transform_mode_vert_slide.c @@ -57,6 +57,34 @@ /** \name Transform Vert Slide * \{ */ +typedef struct TransDataVertSlideVert { + /** #TransDataGenericSlideVert (header) */ + struct BMVert *v; + struct LinkNode **cd_loop_groups; + float co_orig_3d[3]; + /* end generic */ + + float (*co_link_orig_3d)[3]; + int co_link_tot; + int co_link_curr; +} TransDataVertSlideVert; + +typedef struct VertSlideData { + TransDataVertSlideVert *sv; + int totsv; + int curr_sv_index; + + /* result of ED_view3d_ob_project_mat_get */ + float proj_mat[4][4]; +} VertSlideData; + +typedef struct VertSlideParams { + float perc; + + bool use_even; + bool flipped; +} VertSlideParams; + static void calcVertSlideCustomPoints(struct TransInfo *t) { VertSlideParams *slp = t->custom.mode.data; |