[Bf-blender-cvs] [134d695] wiggly-widgets: More refinement to the widget system. Now camera widget should be indistinguishable than the displayed widget (might probably be worth deleting the original)

Antony Riakiotakis noreply at git.blender.org
Wed Nov 19 15:30:16 CET 2014


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




More information about the Bf-blender-cvs mailing list