[Bf-blender-cvs] [6ce5174] wiggly-widgets: Arrow Widget:

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


Commit: 6ce517430141c53fe397eddd3b30119851b70f8d
Author: Antony Riakiotakis
Date:   Wed Nov 19 14:24:29 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB6ce517430141c53fe397eddd3b30119851b70f8d

Arrow Widget:

Create a cross style widget, with wireframe cross.

Allows setting a custom scale for the arrow widget also, an up
orientation.

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

M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_generic_widgets.c

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

diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index fb6d9d2..78056f4 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -717,10 +717,11 @@ static void WIDGETGROUP_camera_update(struct wmWidgetGroup *wgroup, const struct
 
 	RNA_pointer_create(&ca->id, &RNA_Camera, ca, cameraptr);
 	WM_widget_set_origin(widget, ob->obmat[3]);
-	WM_widget_set_draw_on_hover_only(widget, true);
 	WM_widget_property(widget, cameraptr, "dof_distance");
 	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);
 }
 
 
@@ -733,11 +734,12 @@ static void WIDGETGROUP_camera_free(struct wmWidgetGroup *wgroup)
 
 static void WIDGETGROUP_camera_create(struct wmWidgetGroup *wgroup)
 {
-	float color_camera[4] = {1.0f, 0.7f, 0.2f, 1.0f};
+	float color_camera[4] = {1.0f, 0.3f, 0.0f, 1.0f};
 	wmWidget *widget = NULL;
 	PointerRNA *cameraptr = MEM_callocN(sizeof(PointerRNA), "camerawidgetptr");
 
-	widget = WIDGET_arrow_new(0, NULL);
+	widget = WIDGET_arrow_new(UI_ARROW_STYLE_CROSS, NULL);
+	WM_widget_set_draw_on_hover_only(widget, true);
 	WM_widget_register(wgroup, widget);
 	WIDGET_arrow_set_color(widget, color_camera);
 
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 659ae02..7425949 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -516,10 +516,11 @@ void WM_widgetmaptypes_free(void);
 enum {
 	UI_ARROW_STYLE_NORMAL        =  0,
 	UI_ARROW_STYLE_NO_AXIS       = (1 << 1),
+	UI_ARROW_STYLE_CROSS         = (1 << 2),
 	/* inverted offset during interaction - if set it also sets constrained below */
-	UI_ARROW_STYLE_INVERTED      = (1 << 2),
+	UI_ARROW_STYLE_INVERTED      = (1 << 3),
 	/* clamp arrow interaction to property width */
-	UI_ARROW_STYLE_CONSTRAINED   = (1 << 3),
+	UI_ARROW_STYLE_CONSTRAINED   = (1 << 4),
 };
 
 enum {
@@ -530,6 +531,8 @@ enum {
 struct wmWidget *WIDGET_arrow_new(int style, void *customdata);
 void WIDGET_arrow_set_color(struct wmWidget *widget, float color[4]);
 void WIDGET_arrow_set_direction(struct wmWidget *widget, float direction[3]);
+void WIDGET_arrow_set_up_vector(struct wmWidget *widget, float direction[3]);
+void WIDGET_arrow_set_scale(struct wmWidget *widget, float scale);
 
 struct wmWidget *WIDGET_dial_new(int style,
                                  void *customdata);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 278e1d6..814beca 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -136,10 +136,15 @@ static void widget_draw_intern(WidgetDrawInfo *info, bool select)
 
 /********* Arrow widget ************/
 
+#define ARROW_UP_VECTOR_SET 1
+
 typedef struct ArrowWidget {
 	wmWidget widget;
 	int style;
+	int flag;
 	float direction[3];
+	float up[3];
+	float scale;
 	float color[4];
 	float offset;
 	/* property range and minimum for constrained arrows */
@@ -165,20 +170,45 @@ static void widget_arrow_get_final_pos(struct wmWidget *widget, float pos[3])
 	add_v3_v3(pos, arrow->widget.origin);
 }
 
+static void arrow_draw_geom(ArrowWidget *arrow, bool select, bool highlight)
+{
+	if (arrow->style & UI_ARROW_STYLE_CROSS) {
+		glPushAttrib(GL_ENABLE_BIT);
+		glDisable(GL_LIGHTING);
+		glBegin(GL_LINES);
+		glVertex2f(-1.0, 0.f);
+		glVertex2f(1.0, 0.f);
+		glVertex2f(0.f, -1.0);
+		glVertex2f(0.f, 1.0);
+		glEnd();
+
+		glPopAttrib();
+	}
+	else {
+		widget_draw_intern(&arraw_head_draw_info, select);
+	}
+}
 
-static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, float scale)
+static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight)
 {
 	float rot[3][3];
 	float mat[4][4];
 	float up[3] = {0.0f, 0.0f, 1.0f};
 	float final_pos[3];
 
-	widget_arrow_get_final_pos((wmWidget *)arrow, final_pos);
+	widget_arrow_get_final_pos(&arrow->widget, final_pos);
 
-	rotation_between_vecs_to_mat3(rot, up, arrow->direction);
+	if (arrow->flag & ARROW_UP_VECTOR_SET) {
+		copy_v3_v3(rot[2], arrow->direction);
+		copy_v3_v3(rot[1], arrow->up);
+		cross_v3_v3v3(rot[0], arrow->up, arrow->direction);
+	}
+	else {
+		rotation_between_vecs_to_mat3(rot, up, arrow->direction);
+	}
 	copy_m4_m3(mat, rot);
 	copy_v3_v3(mat[3], final_pos);
-	mul_mat3_m4_fl(mat, scale);
+	mul_mat3_m4_fl(mat, arrow->widget.scale * arrow->scale);
 
 	glPushMatrix();
 	glMultMatrixf(&mat[0][0]);
@@ -188,7 +218,7 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
 	else
 		glColor4fv(arrow->color);
 
-	widget_draw_intern(&arraw_head_draw_info, select);
+	arrow_draw_geom(arrow, select, highlight);
 
 	glPopMatrix();
 
@@ -197,14 +227,15 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
 
 		copy_m4_m3(mat, rot);
 		copy_v3_v3(mat[3], data->orig_origin);
-		mul_mat3_m4_fl(mat, data->orig_scale);
+		mul_mat3_m4_fl(mat, data->orig_scale * arrow->scale);
 
 		glPushMatrix();
 		glMultMatrixf(&mat[0][0]);
 
 		glEnable(GL_BLEND);
 		glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
-		widget_draw_intern(&arraw_head_draw_info, select);
+		arrow_draw_geom(arrow, select, highlight);
+
 		glDisable(GL_BLEND);
 
 		glPopMatrix();
@@ -214,12 +245,12 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
 static void widget_arrow_render_3d_intersect(const struct bContext *UNUSED(C), struct wmWidget *widget, int selectionbase)
 {
 	GPU_select_load_id(selectionbase);
-	arrow_draw_intern((ArrowWidget *)widget, true, false, widget->scale);
+	arrow_draw_intern((ArrowWidget *)widget, true, false);
 }
 
 static void widget_arrow_draw(struct wmWidget *widget, const struct bContext *UNUSED(C))
 {
-	arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0, widget->scale);
+	arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0);
 }
 
 #define ARROW_RANGE 1.5f
