star-cpr

Clip 2D meshes with 2D polygons
git clone git://git.meso-star.fr/star-cpr.git
Log | Files | Refs | README | LICENSE

commit 3aeadb054cbc5da7cfd5743b493b8a23964a440c
parent 658e729e85c490811ffbba960863893a88a114a5
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 21 Feb 2023 15:27:45 +0100

Slight API change

Diffstat:
Msrc/scpr.h | 16++++++++++++----
Msrc/scpr_intersector.c | 24++++++++++++++++++++----
Msrc/test_scpr_intersector.c | 14++++++--------
3 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/src/scpr.h b/src/scpr.h @@ -75,16 +75,24 @@ struct scpr_device_create_args { static const struct scpr_device_create_args SCPR_DEVICE_CREATE_ARGS_DEFAULT = SCPR_DEVICE_CREATE_ARGS_DEFAULT__; +/* A struct to represent segments when calling user callbacks. */ +struct scpr_callback_segment { + struct scpr_polygon* polygon; + size_t component; + size_t first_vertex; + size_t last_vertex; +}; + /* A struct holding callbacks that are called when carying an intersection check * on a bunch of segments. */ struct scpr_intersector_check_callbacks { void(*simple_intersection) - (struct scpr_polygon* polygon1, size_t component1, size_t segment1, - struct scpr_polygon* polygon2, size_t component2, size_t segment2, + (struct scpr_callback_segment* segment1, + struct scpr_callback_segment* segment2, void* data); void(*colinear_segments) - (struct scpr_polygon* polygon1, size_t component1, size_t segment1, - struct scpr_polygon* polygon2, size_t component2, size_t segment2, + (struct scpr_callback_segment* segment1, + struct scpr_callback_segment* segment2, void* data); }; #define SCPR_INTERSECTOR_CHECK_CALLBACKS_NULL__ { NULL, NULL } diff --git a/src/scpr_intersector.c b/src/scpr_intersector.c @@ -530,13 +530,29 @@ check_two_segments_intersection } else if(ccw1 == 0 && ccw2 == 0 && ccw3 == 0 && ccw4 == 0) { /* Colinear segments */ - callbacks->colinear_segments(polygon1, comp_idx1, seg1->first_vertex, - polygon2, comp_idx2, seg2->first_vertex, data); + struct scpr_callback_segment arg1, arg2; + arg1.polygon = polygon1; + arg1.component = comp_idx1; + arg1.first_vertex = r11; + arg1.last_vertex = r12; + arg2.polygon = polygon2; + arg2.component = comp_idx2; + arg2.first_vertex = r21; + arg2.last_vertex = r22; + callbacks->colinear_segments(&arg1, &arg2, data); } else if(ccw1 * ccw2 < 0 && ccw3 * ccw4 < 0) { /* Basic segment intersection */ - callbacks->simple_intersection(polygon1, comp_idx1, seg1->first_vertex, - polygon2, comp_idx2, seg2->first_vertex, data); + struct scpr_callback_segment arg1, arg2; + arg1.polygon = polygon1; + arg1.component = comp_idx1; + arg1.first_vertex = r11; + arg1.last_vertex = r12; + arg2.polygon = polygon2; + arg2.component = comp_idx2; + arg2.first_vertex = r21; + arg2.last_vertex = r22; + callbacks->simple_intersection(&arg1, &arg2, data); } exit: diff --git a/src/test_scpr_intersector.c b/src/test_scpr_intersector.c @@ -28,26 +28,24 @@ struct cpt { static void basic_intersection - (struct scpr_polygon* polygon1, size_t component1, size_t segment1, - struct scpr_polygon* polygon2, size_t component2, size_t segment2, + (struct scpr_callback_segment* segment1, + struct scpr_callback_segment* segment2, void* data) { struct cpt* cpt = (struct cpt*)data; - (void)polygon1; (void)component1; (void)segment1; - (void)polygon2; (void)component2; (void)segment2; + (void)segment1; (void)segment2; ASSERT(cpt); cpt->basic++; } static void colinear_segments - (struct scpr_polygon* polygon1, size_t component1, size_t segment1, - struct scpr_polygon* polygon2, size_t component2, size_t segment2, + (struct scpr_callback_segment* segment1, + struct scpr_callback_segment* segment2, void* data) { struct cpt* cpt = (struct cpt*)data; - (void)polygon1; (void)component1; (void)segment1; - (void)polygon2; (void)component2; (void)segment2; + (void)segment1; (void)segment2; ASSERT(cpt); cpt->colinear++; }