[Bf-blender-cvs] [408e89d] wiggly-widgets: Tweaks to arrow line drawing

Julian Eisel noreply at git.blender.org
Thu Aug 27 01:37:01 CEST 2015


Commit: 408e89ddbed8f83b9979fb1b2863280a271e995b
Author: Julian Eisel
Date:   Thu Aug 27 01:33:26 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB408e89ddbed8f83b9979fb1b2863280a271e995b

Tweaks to arrow line drawing

* Rotate arrow heads based on line vecs
* Fix lines drawing into geometry
* Cleanup

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

M	source/blender/editors/transform/transform_manipulator.c
M	source/blender/windowmanager/intern/wm_generic_widgets.c

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

diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index a4ea37b..f121348 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -992,7 +992,7 @@ static void manipulator_line_vec(const View3D *v3d, float r_vec[2][3], const sho
 	switch (axis_type) {
 		case MAN_AXES_TRANSLATE:
 			if (v3d->twtype & V3D_MANIP_SCALE) {
-				start[2] = end[2] - ofs + 0.025f;
+				start[2] = end[2] - ofs + 0.075f;
 			}
 			if (v3d->twtype & V3D_MANIP_ROTATE) {
 				end[2] += ofs;
@@ -1113,7 +1113,6 @@ void WIDGETGROUP_manipulator_create(const struct bContext *C, struct wmWidgetGro
 		int constraint_axis[3] = {1, 0, 0};
 
 		PointerRNA *ptr;
-		float line_vec[2][3];
 		float col[4], col_hi[4];
 
 		if (manipulator_is_axis_visible(v3d, rv3d, axis_idx) == false) {
@@ -1136,12 +1135,16 @@ void WIDGETGROUP_manipulator_create(const struct bContext *C, struct wmWidgetGro
 			case MAN_AXIS_SCALE_X:
 			case MAN_AXIS_SCALE_Y:
 			case MAN_AXIS_SCALE_Z:
+			{
+				float line_vec[2][3];
+
 				manipulator_line_vec(v3d, line_vec, axis_type);
 
 				WIDGET_arrow_set_direction(axis, rv3d->twmat[aidx_norm]);
 				WIDGET_arrow_set_line_vec(axis, (const float (*)[3])line_vec, ARRAY_SIZE(line_vec));
 				WM_widget_set_line_width(axis, MAN_AXIS_LINE_WIDTH);
 				break;
+			}
 			case MAN_AXIS_ROT_X:
 			case MAN_AXIS_ROT_Y:
 			case MAN_AXIS_ROT_Z:
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index e56d415..c4f7814 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -207,34 +207,63 @@ static void arrow_draw_geom(const ArrowWidget *arrow, const bool select)
 #ifdef WIDGET_USE_CUSTOM_ARROWS
 		widget_draw_intern(&arrow_head_draw_info, select);
 #else
+		const int last_co_idx = arrow->tot_line_points - 1;
+		float rot[3][3];
+		float mat[4][4];
+		float co_norm1[3], co_norm2[3];
+
 		glLineWidth(arrow->widget.line_width);
 		glEnableClientState(GL_VERTEX_ARRAY);
 		glVertexPointer(3, GL_FLOAT, 0, arrow->line);
-		glDrawArrays(GL_LINES, 0, arrow->tot_line_points);
+		glDrawArrays(GL_LINE_STRIP, 0, arrow->tot_line_points);
 		glDisableClientState(GL_VERTEX_ARRAY);
 		glLineWidth(1.0);
 
-		/* draw arrow head */
 
-		glTranslatef(UNPACK3(arrow->line[arrow->tot_line_points - 1]));
+		/* *** draw arrow head *** */
+
+		/* prepare matrix for local head drawing, based on rotation of last line segment */
+
+		normalize_v3_v3(co_norm1, arrow->line[last_co_idx - 1]);
+		normalize_v3_v3(co_norm2, arrow->line[last_co_idx]);
+		rotation_between_vecs_to_mat3(rot, co_norm1, co_norm2);
+
+		copy_m4_m3(mat, rot);
+		copy_v3_v3(mat[3], arrow->line[last_co_idx]);
 
 		if (arrow->style & WIDGET_ARROW_STYLE_BOX) {
 			const float size = 0.05f;
+			float loc[3];
+
+			/* add some extra offset so box starts exactly where line ends */
+			normalize_v3_v3(loc, arrow->line[last_co_idx]);
+			madd_v3_v3fl(mat[3], loc, size);
+			/* scale down to box size */
+			mul_mat3_m4_fl(mat, size);
+
+			glPushMatrix();
+			glMultMatrixf(mat);
 
 			/* draw cube */
-			glScalef(size, size, size);
 			widget_draw_intern(&cube_draw_info, select);
+
+			glPopMatrix();
 		}
 		else {
 			GLUquadricObj *qobj = gluNewQuadric();
 			const float len = 0.25f;
 			const float width = 0.06f;
 
+			glPushMatrix();
+			glMultMatrixf(mat);
+
 			gluQuadricDrawStyle(qobj, GLU_FILL);
 			gluCylinder(qobj, width, 0.0, len, 8, 1);
 			gluQuadricOrientation(qobj, GLU_INSIDE);
 			gluDisk(qobj, 0.0, width, 8, 1);
 			gluQuadricOrientation(qobj, GLU_OUTSIDE);
+
+			glPopMatrix();
 		}
 
 		(void)select;
@@ -294,7 +323,6 @@ static void arrow_draw_intern(ArrowWidget *arrow, const bool select, const bool
 		glEnable(GL_BLEND);
 		glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
 		arrow_draw_geom(arrow, select);
-
 		glDisable(GL_BLEND);
 
 		glPopMatrix();
@@ -577,6 +605,8 @@ void WIDGET_arrow_set_line_vec(wmWidget *widget, const float (*vec)[3], const in
 	ArrowWidget *arrow = (ArrowWidget *)widget;
 	const size_t vec_size = 3 * tot_points * sizeof(float);
 
+	BLI_assert(tot_points > 1);
+
 	arrow->tot_line_points = tot_points;
 	arrow->line = MEM_reallocN(arrow->line, vec_size);
 	memcpy(arrow->line, vec, vec_size);




More information about the Bf-blender-cvs mailing list