Commit: 134d69582c5f6370437a6b4570d67251f65e7df1
Author: Antony Riakiotakis
Date: Wed Nov 19 14:48:02 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB134d69582c5f6370437a6b4570d67251f65e7df1
More refinement to the widget system. Now camera widget should be
indistinguishable than the displayed widget (might probably be worth
deleting the original)
===================================================================
M source/blender/editors/space_node/node_draw.c
M source/blender/editors/space_view3d/space_view3d.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
M source/blender/windowmanager/wm.h
===================================================================
diff --git a/source/blender/editors/space_node/node_draw.c
b/source/blender/editors/space_node/node_draw.c
index a2103f5..e85a3a4 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -1349,7 +1349,7 @@ void drawnodespace(const bContext *C, ARegion *ar)
/* almost #wmOrtho2_region_pixelspace, but no +1 px */
//wmOrtho2_pixelspace(ar->winx, ar->winy);
- WM_widgets_draw(C, ar, false);
+ WM_widgets_draw(C, ar);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
diff --git a/source/blender/editors/space_view3d/space_view3d.c
b/source/blender/editors/space_view3d/space_view3d.c
index 78056f4..1be83b5 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -721,7 +721,7 @@ static void WIDGETGROUP_camera_update(struct wmWidgetGroup
*wgroup, const struct
negate_v3_v3(dir, ob->obmat[2]);
WIDGET_arrow_set_direction(widget, dir);
WIDGET_arrow_set_up_vector(widget, ob->obmat[1]);
- WIDGET_arrow_set_scale(widget, ca->drawsize);
+ WM_widget_set_scale(widget, ca->drawsize);
}
@@ -740,6 +740,7 @@ static void WIDGETGROUP_camera_create(struct wmWidgetGroup
*wgroup)
widget = WIDGET_arrow_new(UI_ARROW_STYLE_CROSS, NULL);
WM_widget_set_draw_on_hover_only(widget, true);
+ WM_widget_set_3d_scale(widget, false);
WM_widget_register(wgroup, widget);
WIDGET_arrow_set_color(widget, color_camera);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c
b/source/blender/editors/space_view3d/view3d_draw.c
index 6fc0d90..99ab628 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, true);
+ WM_widgets_draw(C, ar);
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 7425949..35349a8 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, bool is_3d);
+void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
void WM_event_add_widget_handler(struct ARegion *ar);
bool WM_widget_register(struct wmWidgetGroup *wgroup, struct wmWidget *widget);
@@ -493,8 +493,9 @@ void WM_widget_unregister(struct wmWidgetGroup *wgroup,
struct wmWidget *widget)
void *WM_widget_customdata(struct wmWidget *widget);
void WM_widget_set_origin(struct wmWidget *widget, float origin[3]);
void WM_widget_set_draw(struct wmWidget *widget, bool draw);
-
+void WM_widget_set_3d_scale(struct wmWidget *widget, bool scale);
void WM_widget_set_draw_on_hover_only(struct wmWidget *widget, bool draw);
+void WM_widget_set_scale(struct wmWidget *widget, float scale);
void *WM_widgetgroup_customdata(struct wmWidgetGroup *wgroup);
void WM_widgetgroup_customdata_set(struct wmWidgetGroup *wgroup, void *data);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c
b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 814beca..1c7ece1 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -144,7 +144,6 @@ typedef struct ArrowWidget {
int flag;
float direction[3];
float up[3];
- float scale;
float color[4];
float offset;
/* property range and minimum for constrained arrows */
@@ -208,7 +207,7 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool
select, bool highlight)
}
copy_m4_m3(mat, rot);
copy_v3_v3(mat[3], final_pos);
- mul_mat3_m4_fl(mat, arrow->widget.scale * arrow->scale);
+ mul_mat3_m4_fl(mat, arrow->widget.scale);
glPushMatrix();
glMultMatrixf(&mat[0][0]);
@@ -227,7 +226,7 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool
select, bool highlight)
copy_m4_m3(mat, rot);
copy_v3_v3(mat[3], data->orig_origin);
- mul_mat3_m4_fl(mat, data->orig_scale * arrow->scale);
+ mul_mat3_m4_fl(mat, data->orig_scale);
glPushMatrix();
glMultMatrixf(&mat[0][0]);
@@ -438,8 +437,9 @@ wmWidget *WIDGET_arrow_new(int style, void *customdata)
arrow->widget.render_3d_intersection = widget_arrow_render_3d_intersect;
arrow->widget.customdata = customdata;
arrow->widget.bind_to_prop = widget_arrow_bind_to_prop;
+ arrow->widget.user_scale = 1.0f;
+ arrow->widget.flag |= WM_WIDGET_SCALE_3D;
arrow->style = style;
- arrow->scale = 1.0f;
copy_v3_v3(arrow->direction, dir_default);
return (wmWidget *)arrow;
@@ -474,13 +474,6 @@ void WIDGET_arrow_set_up_vector(struct wmWidget *widget,
float direction[3])
}
}
-void WIDGET_arrow_set_scale(struct wmWidget *widget, float scale)
-{
- ArrowWidget *arrow = (ArrowWidget *)widget;
-
- arrow->scale = scale;
-}
-
/********* Dial widget ************/
diff --git a/source/blender/windowmanager/intern/wm_widgets.c
b/source/blender/windowmanager/intern/wm_widgets.c
index f6af313..b0fb8c5 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -222,23 +222,34 @@ static void wm_widgets_delete(ListBase *widgetlist,
wmWidget *widget)
}
-void WM_widgets_draw(const struct bContext *C, struct ARegion *ar, bool is_3d)
+static void widget_calculate_scale(wmWidget *widget, const bContext *C)
+{
+ float scale = 1.0f;
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ if (rv3d && !(U.tw_flag & V3D_3D_WIDGETS) && (widget->flag &
WM_WIDGET_SCALE_3D)) {
+ if (widget->get_final_position) {
+ float position[3];
+
+ widget->get_final_position(widget, position);
+ scale = ED_view3d_pixel_size(rv3d, position) *
U.tw_size;
+ }
+ else {
+ scale = ED_view3d_pixel_size(rv3d, widget->origin) *
U.tw_size;
+ }
+ }
+
+ widget->scale = scale * widget->user_scale;
+}
+
+void WM_widgets_draw(const bContext *C, struct ARegion *ar)
{
- RegionView3D *rv3d;
wmWidgetMap *wmap = ar->widgetmap;
wmWidget *widget;
bool use_lighting;
- bool do_scale = false;
if (!wmap)
return;
- if (is_3d) {
- if (!(U.tw_flag & V3D_3D_WIDGETS))
- do_scale = true;
- rv3d = ar->regiondata;
- }
-
use_lighting = (U.tw_flag & V3D_SHADED_WIDGETS) != 0;
if (use_lighting) {
@@ -260,21 +271,9 @@ void WM_widgets_draw(const struct bContext *C, struct
ARegion *ar, bool is_3d)
widget = wmap->active_widget;
if (widget) {
- float scale = 1.0;
-
- if (do_scale) {
- if (widget->get_final_position) {
- float position[3];
- widget->get_final_position(widget, position);
- scale = ED_view3d_pixel_size(rv3d, position) *
U.tw_size;
- }
- else {
- scale = ED_view3d_pixel_size(rv3d,
widget->origin) * U.tw_size;
- }
- }
+ widget_calculate_scale(widget, C);
/* notice that we don't update the widgetgroup, widget is now
on its own, it should have all
* relevant data to update itself */
- widget->scale = scale;
widget->draw(widget, C);
}
else if (wmap->widgetgroups.first) {
@@ -294,20 +293,7 @@ void WM_widgets_draw(const struct bContext *C, struct
ARegion *ar, bool is_3d)
if (!(widget_iter->flag &
WM_WIDGET_SKIP_DRAW) &&
(!(widget_iter->flag &
WM_WIDGET_DRAW_HOVER) || (widget_iter->flag & WM_WIDGET_HIGHLIGHT)))
{
- float scale = 1.0;
-
- if (do_scale) {
- if
(widget_iter->get_final_position) {
- float
position[3];
-
widget_iter->get_final_position(widget_iter, position);
- scale =
ED_view3d_pixel_size(rv3d, position) * U.tw_size;
- }
- else {
- scale =
ED_view3d_pixel_size(rv3d, widget_iter->origin) * U.tw_size;
- }
- }
-
- widget_iter->scale = scale;
+
widget_calculate_scale(widget_iter, C);
widget_iter->draw(widget_iter,
C);
}
}
@@ -393,6 +379,17 @@ void WM_widget_set_draw(struct wmWidget *widget, bool draw)
}
}
+void WM_widget_set_3d_scale(struct wmWidget *widget, bool scale)
+{
+ if (scale) {
+ widget->flag |= WM_WIDGET_SCALE_3D;
+ }
+ else {
+ widget->flag &= ~WM_WIDGET_SCALE_3D;
+ }
+}
+
+
void WM_widget_set_draw_on_hover_only(struct wmWidget *widget, bool draw)
{
if (draw) {
@@ -403,6 +400,11 @@ void WM_widget_set_draw_on_hover_only(struct wmWidget
*widget, bool draw)
}
}
+void WM_widget_set_scale(struct wmWidget *widget, float scale)
+{
+ widget->user_scale = scale;
+}
+
wmWidgetMapType *WM_widgetmaptype_find(const char *idname, int spaceid, int
regionid, bool is_3d)
{
@@ -445,26 +447,9 @@ static void widget_find_active_3D_loop(bContext *C,
ListBase *visible_widgets)
int selectionbase = 0;
LinkData *link;
wmWidget *widget;
- RegionView3D *rv3d = CTX_wm_region(C)->regiondata;
for (link = visible_widgets->first; link; link = link->next) {
- float scale = 1.0;
-
widget = link->data;
-
- if (!(U.tw_flag & V3D_3D_WIDGETS)) {
- if (widget->get_final_position) {
- float position[3];
- widget->get_final_position(widget, position);
- scale = ED_view3d_pixel_size(rv3d, position) *
U.tw_size;
- }
- else {
- scale = ED_view3d_pixel_size(rv3d,
widget->origin) * U.tw_size;
- }
- }
- /* reset the scale here. We might have more than one 3d view so
scale is not guaranteed to
- * have stayed the same */
- widget->scale = scale;
widget->render_3d_intersection(C, widget, selectionbase);
selectionbase++;
diff --git a/source/blender/windowmanager/wm.h
b/source/blender/windowmanager/wm.h
index 07ae91d..ac6ff16 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -87,6 +87,9 @@ typedef struct wmWidget {
/* runtime property, set the scale while drawing on the viewport */
float scale;
+ /* user defined scale, in addition to the original one */
+ float user_scale;
+
/* data used dur
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs