[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32166] trunk/blender/source/blender/ editors: bugfix [#23908] Irratic manipulator scale at far out distances

Campbell Barton ideasman42 at gmail.com
Tue Sep 28 06:25:35 CEST 2010


Revision: 32166
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32166
Author:   campbellbarton
Date:     2010-09-28 06:25:16 +0200 (Tue, 28 Sep 2010)

Log Message:
-----------
bugfix [#23908] Irratic manipulator scale at far out distances

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/editors/transform/transform_generics.c

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2010-09-28 03:26:17 UTC (rev 32165)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2010-09-28 04:25:16 UTC (rev 32166)
@@ -523,12 +523,11 @@
 }
 
 /* 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 @@
 		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);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-09-28 03:26:17 UTC (rev 32165)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-09-28 04:25:16 UTC (rev 32166)
@@ -1976,19 +1976,17 @@
 	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);
-		}
+		/* 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);
 
-		/* correct for window size */
-		rv3d->pixsize/= (float)MAX2(ar->winx, ar->winy);
+		rv3d->pixsize = (2.0f * MAX2(len1, len2)) / (float)MAX2(ar->winx, ar->winy);
 	}
 
 	/* set for opengl */

Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c	2010-09-28 03:26:17 UTC (rev 32165)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c	2010-09-28 04:25:16 UTC (rev 32166)
@@ -1567,21 +1567,8 @@
 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;
 }





More information about the Bf-blender-cvs mailing list