[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48411] trunk/blender: Extended modes for snapping in the node editor.

Lukas Toenne lukas.toenne at googlemail.com
Fri Jun 29 16:34:47 CEST 2012


Revision: 48411
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48411
Author:   lukastoenne
Date:     2012-06-29 14:34:46 +0000 (Fri, 29 Jun 2012)
Log Message:
-----------
Extended modes for snapping in the node editor.
The transform operators in nodes will now use the unselected nodes to generate snapping points. Unlike object snapping, node snapping works for the x/y axes separately and snaps node borders to same borders of unselected nodes. The sensitive area for node borders extends over the whole view2D range, to enable simple alignment of nodes in both x and y direction.

For snap points in the node editor an additional enum value is stored to indicate the type of node border (left/right/top/bottom). This works as a constraint on possible node alignments: only same border types align with each other.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_node.py
    trunk/blender/source/blender/editors/include/ED_node.h
    trunk/blender/source/blender/editors/include/ED_transform.h
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_constraints.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_snap.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesrna/RNA_enum_types.h
    trunk/blender/source/blender/makesrna/intern/rna_scene.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_node.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_node.py	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/release/scripts/startup/bl_ui/space_node.py	2012-06-29 14:34:46 UTC (rev 48411)
@@ -90,6 +90,9 @@
         # Snap
         row = layout.row(align=True)
         row.prop(toolsettings, "use_snap", text="")
+        row.prop(toolsettings, "snap_node_element", text="", icon_only=True)
+        if toolsettings.snap_node_element != 'INCREMENT':
+            row.prop(toolsettings, "snap_target", text="")
 
         layout.template_running_jobs()
 

Modified: trunk/blender/source/blender/editors/include/ED_node.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_node.h	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/include/ED_node.h	2012-06-29 14:34:46 UTC (rev 48411)
@@ -41,10 +41,20 @@
 struct bNode;
 struct bNodeTree;
 struct ScrArea;
+struct View2D;
 
+typedef enum {
+	NODE_TOP    = 1,
+	NODE_BOTTOM = 2,
+	NODE_LEFT   = 4,
+	NODE_RIGHT  = 8
+} NodeBorder;
+
 /* drawnode.c */
 void ED_init_node_butfuncs(void);
 
+void drawnodesnap(struct View2D *v2d, const float cent[2], float size, NodeBorder border);
+
 /* node_draw.c */
 void ED_node_tree_update(struct SpaceNode *snode, struct Scene *scene);
 void ED_node_changed_update(struct ID *id, struct bNode *node);

Modified: trunk/blender/source/blender/editors/include/ED_transform.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_transform.h	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/include/ED_transform.h	2012-06-29 14:34:46 UTC (rev 48411)
@@ -180,6 +180,8 @@
 int peelObjectsContext(struct bContext *C, struct ListBase *depth_peels, const float mval[2], SnapMode mode);
 int snapObjectsTransform(struct TransInfo *t, const float mval[2], int *r_dist, float r_loc[3], float r_no[3], SnapMode mode);
 int snapObjectsContext(struct bContext *C, const float mval[2], int *r_dist, float r_loc[3], float r_no[3], SnapMode mode);
+int snapNodesTransform(struct TransInfo *t, const int mval[2], int *r_dist, float r_loc[2], char *r_node_border, SnapMode mode);
+int snapNodesContext(struct bContext *C, const int mval[2], int *r_dist, float r_loc[2], char *r_node_border, SnapMode mode);
 
 #endif
 

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2012-06-29 14:34:46 UTC (rev 48411)
@@ -3351,3 +3351,28 @@
 	node_draw_link_bezier(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
 //	node_draw_link_straight(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
 }
+
+void drawnodesnap(View2D *v2d, const float cent[2], float size, NodeBorder border)
+{
+	glBegin(GL_LINES);
+	
+	if (border & (NODE_LEFT | NODE_RIGHT)) {
+		glVertex2f(cent[0], v2d->cur.ymin);
+		glVertex2f(cent[0], v2d->cur.ymax);
+	}
+	else {
+		glVertex2f(cent[0], cent[1] - size);
+		glVertex2f(cent[0], cent[1] + size);
+	}
+	
+	if (border & (NODE_TOP | NODE_BOTTOM)) {
+		glVertex2f(v2d->cur.xmin, cent[1]);
+		glVertex2f(v2d->cur.xmax, cent[1]);
+	}
+	else {
+		glVertex2f(cent[0] - size, cent[1]);
+		glVertex2f(cent[0] + size, cent[1]);
+	}
+	
+	glEnd();
+}

Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c	2012-06-29 14:34:46 UTC (rev 48411)
@@ -65,6 +65,7 @@
 
 #include "ED_node.h"
 #include "ED_gpencil.h"
+#include "ED_space_api.h"
 
 #include "UI_interface.h"
 #include "UI_interface_icons.h"
@@ -1087,6 +1088,8 @@
 	
 	//uiFreeBlocksWin(&sa->uiblocks, sa->win);
 
+	ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW);
+
 	/* only set once */
 	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	glEnable(GL_MAP1_VERTEX_3);
@@ -1139,6 +1142,8 @@
 	glDisable(GL_LINE_SMOOTH);
 	glDisable(GL_BLEND);
 	
+	ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
+	
 	/* draw grease-pencil ('canvas' strokes) */
 	if (snode->nodetree)
 		draw_gpencil_view2d(C, 1);

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/transform/transform.c	2012-06-29 14:34:46 UTC (rev 48411)
@@ -1655,6 +1655,12 @@
 		unit_m3(t->spacemtx);
 		t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
 	}
