[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