[Bf-blender-cvs] [377947342e1] blender2.8: Node Backdrop Manipulator

Campbell Barton noreply at git.blender.org
Mon May 29 14:11:04 CEST 2017


Commit: 377947342e1a483d77dea0df351f20646a30ef20
Author: Campbell Barton
Date:   Mon May 29 22:06:59 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB377947342e1a483d77dea0df351f20646a30ef20

Node Backdrop Manipulator

>From custom-manipulator branch, usable when viewer node is selected.

This might need some changes but works on basic level.

===================================================================

M	source/blender/editors/space_node/CMakeLists.txt
M	source/blender/editors/space_node/node_draw.c
M	source/blender/editors/space_node/node_intern.h
A	source/blender/editors/space_node/node_widgets.c
M	source/blender/editors/space_node/space_node.c
M	source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c

===================================================================

diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt
index cde818333e4..41843927587 100644
--- a/source/blender/editors/space_node/CMakeLists.txt
+++ b/source/blender/editors/space_node/CMakeLists.txt
@@ -53,6 +53,7 @@ set(SRC
 	node_templates.c
 	node_toolbar.c
 	node_view.c
+	node_widgets.c
 	space_node.c
 
 	node_intern.h
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index fb94ce6e252..4fc9f08ff02 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -1395,7 +1395,23 @@ void drawnodespace(const bContext *C, ARegion *ar)
 			
 			/* backdrop */
 			draw_nodespace_back_pix(C, ar, snode, path->parent_key);
-			
+
+			{
+				float original_proj[4][4];
+				gpuGetProjectionMatrix(original_proj);
+
+				gpuPushMatrix();
+				gpuLoadIdentity();
+
+				glaDefine2DArea(&ar->winrct);
+				wmOrtho2_pixelspace(ar->winx, ar->winy);
+
+				WM_manipulatormap_draw(ar->manipulator_map, C, WM_MANIPULATORMAP_DRAWSTEP_2D);
+
+				gpuPopMatrix();
+				gpuLoadProjectionMatrix(original_proj);
+			}
+
 			draw_nodetree(C, ar, ntree, path->parent_key);
 		}
 		
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 3b5d32a432a..b425a92f601 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -219,6 +219,10 @@ void NODE_OT_shader_script_update(struct wmOperatorType *ot);
 void NODE_OT_viewer_border(struct wmOperatorType *ot);
 void NODE_OT_clear_viewer_border(struct wmOperatorType *ot);
 
+/* node_widgets.c */
+void NODE_WGT_backdrop_transform(struct wmManipulatorGroupType *wgt);
+
+
 extern const char *node_context_dir[];
 
 // XXXXXX
diff --git a/source/blender/editors/space_node/node_widgets.c b/source/blender/editors/space_node/node_widgets.c
new file mode 100644
index 00000000000..9e7445b8566
--- /dev/null
+++ b/source/blender/editors/space_node/node_widgets.c
@@ -0,0 +1,114 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/space_node/node_widgets.c
+ *  \ingroup spnode
+ */
+
+#include "BKE_context.h"
+#include "BKE_image.h"
+
+#include "DNA_manipulator_types.h"
+
+#include "ED_screen.h"
+
+#include "IMB_imbuf_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "node_intern.h"
+
+
+static bool WIDGETGROUP_node_transform_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgrouptype))
+{
+	SpaceNode *snode = CTX_wm_space_node(C);
+
+	if ((snode->flag & SNODE_BACKDRAW) == 0) {
+		return false;
+	}
+
+	if (snode && snode->edittree && snode->edittree->type == NTREE_COMPOSIT) {
+		bNode *node = nodeGetActive(snode->edittree);
+
+		if (node && node->type == CMP_NODE_VIEWER) {
+			return true;
+		}
+	}
+
+	return false;
+}
+
+static void WIDGETGROUP_node_transform_init(const bContext *UNUSED(C), wmManipulatorGroup *wgroup)
+{
+	wmManipulatorWrapper *wwrapper = MEM_mallocN(sizeof(wmManipulatorWrapper), __func__);
+
+	wwrapper->manipulator = MANIPULATOR_rect_transform_new(
+	        wgroup, "backdrop_cage",
+	        MANIPULATOR_RECT_TRANSFORM_STYLE_TRANSLATE | MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM);
+	wgroup->customdata = wwrapper;
+
+}
+
+static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmManipulatorGroup *wgroup)
+{
+	wmManipulator *cage = ((wmManipulatorWrapper *)wgroup->customdata)->manipulator;
+	const ARegion *ar = CTX_wm_region(C);
+	/* center is always at the origin */
+	const float origin[3] = {ar->winx / 2, ar->winy / 2};
+
+	void *lock;
+	Image *ima = BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
+	ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock);
+
+	if (ibuf) {
+		const float w = (ibuf->x > 0) ? ibuf->x : 64.0f;
+		const float h = (ibuf->y > 0) ? ibuf->y : 64.0f;
+
+		MANIPULATOR_rect_transform_set_dimensions(cage, w, h);
+		WM_manipulator_set_origin(cage, origin);
+		WM_manipulator_set_flag(cage, WM_MANIPULATOR_HIDDEN, false);
+
+		/* need to set property here for undo. TODO would prefer to do this in _init */
+		SpaceNode *snode = CTX_wm_space_node(C);
+		PointerRNA nodeptr;
+		RNA_pointer_create(snode->id, &RNA_SpaceNodeEditor, snode, &nodeptr);
+		WM_manipulator_set_property(cage, RECT_TRANSFORM_SLOT_OFFSET, &nodeptr, "backdrop_offset");
+		WM_manipulator_set_property(cage, RECT_TRANSFORM_SLOT_SCALE, &nodeptr, "backdrop_zoom");
+	}
+	else {
+		WM_manipulator_set_flag(cage, WM_MANIPULATOR_HIDDEN, true);
+	}
+
+	BKE_image_release_ibuf(ima, ibuf, lock);
+}
+
+void NODE_WGT_backdrop_transform(wmManipulatorGroupType *wgt)
+{
+	wgt->name = "Backdrop Transform Widgets";
+
+	wgt->poll = WIDGETGROUP_node_transform_poll;
+	wgt->init = WIDGETGROUP_node_transform_init;
+	wgt->refresh = WIDGETGROUP_node_transform_refresh;
+}
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 235eadd6f51..4eeb4d02d8c 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -57,6 +57,8 @@
 
 #include "RNA_access.h"
 