+	else if (t->spacetype == SPACE_NODE) {
+		unit_m3(t->spacemtx);
+		/*t->draw_handle_apply = ED_region_draw_cb_activate(t->ar->type, drawTransformApply, t, REGION_DRAW_PRE_VIEW);*/
+		t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
+		/*t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);*/
+	}
 	else
 		unit_m3(t->spacemtx);
 

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/transform/transform.h	2012-06-29 14:34:46 UTC (rev 48411)
@@ -86,6 +86,7 @@
 	float	snapTarget[3]; /* to this point */
 	float	snapNormal[3];
 	float	snapTangent[3];
+	char	snapNodeBorder;
 	ListBase points;
 	TransSnapPoint	*selectedPoint;
 	float	dist; // Distance from snapPoint to snapTarget

Modified: trunk/blender/source/blender/editors/transform/transform_constraints.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_constraints.c	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/transform/transform_constraints.c	2012-06-29 14:34:46 UTC (rev 48411)
@@ -640,7 +640,7 @@
 {
 	TransCon *tc = &(t->con);
 
-	if (!ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE))
+	if (!ELEM3(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE, SPACE_NODE))
 		return;
 	if (!(tc->mode & CON_APPLY))
 		return;

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2012-06-29 14:34:46 UTC (rev 48411)
@@ -5516,8 +5516,11 @@
 	}
 
 	td->loc = td2d->loc;
-	copy_v3_v3(td->center, td->loc);
 	copy_v3_v3(td->iloc, td->loc);
+	/* use node center instead of origin (top-left corner) */
+	td->center[0] = node->locx + 0.5f * (node->totr.xmax - node->totr.xmin);
+	td->center[1] = node->locy - 0.5f * (node->totr.ymax - node->totr.ymin);	/* node height is used negative */
+	td->center[2] = 0.0f;
 
 	memset(td->axismtx, 0, sizeof(td->axismtx));
 	td->axismtx[2][2] = 1.0f;
@@ -5529,6 +5532,8 @@
 
 	unit_m3(td->mtx);
 	unit_m3(td->smtx);
+
+	td->extra = node;
 }
 
 static void createTransNodeData(bContext *C, TransInfo *t)
@@ -6324,7 +6329,7 @@
 #endif
 	}
 	else if (t->spacetype == SPACE_NODE) {
-		t->flag |= T_2D_EDIT | T_POINTS;
+		t->flag |= T_POINTS | T_2D_EDIT;
 		createTransNodeData(C, t);
 		if (t->data && (t->flag & T_PROP_EDIT)) {
 			sort_trans_data(t); // makes selected become first in array

Modified: trunk/blender/source/blender/editors/transform/transform_snap.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_snap.c	2012-06-29 14:34:29 UTC (rev 48410)
+++ trunk/blender/source/blender/editors/transform/transform_snap.c	2012-06-29 14:34:46 UTC (rev 48411)
@@ -42,6 +42,7 @@
 #include "DNA_object_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h" // Temporary, for snapping to other unselected meshes
+#include "DNA_node_types.h"
 #include "DNA_space_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_view3d_types.h"
@@ -74,6 +75,7 @@
 #include "ED_armature.h"
 #include "ED_image.h"
 #include "ED_mesh.h"
+#include "ED_node.h"
 #include "ED_uvedit.h"
 #include "ED_view3d.h"
 
@@ -113,6 +115,9 @@
 
 /****************** IMPLEMENTATIONS *********************/
 
+static int snapNodeTest(View2D *v2d, bNode *node, SnapMode mode);
+static NodeBorder snapNodeBorder(int snap_node_mode);
+
 #if 0
 int BIF_snappingSupported(Object *obedit)
 {
@@ -140,19 +145,22 @@
 
 void drawSnapping(const struct bContext *C, TransInfo *t)
 {
-	if (validSnap(t) && activeSnap(t)) {
-		
-		unsigned char col[4], selectedCol[4], activeCol[4];
-		UI_GetThemeColor3ubv(TH_TRANSFORM, col);
-		col[3] = 128;
-		
-		UI_GetThemeColor3ubv(TH_SELECT, selectedCol);
-		selectedCol[3] = 128;
-
-		UI_GetThemeColor3ubv(TH_ACTIVE, activeCol);
-		activeCol[3] = 192;
-
-		if (t->spacetype == SPACE_VIEW3D) {
+	unsigned char col[4], selectedCol[4], activeCol[4];
+	
+	if (!activeSnap(t))
+		return;
+	
+	UI_GetThemeColor3ubv(TH_TRANSFORM, col);
+	col[3] = 128;
+	
+	UI_GetThemeColor3ubv(TH_SELECT, selectedCol);
+	selectedCol[3] = 128;
+	
+	UI_GetThemeColor3ubv(TH_ACTIVE, activeCol);
+	activeCol[3] = 192;
+	
+	if (t->spacetype == SPACE_VIEW3D) {
+		if (validSnap(t)) {
 			TransSnapPoint *p;
 			View3D *v3d = CTX_wm_view3d(C);
 			RegionView3D *rv3d = CTX_wm_region_view3d(C);
@@ -160,11 +168,11 @@
 			float size;
 			
 			glDisable(GL_DEPTH_TEST);
-	
+			
 			size = 2.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
-
+			
 			invert_m4_m4(imat, rv3d->viewmat);
-
+			
 			for (p = t->tsnap.points.first; p; p = p->next) {
 				if (p == t->tsnap.selectedPoint) {
 					glColor4ubv(selectedCol);
@@ -172,20 +180,20 @@
 				else {
 					glColor4ubv(col);
 				}
-
+				
 				drawcircball(GL_LINE_LOOP, p->co, ED_view3d_pixel_size(rv3d, p->co) * size * 0.75f, imat);
 			}
-
+			
 			if (t->tsnap.status & POINT_INIT) {
 				glColor4ubv(activeCol);
-
+				

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list