[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19454] branches/blender2.5/blender/source /blender/editors/transform: Add snapping parameters to transform operators (only Translation, Resize and Rotation, since those are the one ones that support it).
Martin Poirier
theeth at yahoo.com
Sun Mar 29 21:52:53 CEST 2009
Revision: 19454
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19454
Author: theeth
Date: 2009-03-29 21:52:53 +0200 (Sun, 29 Mar 2009)
Log Message:
-----------
Add snapping parameters to transform operators (only Translation, Resize and Rotation, since those are the one ones that support it).
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/transform/transform.c
branches/blender2.5/blender/source/blender/editors/transform/transform.h
branches/blender2.5/blender/source/blender/editors/transform/transform_constraints.c
branches/blender2.5/blender/source/blender/editors/transform/transform_ops.c
branches/blender2.5/blender/source/blender/editors/transform/transform_snap.c
Modified: branches/blender2.5/blender/source/blender/editors/transform/transform.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform.c 2009-03-29 19:45:25 UTC (rev 19453)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform.c 2009-03-29 19:52:53 UTC (rev 19454)
@@ -1064,7 +1064,7 @@
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 */
Modified: branches/blender2.5/blender/source/blender/editors/transform/transform.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform.h 2009-03-29 19:45:25 UTC (rev 19453)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform.h 2009-03-29 19:52:53 UTC (rev 19454)
@@ -80,8 +80,9 @@
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 @@
/* 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 @@
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);
Modified: branches/blender2.5/blender/source/blender/editors/transform/transform_constraints.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform_constraints.c 2009-03-29 19:45:25 UTC (rev 19453)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform_constraints.c 2009-03-29 19:52:53 UTC (rev 19454)
@@ -179,7 +179,8 @@
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);
Modified: branches/blender2.5/blender/source/blender/editors/transform/transform_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform_ops.c 2009-03-29 19:45:25 UTC (rev 19453)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform_ops.c 2009-03-29 19:52:53 UTC (rev 19454)
@@ -62,6 +62,14 @@
{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 @@
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 @@
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 @@
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 @@
RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Edition", "");
Properties_Constraints(ot);
+
+ Properties_Snapping(ot, 0);
}
void TFM_OT_tilt(struct wmOperatorType *ot)
Modified: branches/blender2.5/blender/source/blender/editors/transform/transform_snap.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform_snap.c 2009-03-29 19:45:25 UTC (rev 19453)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform_snap.c 2009-03-29 19:52:53 UTC (rev 19454)
@@ -43,7 +43,10 @@
#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"
#include "BLI_blenlib.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 @@
{
/* toggle snap and reinit */
t->scene->snap_flag ^= SCE_SNAP;
- initSnapping(t);
+ initSnapping(t, NULL);
status = 1;
}
@@ -217,7 +220,13 @@
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 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 @@
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 @@
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 @@
}
/* 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 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 @@
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 @@
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;
}
More information about the Bf-blender-cvs
mailing list