Revision: 25051
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25051
Author:   theeth
Date:     2009-12-01 19:26:18 +0100 (Tue, 01 Dec 2009)

Log Message:
-----------
Additive snap for Transform. Easy snapping between two vertices, in the middle 
of three faces, ...

A to add the current snapping point to the list
Alt-A to remove the last one

The resulting snapping point is the average of all snap points in the list (and 
the one under the mouse pointer, if valid).

Snapping between two verts is a matter of moving over the first, pressing A, 
moving over the other, confirming transform.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/editors/transform/transform_snap.c

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c  2009-12-01 
15:46:37 UTC (rev 25050)
+++ trunk/blender/source/blender/editors/transform/transform.c  2009-12-01 
18:26:18 UTC (rev 25051)
@@ -517,6 +517,8 @@
 #define TFM_MODAL_PLANE_Y              13
 #define TFM_MODAL_PLANE_Z              14
 #define TFM_MODAL_CONS_OFF             15
+#define TFM_MODAL_ADD_SNAP             16
+#define TFM_MODAL_REMOVE_SNAP  17
 
 /* called in transform_ops.c, on each regeneration of keymaps */
 void transform_modal_keymap(wmKeyConfig *keyconf)
@@ -537,6 +539,8 @@
        {TFM_MODAL_PLANE_Y, "PLANE_Y", 0, "Orientation Y plane", ""},
        {TFM_MODAL_PLANE_Z, "PLANE_Z", 0, "Orientation Z plane", ""},
        {TFM_MODAL_CONS_OFF, "CONS_OFF", 0, "Remove Constraints", ""},
+       {TFM_MODAL_ADD_SNAP, "ADD_SNAP", 0, "Add Snap Point", ""},
+       {TFM_MODAL_REMOVE_SNAP, "REMOVE_SNAP", 0, "Remove Last Snap Point", ""},
        {0, NULL, 0, NULL, NULL}};
        
        wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Transform Modal Map");
@@ -558,6 +562,9 @@
        
        WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_CLICK, KM_ANY, 0, 
TFM_MODAL_SNAP_TOGGLE);
        
+       WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, 
TFM_MODAL_ADD_SNAP);
+       WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_ALT, 0, 
TFM_MODAL_REMOVE_SNAP);
+
        /* assign map to operators */
        WM_modalkeymap_assign(keymap, "TFM_OT_transform");
        WM_modalkeymap_assign(keymap, "TFM_OT_translate");
@@ -743,6 +750,14 @@
                                        t->redraw = 1;
                                }
                                break;
+                       case TFM_MODAL_ADD_SNAP:
+                               addSnapPoint(t);
+                               t->redraw = 1;
+                               break;
+                       case TFM_MODAL_REMOVE_SNAP:
+                               removeSnapPoint(t);
+                               t->redraw = 1;
+                               break;
                        default:
                                handled = 0;
                                break;

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h  2009-12-01 
15:46:37 UTC (rev 25050)
+++ trunk/blender/source/blender/editors/transform/transform.h  2009-12-01 
18:26:18 UTC (rev 25051)
@@ -32,6 +32,8 @@
 
 #include "ED_transform.h"
 
+#include "DNA_listBase.h"
+
 #include "BLI_editVert.h"
 
 /* ************************** Types ***************************** */
@@ -82,6 +84,11 @@
                Negative        : number is negative
 */
 
