Commit: a51a0ca772b21814e29bdb3b2b5fd854e29c5334
Author: Campbell Barton
Date:   Sat Apr 19 22:12:50 2014 +1000
https://developer.blender.org/rBa51a0ca772b21814e29bdb3b2b5fd854e29c5334

Math Lib: add shell_v3v3_normalized_to_dist and v2 version

bypass angle calculation to avoids (asin, sqrt, cos).

===================================================================

M       source/blender/blenkernel/intern/fcurve.c
M       source/blender/blenlib/BLI_math_base.h
M       source/blender/blenlib/BLI_math_geom.h
M       source/blender/blenlib/intern/math_base_inline.c
M       source/blender/blenlib/intern/math_geom_inline.c
M       source/blender/bmesh/intern/bmesh_queries.c
M       source/blender/bmesh/operators/bmo_extrude.c
M       source/blender/bmesh/operators/bmo_inset.c
M       source/blender/editors/sculpt_paint/paint_image_proj.c
M       source/blender/modifiers/intern/MOD_solidify.c

===================================================================

diff --git a/source/blender/blenkernel/intern/fcurve.c 
b/source/blender/blenkernel/intern/fcurve.c
index fc74ae5..d4fa9de 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -1928,6 +1928,7 @@ static void berekenx(float *f, float *o, int b)
 /* Calculate F-Curve value for 'evaltime' using BezTriple keyframes */
 static float fcurve_eval_keyframes(FCurve *fcu, BezTriple *bezts, float 
evaltime)
 {
+       const float eps = 1.e-8f;
        BezTriple *bezt, *prevbezt, *lastbezt;
        float v1[2], v2[2], v3[2], v4[2], opl[32], dx, fac;
        unsigned int a;
@@ -2073,7 +2074,7 @@ static float fcurve_eval_keyframes(FCurve *fcu, BezTriple 
*bezts, float evaltime
                if (exact) {
                        cvalue = prevbezt->vec[1][1];
                }
-               else if (fabsf(bezt->vec[1][0] - evaltime) < SMALL_NUMBER) {
+               else if (fabsf(bezt->vec[1][0] - evaltime) < eps) {
                        cvalue = bezt->vec[1][1];
                }
                /* evaltime occurs within the interval defined by these two 
keyframes */
diff --git a/source/blender/blenlib/BLI_math_base.h 
b/source/blender/blenlib/BLI_math_base.h
index 68ffb4b..5bd8490 100644
--- a/source/blender/blenlib/BLI_math_base.h
+++ b/source/blender/blenlib/BLI_math_base.h
@@ -241,8 +241,6 @@ MINLINE int mod_i(int i, int n);
 MINLINE unsigned int highest_order_bit_i(unsigned int n);
 MINLINE unsigned short highest_order_bit_s(unsigned short n);
 
-MINLINE float shell_angle_to_dist(const float angle);
-
 #if defined(_MSC_VER) && (_MSC_VER < 1800)
 extern double copysign(double x, double y);
 extern double round(double x);
diff --git a/source/blender/blenlib/BLI_math_geom.h 
b/source/blender/blenlib/BLI_math_geom.h
index 6ba8910..5067cee 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -314,6 +314,10 @@ MINLINE int min_axis_v3(const float vec[3]);
 
 MINLINE int poly_to_tri_count(const int poly_count, const int corner_count);
 
+MINLINE float shell_angle_to_dist(const float angle);
+MINLINE float shell_v3v3_normalized_to_dist(const float a[3], const float 
b[3]);
+MINLINE float shell_v2v2_normalized_to_dist(const float a[2], const float 
b[2]);
+
 /**************************** Inline Definitions 
******************************/
 
 #if BLI_MATH_DO_INLINE
diff --git a/source/blender/blenlib/intern/math_base_inline.c 
b/source/blender/blenlib/intern/math_base_inline.c
index 82c6e68..e621732 100644
--- a/source/blender/blenlib/intern/math_base_inline.c
+++ b/source/blender/blenlib/intern/math_base_inline.c
@@ -44,9 +44,6 @@
 #  define UNLIKELY(x)     (x)
 #endif
 
-/* A few small defines. Keep'em local! */
-#define SMALL_NUMBER  1.e-8f
-
 MINLINE float sqrt3f(float f)
 {
        if      (UNLIKELY(f == 0.0f)) return 0.0f;
@@ -111,15 +108,6 @@ MINLINE float interpf(float target, float origin, float 
fac)
        return (fac * target) + (1.0f - fac) * origin;
 }
 
-/* useful to calculate an even width shell, by taking the angle between 2 
planes.
- * The return value is a scale on the offset.
- * no angle between planes is 1.0, as the angle between the 2 planes 
approaches 180d
- * the distance gets very high, 180d would be inf, but this case isn't valid */
-MINLINE float shell_angle_to_dist(const float angle)
-{
-       return (UNLIKELY(angle < SMALL_NUMBER)) ? 1.0f : fabsf(1.0f / 
cosf(angle));
-}
-
 /* used for zoom values*/
 MINLINE float power_of_2(float val)
 {
diff --git a/source/blender/blenlib/intern/math_geom_inline.c 
b/source/blender/blenlib/intern/math_geom_inline.c
index 0e243c5..1e54dd1 100644
--- a/source/blender/blenlib/intern/math_geom_inline.c
+++ b/source/blender/blenlib/intern/math_geom_inline.c
@@ -34,6 +34,9 @@
 
 #include <string.h>
 
+/* A few small defines. Keep'em local! */
+#define SMALL_NUMBER  1.e-8f
+
 /********************************** Polygons *********************************/
 
 MINLINE float cross_tri_v2(const float v1[2], const float v2[2], const float 
v3[2])
@@ -227,4 +230,35 @@ MINLINE float plane_point_side_v3(const float plane[4], 
const float co[3])
        return dot_v3v3(co, plane) + plane[3];
 }
 
+/* useful to calculate an even width shell, by taking the angle between 2 
planes.
+ * The return value is a scale on the offset.
+ * no angle between planes is 1.0, as the angle between the 2 planes 
approaches 180d
+ * the distance gets very high, 180d would be inf, but this case isn't valid */
+MINLINE float shell_angle_to_dist(const float angle)
+{
+       return (UNLIKELY(angle < SMALL_NUMBER)) ? 1.0f : fabsf(1.0f / 
cosf(angle));
+}
+/**
+ * equivalent to ``shell_angle_to_dist(angle_normalized_v3v3(a, b))``
+ */
+MINLINE float shell_v3v3_normalized_to_dist(const float a[3], const float b[3])
+{
+       const float angle_cos = fabsf(dot_v3v3(a, b));
+       BLI_ASSERT_UNIT_V3(a);
+       BLI_ASSERT_UNIT_V3(b);
+       return (UNLIKELY(angle_cos < SMALL_NUMBER)) ? 1.0f : (1.0f / angle_cos);
+}
+/**
+ * equivalent to ``shell_angle_to_dist(angle_normalized_v2v2(a, b))``
+ */
+MINLINE float shell_v2v2_normalized_to_dist(const float a[2], const float b[2])
+{
+       const float angle_cos = fabsf(dot_v2v2(a, b));
+       BLI_ASSERT_UNIT_V2(a);
+       BLI_ASSERT_UNIT_V2(b);
+       return (UNLIKELY(angle_cos < SMALL_NUMBER)) ? 1.0f : (1.0f / angle_cos);
+}
+
+#undef SMALL_NUMBER
+
 #endif /* __MATH_GEOM_INLINE_C__ */
diff --git a/source/blender/bmesh/intern/bmesh_queries.c 
b/source/blender/bmesh/intern/bmesh_queries.c
index f240a10..67f3332 100644
--- a/source/blender/bmesh/intern/bmesh_queries.c
+++ b/source/blender/bmesh/intern/bmesh_queries.c
@@ -1236,7 +1236,7 @@ float BM_vert_calc_shell_factor(BMVert *v)
 
        BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
                const float face_angle = BM_loop_calc_face_angle(l);
-               accum_shell += shell_angle_to_dist(angle_normalized_v3v3(v->no, 
l->f->no)) * face_angle;
+               accum_shell += shell_v3v3_normalized_to_dist(v->no, l->f->no) * 
face_angle;
                accum_angle += face_angle;
        }
 
@@ -1260,7 +1260,7 @@ float BM_vert_calc_shell_factor_ex(BMVert *v, const char 
hflag)
        BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
                if (BM_elem_flag_test(l->f, hflag)) {  /* <-- main difference 
to BM_vert_calc_shell_factor! */
                        const float face_angle = BM_loop_calc_face_angle(l);
-                       accum_shell += 
shell_angle_to_dist(angle_normalized_v3v3(v->no, l->f->no)) * face_angle;
+                       accum_shell += shell_v3v3_normalized_to_dist(v->no, 
l->f->no) * face_angle;
                        accum_angle += face_angle;
                        tot_sel++;
                }
diff --git a/source/blender/bmesh/operators/bmo_extrude.c 
b/source/blender/bmesh/operators/bmo_extrude.c
index 90c514b..f924d47 100644
--- a/source/blender/bmesh/operators/bmo_extrude.c
+++ b/source/blender/bmesh/operators/bmo_extrude.c
@@ -602,7 +602,7 @@ static void solidify_add_thickness(BMesh *bm, const float 
dist)
                                v = l->v;
                                index = BM_elem_index_get(v);
                                vert_accum[index] += face_angles[i];
-                               vert_angles[index] += 
shell_angle_to_dist(angle_normalized_v3v3(v->no, f->no)) * face_angles[i];
+                               vert_angles[index] += 
shell_v3v3_normalized_to_dist(v->no, f->no) * face_angles[i];
                                i++;
                        }
                }
