Commit: 18cffd6fbf90ffc0e7f74e663df6bfd3ecc837e1
Author: Antony Riakiotakis
Date:   Tue Sep 30 18:33:23 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB18cffd6fbf90ffc0e7f74e663df6bfd3ecc837e1

WIP code reshuffling for widgets

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

M       source/blender/editors/include/ED_transform.h
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/transform/transform_manipulator.c
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/WM_types.h
M       source/blender/windowmanager/intern/wm_widgets.c

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

diff --git a/source/blender/editors/include/ED_transform.h 
b/source/blender/editors/include/ED_transform.h
index 732d0d9..7dc7e84 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -153,6 +153,7 @@ void Transform_Properties(struct wmOperatorType *ot, int 
flags);
 /* view3d manipulators */
 
 int BIF_do_manipulator(struct bContext *C, const struct wmEvent *event, struct 
wmWidget *widget);
+void BIF_manipulator_render_3d_intersect(const struct bContext *C, struct 
wmWidget *widget);
 void BIF_draw_manipulator(const struct bContext *C, struct wmWidget 
*customdata);
 bool BIF_manipulator_poll(const struct bContext *C, struct wmWidget 
*customdata);
 
diff --git a/source/blender/editors/space_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index 2acc42a..5061cca 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -430,7 +430,7 @@ static void view3d_init(wmWindowManager *UNUSED(wm), 
ScrArea *UNUSED(sa))
        if (!manipulator_widget) {
                ListBase *widgets = WM_widgetmap_find("View3D", SPACE_VIEW3D, 
RGN_TYPE_WINDOW);
                
-               manipulator_widget = WM_widget_new(BIF_manipulator_poll, 
BIF_draw_manipulator, NULL, BIF_do_manipulator, NULL, 0, 0);
+               manipulator_widget = WM_widget_new(BIF_manipulator_poll, 
BIF_draw_manipulator, BIF_manipulator_render_3d_intersect, NULL, 
BIF_do_manipulator, NULL, 0, 0);
                
                WM_widget_register(widgets, manipulator_widget);
        }
diff --git a/source/blender/editors/transform/transform_manipulator.c 
b/source/blender/editors/transform/transform_manipulator.c
index a0f72f1..952342b 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1804,6 +1804,29 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion 
*ar, const int mval[2], fl
 }
 
 
+void BIF_manipulator_render_3d_intersect(const bContext *C, wmWidget 
*UNUSED(widget))
+{
+       ScrArea *sa = CTX_wm_area(C);
+       View3D *v3d = sa->spacedata.first;
+       ARegion *ar = CTX_wm_region(C);
+       RegionView3D *rv3d = ar->regiondata;
+
+       /* when looking through a selected camera, the manipulator can be at the
+        * exact same position as the view, skip so we don't break selection */
+       if (fabsf(mat4_to_scale(rv3d->twmat)) < 1e-7f)
+               return;
+       
+       /* do the drawing */
+       if (v3d->twtype & V3D_MANIP_ROTATE) {
+               if (G.debug_value == 3) draw_manipulator_rotate_cyl(v3d, rv3d, 
MAN_ROT_C & rv3d->twdrawflag, v3d->twtype, MAN_RGB, false, true);
+               else draw_manipulator_rotate(v3d, rv3d, MAN_ROT_C & 
rv3d->twdrawflag, v3d->twtype, false, true);
+       }
+       if (v3d->twtype & V3D_MANIP_SCALE)
+               draw_manipulator_scale(v3d, rv3d, MAN_SCALE_C & 
rv3d->twdrawflag, v3d->twtype, MAN_RGB, false, true);
+       if (v3d->twtype & V3D_MANIP_TRANSLATE)
+               draw_manipulator_translate(v3d, rv3d, MAN_TRANS_C & 
rv3d->twdrawflag, v3d->twtype, MAN_RGB, false, true);
+}
+
 /* return 0; nothing happened */
 int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmWidget 
