Fix T46933: Bone axes letters may not be visible

Now axis letters are view aligned.
This commit is contained in:
Campbell Barton 2016-02-03 03:30:36 +11:00
parent 2b445b83fe
commit 6bbe59fab1
3 changed files with 85 additions and 53 deletions

@ -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();
}

@ -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;
}

@ -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],