diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-09-28 08:25:16 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-09-28 08:25:16 +0400 |
commit | 690397efb2ab7b18de88a299cb3d08b8646caa25 (patch) | |
tree | f2e915a974724c9c892a62eb8f627547bbfa0f9e | |
parent | d0da06e5c0c231141b7601e93de9d21270023086 (diff) |
bugfix [#23908] Irratic manipulator scale at far out distances
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 13 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 20 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 19 |
3 files changed, 18 insertions, 34 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 44fa0c7b181..d636a544e5b 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -523,12 +523,11 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4]) } /* circle for object centers, special_color is for library or ob users */ -static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *vec, int selstate, int special_color) +static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *co, int selstate, int special_color) { - float size; - - size= rv3d->persmat[0][3]*vec[0]+ rv3d->persmat[1][3]*vec[1]+ rv3d->persmat[2][3]*vec[2]+ rv3d->persmat[3][3]; - size*= rv3d->pixsize*((float)U.obcenter_dia*0.5f); + float vec[3]= {rv3d->persmat[0][3], rv3d->persmat[1][3], rv3d->persmat[2][3]}; + float size= rv3d->pixsize*((float)U.obcenter_dia*0.5f); + size *= dot_v3v3(vec, co) + rv3d->persmat[3][3]; /* using gldepthfunc guarantees that it does write z values, but not checks for it, so centers remain visible independt order of drawing */ if(v3d->zbuf) glDepthFunc(GL_ALWAYS); @@ -544,10 +543,10 @@ static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *vec, int se else if (selstate == SELECT) UI_ThemeColorShadeAlpha(TH_SELECT, 0, -80); else if (selstate == DESELECT) UI_ThemeColorShadeAlpha(TH_TRANSFORM, 0, -80); } - drawcircball(GL_POLYGON, vec, size, rv3d->viewinv); + drawcircball(GL_POLYGON, co, size, rv3d->viewinv); UI_ThemeColorShadeAlpha(TH_WIRE, 0, -30); - drawcircball(GL_LINE_LOOP, vec, size, rv3d->viewinv); + drawcircball(GL_LINE_LOOP, co, size, rv3d->viewinv); glDisable(GL_BLEND); if(v3d->zbuf) glDepthFunc(GL_LEQUAL); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index a44f2b15d11..2054761bd43 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1976,19 +1976,17 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar, mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat); invert_m4_m4(rv3d->persinv, rv3d->persmat); invert_m4_m4(rv3d->viewinv, rv3d->viewmat); - + /* calculate pixelsize factor once, is used for lamps and obcenters */ { - rv3d->pixsize= 2.0f; - - if(rv3d->persp == RV3D_ORTHO || v3d->camera) { /* camera view needs with for ortho & persp */ - float len1= len_v3(rv3d->persinv[0]); - float len2= len_v3(rv3d->persinv[1]); - rv3d->pixsize *= MAX2(len1, len2); - } - - /* correct for window size */ - rv3d->pixsize/= (float)MAX2(ar->winx, ar->winy); + /* note: '1.0f / len_v3(v1)' replaced 'len_v3(rv3d->viewmat[0])' + * because of float point precission problems at large values [#23908] */ + float v1[3]= {rv3d->persmat[0][0], rv3d->persmat[1][0], rv3d->persmat[2][0]}; + float v2[3]= {rv3d->persmat[0][1], rv3d->persmat[1][1], rv3d->persmat[2][1]}; + float len1= 1.0f / len_v3(v1); + float len2= 1.0f / len_v3(v2); + + rv3d->pixsize = (2.0f * MAX2(len1, len2)) / (float)MAX2(ar->winx, ar->winy); } /* set for opengl */ diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 036ef410963..df1a72dd3d4 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1567,21 +1567,8 @@ void calculatePropRatio(TransInfo *t) float get_drawsize(ARegion *ar, float *co) { RegionView3D *rv3d= ar->regiondata; - float size, vec[3], len1, len2; - - /* size calculus, depending ortho/persp settings, like initgrabz() */ - size= rv3d->persmat[0][3]*co[0]+ rv3d->persmat[1][3]*co[1]+ rv3d->persmat[2][3]*co[2]+ rv3d->persmat[3][3]; - - VECCOPY(vec, rv3d->persinv[0]); - len1= normalize_v3(vec); - VECCOPY(vec, rv3d->persinv[1]); - len2= normalize_v3(vec); - - size*= 0.01f*(len1>len2?len1:len2); - - /* correct for window size to make widgets appear fixed size */ - if(ar->winx > ar->winy) size*= 1000.0f/(float)ar->winx; - else size*= 1000.0f/(float)ar->winy; - + float vec[3]= {rv3d->persmat[0][3], rv3d->persmat[1][3], rv3d->persmat[2][3]}; + float size= rv3d->pixsize * 5; + size *= dot_v3v3(vec, co) + rv3d->persmat[3][3]; return size; } |