diff options
author | YimingWu <xp8110@outlook.com> | 2021-07-27 09:02:22 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2021-08-09 09:14:06 +0300 |
commit | 69edb9c7d969934e40414ee30bf8a29cf69c4a30 (patch) | |
tree | 95421ba5b19dd474b349fb55a7128d4e5d5cfc62 | |
parent | a818ad5a54984ce139c85fc0b6dfb9a97f18d877 (diff) |
LineArt: Occlusion accuracy fix.
This patch fixes occlusion function to handle one specific case (when an edge shares a point with triangle) better,especially when there's overlapping edges in this case.
-rw-r--r-- | source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h | 3 | ||||
-rw-r--r-- | source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c | 4 |
2 files changed, 4 insertions, 3 deletions
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h index 56cd7fa1456..05222a2fdfb 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h +++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h @@ -413,7 +413,8 @@ typedef struct LineartBoundingArea { BLI_INLINE int lineart_LineIntersectTest2d( const double *a1, const double *a2, const double *b1, const double *b2, double *aRatio) { -#define USE_VECTOR_LINE_INTERSECTION +/* Legacy intersection math aligns better with occlusion function quirks. */ +/* #define USE_VECTOR_LINE_INTERSECTION */ #ifdef USE_VECTOR_LINE_INTERSECTION /* from isect_line_line_v2_point() */ diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c index ab1b0b9bac7..805c864566a 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c @@ -2141,8 +2141,8 @@ static bool lineart_triangle_edge_image_space_occlusion(SpinLock *UNUSED(spl), } } else if (st_r == 0) { - INTERSECT_JUST_GREATER(is, order, 0, LCross); - if (LRT_ABC(LCross) && is[LCross] > 0) { + INTERSECT_JUST_GREATER(is, order, DBL_TRIANGLE_LIM, LCross); + if (LRT_ABC(LCross) && is[LCross] > DBL_TRIANGLE_LIM) { INTERSECT_JUST_GREATER(is, order, is[LCross], RCross); } else { |