+typedef struct TransSnapPoint {
+       struct TransSnapPoint *next,*prev;
+       float co[3];
+} TransSnapPoint;
+
 typedef struct TransSnap {
        short   mode;
        short   modePoint;
@@ -95,6 +102,7 @@
        float   snapTarget[3]; /* to this point */
        float   snapNormal[3];
        float   snapTangent[3];
+       ListBase points;
        float   dist; // Distance from snapPoint to snapTarget
        double  last;
        void  (*applySnap)(struct TransInfo *, float *);
@@ -417,6 +425,7 @@
 #define SNAP_FORCED            1
 #define TARGET_INIT            2
 #define POINT_INIT             4
+#define MULTI_POINTS   8
 
 /* transsnap->modeTarget */
 #define SNAP_CLOSEST           0
@@ -597,6 +606,10 @@
 int usingSnappingNormal(TransInfo *t);
 int validSnappingNormal(TransInfo *t);
 
+void getSnapPoint(TransInfo *t, float vec[3]);
+void addSnapPoint(TransInfo *t);
+void removeSnapPoint(TransInfo *t);
+
 /********************** Mouse Input ******************************/
 
 typedef enum {

Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c 
2009-12-01 15:46:37 UTC (rev 25050)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c 
2009-12-01 18:26:18 UTC (rev 25051)
@@ -1095,6 +1095,8 @@
                MEM_freeN(t->data);
        }
        
+       BLI_freelistN(&t->tsnap.points);
+
        if (t->ext) MEM_freeN(t->ext);
        if (t->data2d) {
                MEM_freeN(t->data2d);

Modified: trunk/blender/source/blender/editors/transform/transform_snap.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_snap.c     
2009-12-01 15:46:37 UTC (rev 25050)
+++ trunk/blender/source/blender/editors/transform/transform_snap.c     
2009-12-01 18:26:18 UTC (rev 25051)
@@ -123,9 +123,14 @@
        return status;
 }
 
+int validSnap(TransInfo *t) {
+       return (t->tsnap.status & (POINT_INIT|TARGET_INIT)) == 
(POINT_INIT|TARGET_INIT) ||
+                       (t->tsnap.status & (MULTI_POINTS|TARGET_INIT)) == 
(MULTI_POINTS|TARGET_INIT);
+}
+
 void drawSnapping(const struct bContext *C, TransInfo *t)
 {
-       if ((t->tsnap.status & (POINT_INIT|TARGET_INIT)) == 
(POINT_INIT|TARGET_INIT) &&
+       if (validSnap(t) &&
                (t->modifiers & MOD_SNAP))
                {
                
@@ -134,6 +139,7 @@
                glColor4ub(col[0], col[1], col[2], 128);
                
                if (t->spacetype == SPACE_VIEW3D) {
+                       TransSnapPoint *p;
                        View3D *v3d = CTX_wm_view3d(C);
                        RegionView3D *rv3d = CTX_wm_region_view3d(C);
                        float tmat[4][4], imat[4][4];
@@ -141,14 +147,18 @@
                        
                        glDisable(GL_DEPTH_TEST);
        
-                       size = get_drawsize(t->ar, t->tsnap.snapPoint);
+                       size = 0.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
                        
-                       size *= 0.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
-                       
                        copy_m4_m4(tmat, rv3d->viewmat);
                        invert_m4_m4(imat, tmat);
 
-                       drawcircball(GL_LINE_LOOP, t->tsnap.snapPoint, size, 
imat);
+                       for (p = t->tsnap.points.first; p; p = p->next) {
+                               drawcircball(GL_LINE_LOOP, p->co, size * 
get_drawsize(t->ar, p->co), imat);
+                       }
+
+                       if (t->tsnap.status & POINT_INIT) {
+                               drawcircball(GL_LINE_LOOP, t->tsnap.snapPoint, 
size * get_drawsize(t->ar, t->tsnap.snapPoint), imat);
+                       }
                        
                        /* draw normal if needed */
                        if (usingSnappingNormal(t) && validSnappingNormal(t))
@@ -302,7 +312,7 @@
        
                        t->tsnap.last = current;
                }
-               if ((t->tsnap.status & (POINT_INIT|TARGET_INIT)) == 
(POINT_INIT|TARGET_INIT))
+               if (validSnap(t))
                {
                        t->tsnap.applySnap(t, vec);
                }
@@ -331,7 +341,7 @@
 
 int validSnappingNormal(TransInfo *t)
 {
-       if ((t->tsnap.status & (POINT_INIT|TARGET_INIT)) == 
(POINT_INIT|TARGET_INIT))
+       if (validSnap(t))
        {
                if (dot_v3v3(t->tsnap.snapNormal, t->tsnap.snapNormal) > 0)
                {
@@ -502,11 +512,59 @@
        }
 }
 
+void addSnapPoint(TransInfo *t)
+{
+       if (t->tsnap.status & POINT_INIT) {
+               TransSnapPoint *p = MEM_callocN(sizeof(TransSnapPoint), 
"SnapPoint");
+
+               VECCOPY(p->co, t->tsnap.snapPoint);
+
+               BLI_addtail(&t->tsnap.points, p);
+
+               t->tsnap.status |= MULTI_POINTS;
+       }
+}
+
+void removeSnapPoint(TransInfo *t)
+{
+       if (t->tsnap.status & MULTI_POINTS) {
+               BLI_freelinkN(&t->tsnap.points, t->tsnap.points.last);
+
+               if (t->tsnap.points.first == NULL)
+                       t->tsnap.status &= ~MULTI_POINTS;
+       }
+}
+
+void getSnapPoint(TransInfo *t, float vec[3])
+{
+       if (t->tsnap.points.first) {
+               TransSnapPoint *p;
+               int total = 0;
+
+               vec[0] = vec[1] = vec[2] = 0;
+
+               for (p = t->tsnap.points.first; p; p = p->next, total++) {
+                       add_v3_v3(vec, p->co);
+               }
+
+               if (t->tsnap.status & POINT_INIT) {
+                       add_v3_v3(vec, t->tsnap.snapPoint);
+                       total++;
+               }
+
+               mul_v3_fl(vec, 1.0f / total);
+       } else {
+               VECCOPY(vec, t->tsnap.snapPoint)
+       }
+}
+
 /********************** APPLY **************************/
 
 void ApplySnapTranslation(TransInfo *t, float vec[3])
 {
-       sub_v3_v3v3(vec, t->tsnap.snapPoint, t->tsnap.snapTarget);
+       float point[3];
+       getSnapPoint(t, point);
+       sub_v3_v3v3(vec, point, t->tsnap.snapTarget);
 }
 
 void ApplySnapRotation(TransInfo *t, float *vec)
@@ -515,7 +573,9 @@
                *vec = t->tsnap.dist;
        }
        else {
-               *vec = RotationBetween(t, t->tsnap.snapTarget, 
t->tsnap.snapPoint);
+               float point[3];
+               getSnapPoint(t, point);
+               *vec = RotationBetween(t, t->tsnap.snapTarget, point);
        }
 }
 
@@ -525,7 +585,9 @@
                vec[0] = vec[1] = vec[2] = t->tsnap.dist;
        }
        else {
-               vec[0] = vec[1] = vec[2] = ResizeBetween(t, 
t->tsnap.snapTarget, t->tsnap.snapPoint);
+               float point[3];
+               getSnapPoint(t, point);
+               vec[0] = vec[1] = vec[2] = ResizeBetween(t, 
t->tsnap.snapTarget, point);
        }
 }
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to