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:
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++;
}