diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-12-27 15:05:49 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-12-27 15:05:49 +0400 |
commit | 76b562237f31a804cd2eba9e3af6effa54f31b5b (patch) | |
tree | d789e373995ad0ab4ca0fb5668937c5b7814bb2d /source/blender/blenlib/intern/polyfill2d.c | |
parent | 03e388127034c35c82ed0f84b2239125111db5a4 (diff) | |
parent | d09a8ea9e7a8ad208326b99a0631e9efc7119fbd (diff) |
Merge branch 'master' into soc-2013-depsgraph_mtsoc-2013-depsgraph_mt
Conflicts:
source/blender/blenkernel/intern/constraint.c
source/blender/blenkernel/intern/depsgraph.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/scene.c
source/blender/blenkernel/intern/shrinkwrap.c
source/blender/collada/AnimationExporter.cpp
source/blender/editors/space_image/image_ops.c
source/blender/editors/space_view3d/view3d_view.c
source/blender/makesrna/intern/rna_scene.c
source/blender/modifiers/intern/MOD_util.c
source/blender/render/intern/source/pipeline.c
Diffstat (limited to 'source/blender/blenlib/intern/polyfill2d.c')
-rw-r--r-- | source/blender/blenlib/intern/polyfill2d.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/source/blender/blenlib/intern/polyfill2d.c b/source/blender/blenlib/intern/polyfill2d.c index 287a0909870..f5a226cebb6 100644 --- a/source/blender/blenlib/intern/polyfill2d.c +++ b/source/blender/blenlib/intern/polyfill2d.c @@ -50,8 +50,6 @@ #include "BLI_strict_flags.h" -#define SIGN_EPS 0.000001f - /* avoid fan-fill topology */ #define USE_CLIP_EVEN #define USE_CONVEX_SKIP @@ -97,7 +95,7 @@ static void pf_ear_tip_cut(PolyFill *pf, unsigned int index_ear_tip); BLI_INLINE eSign signum_i(float a) { - if (UNLIKELY(fabsf(a) < SIGN_EPS)) + if (UNLIKELY(a == 0.0f)) return 0; else if (a > 0.0f) return 1; @@ -105,9 +103,23 @@ BLI_INLINE eSign signum_i(float a) return -1; } +/** + * alternative version of #area_tri_signed_v2 + * needed because of float precision issues + * + * \note removes / 2 since its not needed since we only need ths sign. + */ +BLI_INLINE float area_tri_signed_v2_alt_2x(const float v1[2], const float v2[2], const float v3[2]) +{ + return ((v1[0] * (v2[1] - v3[1])) + + (v2[0] * (v3[1] - v1[1])) + + (v3[0] * (v1[1] - v2[1]))); +} + + static eSign span_tri_v2_sign(const float v1[2], const float v2[2], const float v3[2]) { - return signum_i(area_tri_signed_v2(v3, v2, v1)); + return signum_i(area_tri_signed_v2_alt_2x(v3, v2, v1)); } static unsigned int *pf_tri_add(PolyFill *pf) @@ -316,9 +328,9 @@ static bool pf_ear_tip_check(PolyFill *pf, const unsigned int index_ear_tip) /* Because the polygon has clockwise winding order, * the area sign will be positive if the point is strictly inside. * It will be 0 on the edge, which we want to include as well. */ - if ((span_tri_v2_sign(v1, v2, v) == CONVEX) && - (span_tri_v2_sign(v2, v3, v) == CONVEX) && - (span_tri_v2_sign(v3, v1, v) == CONVEX)) + if ((span_tri_v2_sign(v1, v2, v) != CONCAVE) && + (span_tri_v2_sign(v2, v3, v) != CONCAVE) && + (span_tri_v2_sign(v3, v1, v) != CONCAVE)) { return false; } |