diff options
author | Martin Poirier <theeth@yahoo.com> | 2009-03-29 23:52:53 +0400 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2009-03-29 23:52:53 +0400 |
commit | 9d4543bd29625699271d50c66c1a27beed7bab6b (patch) | |
tree | d2630ccb314bdc56800ad8f6611398b1721c8dcf /source/blender | |
parent | 6705b6f96ea4255f6bd69a039562ed603a83a83e (diff) |
Add snapping parameters to transform operators (only Translation, Resize and Rotation, since those are the one ones that support it).
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/transform/transform.c | 2 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.h | 12 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_constraints.c | 3 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_ops.c | 26 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_snap.c | 71 |
5 files changed, 87 insertions, 27 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 7faeef0bd6a..091b35c7361 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1064,7 +1064,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int return 0; } - initSnapping(t); // Initialize snapping data AFTER mode flags + initSnapping(t, op); // Initialize snapping data AFTER mode flags /* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */ /* EVIL2: we gave as argument also texture space context bit... was cleared */ diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 655bff34181..dfbc22b1e14 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -80,8 +80,9 @@ typedef struct NumInput { typedef struct TransSnap { short modePoint; short modeTarget; - int mode; - int status; + short mode; + short align; + short status; float snapPoint[3]; float snapTarget[3]; float snapNormal[3]; @@ -351,8 +352,9 @@ typedef struct TransInfo { /* transsnap->status */ #define SNAP_ON 1 -#define TARGET_INIT 2 -#define POINT_INIT 4 +#define SNAP_FORCED 2 +#define TARGET_INIT 4 +#define POINT_INIT 8 /* transsnap->modePoint */ #define SNAP_GRID 0 @@ -522,7 +524,7 @@ typedef enum { void snapGrid(TransInfo *t, float *val); void snapGridAction(TransInfo *t, float *val, GearsType action); -void initSnapping(struct TransInfo *t); +void initSnapping(struct TransInfo *t, struct wmOperator *op); void applySnapping(TransInfo *t, float *vec); void resetSnapping(TransInfo *t); int handleSnapping(TransInfo *t, struct wmEvent *event); diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index 510351446cd..0064317b57a 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -179,7 +179,8 @@ static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3]) { constraintNumInput(t, vec); } - if (t->flag & T_AUTOVALUES) + /* autovalues is operator param, use that directly but not if snapping is forced */ + if (t->flag & T_AUTOVALUES && (t->tsnap.status & SNAP_FORCED) == 0) { VECCOPY(vec, t->auto_values); constraintAutoValues(t, vec); diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 9c68c203291..a45af971d01 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -62,6 +62,14 @@ EnumPropertyItem proportional_mode_types[] = { {0, NULL, NULL, NULL} }; +EnumPropertyItem snap_mode_types[] = { + {SCE_SNAP_TARGET_CLOSEST, "CLOSEST", "Closest", ""}, + {SCE_SNAP_TARGET_CENTER, "CENTER", "Center", ""}, + {SCE_SNAP_TARGET_MEDIAN, "MEDIAN", "Median", ""}, + {SCE_SNAP_TARGET_ACTIVE, "ACTIVE", "Active", ""}, + {0, NULL, NULL, NULL} +}; + EnumPropertyItem proportional_falloff_types[] = { {PROP_SMOOTH, "SMOOTH", "Smooth", ""}, {PROP_SPHERE, "SPHERE", "Sphere", ""}, @@ -262,7 +270,19 @@ void Properties_Proportional(struct wmOperatorType *ot) RNA_def_enum(ot->srna, "proportional", proportional_mode_types, 0, "Proportional Edition", ""); RNA_def_enum(ot->srna, "proportional_editing_falloff", prop_mode_items, 0, "Proportional Editing Falloff", "Falloff type for proportional editing mode."); RNA_def_float(ot->srna, "proportional_size", 1, 0, FLT_MAX, "Proportional Size", "", 0, 100); +} +void Properties_Snapping(struct wmOperatorType *ot, short align) +{ + RNA_def_boolean(ot->srna, "snap", 0, "Snap to Point", ""); + RNA_def_enum(ot->srna, "snap_mode", snap_mode_types, 0, "Mode", ""); + RNA_def_float_vector(ot->srna, "snap_point", 3, NULL, -FLT_MAX, FLT_MAX, "Point", "", -FLT_MAX, FLT_MAX); + + if (align) + { + RNA_def_boolean(ot->srna, "snap_align", 0, "Align with Point Normal", ""); + RNA_def_float_vector(ot->srna, "snap_normal", 3, NULL, -FLT_MAX, FLT_MAX, "Normal", "", -FLT_MAX, FLT_MAX); + } } void Properties_Constraints(struct wmOperatorType *ot) @@ -292,6 +312,8 @@ void TFM_OT_translation(struct wmOperatorType *ot) RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Edition", ""); Properties_Constraints(ot); + + Properties_Snapping(ot, 1); } void TFM_OT_resize(struct wmOperatorType *ot) @@ -315,6 +337,8 @@ void TFM_OT_resize(struct wmOperatorType *ot) RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Edition", ""); Properties_Constraints(ot); + + Properties_Snapping(ot, 0); } void TFM_OT_rotation(struct wmOperatorType *ot) @@ -338,6 +362,8 @@ void TFM_OT_rotation(struct wmOperatorType *ot) RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Edition", ""); Properties_Constraints(ot); + + Properties_Snapping(ot, 0); } void TFM_OT_tilt(struct wmOperatorType *ot) diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index bf1169072e1..dc32a46a301 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -43,6 +43,9 @@ #include "DNA_screen_types.h" #include "DNA_userdef_types.h" #include "DNA_view3d_types.h" +#include "DNA_windowmanager_types.h" + +#include "RNA_access.h" #include "BLI_arithb.h" #include "BLI_editVert.h" @@ -88,7 +91,7 @@ /********************* PROTOTYPES ***********************/ -void setSnappingCallback(TransInfo *t); +void setSnappingCallback(TransInfo *t, short snap_target); void ApplySnapTranslation(TransInfo *t, float vec[3]); void ApplySnapRotation(TransInfo *t, float *vec); @@ -208,7 +211,7 @@ int handleSnapping(TransInfo *t, wmEvent *event) { /* toggle snap and reinit */ t->scene->snap_flag ^= SCE_SNAP; - initSnapping(t); + initSnapping(t, NULL); status = 1; } @@ -217,7 +220,13 @@ int handleSnapping(TransInfo *t, wmEvent *event) void applySnapping(TransInfo *t, float *vec) { - if ((t->tsnap.status & SNAP_ON) && + if (t->tsnap.status & SNAP_FORCED) + { + t->tsnap.targetSnap(t); + + t->tsnap.applySnap(t, vec); + } + else if ((t->tsnap.status & SNAP_ON) && (t->modifiers & MOD_SNAP_GEARS)) { double current = PIL_check_seconds_timer(); @@ -241,6 +250,8 @@ void applySnapping(TransInfo *t, float *vec) void resetSnapping(TransInfo *t) { t->tsnap.status = 0; + t->tsnap.mode = 0; + t->tsnap.align = 0; t->tsnap.modePoint = 0; t->tsnap.modeTarget = 0; t->tsnap.last = 0; @@ -253,14 +264,7 @@ void resetSnapping(TransInfo *t) int usingSnappingNormal(TransInfo *t) { - if (t->scene->snap_flag & SCE_SNAP_ROTATE) - { - return 1; - } - else - { - return 0; - } + return t->tsnap.align; } int validSnappingNormal(TransInfo *t) @@ -276,19 +280,47 @@ int validSnappingNormal(TransInfo *t) return 0; } -void initSnapping(TransInfo *t) +void initSnapping(TransInfo *t, wmOperator *op) { Scene *scene = t->scene; Object *obedit = t->obedit; + int snapping = 0; + short snap_mode = t->scene->snap_target; + resetSnapping(t); + if (op && RNA_struct_find_property(op->ptr, "snap") && RNA_property_is_set(op->ptr, "snap")) + { + if (RNA_boolean_get(op->ptr, "snap")) + { + snapping = 1; + snap_mode = RNA_enum_get(op->ptr, "snap_mode"); + + t->tsnap.status |= SNAP_FORCED|POINT_INIT; + RNA_float_get_array(op->ptr, "snap_point", t->tsnap.snapPoint); + + /* snap align only defined in specific cases */ + if (RNA_struct_find_property(op->ptr, "snap_align")) + { + t->tsnap.align = RNA_boolean_get(op->ptr, "snap_align"); + RNA_float_get_array(op->ptr, "snap_normal", t->tsnap.snapNormal); + Normalize(t->tsnap.snapNormal); + } + } + } + else + { + snapping = ((scene->snap_flag & SCE_SNAP) == SCE_SNAP); + t->tsnap.align = ((t->scene->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE); + } + if ((t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) && // Only 3D view or UV (t->flag & T_CAMERA) == 0) { // Not with camera selected - setSnappingCallback(t); + setSnappingCallback(t, snap_mode); /* Edit mode */ if (t->tsnap.applySnap != NULL && // A snapping function actually exist - (scene->snap_flag & SCE_SNAP) && // Only if the snap flag is on + (snapping) && // Only if the snap flag is on (obedit != NULL && ELEM(obedit->type, OB_MESH, OB_ARMATURE)) ) // Temporary limited to edit mode meshes or armature { t->tsnap.status |= SNAP_ON; @@ -305,7 +337,7 @@ void initSnapping(TransInfo *t) } /* Object mode */ else if (t->tsnap.applySnap != NULL && // A snapping function actually exist - (scene->snap_flag & SCE_SNAP) && // Only if the snap flag is on + (snapping) && // Only if the snap flag is on (obedit == NULL) ) // Object Mode { t->tsnap.status |= SNAP_ON; @@ -325,12 +357,11 @@ void initSnapping(TransInfo *t) } } -void setSnappingCallback(TransInfo *t) +void setSnappingCallback(TransInfo *t, short snap_target) { - Scene *scene = t->scene; t->tsnap.calcSnap = CalcSnapGeometry; - switch(scene->snap_target) + switch(snap_target) { case SCE_SNAP_TARGET_CLOSEST: t->tsnap.modeTarget = SNAP_CLOSEST; @@ -362,7 +393,7 @@ void setSnappingCallback(TransInfo *t) t->tsnap.distance = RotationBetween; // Can't do TARGET_CENTER with rotation, use TARGET_MEDIAN instead - if (scene->snap_target == SCE_SNAP_TARGET_CENTER) { + if (snap_target == SCE_SNAP_TARGET_CENTER) { t->tsnap.modeTarget = SNAP_MEDIAN; t->tsnap.targetSnap = TargetSnapMedian; } @@ -372,7 +403,7 @@ void setSnappingCallback(TransInfo *t) t->tsnap.distance = ResizeBetween; // Can't do TARGET_CENTER with resize, use TARGET_MEDIAN instead - if (scene->snap_target == SCE_SNAP_TARGET_CENTER) { + if (snap_target == SCE_SNAP_TARGET_CENTER) { t->tsnap.modeTarget = SNAP_MEDIAN; t->tsnap.targetSnap = TargetSnapMedian; } |