[Bf-blender-cvs] [2114f49] wiggly-widgets: WIP cage transform.

Antony Riakiotakis noreply at git.blender.org
Sun Nov 16 19:41:21 CET 2014


Commit: 2114f49750253426a6e6819c14087a92957933be
Author: Antony Riakiotakis
Date:   Wed Nov 12 17:42:25 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB2114f49750253426a6e6819c14087a92957933be

WIP cage transform.

This also includes code for the node editor but probably
will try a different use case first.

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

M	source/blender/editors/space_node/node_draw.c
M	source/blender/editors/space_node/space_node.c
M	source/blender/editors/space_sequencer/space_sequencer.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_generic_widgets.c
M	source/blender/windowmanager/intern/wm_widgets.c

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

diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index 7b5ec38..da298c2 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -1330,6 +1330,27 @@ void drawnodespace(const bContext *C, ARegion *ar)
 			/* backdrop */
 			draw_nodespace_back_pix(C, ar, snode, path->parent_key);
 			
+			glMatrixMode(GL_PROJECTION);
+			glPushMatrix();
+			glLoadIdentity();
+			glMatrixMode(GL_MODELVIEW);
+			glPushMatrix();
+			glLoadIdentity();
+
+			/* somehow the offset has to be calculated inverse */
+
+			//glaDefine2DArea(&ar->winrct);
+			/* ortho at pixel level curarea */
+			/* almost #wmOrtho2_region_pixelspace, but no +1 px */
+			//wmOrtho2_pixelspace(ar->winx, ar->winy);
+
+			WM_widgets_draw(C, ar, false);
+
+			glMatrixMode(GL_PROJECTION);
+			glPopMatrix();
+			glMatrixMode(GL_MODELVIEW);
+			glPopMatrix();
+
 			draw_nodetree(C, ar, ntree, path->parent_key);
 		}
 		
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index ccaeae3..fea45bb 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -40,7 +40,10 @@
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
 
+#include "IMB_imbuf_types.h"
+
 #include "BKE_context.h"
+#include "BKE_image.h"
 #include "BKE_library.h"
 #include "BKE_scene.h"
 #include "BKE_screen.h"
@@ -58,6 +61,8 @@
 
 #include "RNA_access.h"
 
+#include "WM_api.h"
+
 #include "node_intern.h"  /* own include */
 
 
@@ -339,6 +344,7 @@ static SpaceLink *node_new(const bContext *UNUSED(C))
 
 	/* main area */
 	ar = MEM_callocN(sizeof(ARegion), "main area for node");
+	ar->widgetmap = WM_widgetmap_from_type("Node", SPACE_NODE, RGN_TYPE_WINDOW, true);
 
 	BLI_addtail(&snode->regionbase, ar);
 	ar->regiontype = RGN_TYPE_WINDOW;
@@ -652,6 +658,13 @@ static void node_main_area_init(wmWindowManager *wm, ARegion *ar)
 	lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW);
 
 	WM_event_add_dropbox_handler(&ar->handlers, lb);
+
+	/* make sure we have a widgetmap - sucks a bit to do it here, but works for now */
+	if (!ar->widgetmap)
+		ar->widgetmap = WM_widgetmap_from_type("Node", SPACE_NODE, RGN_TYPE_WINDOW, false);
+
+	WM_event_add_widget_handler(ar);
+
 }
 
 static void node_main_area_draw(const bContext *C, ARegion *ar)
@@ -816,6 +829,59 @@ static int node_context(const bContext *C, const char *member, bContextDataResul
 	return 0;
 }
 
