diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-03-28 08:16:15 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-03-28 08:25:02 +0400 |
commit | ac07046e55e515cbecbb2a528e97c0d57106f552 (patch) | |
tree | ede06d810b46136ce551bfb57ba0e68db1a733b7 /source | |
parent | 5981567ec6afb3ae95f24c28b2c72bff0d8e01e6 (diff) |
BMesh: optimize quad_coord, avoid duplicate sqrt calls
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/BLI_utildefines.h | 7 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_interp.c | 20 |
2 files changed, 17 insertions, 10 deletions
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 9f6eabf3a66..bb1b3a368f0 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -276,6 +276,13 @@ else if ((a) > (c)) (a) = (c); \ } (void)0 +#define CLAMP_MAX(a, c) { \ + if ((a) > (c)) (a) = (c); \ +} (void)0 + +#define CLAMP_MIN(a, b) { \ + if ((a) < (b)) (a) = (b); \ +} (void)0 #define IS_EQ(a, b) ( \ CHECK_TYPE_INLINE(a, double), CHECK_TYPE_INLINE(b, double), \ diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c index 2afb9c9cdee..e5921bb49d7 100644 --- a/source/blender/bmesh/intern/bmesh_interp.c +++ b/source/blender/bmesh/intern/bmesh_interp.c @@ -257,24 +257,24 @@ static int compute_mdisp_quad(BMLoop *l, float v1[3], float v2[3], float v3[3], } /* funnily enough, I think this is identical to face_to_crn_interp, heh */ -static float quad_coord(float aa[3], float bb[3], float cc[3], float dd[3], int a1, int a2) +static float quad_coord(const float aa[3], const float bb[3], const float cc[3], const float dd[3], int a1, int a2) { float x, y, z, f1; + float div; 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 (fabsf(2.0f * (x - y + z)) > FLT_EPSILON * 10.0f) { - float f2; - f1 = ( sqrtf(y * y - 4.0f * x * z) - y + 2.0f * z) / (2.0f * (x - y + z)); - f2 = (-sqrtf(y * y - 4.0f * x * z) - y + 2.0f * z) / (2.0f * (x - y + z)); + div = 2.0f * (x - y + z); - f1 = fabsf(f1); - f2 = fabsf(f2); - f1 = min_ff(f1, f2); - CLAMP(f1, 0.0f, 1.0f + FLT_EPSILON); + if (fabsf(div) > FLT_EPSILON * 10.0f) { + const float f_tmp = sqrtf(y * y - 4.0f * x * z); + + f1 = min_ff(fabsf(( f_tmp - y + 2.0f * z) / div), + fabsf((-f_tmp - y + 2.0f * z) / div)); + + CLAMP_MAX(f1, 1.0f + FLT_EPSILON); } else { f1 = -z / (y - 2 * z); |