From 6bbe59fab1945ddedb7328b278821f0de2337137 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 3 Feb 2016 03:30:36 +1100 Subject: [PATCH] Fix T46933: Bone axes letters may not be visible Now axis letters are view aligned. --- .../editors/space_view3d/drawarmature.c | 10 +- .../blender/editors/space_view3d/drawobject.c | 126 +++++++++++------- .../editors/space_view3d/view3d_intern.h | 2 +- 3 files changed, 85 insertions(+), 53 deletions(-) diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index cf77a79c92c..ff587243d3c 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -2077,7 +2077,10 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, glMultMatrixf(bmat); glColor3ubv(col); - drawaxes(pchan->bone->length * 0.25f, OB_ARROWS); + + float viewmat_pchan[4][4]; + mul_m4_m4m4(viewmat_pchan, rv3d->viewmatob, bmat); + drawaxes(viewmat_pchan, pchan->bone->length * 0.25f, OB_ARROWS); glPopMatrix(); } @@ -2285,7 +2288,10 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, const short dt) glMultMatrixf(bmat); glColor3ubv(col); - drawaxes(eBone->length * 0.25f, OB_ARROWS); + + float viewmat_ebone[4][4]; + mul_m4_m4m4(viewmat_ebone, rv3d->viewmatob, bmat); + drawaxes(viewmat_ebone, eBone->length * 0.25f, OB_ARROWS); glPopMatrix(); } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 8f73243edb2..6cfe6ecdf6b 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -401,8 +401,15 @@ static const float cosval[CIRCLE_RESOL] = { 1.00000000 }; -static void draw_xyz_wire(const float c[3], float size, int axis) +/** + * \param viewmat_local is typically the 'rv3d->viewmatob'. + */ +static void draw_xyz_wire(const float viewmat_local_unit[3][3], const float c[3], float size, int axis) { + int line_type; + float buffer[4][3]; + int n = 0; + float v1[3] = {0.0f, 0.0f, 0.0f}, v2[3] = {0.0f, 0.0f, 0.0f}; float dim = size * 0.1f; float dx[3], dy[3], dz[3]; @@ -413,80 +420,91 @@ static void draw_xyz_wire(const float c[3], float size, int axis) switch (axis) { case 0: /* x axis */ - glBegin(GL_LINES); - + line_type = GL_LINES; + + /* bottom left to top right */ - sub_v3_v3v3(v1, c, dx); + negate_v3_v3(v1, dx); sub_v3_v3(v1, dy); - add_v3_v3v3(v2, c, dx); + copy_v3_v3(v2, dx); add_v3_v3(v2, dy); - - glVertex3fv(v1); - glVertex3fv(v2); + + copy_v3_v3(buffer[n++], v1); + copy_v3_v3(buffer[n++], v2); /* top left to bottom right */ mul_v3_fl(dy, 2.0f); add_v3_v3(v1, dy); sub_v3_v3(v2, dy); - glVertex3fv(v1); - glVertex3fv(v2); - - glEnd(); + copy_v3_v3(buffer[n++], v1); + copy_v3_v3(buffer[n++], v2); + break; case 1: /* y axis */ - glBegin(GL_LINES); + line_type = GL_LINES; /* bottom left to top right */ mul_v3_fl(dx, 0.75f); - sub_v3_v3v3(v1, c, dx); + negate_v3_v3(v1, dx); sub_v3_v3(v1, dy); - add_v3_v3v3(v2, c, dx); + copy_v3_v3(v2, dx); add_v3_v3(v2, dy); - glVertex3fv(v1); - glVertex3fv(v2); + copy_v3_v3(buffer[n++], v1); + copy_v3_v3(buffer[n++], v2); /* top left to center */ mul_v3_fl(dy, 2.0f); add_v3_v3(v1, dy); - copy_v3_v3(v2, c); + zero_v3(v2); - glVertex3fv(v1); - glVertex3fv(v2); + copy_v3_v3(buffer[n++], v1); + copy_v3_v3(buffer[n++], v2); - glEnd(); break; case 2: /* z axis */ - glBegin(GL_LINE_STRIP); + line_type = GL_LINE_STRIP; /* start at top left */ - sub_v3_v3v3(v1, c, dx); - add_v3_v3v3(v1, c, dz); + negate_v3_v3(v1, dx); + add_v3_v3(v1, dy); - glVertex3fv(v1); + copy_v3_v3(buffer[n++], v1); mul_v3_fl(dx, 2.0f); add_v3_v3(v1, dx); - glVertex3fv(v1); + copy_v3_v3(buffer[n++], v1); - mul_v3_fl(dz, 2.0f); + mul_v3_fl(dy, 2.0f); sub_v3_v3(v1, dx); - sub_v3_v3(v1, dz); + sub_v3_v3(v1, dy); - glVertex3fv(v1); + copy_v3_v3(buffer[n++], v1); add_v3_v3(v1, dx); - glVertex3fv(v1); + copy_v3_v3(buffer[n++], v1); - glEnd(); break; + default: + BLI_assert(0); + return; } + + for (int i = 0; i < n; i++) { + mul_transposed_m3_v3((float (*)[3])viewmat_local_unit, buffer[i]); + add_v3_v3(buffer[i], c); + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, buffer); + glDrawArrays(line_type, 0, n); + glDisableClientState(GL_VERTEX_ARRAY); } -void drawaxes(float size, char drawtype) +void drawaxes(const float viewmat_local[4][4], float size, char drawtype) { int axis; float v1[3] = {0.0, 0.0, 0.0}; @@ -565,6 +583,11 @@ void drawaxes(float size, char drawtype) case OB_ARROWS: default: { + float viewmat_local_unit[3][3]; + + copy_m3_m4(viewmat_local_unit, (float (*)[4])viewmat_local); + normalize_m3(viewmat_local_unit); + for (axis = 0; axis < 3; axis++) { const int arrow_axis = (axis == 0) ? 1 : 0; @@ -587,7 +610,7 @@ void drawaxes(float size, char drawtype) v2[axis] += size * 0.125f; - draw_xyz_wire(v2, size, axis); + draw_xyz_wire(viewmat_local_unit, v2, size, axis); /* reset v1 & v2 to zero */ @@ -1575,10 +1598,11 @@ static void draw_bundle_sphere(void) glCallList(displist); } -static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D *v3d, - MovieClip *clip, MovieTrackingObject *tracking_object, - const short dflag, const unsigned char ob_wire_col[4], - int *global_track_index, bool draw_selected) +static void draw_viewport_object_reconstruction( + Scene *scene, Base *base, const View3D *v3d, const RegionView3D *rv3d, + MovieClip *clip, MovieTrackingObject *tracking_object, + const short dflag, const unsigned char ob_wire_col[4], + int *global_track_index, bool draw_selected) { MovieTracking *tracking = &clip->tracking; MovieTrackingTrack *track; @@ -1648,7 +1672,7 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D } } - drawaxes(0.05f, v3d->bundle_drawtype); + drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype); } else if (v3d->drawtype > OB_WIRE) { if (v3d->bundle_drawtype == OB_EMPTY_SPHERE) { @@ -1684,7 +1708,7 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D } } - drawaxes(0.05f, v3d->bundle_drawtype); + drawaxes(rv3d->viewmatob, 0.05f, v3d->bundle_drawtype); } } @@ -1728,9 +1752,10 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D *global_track_index = tracknr; } -static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, - const short dflag, const unsigned char ob_wire_col[4], - const bool draw_selected) +static void draw_viewport_reconstruction( + Scene *scene, Base *base, const View3D *v3d, const RegionView3D *rv3d, MovieClip *clip, + const short dflag, const unsigned char ob_wire_col[4], + const bool draw_selected) { MovieTracking *tracking = &clip->tracking; MovieTrackingObject *tracking_object; @@ -1749,8 +1774,9 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, tracking_object = tracking->objects.first; while (tracking_object) { - draw_viewport_object_reconstruction(scene, base, v3d, clip, tracking_object, - dflag, ob_wire_col, &global_track_index, draw_selected); + draw_viewport_object_reconstruction( + scene, base, v3d, rv3d, clip, tracking_object, + dflag, ob_wire_col, &global_track_index, draw_selected); tracking_object = tracking_object->next; } @@ -2022,8 +2048,8 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base /* draw data for movie clip set as active for scene */ if (clip) { - draw_viewport_reconstruction(scene, base, v3d, clip, dflag, ob_wire_col, false); - draw_viewport_reconstruction(scene, base, v3d, clip, dflag, ob_wire_col, true); + draw_viewport_reconstruction(scene, base, v3d, rv3d, clip, dflag, ob_wire_col, false); + draw_viewport_reconstruction(scene, base, v3d, rv3d, clip, dflag, ob_wire_col, true); } #ifdef VIEW3D_CAMERA_BORDER_HACK @@ -7635,7 +7661,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short draw_empty_image(ob, dflag, ob_wire_col); } else { - drawaxes(ob->empty_drawsize, ob->empty_drawtype); + drawaxes(rv3d->viewmatob, ob->empty_drawsize, ob->empty_drawtype); } } break; @@ -7687,7 +7713,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short break; default: if (!render_override) { - drawaxes(1.0, OB_ARROWS); + drawaxes(rv3d->viewmatob, 1.0, OB_ARROWS); } break; } @@ -7914,7 +7940,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short if (dtx && (G.f & G_RENDER_OGL) == 0) { if (dtx & OB_AXIS) { - drawaxes(1.0f, OB_ARROWS); + drawaxes(rv3d->viewmatob, 1.0f, OB_ARROWS); } if (dtx & OB_DRAWBOUNDOX) { draw_bounding_volume(ob, ob->boundtype); @@ -8454,7 +8480,7 @@ void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object draw_empty_image(ob, DRAW_CONSTCOLOR, NULL); } else { - drawaxes(ob->empty_drawsize, ob->empty_drawtype); + drawaxes(rv3d->viewmatob, ob->empty_drawsize, ob->empty_drawtype); } break; } diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index 855c8a959fe..c398356e941 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -140,7 +140,7 @@ void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, cons bool draw_glsl_material(Scene *scene, struct Object *ob, View3D *v3d, const char dt); void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob, const char dt, int outline); void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob); -void drawaxes(float size, char drawtype); +void drawaxes(const float viewmat_local[4][4], float size, char drawtype); void view3d_cached_text_draw_begin(void); void view3d_cached_text_draw_add(const float co[3],