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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to