[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44303] trunk/blender/source/blender/bmesh /intern/bmesh_interp.c: - Remove unused code in bmesh interpolation module and switch it to using mathutils

Sergey Sharybin sergey.vfx at gmail.com
Tue Feb 21 18:24:06 CET 2012


Revision: 44303
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44303
Author:   nazgul
Date:     2012-02-21 17:24:05 +0000 (Tue, 21 Feb 2012)
Log Message:
-----------
- Remove unused code in bmesh interpolation module and switch it to using mathutils
  functions instead of own macros for vectors.
- Double precision isn't needed here at all. It only makes it impossible to use
  mathutils, adds extra float<->double conversions without any benefits.
  (current multires interpolation is already an approximate method and it can't
  be improved using double precision)

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_interp.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_interp.c	2012-02-21 17:23:32 UTC (rev 44302)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.c	2012-02-21 17:24:05 UTC (rev 44303)
@@ -233,145 +233,6 @@
 	BLI_array_fixedstack_free(blocks);
 }
 
-/* some math stuff for dealing with doubles, put here to
- * avoid merge errors - joeedh */
-
-#define VECMUL(a, b) (((a)[0] = (a)[0] * (b)), ((a)[1] = (a)[1] * (b)), ((a)[2] = (a)[2] * (b)))
-#define VECADD2(a, b) (((a)[0] = (a)[0] + (b)[0]), ((a)[1] = (a)[1] + (b)[1]), ((a)[2] = (a)[2] + (b)[2]))
-#define VECSUB2(a, b) (((a)[0] = (a)[0] - (b)[0]), ((a)[1] = (a)[1] - (b)[1]), ((a)[2] = (a)[2] - (b)[2]))
-
-/* find closest point to p on line through l1, l2 and return lambda,
- * where (0 <= lambda <= 1) when cp is in the line segement l1, l2
- */
-static double closest_to_line_v3_d(double cp[3], const double p[3], const double l1[3], const double l2[3])
-{
-	double h[3], u[3], lambda;
-	VECSUB(u, l2, l1);
-	VECSUB(h, p, l1);
-	lambda = INPR(u, h) / INPR(u, u);
-	cp[0] = l1[0] + u[0] * lambda;
-	cp[1] = l1[1] + u[1] * lambda;
-	cp[2] = l1[2] + u[2] * lambda;
-	return lambda;
-}
-
-/* point closest to v1 on line v2-v3 in 3D */
-static void UNUSED_FUNCTION(closest_to_line_segment_v3_d)(double *closest, double v1[3], double v2[3], double v3[3])
-{
-	double lambda, cp[3];
-
-	lambda = closest_to_line_v3_d(cp, v1, v2, v3);
-
-	if (lambda <= 0.0) {
-		VECCOPY(closest, v2);
-	}
-	else if (lambda >= 1.0) {
-		VECCOPY(closest, v3);
-	}
-	else {
-		VECCOPY(closest, cp);
-	}
-}
-
-static double UNUSED_FUNCTION(len_v3_d)(const double a[3])
-{
-	return sqrt(INPR(a, a));
-}
-
-static double UNUSED_FUNCTION(len_v3v3_d)(const double a[3], const double b[3])
-{
-	double d[3];
-
-	VECSUB(d, b, a);
-	return sqrt(INPR(d, d));
-}
-
-static void cent_quad_v3_d(double *cent, double *v1, double *v2, double *v3, double *v4)
-{
-	cent[0] = 0.25 * (v1[0] + v2[0] + v3[0] + v4[0]);
-	cent[1] = 0.25 * (v1[1] + v2[1] + v3[1] + v4[1]);
-	cent[2] = 0.25 * (v1[2] + v2[2] + v3[2] + v4[2]);
-}
-
-static void UNUSED_FUNCTION(cent_tri_v3_d)(double *cent, double *v1, double *v2, double *v3)
-{
-	cent[0] = (1.0 / 3.0) * (v1[0] + v2[0] + v3[0]);
-	cent[1] = (1.0 / 3.0) * (v1[1] + v2[1] + v3[1]);
-	cent[2] = (1.0 / 3.0) * (v1[2] + v2[2] + v3[2]);
-}
-
-static void UNUSED_FUNCTION(cross_v3_v3v3_d)(double r[3], const double a[3], const double b[3])
-{
-	r[0] = a[1] * b[2] - a[2] * b[1];
-	r[1] = a[2] * b[0] - a[0] * b[2];
-	r[2] = a[0] * b[1] - a[1] * b[0];
-}
-
-/* distance v1 to line-piece v2-v3 */
-static double UNUSED_FUNCTION(dist_to_line_segment_v2_d)(double v1[3], double v2[3], double v3[3])
-{
-	double labda, rc[2], pt[2], len;
-	
-	rc[0] = v3[0] - v2[0];
-	rc[1] = v3[1] - v2[1];
-	len = rc[0] * rc[0] + rc[1] * rc[1];
-	if (len == 0.0) {
-		rc[0] = v1[0] - v2[0];
-		rc[1] = v1[1] - v2[1];
-		return sqrt(rc[0] * rc[0] + rc[1] * rc[1]);
-	}
-	
-	labda = (rc[0] * (v1[0] - v2[0]) + rc[1] * (v1[1] - v2[1])) / len;
-	if (labda <= 0.0) {
-		pt[0] = v2[0];
-		pt[1] = v2[1];
-	}
-	else if (labda >= 1.0) {
-		pt[0] = v3[0];
-		pt[1] = v3[1];
-	}
-	else {
-		pt[0] = labda * rc[0] + v2[0];
-		pt[1] = labda * rc[1] + v2[1];
-	}
-
-	rc[0] = pt[0] - v1[0];
-	rc[1] = pt[1] - v1[1];
-	return sqrt(rc[0] * rc[0] + rc[1] * rc[1]);
-}
-
-
-MINLINE double line_point_side_v2_d(const double *l1, const double *l2, const double *pt)
-{
-	return	((l1[0] - pt[0]) * (l2[1] - pt[1])) -
-	        ((l2[0] - pt[0]) * (l1[1] - pt[1]));
-}
-
-/* point in quad - only convex quads */
-static int isect_point_quad_v2_d(double pt[2], double v1[2], double v2[2], double v3[2], double v4[2])
-{
-	if (line_point_side_v2_d(v1, v2, pt) >= 0.0) {
-		if (line_point_side_v2_d(v2, v3, pt) >= 0.0) {
-			if (line_point_side_v2_d(v3, v4, pt) >= 0.0) {
-				if (line_point_side_v2_d(v4, v1, pt) >= 0.0) {
-					return 1;
-				}
-			}
-		}
-	}
-	else {
-		if (! (line_point_side_v2_d(v2, v3, pt) >= 0.0)) {
-			if (! (line_point_side_v2_d(v3, v4, pt) >= 0.0)) {
-				if (! (line_point_side_v2_d(v4, v1, pt) >= 0.0)) {
-					return -1;
-				}
-			}
-		}
-	}
-	
-	return 0;
-}
-
 /***** multires interpolation*****
  *
  * mdisps is a grid of displacements, ordered thus:
@@ -385,50 +246,50 @@
  *      y
  */
 