diff --git a/source/blender/bmesh/operators/bmo_inset.c 
b/source/blender/bmesh/operators/bmo_inset.c
index 29522b6..e0285dc 100644
--- a/source/blender/bmesh/operators/bmo_inset.c
+++ b/source/blender/bmesh/operators/bmo_inset.c
@@ -758,7 +758,7 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
                                                                
normalize_v3(tvec);
 
                                                                if 
(use_even_offset) {
-                                                                       
mul_v3_fl(tvec, shell_angle_to_dist(angle_normalized_v3v3(e_no_a, tvec)));
+                                                                       
mul_v3_fl(tvec, shell_v3v3_normalized_to_dist(e_no_a, tvec));
                                                                }
                                                        }
                                                        else {
diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c 
b/source/blender/editors/sculpt_paint/paint_image_proj.c
index c6de574..ac48bee 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -983,19 +983,16 @@ static void uv_image_outset(float (*orig_uv)[2], float 
(*outset_uv)[2], const fl
                normalize_v2(dir3);
        }
 
-       /* TODO - angle_normalized_v2v2(...) * (M_PI/180.0f)
-        * This is incorrect. Its already given radians but without it wont 
work.
-        * need to look into a fix - campbell */
        if (is_quad) {
-               a1 = shell_angle_to_dist(angle_normalized_v2v2(dir4, dir1) * 
((float)M_PI / 180.0f));
-               a2 = shell_angle_to_dist(angle_normalized_v2v2(dir1, dir2) * 
((float)M_PI / 180.0f));
-               a3 = shell_angle_to_dist(angle_normalized_v2v2(dir2, dir3) * 
((float)M_PI / 180.0f));
-               a4 = shell_angle_to_dist(angle_normalized_v2v2(dir3, dir4) * 
((float)M_PI / 180.0f));
+               a1 = shell_v2v2_normalized_to_dist(dir4, dir1);
+               a2 = shell_v2v2_normalized_to_dist(dir1, dir2);
+               a3 = shell_v2v2_normalized_to_dist(dir2, dir3);
+               a4 = shell_v2v2_normalized_to_dist(dir3, dir4);
        }
        else {
-               a1 = shell_angle_to_dist(angle_normalized_v2v2(dir3, dir1) * 
((float)M_PI / 180.0f));
-               a2 = shell_angle_to_dist(angle_normalized_v2v2(dir1, dir2) * 
((float)M_PI / 180.0f));
-               a3 = shell_angle_to_dist(angle_normalized_v2v2(dir2, dir3) * 
((float)M_PI / 180.0f));
+               a1 = shell_v2v2_normalized_to_dist(dir3, dir1);
+               a2 = shell_v2v2_normalized_to_dist(dir1, dir2);
+               a3 = shell_v2v2_normalized_to_dist(dir2, dir3);
        }
 
        if (is_quad) {
diff --git a/source/blender/modifiers/intern/MOD_solidify.c 
b/source/blender/modifiers/intern/MOD_solidify.c
index 721a77d..90a5d56 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -538,13 +538,13 @@ static DerivedMesh *applyModifier(
                                    LIKELY(((orig_medge[ml[i_curr].e].flag & 
ME_EDGE_TMP_TAG) == 0) &&
                                           ((orig_medge[ml[i_next].e].flag & 
ME_EDGE_TMP_TAG) == 0)))
                                {
-                                       vert_angles[vidx] += 
shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * 
angle;
+                                       vert_angles[vidx] += 
shell_v3v3_normalized_to_dist(vert_nors[vidx], face_nors[i]) * angle;
                                }
                                else {
                                        vert_angles[vidx] += angle;
                                }
 #else
-                               vert_angles[vidx] += 
shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * 
angle;
+                               vert_angles[vidx] += 
shell_v3v3_normalized_to_dist(vert_nors[vidx], face_nors[i]) * angle;
 #endif
                                /* --- end non-angle-calc section --- */

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to