@@ -398,6 +429,7 @@ wmWidget *WIDGET_arrow_new(int style, void *customdata)
 	
 	arrow = MEM_callocN(sizeof(ArrowWidget), "arrowwidget");
 	
+
 	arrow->widget.draw = widget_arrow_draw;
 	arrow->widget.get_final_position = 	widget_arrow_get_final_pos;
 	arrow->widget.intersect = NULL;
@@ -407,6 +439,7 @@ wmWidget *WIDGET_arrow_new(int style, void *customdata)
 	arrow->widget.customdata = customdata;
 	arrow->widget.bind_to_prop = widget_arrow_bind_to_prop;
 	arrow->style = style;
+	arrow->scale = 1.0f;
 	copy_v3_v3(arrow->direction, dir_default);
 	
 	return (wmWidget *)arrow;
@@ -427,6 +460,28 @@ void WIDGET_arrow_set_direction(struct wmWidget *widget, float direction[3])
 	normalize_v3(arrow->direction);
 }
 
+void WIDGET_arrow_set_up_vector(struct wmWidget *widget, float direction[3])
+{
+	ArrowWidget *arrow = (ArrowWidget *)widget;
+
+	if (direction) {
+		copy_v3_v3(arrow->up, direction);
+		normalize_v3(arrow->up);
+		arrow->flag |= ARROW_UP_VECTOR_SET;
+	}
+	else {
+		arrow->flag &= ~ARROW_UP_VECTOR_SET;
+	}
+}
+
+void WIDGET_arrow_set_scale(struct wmWidget *widget, float scale)
+{
+	ArrowWidget *arrow = (ArrowWidget *)widget;
+
+	arrow->scale = scale;
+}
+
+
 /********* Dial widget ************/
 
 typedef struct DialWidget {




More information about the Bf-blender-cvs mailing list