-static int compute_mdisp_quad(BMLoop *l, double v1[3], double v2[3], double v3[3], double v4[3],
-                              double e1[3], double e2[3])
+static int compute_mdisp_quad(BMLoop *l, float v1[3], float v2[3], float v3[3], float v4[3],
+                              float e1[3], float e2[3])
 {
-	double cent[3] = {0.0, 0.0, 0.0}, n[3], p[3];
+	float cent[3] = {0.0f, 0.0f, 0.0f}, n[3], p[3];
 	BMLoop *l_first;
 	BMLoop *l_iter;
 	
 	/* computer center */
 	l_iter = l_first = BM_FACE_FIRST_LOOP(l->f);
 	do {
-		cent[0] += (double)l_iter->v->co[0];
-		cent[1] += (double)l_iter->v->co[1];
-		cent[2] += (double)l_iter->v->co[2];
+		cent[0] += (float)l_iter->v->co[0];
+		cent[1] += (float)l_iter->v->co[1];
+		cent[2] += (float)l_iter->v->co[2];
 	} while ((l_iter = l_iter->next) != l_first);
 	
-	VECMUL(cent, (1.0 / (double)l->f->len));
+	mul_v3_fl(cent, (1.0 / (float)l->f->len));
 	
-	VECADD(p, l->prev->v->co, l->v->co);
-	VECMUL(p, 0.5);
-	VECADD(n, l->next->v->co, l->v->co);
-	VECMUL(n, 0.5);
+	add_v3_v3v3(p, l->prev->v->co, l->v->co);
+	mul_v3_fl(p, 0.5);
+	add_v3_v3v3(n, l->next->v->co, l->v->co);
+	mul_v3_fl(n, 0.5);
 	
-	VECCOPY(v1, cent);
-	VECCOPY(v2, p);
-	VECCOPY(v3, l->v->co);
-	VECCOPY(v4, n);
+	copy_v3_v3(v1, cent);
+	copy_v3_v3(v2, p);
+	copy_v3_v3(v3, l->v->co);
+	copy_v3_v3(v4, n);
 	
-	VECSUB(e1, v2, v1);
-	VECSUB(e2, v3, v4);
+	sub_v3_v3v3(e1, v2, v1);
+	sub_v3_v3v3(e2, v3, v4);
 	
 	return 1;
 }
 
 /* funnily enough, I think this is identical to face_to_crn_interp, heh */