*UNUSED(widget))
 {
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index b16a61f..5d8dadc 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -463,8 +463,9 @@ bool        WM_event_is_tablet(const struct wmEvent *event);
 /* widget API */
 struct wmWidget *WM_widget_new(bool (*poll)(const struct bContext *, struct 
wmWidget *),
                                void (*draw)(const struct bContext *, struct 
wmWidget *),
-                               void (*draw_highlighted)(const struct bContext 
*, struct wmWidget *),
-                               int  (*handler)(struct bContext *, struct 
wmEvent *, struct wmWidget *),
+                                                          void 
(*render_3d_intersection)(const struct bContext *C, struct wmWidget 
*customdata),
+                                                          int  
(*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget 
*customdata),
+                               int  (*handler)(struct bContext *, const struct 
wmEvent *, struct wmWidget *),
                                void *customdata, bool free_data, bool 
requires_ogl);
 
 void WM_widgets_delete(ListBase *widgetlist, struct wmWidget *widget);
diff --git a/source/blender/windowmanager/WM_types.h 
b/source/blender/windowmanager/WM_types.h
index 032ea7c..5623868 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -661,9 +661,11 @@ typedef struct wmWidget {
        bool (*poll)(const struct bContext *C, struct wmWidget *customdata);
        /* draw widget in screen space */
        void (*draw)(const struct bContext *C, struct wmWidget *customdata);
-       /* draw widget highlight */
-       void (*draw_highlighted)(const struct bContext *C, struct wmWidget 
*customdata);
-       int (*handler)(struct bContext *C, struct wmEvent *event, struct 
wmWidget *customdata);
+       /* determine if the mouse intersects with the widget */
+       int  (*intersect)(struct bContext *C, const struct wmEvent *event, 
struct wmWidget *customdata);
+       /* renders 3d intersetion in selection routine */
+       void  (*render_3d_intersection)(const struct bContext *C, struct 
wmWidget *customdata);
+       int  (*handler)(struct bContext *C, const struct wmEvent *event, struct 
wmWidget *customdata);
        int flag; /* flags set by drawing and interaction, such as highlighting 
*/
 } wmWidget;
 
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index 797a92a..2b72cd2 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -36,11 +36,13 @@
 #include "DNA_screen_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_windowmanager_types.h"
+#include "DNA_view3d_types.h"
 
 #include "MEM_guardedalloc.h"
 
 #include "BLI_listbase.h"
 #include "BLI_string.h"
+#include "BLI_math.h"
 
 #include "BKE_context.h"
 #include "BKE_idprop.h"
@@ -59,6 +61,9 @@
 #include "wm_event_types.h"
 #include "wm_draw.h"
 
+#include "GL/glew.h"
+#include "GPU_select.h"
+
 #ifndef NDEBUG
 #  include "RNA_enum_types.h"
 #endif
@@ -79,16 +84,18 @@ static ListBase widgetmaps = {NULL, NULL};
 
 wmWidget *WM_widget_new(bool (*poll)(const struct bContext *C, struct wmWidget 
*customdata),
                         void (*draw)(const struct bContext *C, struct wmWidget 
*customdata),
-                        void (*draw_highlighted)(const struct bContext *C, 
struct wmWidget *customdata),
-                        int  (*handler)(struct bContext *C, struct wmEvent 
*event, struct wmWidget *customdata),
+                        void (*render_3d_intersection)(const struct bContext 
*C, struct wmWidget *customdata),
+                                               int  (*intersect)(struct 
bContext *C, const struct wmEvent *event, struct wmWidget *customdata),
+                        int  (*handler)(struct bContext *C, const struct 
wmEvent *event, struct wmWidget *customdata),
                         void *customdata, bool free_data, bool requires_ogl)
 {
        wmWidget *widget = MEM_callocN(sizeof(wmWidget), "widget");
        
        widget->poll = poll;
        widget->draw = draw;
-       widget->draw_highlighted = draw_highlighted;
        widget->handler = handler;
+       widget->intersect = intersect;
+       widget->render_3d_intersection = render_3d_intersection;
        widget->customdata = customdata;
        
        if (free_data)
@@ -117,15 +124,10 @@ void WM_widgets_draw(const struct bContext *C, struct 
ARegion *ar)
                wmWidget *widget;
                
                for (widget = ar->widgets->first; widget; widget = 
widget->next) {
-                       if ((widget->draw || widget->draw_highlighted) &&
+                       if ((widget->draw) &&
                                (widget->poll == NULL || widget->poll(C, 
widget->customdata))) 
                        {
-                               if (widget->draw_highlighted && (widget->flag & 
WM_WIDGET_HIGHLIGHT)) {
-                                       widget->draw_highlighted(C, 
widget->customdata);
-                               }
-                               else if (widget->draw) {
-                                       widget->draw(C, widget->customdata);
-                               }                               
+                               widget->draw(C, widget->customdata);            
        
                        }
                }
        }
@@ -200,3 +202,48 @@ void WM_widgetmaps_free(void)
        BLI_freelistN(&widgetmaps);
 }
 
+wmWidget *WM_widget_find_active_3D (bContext *C, const struct wmEvent *event, 
float hotspot)
+{
+       ScrArea *sa = CTX_wm_area(C);
+       View3D *v3d = sa->spacedata.first;
+       ARegion *ar = CTX_wm_region(C);
+       RegionView3D *rv3d = ar->regiondata;
+       rctf rect, selrect;
+       GLuint buffer[64];      // max 4 items per select, so large enuf
+       short hits;
+       const bool do_passes = GPU_select_query_check_active();
+       
+       /* XXX check a bit later on this... (ton) */
+       extern void view3d_winmatrix_set(ARegion *ar, View3D *v3d, rctf *rect);
+               
+       rect.xmin = event->mval[0] - hotspot;
+       rect.xmax = event->mval[0] + hotspot;
+       rect.ymin = event->mval[1] - hotspot;
+       rect.ymax = event->mval[1] + hotspot;
+       
+       selrect = rect;
+       
+       view3d_winmatrix_set(ar, v3d, &rect);
+       mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
+       
+       if (do_passes)
+               GPU_select_begin(buffer, 64, &selrect, 
GPU_SELECT_NEAREST_FIRST_PASS, 0);
+       else
+               GPU_select_begin(buffer, 64, &selrect, GPU_SELECT_ALL, 0);
+       
+       /* do the drawing */
+       
+       hits = GPU_select_end();
+       
+       if (do_passes) {
+               GPU_select_begin(buffer, 64, &selrect, 
GPU_SELECT_NEAREST_SECOND_PASS, hits);
+               
+               
+               GPU_select_end();
+       }
+       
+       view3d_winmatrix_set(ar, v3d, NULL);
+       mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
+       
+       return 0;
+}

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

Reply via email to