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. @@

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

Reply via email to