Refactor: rearrange transform mode functions in a 'TransModeInfo' struct #108467

Merged
Germano Cavalcante merged 1 commits from mano-wii/blender:transform_mode_refactor into main 2023-06-02 14:42:34 +02:00
35 changed files with 650 additions and 411 deletions

View File

@ -1332,11 +1332,12 @@ int transformEvent(TransInfo *t, const wmEvent *event)
}
/* Per transform event, if present */
if (t->handleEvent && (!handled ||
/* Needed for vertex slide, see #38756. */
(event->type == MOUSEMOVE)))
if (t->mode_info && t->mode_info->handle_event_fn &&
(!handled ||
/* Needed for vertex slide, see #38756. */
(event->type == MOUSEMOVE)))
{
t->redraw |= t->handleEvent(t, event);
t->redraw |= t->mode_info->handle_event_fn(t, event);
}
/* Try to init modal numinput now, if possible. */
@ -1441,10 +1442,8 @@ static void drawTransformView(const struct bContext *C, ARegion *region, void *a
drawPropCircle(C, t);
drawSnapping(C, t);
if (region == t->region) {
/* edge slide, vert slide */
drawEdgeSlide(t);
drawVertSlide(t);
if (region == t->region && t->mode_info && t->mode_info->draw_fn) {
t->mode_info->draw_fn(t);
}
}
@ -2066,8 +2065,8 @@ void transformApply(bContext *C, TransInfo *t)
if (t->redraw == TREDRAW_HARD) {
selectConstraint(t);
if (t->transform) {
t->transform(t, t->mval); /* calls recalcData() */
if (t->mode_info) {
t->mode_info->transform_fn(t, t->mval); /* calls recalcData() */
}
}
@ -2143,8 +2142,8 @@ bool checkUseAxisMatrix(TransInfo *t)
bool transform_apply_matrix(TransInfo *t, float mat[4][4])
{
if (t->transform_matrix != NULL) {
t->transform_matrix(t, mat);
if (t->mode_info && t->mode_info->transform_matrix_fn) {
t->mode_info->transform_matrix_fn(t, mat);
return true;
}
return false;

View File

@ -309,14 +309,6 @@ typedef struct TransSnap {
double last;
void (*snap_target_fn)(struct TransInfo *, float *);
void (*snap_source_fn)(struct TransInfo *);
/**
* Get the transform distance between two points (used by Closest snap)
*
* \note Return value can be anything,
* where the smallest absolute value defines what's closest.
*/
float (*snap_mode_distance_fn)(struct TransInfo *t, const float p1[3], const float p2[3]);
void (*snap_mode_apply_fn)(struct TransInfo *, float *);
/**
* Re-usable snap context data.
@ -508,6 +500,11 @@ typedef struct TransInfo {
/** TODO: It should be a member of #TransDataContainer. */
struct TransConvertTypeInfo *data_type;
/** Mode indicator as set for the operator.
* NOTE: A same `mode_info` can have different `mode`s. */
eTfmMode mode;
struct TransModeInfo *mode_info;
/** Current context/options for transform. */
eTContext options;
/** Generic flags for special behaviors. */
@ -520,20 +517,6 @@ typedef struct TransInfo {
eRedrawFlag redraw;
/** Choice of custom cursor with or without a help line from the gizmo to the mouse position. */
eTHelpline helpline;
/** Current mode. */
eTfmMode mode;
/** Main transform mode function. */
void (*transform)(struct TransInfo *, const int[2]);
/* Event handler function that determines whether the viewport needs to be redrawn. */
eRedrawFlag (*handleEvent)(struct TransInfo *, const struct wmEvent *);
/**
* Optional callback to transform a single matrix.
*
* \note used by the gizmo to transform the matrix used to position it.
*/
void (*transform_matrix)(struct TransInfo *t, float mat_xform[4][4]);
/** Constraint Data. */
TransCon con;

View File

@ -186,8 +186,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
copy_v2_v2_int(t->mouse.imval, mval);
copy_v2_v2_int(t->con.imval, mval);
t->transform = NULL;
t->handleEvent = NULL;
t->mode_info = NULL;
t->data_len_all = 0;

View File

@ -1066,141 +1066,92 @@ void ElementResize(const TransInfo *t,
/** \name Transform Mode Initialization
* \{ */
static TransModeInfo *mode_info_get(TransInfo *t, const int mode)
{
switch (mode) {
case TFM_TRANSLATION:
return &TransMode_translate;
case TFM_ROTATION:
return &TransMode_rotate;
case TFM_RESIZE:
return &TransMode_resize;
case TFM_SKIN_RESIZE:
return &TransMode_skinresize;
case TFM_TOSPHERE:
return &TransMode_tosphere;
case TFM_SHEAR:
return &TransMode_shear;
case TFM_BEND:
return &TransMode_bend;
case TFM_SHRINKFATTEN:
return &TransMode_shrinkfatten;
case TFM_TILT:
return &TransMode_tilt;
case TFM_CURVE_SHRINKFATTEN:
return &TransMode_curveshrinkfatten;
case TFM_MASK_SHRINKFATTEN:
return &TransMode_maskshrinkfatten;
case TFM_GPENCIL_SHRINKFATTEN:
return &TransMode_gpshrinkfatten;
case TFM_TRACKBALL:
return &TransMode_trackball;
case TFM_PUSHPULL:
return &TransMode_pushpull;
case TFM_EDGE_CREASE:
return &TransMode_edgecrease;
case TFM_VERT_CREASE:
return &TransMode_vertcrease;
case TFM_BONESIZE:
return &TransMode_bboneresize;
case TFM_BONE_ENVELOPE:
case TFM_BONE_ENVELOPE_DIST:
return &TransMode_boneenvelope;
case TFM_EDGE_SLIDE:
return &TransMode_edgeslide;
case TFM_VERT_SLIDE:
return &TransMode_vertslide;
case TFM_BONE_ROLL:
return &TransMode_boneroll;
case TFM_TIME_TRANSLATE:
return &TransMode_translate;
case TFM_TIME_SLIDE:
return &TransMode_timeslide;
case TFM_TIME_SCALE:
return &TransMode_timescale;
case TFM_TIME_EXTEND:
/* Do TFM_TIME_TRANSLATE (for most Animation Editors because they have only 1D transforms for
* time values) or TFM_TRANSLATION (for Graph/NLA Editors only since they uses 'standard'
* transforms to get 2D movement) depending on which editor this was called from. */
if (ELEM(t->spacetype, SPACE_GRAPH, SPACE_NLA)) {
return &TransMode_translate;
}
return &TransMode_timetranslate;
case TFM_BAKE_TIME:
return &TransMode_baketime;
case TFM_MIRROR:
return &TransMode_mirror;
case TFM_BWEIGHT:
return &TransMode_bevelweight;
case TFM_ALIGN:
return &TransMode_align;
case TFM_SEQ_SLIDE:
return &TransMode_seqslide;
case TFM_NORMAL_ROTATION:
return &TransMode_rotatenormal;
case TFM_GPENCIL_OPACITY:
return &TransMode_gpopacity;
}
return NULL;
}
void transform_mode_init(TransInfo *t, wmOperator *op, const int mode)
{
t->mode = mode;
t->mode_info = mode_info_get(t, mode);
switch (mode) {
case TFM_TRANSLATION:
initTranslation(t);
break;
case TFM_ROTATION:
initRotation(t);
break;
case TFM_RESIZE: {
float mouse_dir_constraint[3];
if (op) {
PropertyRNA *prop = RNA_struct_find_property(op->ptr, "mouse_dir_constraint");
if (prop) {
RNA_property_float_get_array(op->ptr, prop, mouse_dir_constraint);
}
else {
/* Resize is expected to have this property. */
BLI_assert(!STREQ(op->idname, "TRANSFORM_OT_resize"));
}
}
else {
zero_v3(mouse_dir_constraint);
}
initResize(t, mouse_dir_constraint);
break;
}
case TFM_SKIN_RESIZE:
initSkinResize(t);
break;
case TFM_TOSPHERE:
initToSphere(t);
break;
case TFM_SHEAR:
initShear(t);
break;
case TFM_BEND:
initBend(t);
break;
case TFM_SHRINKFATTEN:
initShrinkFatten(t);
break;
case TFM_TILT:
initTilt(t);
break;
case TFM_CURVE_SHRINKFATTEN:
initCurveShrinkFatten(t);
break;
case TFM_MASK_SHRINKFATTEN:
initMaskShrinkFatten(t);
break;
case TFM_GPENCIL_SHRINKFATTEN:
initGPShrinkFatten(t);
break;
case TFM_TRACKBALL:
initTrackball(t);
break;
case TFM_PUSHPULL:
initPushPull(t);
break;
case TFM_EDGE_CREASE:
initEgdeCrease(t);
break;
case TFM_VERT_CREASE:
initVertCrease(t);
break;
case TFM_BONESIZE:
initBoneSize(t);
break;
case TFM_BONE_ENVELOPE:
case TFM_BONE_ENVELOPE_DIST:
initBoneEnvelope(t);
break;
case TFM_EDGE_SLIDE:
case TFM_VERT_SLIDE: {
const bool use_even = (op ? RNA_boolean_get(op->ptr, "use_even") : false);
const bool flipped = (op ? RNA_boolean_get(op->ptr, "flipped") : false);
const bool use_clamp = (op ? RNA_boolean_get(op->ptr, "use_clamp") : true);
if (mode == TFM_EDGE_SLIDE) {
const bool use_double_side = (op ? !RNA_boolean_get(op->ptr, "single_side") : true);
initEdgeSlide_ex(t, use_double_side, use_even, flipped, use_clamp);
}
else {
initVertSlide_ex(t, use_even, flipped, use_clamp);
}
break;
}
case TFM_BONE_ROLL:
initBoneRoll(t);
break;
case TFM_TIME_TRANSLATE:
initTimeTranslate(t);
break;
case TFM_TIME_SLIDE:
initTimeSlide(t);
break;
case TFM_TIME_SCALE:
initTimeScale(t);
break;
case TFM_TIME_EXTEND:
/* now that transdata has been made, do like for TFM_TIME_TRANSLATE (for most Animation
* Editors because they have only 1D transforms for time values) or TFM_TRANSLATION
* (for Graph/NLA Editors only since they uses 'standard' transforms to get 2D movement)
* depending on which editor this was called from
*/
if (ELEM(t->spacetype, SPACE_GRAPH, SPACE_NLA)) {
initTranslation(t);
}
else {
initTimeTranslate(t);
}
break;
case TFM_BAKE_TIME:
initBakeTime(t);
break;
case TFM_MIRROR:
initMirror(t);
break;
case TFM_BWEIGHT:
initBevelWeight(t);
break;
case TFM_ALIGN:
initAlign(t);
break;
case TFM_SEQ_SLIDE:
initSeqSlide(t);
break;
case TFM_NORMAL_ROTATION:
initNormalRotation(t);
break;
case TFM_GPENCIL_OPACITY:
initGPOpacity(t);
break;
if (t->mode_info) {
t->flag |= t->mode_info->flags;
t->mode_info->init_fn(t, op);
}
if (t->data_type == &TransConvertType_Mesh) {
@ -1211,7 +1162,7 @@ void transform_mode_init(TransInfo *t, wmOperator *op, const int mode)
transform_gizmo_3d_model_from_constraint_and_mode_set(t);
/* TODO(@germano): Some of these operations change the `t->mode`.
/* TODO(@mano-wii): Some of these operations change the `t->mode`.
* This can be bad for Redo. */
// BLI_assert(t->mode == mode);
}

View File

@ -16,6 +16,37 @@ struct TransInfo;
struct bContext;
struct wmOperator;
typedef struct TransModeInfo {
int flags; /* eTFlag */
void (*init_fn)(TransInfo *, struct wmOperator *);
/** Main transform mode function. */
void (*transform_fn)(TransInfo *, const int[2]);
/**
* Optional callback to transform a single matrix.
*
* \note used by the gizmo to transform the matrix used to position it.
*/
void (*transform_matrix_fn)(TransInfo *, float[4][4]);
/* Event handler function that determines whether the viewport needs to be redrawn. */
eRedrawFlag (*handle_event_fn)(TransInfo *, const struct wmEvent *);
/**
* Get the transform distance between two points (used by Closest snap)
*
* \note Return value can be anything,
* where the smallest absolute value defines what's closest.
*/
float (*snap_distance_fn)(struct TransInfo *t, const float p1[3], const float p2[3]);
void (*snap_apply_fn)(struct TransInfo *, float *);
/** Custom drawing. */
void (*draw_fn)(struct TransInfo *);
} TransModeInfo;
/* header of TransDataEdgeSlideVert, TransDataEdgeSlideEdge */
typedef struct TransDataGenericSlideVert {
struct BMVert *v;
@ -68,125 +99,120 @@ void transform_mode_default_modal_orientation_set(TransInfo *t, int type);
/* transform_mode_align.c */
void initAlign(TransInfo *t);
extern TransModeInfo TransMode_align;
/* transform_mode_baketime.c */
void initBakeTime(TransInfo *t);
extern TransModeInfo TransMode_baketime;
/* transform_mode_bbone_resize.c */
void initBoneSize(TransInfo *t);
extern TransModeInfo TransMode_bboneresize;
/* transform_mode_bend.c */
void initBend(TransInfo *t);
extern TransModeInfo TransMode_bend;
/* transform_mode_boneenvelope.c */
void initBoneEnvelope(TransInfo *t);
extern TransModeInfo TransMode_boneenvelope;
/* transform_mode_boneroll.c */
void initBoneRoll(TransInfo *t);
extern TransModeInfo TransMode_boneroll;
/* transform_mode_curveshrinkfatten.c */
void initCurveShrinkFatten(TransInfo *t);
extern TransModeInfo TransMode_curveshrinkfatten;
/* transform_mode_customdata.c */
void initEgdeCrease(TransInfo *t);
void initVertCrease(TransInfo *t);
void initBevelWeight(TransInfo *t);
extern TransModeInfo TransMode_edgecrease;
extern TransModeInfo TransMode_vertcrease;
extern TransModeInfo TransMode_bevelweight;
/* transform_mode_edge_rotate_normal.c */
void initNormalRotation(TransInfo *t);
extern TransModeInfo TransMode_rotatenormal;
/* transform_mode_edge_seq_slide.c */
void initSeqSlide(TransInfo *t);
extern TransModeInfo TransMode_seqslide;
/* transform_mode_edge_slide.c */
void drawEdgeSlide(TransInfo *t);
void initEdgeSlide_ex(
TransInfo *t, bool use_double_side, bool use_even, bool flipped, bool use_clamp);
void initEdgeSlide(TransInfo *t);
extern TransModeInfo TransMode_edgeslide;
void transform_mode_edge_slide_reproject_input(TransInfo *t);
/* transform_mode_gpopacity.c */
void initGPOpacity(TransInfo *t);
extern TransModeInfo TransMode_gpopacity;
/* transform_mode_gpshrinkfatten.c */
void initGPShrinkFatten(TransInfo *t);
extern TransModeInfo TransMode_gpshrinkfatten;
/* transform_mode_maskshrinkfatten.c */
void initMaskShrinkFatten(TransInfo *t);
extern TransModeInfo TransMode_maskshrinkfatten;
/* transform_mode_mirror.c */
void initMirror(TransInfo *t);
extern TransModeInfo TransMode_mirror;
/* transform_mode_push_pull.c */
void initPushPull(TransInfo *t);
extern TransModeInfo TransMode_pushpull;
/* transform_mode_resize.c */
void initResize(TransInfo *t, float mouse_dir_constraint[3]);
extern TransModeInfo TransMode_resize;
/* transform_mode_rotate.c */
void initRotation(TransInfo *t);
extern TransModeInfo TransMode_rotate;
/* transform_mode_shear.c */
void initShear(TransInfo *t);
extern TransModeInfo TransMode_shear;
/* transform_mode_shrink_fatten.c */
void initShrinkFatten(TransInfo *t);
extern TransModeInfo TransMode_shrinkfatten;
/* transform_mode_skin_resize.c */
void initSkinResize(TransInfo *t);
extern TransModeInfo TransMode_skinresize;
/* transform_mode_tilt.c */
void initTilt(TransInfo *t);
extern TransModeInfo TransMode_tilt;
/* transform_mode_timescale.c */
void initTimeScale(TransInfo *t);
extern TransModeInfo TransMode_timescale;
/* transform_mode_timeslide.c */
void initTimeSlide(TransInfo *t);
extern TransModeInfo TransMode_timeslide;
/* transform_mode_timetranslate.c */
void initTimeTranslate(TransInfo *t);
extern TransModeInfo TransMode_timetranslate;
/* transform_mode_tosphere.c */
void initToSphere(TransInfo *t);
extern TransModeInfo TransMode_tosphere;
/* transform_mode_trackball.c */
void initTrackball(TransInfo *t);
extern TransModeInfo TransMode_trackball;
/* transform_mode_translate.c */
void initTranslation(TransInfo *t);
extern TransModeInfo TransMode_translate;
/* transform_mode_vert_slide.c */
void drawVertSlide(TransInfo *t);
void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp);
void initVertSlide(TransInfo *t);
extern TransModeInfo TransMode_vertslide;
void transform_mode_vert_slide_reproject_input(TransInfo *t);

View File

@ -66,13 +66,20 @@ static void applyAlign(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, TIP_("Align"));
}
void initAlign(TransInfo *t)
static void initAlign(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->flag |= T_NO_CONSTRAINT;
t->transform = applyAlign;
initMouseInputMode(t, &t->mouse, INPUT_NONE);
}
/** \} */
TransModeInfo TransMode_align = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initAlign,
/*transform_fn*/ applyAlign,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -103,9 +103,8 @@ static void applyBakeTime(TransInfo *t, const int mval[2])
ED_area_status_text(t->area, str);
}
void initBakeTime(TransInfo *t)
static void initBakeTime(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->transform = applyBakeTime;
initMouseInputMode(t, &t->mouse, INPUT_NONE);
t->idx_max = 0;
@ -119,3 +118,14 @@ void initBakeTime(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_baketime = {
/*flags*/ 0,
/*init_fn*/ initBakeTime,
/*transform_fn*/ applyBakeTime,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -148,10 +148,9 @@ static void applyBoneSize(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initBoneSize(TransInfo *t)
static void initBoneSize(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_BONESIZE;
t->transform = applyBoneSize;
initMouseInputMode(t, &t->mouse, INPUT_SPRING_FLIP);
@ -172,3 +171,14 @@ void initBoneSize(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_bboneresize = {
/*flags*/ 0,
/*init_fn*/ initBoneSize,
/*transform_fn*/ applyBoneSize,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -324,7 +324,7 @@ static void Bend(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initBend(TransInfo *t)
static void initBend(TransInfo *t, struct wmOperator *UNUSED(op))
{
const float mval_fl[2] = {UNPACK2(t->mval)};
const float *curs;
@ -332,8 +332,6 @@ void initBend(TransInfo *t)
struct BendCustomData *data;
t->mode = TFM_BEND;
t->transform = Bend;
t->handleEvent = handleEventBend;
initMouseInputMode(t, &t->mouse, INPUT_ANGLE_SPRING);
@ -348,8 +346,6 @@ void initBend(TransInfo *t)
t->num.unit_type[0] = B_UNIT_ROTATION;
t->num.unit_type[1] = B_UNIT_LENGTH;
t->flag |= T_NO_CONSTRAINT;
// copy_v3_v3(t->center, ED_view3d_cursor3d_get(t->scene, t->view));
if ((t->flag & T_OVERRIDE_CENTER) == 0) {
calculateCenterCursor(t, t->center_global);
@ -378,3 +374,14 @@ void initBend(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_bend = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initBend,
/*transform_fn*/ Bend,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ handleEventBend,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -79,10 +79,8 @@ static void applyBoneEnvelope(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initBoneEnvelope(TransInfo *t)
static void initBoneEnvelope(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->transform = applyBoneEnvelope;
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
t->idx_max = 0;
@ -93,8 +91,17 @@ void initBoneEnvelope(TransInfo *t)
copy_v3_fl(t->num.val_inc, t->snap[0]);
t->num.unit_sys = t->scene->unit.system;
t->num.unit_type[0] = B_UNIT_NONE;
t->flag |= T_NO_CONSTRAINT | T_NO_PROJECT;
}
/** \} */
TransModeInfo TransMode_boneenvelope = {
/*flags*/ T_NO_CONSTRAINT | T_NO_PROJECT,
/*init_fn*/ initBoneEnvelope,
/*transform_fn*/ applyBoneEnvelope,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -73,10 +73,9 @@ static void applyBoneRoll(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initBoneRoll(TransInfo *t)
static void initBoneRoll(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_BONE_ROLL;
t->transform = applyBoneRoll;
initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
@ -89,8 +88,17 @@ void initBoneRoll(TransInfo *t)
t->num.unit_sys = t->scene->unit.system;
t->num.unit_use_radians = (t->scene->unit.system_rotation == USER_UNIT_ROT_RADIANS);
t->num.unit_type[0] = B_UNIT_ROTATION;
t->flag |= T_NO_CONSTRAINT | T_NO_PROJECT;
}
/** \} */
TransModeInfo TransMode_boneroll = {
/*flags*/ T_NO_CONSTRAINT | T_NO_PROJECT,
/*init_fn*/ initBoneRoll,
/*transform_fn*/ applyBoneRoll,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -84,10 +84,9 @@ static void applyCurveShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initCurveShrinkFatten(TransInfo *t)
static void initCurveShrinkFatten(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_CURVE_SHRINKFATTEN;
t->transform = applyCurveShrinkFatten;
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
@ -100,8 +99,6 @@ void initCurveShrinkFatten(TransInfo *t)
t->num.unit_sys = t->scene->unit.system;
t->num.unit_type[0] = B_UNIT_NONE;
t->flag |= T_NO_CONSTRAINT;
float scale_factor = 0.0f;
if (((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW) &&
(t->data_len_all == 1)) ||
@ -117,3 +114,14 @@ void initCurveShrinkFatten(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_curveshrinkfatten = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initCurveShrinkFatten,
/*transform_fn*/ applyCurveShrinkFatten,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -159,29 +159,57 @@ static void init_mode_impl(TransInfo *t)
copy_v3_fl(t->num.val_inc, t->snap[0]);
t->num.unit_sys = t->scene->unit.system;
t->num.unit_type[0] = B_UNIT_NONE;
t->flag |= T_NO_CONSTRAINT | T_NO_PROJECT;
}
void initEgdeCrease(TransInfo *t)
static void initEgdeCrease(TransInfo *t, struct wmOperator *UNUSED(op))
{
init_mode_impl(t);
t->mode = TFM_EDGE_CREASE;
t->transform = applyCrease;
}
void initVertCrease(TransInfo *t)
static void initVertCrease(TransInfo *t, struct wmOperator *UNUSED(op))
{
init_mode_impl(t);
t->mode = TFM_VERT_CREASE;
t->transform = applyCrease;
}
void initBevelWeight(TransInfo *t)
static void initBevelWeight(TransInfo *t, struct wmOperator *UNUSED(op))
{
init_mode_impl(t);
t->mode = TFM_BWEIGHT;
t->transform = applyBevelWeight;
}
/** \} */
TransModeInfo TransMode_edgecrease = {
/*flags*/ T_NO_CONSTRAINT | T_NO_PROJECT,
/*init_fn*/ initEgdeCrease,
/*transform_fn*/ applyCrease,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};
TransModeInfo TransMode_vertcrease = {
/*flags*/ T_NO_CONSTRAINT | T_NO_PROJECT,
/*init_fn*/ initVertCrease,
/*transform_fn*/ applyCrease,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};
TransModeInfo TransMode_bevelweight = {
/*flags*/ T_NO_CONSTRAINT | T_NO_PROJECT,
/*init_fn*/ initBevelWeight,
/*transform_fn*/ applyBevelWeight,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -108,10 +108,9 @@ static void applyNormalRotation(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initNormalRotation(TransInfo *t)
static void initNormalRotation(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_NORMAL_ROTATION;
t->transform = applyNormalRotation;
initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
@ -139,3 +138,14 @@ void initNormalRotation(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_rotatenormal = {
/*flags*/ 0,
/*init_fn*/ initNormalRotation,
/*transform_fn*/ applyNormalRotation,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -108,11 +108,8 @@ static void applySeqSlide(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initSeqSlide(TransInfo *t)
static void initSeqSlide(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->transform = applySeqSlide;
t->tsnap.snap_mode_apply_fn = transform_snap_sequencer_apply_translate;
initMouseInputMode(t, &t->mouse, INPUT_VECTOR);
t->idx_max = 1;
@ -136,3 +133,14 @@ void initSeqSlide(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_seqslide = {
/*flags*/ 0,
/*init_fn*/ initSeqSlide,
/*transform_fn*/ applySeqSlide,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ transform_snap_sequencer_apply_translate,
/*draw_fn*/ NULL,
};

View File

@ -29,6 +29,8 @@
#include "WM_api.h"
#include "WM_types.h"
#include "RNA_access.h"
#include "UI_interface.h"
#include "UI_resources.h"
@ -1081,50 +1083,44 @@ static void freeEdgeSlideVerts(TransInfo *UNUSED(t),
static eRedrawFlag handleEventEdgeSlide(struct TransInfo *t, const struct wmEvent *event)
{
if (t->mode == TFM_EDGE_SLIDE) {
EdgeSlideParams *slp = t->custom.mode.data;
EdgeSlideParams *slp = t->custom.mode.data;
if (slp) {
switch (event->type) {
case EVT_EKEY:
if (event->val == KM_PRESS) {
slp->use_even = !slp->use_even;
calcEdgeSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case EVT_FKEY:
if (event->val == KM_PRESS) {
slp->flipped = !slp->flipped;
calcEdgeSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case EVT_CKEY:
/* use like a modifier key */
if (event->val == KM_PRESS) {
t->flag ^= T_ALT_TRANSFORM;
calcEdgeSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case MOUSEMOVE:
if (slp) {
switch (event->type) {
case EVT_EKEY:
if (event->val == KM_PRESS) {
slp->use_even = !slp->use_even;
calcEdgeSlideCustomPoints(t);
break;
default:
break;
}
return TREDRAW_HARD;
}
break;
case EVT_FKEY:
if (event->val == KM_PRESS) {
slp->flipped = !slp->flipped;
calcEdgeSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case EVT_CKEY:
/* use like a modifier key */
if (event->val == KM_PRESS) {
t->flag ^= T_ALT_TRANSFORM;
calcEdgeSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case MOUSEMOVE:
calcEdgeSlideCustomPoints(t);
break;
default:
break;
}
}
return TREDRAW_NOTHING;
}
void drawEdgeSlide(TransInfo *t)
static void drawEdgeSlide(TransInfo *t)
{
if (t->mode != TFM_EDGE_SLIDE) {
return;
}
EdgeSlideData *sld = edgeSlideFirstGet(t);
if (sld == NULL) {
return;
@ -1484,18 +1480,13 @@ static void applyEdgeSlide(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initEdgeSlide_ex(
static void initEdgeSlide_ex(
TransInfo *t, bool use_double_side, bool use_even, bool flipped, bool use_clamp)
{
EdgeSlideData *sld;
bool ok = false;
t->mode = TFM_EDGE_SLIDE;
t->transform = applyEdgeSlide;
t->handleEvent = handleEventEdgeSlide;
t->transform_matrix = NULL;
t->tsnap.snap_mode_apply_fn = edge_slide_snap_apply;
t->tsnap.snap_mode_distance_fn = transform_snap_distance_len_squared_fn;
{
EdgeSlideParams *slp = MEM_callocN(sizeof(*slp), __func__);
@ -1542,13 +1533,21 @@ void initEdgeSlide_ex(
copy_v3_fl(t->num.val_inc, t->snap[0]);
t->num.unit_sys = t->scene->unit.system;
t->num.unit_type[0] = B_UNIT_NONE;
t->flag |= T_NO_CONSTRAINT | T_NO_PROJECT;
}
void initEdgeSlide(TransInfo *t)
static void initEdgeSlide(TransInfo *t, wmOperator *op)
{
initEdgeSlide_ex(t, true, false, false, true);
bool use_double_side = true;
bool use_even = false;
bool flipped = false;
bool use_clamp = true;
if (op) {
use_double_side = !RNA_boolean_get(op->ptr, "single_side");
use_even = RNA_boolean_get(op->ptr, "use_even");
flipped = RNA_boolean_get(op->ptr, "flipped");
use_clamp = RNA_boolean_get(op->ptr, "use_clamp");
}
initEdgeSlide_ex(t, use_double_side, use_even, flipped, use_clamp);
}
/** \} */
@ -1581,3 +1580,14 @@ void transform_mode_edge_slide_reproject_input(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_edgeslide = {
/*flags*/ T_NO_CONSTRAINT | T_NO_PROJECT,
/*init_fn*/ initEdgeSlide,
/*transform_fn*/ applyEdgeSlide,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ handleEventEdgeSlide,
/*snap_distance_fn*/ transform_snap_distance_len_squared_fn,
/*snap_apply_fn*/ edge_slide_snap_apply,
/*draw_fn*/ drawEdgeSlide,
};

View File

@ -88,10 +88,9 @@ static void applyGPOpacity(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initGPOpacity(TransInfo *t)
static void initGPOpacity(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_GPENCIL_OPACITY;
t->transform = applyGPOpacity;
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
@ -107,8 +106,17 @@ void initGPOpacity(TransInfo *t)
#ifdef USE_NUM_NO_ZERO
t->num.val_flag[0] |= NUM_NO_ZERO;
#endif
t->flag |= T_NO_CONSTRAINT;
}
/** \} */
TransModeInfo TransMode_gpopacity = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initGPOpacity,
/*transform_fn*/ applyGPOpacity,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -90,10 +90,9 @@ static void applyGPShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initGPShrinkFatten(TransInfo *t)
static void initGPShrinkFatten(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_GPENCIL_SHRINKFATTEN;
t->transform = applyGPShrinkFatten;
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
@ -109,8 +108,17 @@ void initGPShrinkFatten(TransInfo *t)
#ifdef USE_NUM_NO_ZERO
t->num.val_flag[0] |= NUM_NO_ZERO;
#endif
t->flag |= T_NO_CONSTRAINT;
}
/** \} */
TransModeInfo TransMode_gpshrinkfatten = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initGPShrinkFatten,
/*transform_fn*/ applyGPShrinkFatten,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -104,10 +104,9 @@ static void applyMaskShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initMaskShrinkFatten(TransInfo *t)
static void initMaskShrinkFatten(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_MASK_SHRINKFATTEN;
t->transform = applyMaskShrinkFatten;
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
@ -123,8 +122,17 @@ void initMaskShrinkFatten(TransInfo *t)
#ifdef USE_NUM_NO_ZERO
t->num.val_flag[0] |= NUM_NO_ZERO;
#endif
t->flag |= T_NO_CONSTRAINT;
}
/** \} */
TransModeInfo TransMode_maskshrinkfatten = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initMaskShrinkFatten,
/*transform_fn*/ applyMaskShrinkFatten,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -216,12 +216,20 @@ static void applyMirror(TransInfo *t, const int UNUSED(mval[2]))
}
}
void initMirror(TransInfo *t)
static void initMirror(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->transform = applyMirror;
initMouseInputMode(t, &t->mouse, INPUT_NONE);
t->flag |= T_NULL_ONE;
}
/** \} */
TransModeInfo TransMode_mirror = {
/*flags*/ T_NULL_ONE,
/*init_fn*/ initMirror,
/*transform_fn*/ applyMirror,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -169,10 +169,9 @@ static void applyPushPull(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initPushPull(TransInfo *t)
static void initPushPull(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_PUSHPULL;
t->transform = applyPushPull;
initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_ABSOLUTE);
@ -187,3 +186,14 @@ void initPushPull(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_pushpull = {
/*flags*/ 0,
/*init_fn*/ initPushPull,
/*transform_fn*/ applyPushPull,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -8,6 +8,8 @@
#include <stdlib.h>
#include "DNA_windowmanager_types.h"
#include "BLI_math.h"
#include "BLI_task.h"
@ -17,6 +19,8 @@
#include "ED_screen.h"
#include "RNA_access.h"
#include "UI_interface.h"
#include "transform.h"
@ -282,13 +286,22 @@ static void applyResize(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initResize(TransInfo *t, float mouse_dir_constraint[3])
static void initResize(TransInfo *t, wmOperator *op)
{
t->mode = TFM_RESIZE;
t->transform = applyResize;
t->transform_matrix = NULL;
t->tsnap.snap_mode_apply_fn = ApplySnapResize;
t->tsnap.snap_mode_distance_fn = ResizeBetween;
float mouse_dir_constraint[3];
if (op) {
PropertyRNA *prop = RNA_struct_find_property(op->ptr, "mouse_dir_constraint");
if (prop) {
RNA_property_float_get_array(op->ptr, prop, mouse_dir_constraint);
}
else {
/* Resize is expected to have this property. */
BLI_assert(!STREQ(op->idname, "TRANSFORM_OT_resize"));
}
}
else {
zero_v3(mouse_dir_constraint);
}
if (is_zero_v3(mouse_dir_constraint)) {
initMouseInputMode(t, &t->mouse, INPUT_SPRING_FLIP);
@ -323,7 +336,6 @@ void initResize(TransInfo *t, float mouse_dir_constraint[3])
initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO);
}
t->flag |= T_NULL_ONE;
t->num.val_flag[0] |= NUM_NULL_ONE;
t->num.val_flag[1] |= NUM_NULL_ONE;
t->num.val_flag[2] |= NUM_NULL_ONE;
@ -351,3 +363,14 @@ void initResize(TransInfo *t, float mouse_dir_constraint[3])
}
/** \} */
TransModeInfo TransMode_resize = {
/*flags*/ T_NULL_ONE,
/*init_fn*/ initResize,
/*transform_fn*/ applyResize,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ ResizeBetween,
/*snap_apply_fn*/ ApplySnapResize,
/*draw_fn*/ NULL,
};

View File

@ -405,7 +405,7 @@ static void applyRotationMatrix(TransInfo *t, float mat_xform[4][4])
mul_m4_m4m4(mat_xform, mat4, mat_xform);
}
void initRotation(TransInfo *t)
static void initRotation(TransInfo *t, struct wmOperator *UNUSED(op))
{
if (t->spacetype == SPACE_ACTION) {
BKE_report(t->reports, RPT_ERROR, "Rotation is not supported in the Dope Sheet Editor");
@ -413,10 +413,6 @@ void initRotation(TransInfo *t)
}
t->mode = TFM_ROTATION;
t->transform = applyRotation;
t->transform_matrix = applyRotationMatrix;
t->tsnap.snap_mode_apply_fn = ApplySnapRotation;
t->tsnap.snap_mode_distance_fn = RotationBetween;
initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
@ -438,3 +434,14 @@ void initRotation(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_rotate = {
/*flags*/ 0,
/*init_fn*/ initRotation,
/*transform_fn*/ applyRotation,
/*transform_matrix_fn*/ applyRotationMatrix,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ RotationBetween,
/*snap_apply_fn*/ ApplySnapRotation,
/*draw_fn*/ NULL,
};

View File

@ -320,11 +320,9 @@ static void apply_shear(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initShear(TransInfo *t)
static void initShear(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_SHEAR;
t->transform = apply_shear;
t->handleEvent = handleEventShear;
if (t->orient_axis == t->orient_axis_ortho) {
t->orient_axis = 2;
@ -342,9 +340,18 @@ void initShear(TransInfo *t)
t->num.unit_sys = t->scene->unit.system;
t->num.unit_type[0] = B_UNIT_NONE; /* Don't think we have any unit here? */
t->flag |= T_NO_CONSTRAINT;
transform_mode_default_modal_orientation_set(t, V3D_ORIENT_VIEW);
}
/** \} */
TransModeInfo TransMode_shear = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initShear,
/*transform_fn*/ apply_shear,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ handleEventShear,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -170,7 +170,7 @@ static void applyShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initShrinkFatten(TransInfo *t)
static void initShrinkFatten(TransInfo *t, struct wmOperator *UNUSED(op))
{
if ((t->flag & T_EDIT) == 0 || (t->obedit_type != OB_MESH)) {
BKE_report(t->reports, RPT_ERROR, "'Shrink/Fatten' meshes is only supported in edit mode");
@ -178,8 +178,6 @@ void initShrinkFatten(TransInfo *t)
}
t->mode = TFM_SHRINKFATTEN;
t->transform = applyShrinkFatten;
t->handleEvent = shrinkfatten_handleEvent;
initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_ABSOLUTE);
@ -192,8 +190,6 @@ void initShrinkFatten(TransInfo *t)
t->num.unit_sys = t->scene->unit.system;
t->num.unit_type[0] = B_UNIT_LENGTH;
t->flag |= T_NO_CONSTRAINT;
if (t->keymap) {
/* Workaround to use the same key as the modal keymap. */
t->custom.mode.data = (void *)WM_modalkeymap_find_propvalue(t->keymap, TFM_MODAL_RESIZE);
@ -201,3 +197,14 @@ void initShrinkFatten(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_shrinkfatten = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initShrinkFatten,
/*transform_fn*/ applyShrinkFatten,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ shrinkfatten_handleEvent,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -134,10 +134,9 @@ static void applySkinResize(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initSkinResize(TransInfo *t)
static void initSkinResize(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_SKIN_RESIZE;
t->transform = applySkinResize;
initMouseInputMode(t, &t->mouse, INPUT_SPRING_FLIP);
@ -167,3 +166,14 @@ void initSkinResize(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_skinresize = {
/*flags*/ 0,
/*init_fn*/ initSkinResize,
/*transform_fn*/ applySkinResize,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -77,10 +77,9 @@ static void applyTilt(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initTilt(TransInfo *t)
static void initTilt(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_TILT;
t->transform = applyTilt;
initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
@ -93,8 +92,17 @@ void initTilt(TransInfo *t)
t->num.unit_sys = t->scene->unit.system;
t->num.unit_use_radians = (t->scene->unit.system_rotation == USER_UNIT_ROT_RADIANS);
t->num.unit_type[0] = B_UNIT_ROTATION;
t->flag |= T_NO_CONSTRAINT | T_NO_PROJECT;
}
/** \} */
TransModeInfo TransMode_tilt = {
/*flags*/ T_NO_CONSTRAINT | T_NO_PROJECT,
/*init_fn*/ initTilt,
/*transform_fn*/ applyTilt,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -94,7 +94,7 @@ static void applyTimeScale(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initTimeScale(TransInfo *t)
static void initTimeScale(TransInfo *t, struct wmOperator *UNUSED(op))
{
float center[2];
@ -106,7 +106,6 @@ void initTimeScale(TransInfo *t)
}
t->mode = TFM_TIME_SCALE;
t->transform = applyTimeScale;
/* recalculate center2d to use scene->r.cfra and mouse Y, since that's
* what is used in time scale */
@ -121,7 +120,6 @@ void initTimeScale(TransInfo *t)
initMouseInputMode(t, &t->mouse, INPUT_SPRING_FLIP);
t->flag |= T_NULL_ONE;
t->num.val_flag[0] |= NUM_NULL_ONE;
/* Numeric-input has max of (n-1). */
@ -138,3 +136,14 @@ void initTimeScale(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_timescale = {
/*flags*/ T_NULL_ONE,
/*init_fn*/ initTimeScale,
/*transform_fn*/ applyTimeScale,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -148,7 +148,7 @@ static void applyTimeSlide(TransInfo *t, const int mval[2])
ED_area_status_text(t->area, str);
}
void initTimeSlide(TransInfo *t)
static void initTimeSlide(TransInfo *t, struct wmOperator *UNUSED(op))
{
/* this tool is only really available in the Action Editor... */
if (t->spacetype == SPACE_ACTION) {
@ -162,7 +162,6 @@ void initTimeSlide(TransInfo *t)
}
t->mode = TFM_TIME_SLIDE;
t->transform = applyTimeSlide;
initMouseInputMode(t, &t->mouse, INPUT_NONE);
@ -219,3 +218,14 @@ void initTimeSlide(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_timeslide = {
/*flags*/ T_NULL_ONE,
/*init_fn*/ initTimeSlide,
/*transform_fn*/ applyTimeSlide,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -119,15 +119,13 @@ static void applyTimeTranslate(TransInfo *t, const int mval[2])
ED_area_status_text(t->area, str);
}
void initTimeTranslate(TransInfo *t)
static void initTimeTranslate(TransInfo *t, struct wmOperator *UNUSED(op))
{
/* this tool is only really available in the Action Editor... */
if (!ELEM(t->spacetype, SPACE_ACTION, SPACE_SEQ)) {
t->state = TRANS_CANCEL;
}
t->transform = applyTimeTranslate;
initMouseInputMode(t, &t->mouse, INPUT_NONE);
/* Numeric-input has max of (n-1). */
@ -145,3 +143,14 @@ void initTimeTranslate(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_timetranslate = {
/*flags*/ 0,
/*init_fn*/ initTimeTranslate,
/*transform_fn*/ applyTimeTranslate,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -237,10 +237,9 @@ static void applyToSphere(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initToSphere(TransInfo *t)
static void initToSphere(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_TOSPHERE;
t->transform = applyToSphere;
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
@ -254,7 +253,6 @@ void initToSphere(TransInfo *t)
t->num.unit_type[0] = B_UNIT_NONE;
t->num.val_flag[0] |= NUM_NULL_ONE | NUM_NO_NEGATIVE;
t->flag |= T_NO_CONSTRAINT;
struct ToSphereInfo *data = MEM_callocN(sizeof(*data), __func__);
t->custom.mode.data = data;
@ -264,3 +262,14 @@ void initToSphere(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_tosphere = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initToSphere,
/*transform_fn*/ applyToSphere,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -187,11 +187,9 @@ static void applyTrackballMatrix(TransInfo *t, float mat_xform[4][4])
mul_m4_m4m4(mat_xform, mat4, mat_xform);
}
void initTrackball(TransInfo *t)
static void initTrackball(TransInfo *t, struct wmOperator *UNUSED(op))
{
t->mode = TFM_TRACKBALL;
t->transform = applyTrackball;
t->transform_matrix = applyTrackballMatrix;
initMouseInputMode(t, &t->mouse, INPUT_TRACKBALL);
@ -205,8 +203,17 @@ void initTrackball(TransInfo *t)
t->num.unit_use_radians = (t->scene->unit.system_rotation == USER_UNIT_ROT_RADIANS);
t->num.unit_type[0] = B_UNIT_ROTATION;
t->num.unit_type[1] = B_UNIT_ROTATION;
t->flag |= T_NO_CONSTRAINT;
}
/** \} */
TransModeInfo TransMode_trackball = {
/*flags*/ T_NO_CONSTRAINT,
/*init_fn*/ initTrackball,
/*transform_fn*/ applyTrackball,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ NULL,
/*snap_apply_fn*/ NULL,
/*draw_fn*/ NULL,
};

View File

@ -666,7 +666,7 @@ static void applyTranslationMatrix(TransInfo *t, float mat_xform[4][4])
add_v3_v3(mat_xform[3], delta);
}
void initTranslation(TransInfo *t)
static void initTranslation(TransInfo *t, struct wmOperator *UNUSED(op))
{
if (t->spacetype == SPACE_ACTION) {
/* this space uses time translate */
@ -675,13 +675,9 @@ void initTranslation(TransInfo *t)
"Use 'Time_Translate' transform mode instead of 'Translation' mode "
"for translating keyframes in Dope Sheet Editor");
t->state = TRANS_CANCEL;
return;
}
t->transform = applyTranslation;
t->transform_matrix = applyTranslationMatrix;
t->tsnap.snap_mode_apply_fn = ApplySnapTranslation;
t->tsnap.snap_mode_distance_fn = transform_snap_distance_len_squared_fn;
initMouseInputMode(t, &t->mouse, INPUT_VECTOR);
t->idx_max = (t->flag & T_2D_EDIT) ? 1 : 2;
@ -716,3 +712,14 @@ void initTranslation(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_translate = {
/*flags*/ 0,
/*init_fn*/ initTranslation,
/*transform_fn*/ applyTranslation,
/*transform_matrix_fn*/ applyTranslationMatrix,
/*handle_event_fn*/ NULL,
/*snap_distance_fn*/ transform_snap_distance_len_squared_fn,
/*snap_apply_fn*/ ApplySnapTranslation,
/*draw_fn*/ NULL,
};

View File

@ -26,6 +26,8 @@
#include "WM_api.h"
#include "WM_types.h"
#include "RNA_access.h"
#include "UI_interface.h"
#include "UI_resources.h"
@ -304,55 +306,53 @@ static void freeVertSlideVerts(TransInfo *UNUSED(t),
static eRedrawFlag handleEventVertSlide(struct TransInfo *t, const struct wmEvent *event)
{
if (t->mode == TFM_VERT_SLIDE) {
VertSlideParams *slp = t->custom.mode.data;
VertSlideParams *slp = t->custom.mode.data;
if (slp) {
switch (event->type) {
case EVT_EKEY:
if (event->val == KM_PRESS) {
slp->use_even = !slp->use_even;
if (slp->flipped) {
calcVertSlideCustomPoints(t);
}
return TREDRAW_HARD;
}
break;
case EVT_FKEY:
if (event->val == KM_PRESS) {
slp->flipped = !slp->flipped;
if (slp) {
switch (event->type) {
case EVT_EKEY:
if (event->val == KM_PRESS) {
slp->use_even = !slp->use_even;
if (slp->flipped) {
calcVertSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case EVT_CKEY:
/* use like a modifier key */
if (event->val == KM_PRESS) {
t->flag ^= T_ALT_TRANSFORM;
calcVertSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case MOUSEMOVE: {
/* don't recalculate the best edge */
const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
if (is_clamp) {
calcVertSlideMouseActiveEdges(t, event->mval);
}
calcVertSlideCustomPoints(t);
break;
return TREDRAW_HARD;
}
default:
break;
break;
case EVT_FKEY:
if (event->val == KM_PRESS) {
slp->flipped = !slp->flipped;
calcVertSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case EVT_CKEY:
/* use like a modifier key */
if (event->val == KM_PRESS) {
t->flag ^= T_ALT_TRANSFORM;
calcVertSlideCustomPoints(t);
return TREDRAW_HARD;
}
break;
case MOUSEMOVE: {
/* don't recalculate the best edge */
const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
if (is_clamp) {
calcVertSlideMouseActiveEdges(t, event->mval);
}
calcVertSlideCustomPoints(t);
break;
}
default:
break;
}
}
return TREDRAW_NOTHING;
}
void drawVertSlide(TransInfo *t)
static void drawVertSlide(TransInfo *t)
{
if ((t->mode == TFM_VERT_SLIDE) && TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data) {
if (TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data) {
const VertSlideParams *slp = t->custom.mode.data;
VertSlideData *sld = TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data;
const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
@ -610,15 +610,10 @@ static void applyVertSlide(TransInfo *t, const int UNUSED(mval[2]))
ED_area_status_text(t->area, str);
}
void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp)
static void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp)
{
t->mode = TFM_VERT_SLIDE;
t->transform = applyVertSlide;
t->handleEvent = handleEventVertSlide;
t->transform_matrix = NULL;
t->tsnap.snap_mode_apply_fn = vert_slide_snap_apply;
t->tsnap.snap_mode_distance_fn = transform_snap_distance_len_squared_fn;
{
VertSlideParams *slp = MEM_callocN(sizeof(*slp), __func__);
@ -664,13 +659,19 @@ void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp)
copy_v3_fl(t->num.val_inc, t->snap[0]);
t->num.unit_sys = t->scene->unit.system;
t->num.unit_type[0] = B_UNIT_NONE;
t->flag |= T_NO_CONSTRAINT | T_NO_PROJECT;
}
void initVertSlide(TransInfo *t)
static void initVertSlide(TransInfo *t, wmOperator *op)
{
initVertSlide_ex(t, false, false, true);
bool use_even = false;
bool flipped = false;
bool use_clamp = true;
if (op) {
use_even = RNA_boolean_get(op->ptr, "use_even");
flipped = RNA_boolean_get(op->ptr, "flipped");
use_clamp = RNA_boolean_get(op->ptr, "use_clamp");
}
initVertSlide_ex(t, use_even, flipped, use_clamp);
}
/** \} */
@ -693,3 +694,14 @@ void transform_mode_vert_slide_reproject_input(TransInfo *t)
}
/** \} */
TransModeInfo TransMode_vertslide = {
/*flags*/ T_NO_CONSTRAINT | T_NO_PROJECT,
/*init_fn*/ initVertSlide,
/*transform_fn*/ applyVertSlide,
/*transform_matrix_fn*/ NULL,
/*handle_event_fn*/ handleEventVertSlide,
/*snap_distance_fn*/ transform_snap_distance_len_squared_fn,
/*snap_apply_fn*/ vert_slide_snap_apply,
/*draw_fn*/ drawVertSlide,
};

View File

@ -50,6 +50,7 @@
#include "transform.h"
#include "transform_convert.h"
#include "transform_mode.h"
#include "transform_snap.h"
/* use half of flt-max so we can scale up without an exception */
@ -546,7 +547,7 @@ void transform_snap_mixed_apply(TransInfo *t, float *vec)
}
if (validSnap(t)) {
t->tsnap.snap_mode_apply_fn(t, vec);
t->mode_info->snap_apply_fn(t, vec);
}
}
}
@ -1317,7 +1318,7 @@ static void snap_source_closest_fn(TransInfo *t)
copy_v3_v3(loc, bb->vec[j]);
mul_m4_v3(td->ext->obmat, loc);
dist = t->tsnap.snap_mode_distance_fn(t, loc, t->tsnap.snap_target);
dist = t->mode_info->snap_distance_fn(t, loc, t->tsnap.snap_target);
if ((dist != TRANSFORM_DIST_INVALID) &&
(closest == nullptr || fabsf(dist) < fabsf(dist_closest))) {
@ -1334,7 +1335,7 @@ static void snap_source_closest_fn(TransInfo *t)
copy_v3_v3(loc, td->center);
dist = t->tsnap.snap_mode_distance_fn(t, loc, t->tsnap.snap_target);
dist = t->mode_info->snap_distance_fn(t, loc, t->tsnap.snap_target);
if ((dist != TRANSFORM_DIST_INVALID) &&
(closest == nullptr || fabsf(dist) < fabsf(dist_closest))) {
@ -1359,7 +1360,7 @@ static void snap_source_closest_fn(TransInfo *t)
mul_m4_v3(tc->mat, loc);
}
dist = t->tsnap.snap_mode_distance_fn(t, loc, t->tsnap.snap_target);
dist = t->mode_info->snap_distance_fn(t, loc, t->tsnap.snap_target);
if ((dist != TRANSFORM_DIST_INVALID) &&
(closest == nullptr || fabsf(dist) < fabsf(dist_closest))) {