[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