-static double quad_coord(double aa[3], double bb[3], double cc[3], double dd[3], int a1, int a2)
+static float quad_coord(float aa[3], float bb[3], float cc[3], float dd[3], int a1, int a2)
 {
-	double x, y, z, f1;
+	float x, y, z, f1;
 	
 	x = aa[a1] * cc[a2] - cc[a1] * aa[a2];
 	y = aa[a1] * dd[a2] + bb[a1] * cc[a2] - cc[a1] * bb[a2] - dd[a1] * aa[a2];
 	z = bb[a1] * dd[a2] - dd[a1] * bb[a2];
 	
-	if (fabs(2 * (x - y + z)) > DBL_EPSILON * 10.0) {
-		double f2;
+	if (fabs(2 * (x - y + z)) > FLT_EPSILON * 10.0f) {
+		float f2;
 
 		f1 = (sqrt(y * y - 4.0 * x * z) - y + 2.0 * z) / (2.0 * (x - y + z));
 		f2 = (-sqrt(y * y - 4.0 * x * z) - y + 2.0 * z) / (2.0 * (x - y + z));
@@ -436,19 +297,19 @@
 		f1 = fabs(f1);
 		f2 = fabs(f2);
 		f1 = MIN2(f1, f2);
-		CLAMP(f1, 0.0, 1.0 + DBL_EPSILON);
+		CLAMP(f1, 0.0f, 1.0f + FLT_EPSILON);
 	}
 	else {
 		f1 = -z / (y - 2 * z);
-		CLAMP(f1, 0.0, 1.0 + DBL_EPSILON);
+		CLAMP(f1, 0.0f, 1.0f + FLT_EPSILON);
 		
-		if (isnan(f1) || f1 > 1.0 || f1 < 0.0) {
+		if (isnan(f1) || f1 > 1.0 || f1 < 0.0f) {
 			int i;
 			
 			for (i = 0; i < 2; i++) {
-				if (fabsf(aa[i]) < FLT_EPSILON * 100)
+				if (fabsf(aa[i]) < FLT_EPSILON * 100.0f)
 					return aa[(i + 1) % 2] / fabs(bb[(i + 1) % 2] - aa[(i + 1) % 2]);
-				if (fabsf(cc[i]) < FLT_EPSILON * 100)
+				if (fabsf(cc[i]) < FLT_EPSILON * 100.0f)
 					return cc[(i + 1) % 2] / fabs(dd[(i + 1) % 2] - cc[(i + 1) % 2]);
 			}
 		}
@@ -457,19 +318,19 @@
 	return f1;
 }
 
-static int quad_co(double *x, double *y, double v1[3], double v2[3], double v3[3], double v4[3],
-                   double p[3], float n[3])
+static int quad_co(float *x, float *y, float v1[3], float v2[3], float v3[3], float v4[3],
+                   float p[3], float n[3])
 {
 	float projverts[5][3], n2[3];
-	double dprojverts[4][3], origin[3] = {0.0f, 0.0f, 0.0f};
+	float dprojverts[4][3], origin[3] = {0.0f, 0.0f, 0.0f};
 	int i;
 
 	/* project points into 2d along normal */
-	VECCOPY(projverts[0], v1);
-	VECCOPY(projverts[1], v2);
-	VECCOPY(projverts[2], v3);
-	VECCOPY(projverts[3], v4);
-	VECCOPY(projverts[4], p);
+	copy_v3_v3(projverts[0], v1);
+	copy_v3_v3(projverts[1], v2);
+	copy_v3_v3(projverts[2], v3);
+	copy_v3_v3(projverts[3], v4);
+	copy_v3_v3(projverts[4], p);
 
 	normal_quad_v3(n2, projverts[0], projverts[1], projverts[2], projverts[3]);
 
@@ -487,15 +348,15 @@
 	
 	/* subtract origin */
 	for (i = 0; i < 4; i++) {
-		VECSUB2(projverts[i], projverts[4]);
+		sub_v3_v3(projverts[i], projverts[4]);
 	}
 	
-	VECCOPY(dprojverts[0], projverts[0]);
-	VECCOPY(dprojverts[1], projverts[1]);
-	VECCOPY(dprojverts[2], projverts[2]);
-	VECCOPY(dprojverts[3], projverts[3]);
+	copy_v3_v3(dprojverts[0], projverts[0]);
+	copy_v3_v3(dprojverts[1], projverts[1]);
+	copy_v3_v3(dprojverts[2], projverts[2]);
+	copy_v3_v3(dprojverts[3], projverts[3]);
 
-	if (!isect_point_quad_v2_d(origin, dprojverts[0], dprojverts[1], dprojverts[2], dprojverts[3])) {
+	if (!isect_point_quad_v2(origin, dprojverts[0], dprojverts[1], dprojverts[2], dprojverts[3])) {
 		return 0;
 	}
 	
@@ -505,11 +366,11 @@
 	return 1;
 }
 
-static void mdisp_axis_from_quad(double v1[3], double v2[3], double UNUSED(v3[3]), double v4[3],
+static void mdisp_axis_from_quad(float v1[3], float v2[3], float UNUSED(v3[3]), float v4[3],
                                 float axis_x[3], float axis_y[3])
 {
-	VECSUB(axis_x, v4, v1);
-	VECSUB(axis_y, v2, v1);
+	sub_v3_v3v3(axis_x, v4, v1);
+	sub_v3_v3v3(axis_y, v2, v1);
 
 	normalize_v3(axis_x);
 	normalize_v3(axis_y);
@@ -517,11 +378,11 @@
 
 /* tl is loop to project onto, l is loop whose internal displacement, co, is being
  * projected.  x and y are location in loop's mdisps grid of point co. */
-static int mdisp_in_mdispquad(BMesh *bm, BMLoop *l, BMLoop *tl, double p[3], double *x, double *y,
+static int mdisp_in_mdispquad(BMesh *bm, BMLoop *l, BMLoop *tl, float p[3], float *x, float *y,
                               int res, float axis_x[3], float axis_y[3])
 {
-	double v1[3], v2[3], c[3], v3[3], v4[3], e1[3], e2[3];
-	double eps = FLT_EPSILON * 4000;
+	float v1[3], v2[3], c[3], v3[3], v4[3], e1[3], e2[3];
+	float eps = FLT_EPSILON * 4000;
 	
 	if (len_v3(l->v->no) == 0.0f)
 		BM_vert_normal_update_all(bm, l->v);
@@ -531,14 +392,14 @@
 	compute_mdisp_quad(tl, v1, v2, v3, v4, e1, e2);
 
 	/* expand quad a bit */
-	cent_quad_v3_d(c, v1, v2, v3, v4);
+	cent_quad_v3(c, v1, v2, v3, v4);
 	
-	VECSUB2(v1, c); VECSUB2(v2, c);
-	VECSUB2(v3, c); VECSUB2(v4, c);
-	VECMUL(v1, 1.0 + eps); VECMUL(v2, 1.0 + eps);
-	VECMUL(v3, 1.0 + eps); VECMUL(v4, 1.0 + eps);
-	VECADD2(v1, c); VECADD2(v2, c);
-	VECADD2(v3, c); VECADD2(v4, c);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list