+#include "WM_api.h"
+
 #include "node_intern.h"  /* own include */
 
 
@@ -643,6 +645,14 @@ static void node_main_region_init(wmWindowManager *wm, ARegion *ar)
 
 	UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
 
+	/* manipulators stay in the background for now - quick patchjob to make sure nodes themselves work */
+	if (!ar->manipulator_map) {
+		ar->manipulator_map = WM_manipulatormap_new_from_type(&(const struct wmManipulatorMapType_Params) {
+		        "Node_Canvas", SPACE_NODE, RGN_TYPE_WINDOW});
+	}
+
+	WM_manipulatormap_add_handlers(ar, ar->manipulator_map);
+
 	/* own keymaps */
 	keymap = WM_keymap_find(wm->defaultconf, "Node Generic", SPACE_NODE, 0);
 	WM_event_add_keymap_handler(&ar->handlers, keymap);
@@ -741,13 +751,24 @@ static void node_region_listener(
         bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar,
         wmNotifier *wmn, const Scene *UNUSED(scene))
 {
+	wmManipulatorMap *mmap = ar->manipulator_map;
+
 	/* context changes */
 	switch (wmn->category) {
 		case NC_SPACE:
-			if (wmn->data == ND_SPACE_NODE)
-				ED_region_tag_redraw(ar);
+			switch (wmn->data) {
+				case ND_SPACE_NODE:
+					ED_region_tag_redraw(ar);
+					break;
+				case ND_SPACE_NODE_VIEW:
+					WM_manipulatormap_tag_refresh(mmap);
+					break;
+			}
 			break;
 		case NC_SCREEN:
+			if (wmn->data == ND_SCREENSET || wmn->action == NA_EDITED) {
+				WM_manipulatormap_tag_refresh(mmap);
+			}
 			switch (wmn->data) {
 				case ND_SCREENCAST:
 				case ND_ANIMPLAY:
@@ -756,10 +777,20 @@ static void node_region_listener(
 			}
 			break;
 		case NC_SCENE:
+			ED_region_tag_redraw(ar);
+			if (wmn->data == ND_RENDER_RESULT) {
+				WM_manipulatormap_tag_refresh(mmap);
+			}
+			break;
+		case NC_NODE:
+			ED_region_tag_redraw(ar);
+			if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
+				WM_manipulatormap_tag_refresh(mmap);
+			}
+			break;
 		case NC_MATERIAL:
 		case NC_TEXTURE:
 		case NC_WORLD:
-		case NC_NODE:
 		case NC_LINESTYLE:
 			ED_region_tag_redraw(ar);
 			break;
@@ -824,6 +855,14 @@ static int node_context(const bContext *C, const char *member, bContextDataResul
 	return 0;
 }
 
+static void node_widgets(void)
+{
+	/* create the widgetmap for the area here */
+	wmManipulatorMapType *wmaptype = WM_manipulatormaptype_ensure(&(const struct wmManipulatorMapType_Params) {
+	        "Node_Canvas", SPACE_NODE, RGN_TYPE_WINDOW});
+	WM_manipulatorgrouptype_append(wmaptype, NODE_WGT_backdrop_transform);
+}
+
 static void node_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id)
 {
 	SpaceNode *snode = (SpaceNode *)slink;
@@ -914,6 +953,7 @@ void ED_spacetype_node(void)
 	st->refresh = node_area_refresh;
 	st->context = node_context;
 	st->dropboxes = node_dropboxes;
+	st->manipulators = node_widgets;
 	st->id_remap = node_id_remap;
 
 	/* regions: main window */
diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c
index 59ae06eb30b..45973fbf2fe 100644
--- a/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/cage_manipulator.c
@@ -179,7 +179,7 @@ static void rect_transform_draw_interaction(
 	VertexFormat *format = immVertexFormat();
 	unsigned int pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT);
 	unsigned int color = VertexFormat_add_attrib(format, "color", COMP_F32, 3, KEEP_FLOAT);
-	immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+	immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
 
 	glLineWidth(line_width + 3.0);
 
@@ -198,6 +198,8 @@ static void rect_transform_draw_interaction(
 	immVertex2fv(pos, verts[1]);
 	immVertex2fv(pos, verts[2]);
 	immEnd();
+
+	immUnbindProgram();
 }
 
 static void manipulator_rect_transform_draw(const bContext *UNUSED(C), wmManipulator *manipulator)




More information about the Bf-blender-cvs mailing list