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;
                }


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to