[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