+static void WIDGETGROUP_node_transform_create(struct wmWidgetGroup *wgroup)
+{
+	wmWidget *widget = WIDGET_cage_new(0, NULL);
+	WM_widget_register(wgroup, widget);
+}
+
+static bool WIDGETGROUP_node_transform_poll(struct wmWidgetGroup *UNUSED(wgroup), const struct bContext *C)
+{
+	SpaceNode *snode = CTX_wm_space_node(C);
+
+	if (snode->edittree->type == NTREE_COMPOSIT) {
+		bNode *node = nodeGetActive(snode->edittree);
+
+		if (node->type == CMP_NODE_TRANSFORM)
+			return true;
+	}
+
+	return false;
+}
+
+static void WIDGETGROUP_node_transform_update(struct wmWidgetGroup *wgroup, const struct bContext *C)
+{
+	/* temporarily get the first */
+	SpaceNode *snode = CTX_wm_space_node(C);
+	wmWidget *cage = WM_widgetgroup_widgets(wgroup)->first;
+	bNode *node = nodeGetActive(snode->edittree);
+	Image *ima;
+	ImBuf *ibuf;
+	void *lock;
+	ima = BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
+	ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock);
+	if (ibuf) {
+		WIDGET_cage_bounds_set(cage, ibuf->x, ibuf->y);
+	}
+	BKE_image_release_ibuf(ima, ibuf, lock);
+}
+
+static void WIDGETGROUP_node_transform_free(struct wmWidgetGroup *wgroup)
+{
+
+}
+
+static void node_widgets(void)
+{
+	struct wmWidgetMapType *wmaptype = WM_widgetmaptype_find("Node", SPACE_NODE, RGN_TYPE_WINDOW, false);
+	struct wmWidgetGroupType *wgroup_node_transform = WM_widgetgrouptype_new(WIDGETGROUP_node_transform_create,
+	                                                                         WIDGETGROUP_node_transform_poll,
+	                                                                         WIDGETGROUP_node_transform_update,
+	                                                                         WIDGETGROUP_node_transform_free);
+
+	WM_widgetgrouptype_register(wmaptype, wgroup_node_transform);
+}
+
 /* only called once, from space/spacetypes.c */
 void ED_spacetype_node(void)
 {
@@ -835,6 +901,7 @@ void ED_spacetype_node(void)
 	st->refresh = node_area_refresh;
 	st->context = node_context;
 	st->dropboxes = node_dropboxes;
+	st->widgets = node_widgets;
 
 	/* regions: main window */
 	art = MEM_callocN(sizeof(ARegionType), "spacetype node region");
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index c0cfaed..a8d2be4 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -166,7 +166,7 @@ static SpaceLink *sequencer_new(const bContext *C)
 	BLI_addtail(&sseq->regionbase, ar);
 	ar->regiontype = RGN_TYPE_WINDOW;
 	
-	
+
 	/* seq space goes from (0,8) to (0, efra) */
 	
 	ar->v2d.tot.xmin = 0.0f;
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index a9004aa..35aa419 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3552,7 +3552,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
 	
 	view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);	
 	glClear(GL_DEPTH_BUFFER_BIT);
-	WM_widgets_draw(C, ar);
+	WM_widgets_draw(C, ar, true);
 	ED_region_pixelspace(ar);
 	
 	view3d_main_area_draw_info(C, scene, ar, v3d, grid_unit, render_border);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index be678bf..b47a3a5 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -484,7 +484,7 @@ void WM_widget_operator(struct wmWidget *,
                         int  (*initialize_op)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct PointerRNA *),
                         const char *opname,
                         const char *propname);
-void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
+void WM_widgets_draw(const struct bContext *C, struct ARegion *ar, bool is_3d);
 void WM_event_add_widget_handler(struct ARegion *ar);
 
 bool WM_widget_register(struct wmWidgetGroup *wgroup, struct wmWidget *widget);
