[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