[Bf-blender-cvs] [18cffd6] wiggly-widgets: WIP code reshuffling for widgets

Antony Riakiotakis noreply at git.blender.org
Tue Sep 30 19:21:27 CEST 2014


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;
+}




More information about the Bf-blender-cvs mailing list