[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