[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44739] trunk/blender/source/blender: Fix ##30455: Orthographic grid alignment jumps/shifts when zooming

Sergey Sharybin sergey.vfx at gmail.com
Thu Mar 8 12:57:52 CET 2012


Revision: 44739
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44739
Author:   nazgul
Date:     2012-03-08 11:57:51 +0000 (Thu, 08 Mar 2012)
Log Message:
-----------
Fix ##30455: Orthographic grid alignment jumps/shifts when zooming

Issue was caused by precision errors with floats.
Made internal grid drawing stuff using doubles and also added some
functions to multiply double vector by float matrix which also makes
all intermediate calculation in doubles.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_math_matrix.h
    trunk/blender/source/blender/blenlib/intern/math_matrix.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c

Modified: trunk/blender/source/blender/blenlib/BLI_math_matrix.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_matrix.h	2012-03-08 11:56:11 UTC (rev 44738)
+++ trunk/blender/source/blender/blenlib/BLI_math_matrix.h	2012-03-08 11:57:51 UTC (rev 44739)
@@ -103,6 +103,11 @@
 int invert_m4(float R[4][4]);
 int invert_m4_m4(float R[4][4], float A[4][4]);
 
+/* double ariphmetics */
+void mul_m4_v4d(float M[4][4], double r[4]);
+void mul_v4d_m4v4d(double r[4], float M[4][4], double v[4]);
+
+
 /****************************** Linear Algebra *******************************/
 
 void transpose_m3(float R[3][3]);

Modified: trunk/blender/source/blender/blenlib/intern/math_matrix.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_matrix.c	2012-03-08 11:56:11 UTC (rev 44738)
+++ trunk/blender/source/blender/blenlib/intern/math_matrix.c	2012-03-08 11:57:51 UTC (rev 44739)
@@ -373,6 +373,25 @@
 	mul_v4_m4v4(r, mat, r);
 }
 
+void mul_v4d_m4v4d(double r[4], float mat[4][4], double v[4])
+{
+	double x, y, z;
+
+	x= v[0];
+	y= v[1];
+	z= v[2];
+
+	r[0]= x*(double)mat[0][0] + y*(double)mat[1][0] + z*(double)mat[2][0] + (double)mat[3][0]*v[3];
+	r[1]= x*(double)mat[0][1] + y*(double)mat[1][1] + z*(double)mat[2][1] + (double)mat[3][1]*v[3];
+	r[2]= x*(double)mat[0][2] + y*(double)mat[1][2] + z*(double)mat[2][2] + (double)mat[3][2]*v[3];
+	r[3]= x*(double)mat[0][3] + y*(double)mat[1][3] + z*(double)mat[2][3] + (double)mat[3][3]*v[3];
+}
+
+void mul_m4_v4d(float mat[4][4], double r[4])
+{
+	mul_v4d_m4v4d(r, mat, r);
+}
+
 void mul_v3_m3v3(float r[3], float M[3][3], float a[3])
 {
 	r[0]= M[0][0]*a[0] + M[1][0]*a[1] + M[2][0]*a[2];

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-03-08 11:56:11 UTC (rev 44738)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-03-08 11:57:51 UTC (rev 44739)
@@ -225,21 +225,21 @@
 /* ********* end custom clipping *********** */
 
 
-static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, float dx)
+static void drawgrid_draw(ARegion *ar, double wx, double wy, double x, double y, double dx)
 {	
-	float verts[2][2];
+	double verts[2][2];
 
 	x+= (wx); 
 	y+= (wy);
 
 	/* set fixed 'Y' */
 	verts[0][1]= 0.0f;
-	verts[1][1]= (float)ar->winy;
+	verts[1][1]= (double)ar->winy;
 
 	/* iter over 'X' */
-	verts[0][0] = verts[1][0] = x-dx*floorf(x/dx);
+	verts[0][0] = verts[1][0] = x-dx*floor(x/dx);
 	glEnableClientState(GL_VERTEX_ARRAY);
-	glVertexPointer(2, GL_FLOAT, 0, verts);
+	glVertexPointer(2, GL_DOUBLE, 0, verts);
 
 	while (verts[0][0] < ar->winx) {
 		glDrawArrays(GL_LINES, 0, 2);
@@ -248,10 +248,10 @@
 
 	/* set fixed 'X' */
 	verts[0][0]= 0.0f;
-	verts[1][0]= (float)ar->winx;
+	verts[1][0]= (double)ar->winx;
 
 	/* iter over 'Y' */
-	verts[0][1]= verts[1][1]= y-dx*floorf(y/dx);
+	verts[0][1]= verts[1][1]= y-dx*floor(y/dx);
 	while (verts[0][1] < ar->winy) {
 		glDrawArrays(GL_LINES, 0, 2);
 		verts[0][1] = verts[1][1] = verts[0][1] + dx;
@@ -266,16 +266,13 @@
 {
 	/* extern short bgpicmode; */
 	RegionView3D *rv3d= ar->regiondata;
-	float wx, wy, x, y, fw, fx, fy, dx;
-	float vec4[4];
+	double wx, wy, x, y, fw, fx, fy, dx;
+	double vec4[4];
 	unsigned char col[3], col2[3];
 
-	vec4[0]=vec4[1]=vec4[2]=0.0; 
-	vec4[3]= 1.0;
-	mul_m4_v4(rv3d->persmat, vec4);
-	fx= vec4[0]; 
-	fy= vec4[1]; 
-	fw= vec4[3];
+	fx= rv3d->persmat[3][0];
+	fy= rv3d->persmat[3][1];
+	fw= rv3d->persmat[3][3];
 
 	wx= (ar->winx/2.0);	/* because of rounding errors, grid at wrong location */
 	wy= (ar->winy/2.0);
@@ -287,7 +284,7 @@
 
 	vec4[2]= 0.0;
 	vec4[3]= 1.0;
-	mul_m4_v4(rv3d->persmat, vec4);
+	mul_m4_v4d(rv3d->persmat, vec4);
 	fx= vec4[0]; 
 	fy= vec4[1]; 
 	fw= vec4[3];
@@ -305,7 +302,7 @@
 		 * items are less useful when dealing with units */
 		void *usys;
 		int len, i;
-		float dx_scalar;
+		double dx_scalar;
 		float blend_fac;
 
 		bUnit_GetSystem(&usys, &len, unit->system, B_UNIT_LENGTH);
@@ -313,7 +310,7 @@
 		if (usys) {
 			i= len;
 			while (i--) {
-				float scalar= bUnit_GetScaler(usys, i);
+				double scalar= bUnit_GetScaler(usys, i);
 
 				dx_scalar = dx * scalar / unit->scale_length;
 				if (dx_scalar < (GRID_MIN_PX*2))




More information about the Bf-blender-cvs mailing list