@@ -534,6 +534,10 @@ struct wmWidget *WIDGET_dial_new(int style,
 void WIDGET_dial_set_color(struct wmWidget *widget, float color[4]);
 void WIDGET_dial_set_direction(struct wmWidget *widget, float direction[3]);
 
+struct wmWidget *WIDGET_cage_new(int style, void *customdata);
+void WIDGET_cage_bind_to_rotation(struct wmWidget *widget, float rotation);
+void WIDGET_cage_bounds_set(struct wmWidget *widget, float w, float h);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index eb75a85..11d9a98 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -134,7 +134,7 @@ static void widget_draw_intern(WidgetDrawInfo *info, bool select)
 	}
 }
 
-/* Arrow widget */
+/********* Arrow widget ************/
 
 typedef struct ArrowWidget {
 	wmWidget widget;
@@ -413,7 +413,7 @@ void WIDGET_arrow_set_direction(struct wmWidget *widget, float direction[3])
 	normalize_v3(arrow->direction);
 }
 
-/* Dial widget */
+/********* Dial widget ************/
 
 typedef struct DialWidget {
 	wmWidget widget;
@@ -534,6 +534,69 @@ void WIDGET_dial_set_direction(struct wmWidget *widget, float direction[3])
 	normalize_v3(arrow->direction);
 }
 
+/********* Cage widget ************/
+
+
+typedef struct CageWidget {
+	wmWidget widget;
+	float rotation;
+	rctf bound;
+	int style;
+} CageWidget;
+
+static void widget_cage_draw(struct wmWidget *widget, const struct bContext *C)
+{
+	CageWidget *cage = (CageWidget *)widget;
+
+	glColor3f(1.0, 1.0, 1.0);
+	glRectf(cage->bound.xmin, cage->bound.ymin, cage->bound.xmax, cage->bound.ymax);
+
+}
+
+int widget_cage_intersect(struct bContext *UNUSED(C), const struct wmEvent *event, struct wmWidget *widget)
+{
+	CageWidget *cage = (CageWidget *)widget;
+	float mouse[2] = {event->mval[0], event->mval[1]};
+	float pointrot[2];
+	float matrot[2][2];
+
+	/* rotate mouse in relation to the center and relocate it */
+	sub_v2_v2v2(pointrot, mouse, widget->origin);
+
+	rotate_m2(matrot, -cage->rotation);
+
+	add_v2_v2(pointrot, widget->origin);
+
+	return BLI_rctf_isect_pt_v(&cage->bound, pointrot);
+}
+
+struct wmWidget *WIDGET_cage_new(int style, void *customdata)
+{
+	CageWidget *cage = MEM_callocN(sizeof(CageWidget), "CageWidget");
+
+	cage->widget.customdata = customdata;
+	cage->widget.draw = widget_cage_draw;
+	cage->widget.intersect = widget_cage_intersect;
+	cage->style = style;
+
+	return (wmWidget *)cage;
+}
+
+void WIDGET_cage_bind_to_rotation(struct wmWidget *widget, float rotation)
+{
+
+}
+
+void WIDGET_cage_bounds_set(struct wmWidget *widget, float w, float h)
+{
+	CageWidget *cage = (CageWidget *)widget;
+	cage->bound.xmax = w/2;
+	cage->bound.ymax = h/2;
+	cage->bound.xmin = -w/2;
+	cage->bound.ymin = h/2;
+}
+
+
 void fix_linking_widget_lib(void)
 {
 	(void) 0;
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index a6d0ba8..2443d19 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -222,16 +222,23 @@ static void wm_widgets_delete(ListBase *widgetlist, wmWidget *widget)
 }
 
 
-void WM_widgets_draw(const struct bContext *C, struct ARegion *ar)
+void WM_widgets_draw(const struct bContext *C, struct ARegion *ar, bool is_3d)
 {
-	RegionView3D *rv3d = ar->regiondata;
+	RegionView3D *rv3d;
 	wmWidgetMap *wmap = ar->widgetmap;
-	wmWidget *widget;;
+	wmWidget *widget;
 	bool use_lighting;
+	bool do_scale = false;
 
 	if (!wmap)
 		return

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list