commit 55aa4aa37e6436160e4547570f979d416739d4af
parent 935d8bfe6f6131060b774e7477c8604cc093e9e9
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 12 Jan 2018 13:42:48 +0100
Push further the tests on the scene view
Diffstat:
4 files changed, 153 insertions(+), 48 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -130,10 +130,10 @@ if(NOT NO_TEST)
endfunction()
new_test(test_s2d_device)
+ #new_test(test_s2d_scene)
new_test(test_s2d_scene_view)
# new_test(test_s2d_primitive)
# new_test(test_s2d_sample)
-# new_test(test_s2d_scene)
# new_test(test_s2d_session_advanced)
# new_test(test_s2d_shape)
# new_test(test_s2d_trace_ray)
diff --git a/src/s2d_scene_view.c b/src/s2d_scene_view.c
@@ -1100,6 +1100,14 @@ s2d_scene_view_compute_area(struct s2d_scene_view* scnview, float* out_area)
}
}
+ if(area < 0.f) {
+ log_warning(scnview->scn->dev,
+"%s:\n"
+"\tthe area is negative. The scene shapes might not represent closed\n"
+"\tpolygons, or the edge normals might not point inward the polygon.\n",
+ FUNC_NAME);
+ }
+
exit:
if(out_area) *out_area = area;
return res;
diff --git a/src/test_s2d_scene.c b/src/test_s2d_scene.c
@@ -86,33 +86,14 @@ main(int argc, char** argv)
CHK(s2d_scene_attach_shape(scn, shape) == RES_OK);
CHK(s2d_scene_clear(scn) == RES_OK);
- CHK(s2d_scene_begin_session(NULL, 0) == RES_BAD_ARG);
- CHK(s2d_scene_begin_session(scn, 0) == RES_BAD_ARG);
- CHK(s2d_scene_begin_session(NULL, S2D_TRACE) == RES_BAD_ARG);
- CHK(s2d_scene_begin_session(scn, S2D_TRACE) == RES_OK);
-
- CHK(s2d_scene_get_session_mask(NULL, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_get_session_mask(scn, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_get_session_mask(NULL, &mask) == RES_BAD_ARG);
- CHK(s2d_scene_get_session_mask(scn, &mask) == RES_OK);
- CHK(mask == S2D_TRACE);
-
- CHK(s2d_scene_primitives_count(NULL, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_primitives_count(scn, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_primitives_count(NULL, &nprims) == RES_BAD_ARG);
- CHK(s2d_scene_primitives_count(scn, &nprims) == RES_OK);
+ CHK(s2d_scene_view_create(scn, S2D_TRACE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_primitives_count(scn, &nprims) == RES_OK);
CHK(nprims == 0);
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
CHK(s2d_scene_attach_shape(scn, shape) == RES_OK);
- CHK(s2d_scene_clear(scn) == RES_BAD_OP);
CHK(s2d_scene_detach_shape(scn, shape) == RES_OK);
- CHK(s2d_scene_end_session(NULL) == RES_BAD_ARG);
- CHK(s2d_scene_end_session(scn) == RES_OK);
- CHK(s2d_scene_end_session(scn) == RES_BAD_ARG);
- CHK(s2d_scene_get_session_mask(scn, &mask) == RES_OK);
- CHK(mask == 0);
-
attrib.type = S2D_FLOAT2;
attrib.usage = S2D_POSITION;
attrib.get = line_segments_get_position;
@@ -121,34 +102,16 @@ main(int argc, char** argv)
(void*)&box_desc), RES_OK);
CHK(s2d_scene_attach_shape(scn, shape) == RES_OK);
- CHK(s2d_scene_begin_session(scn, S2D_TRACE) == RES_OK);
- CHK(s2d_scene_detach_shape(scn, shape) == RES_BAD_OP);
- CHK(s2d_scene_end_session(scn) == RES_OK);
-
- CHK(s2d_scene_primitives_count(scn, &nprims) == RES_BAD_OP);
- CHK(s2d_scene_begin_session(scn, S2D_GET_PRIMITIVE) == RES_OK);
- CHK(s2d_scene_primitives_count(scn, &nprims) == RES_OK);
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_primitives_count(scn, &nprims) == RES_OK);
CHK(nprims == 4);
- CHK(s2d_scene_get_primitive(NULL, 5, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_get_primitive(scn, 5, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_get_primitive(NULL, 0, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_get_primitive(scn, 0, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_get_primitive(NULL, 5, &prim) == RES_BAD_ARG);
- CHK(s2d_scene_get_primitive(scn, 5, &prim) == RES_BAD_ARG);
- CHK(s2d_scene_get_primitive(NULL, 0, &prim) == RES_BAD_ARG);
- CHK(s2d_scene_get_primitive(scn, 0, &prim) == RES_OK);
-
- CHK(s2d_scene_end_session(scn) == RES_OK);
-
- CHK(s2d_scene_get_primitive(scn, 0, &prim) == RES_BAD_OP);
-
CHK(s2d_scene_begin_session(scn, S2D_GET_PRIMITIVE) == RES_OK);
FOR_EACH(i, 0, nprims) {
struct s2d_attrib attr;
float tmp[2];
- CHK(s2d_scene_get_primitive(scn, (unsigned)i, &prim) == RES_OK);
+ CHK(s2d_scene_view_get_primitive(scnview, (unsigned)i, &prim) == RES_OK);
CHK(s2d_primitive_get_attrib(&prim, S2D_GEOMETRY_NORMAL, 0, &attr) == RES_OK);
f2_normalize(attr.value, attr.value);
switch(i) {
@@ -160,10 +123,10 @@ main(int argc, char** argv)
}
}
- CHK(s2d_scene_compute_contour_length(NULL, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_compute_contour_length(scn, NULL) == RES_BAD_ARG);
- CHK(s2d_scene_compute_contour_length(NULL, &length) == RES_BAD_ARG);
- CHK(s2d_scene_compute_contour_length(scn, &length) == RES_OK);
+ CHK(s2d_scene_view_compute_contour_length(NULL, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_contour_length(scn, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_contour_length(NULL, &length) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_contour_length(scn, &length) == RES_OK);
CHK(eq_epsf(length, 8.f, 1.e-6f) == 1);
CHK(s2d_scene_compute_area(NULL, NULL) == RES_BAD_ARG);
diff --git a/src/test_s2d_scene_view.c b/src/test_s2d_scene_view.c
@@ -350,10 +350,141 @@ test_get_primitive
}
FOR_EACH(i, 0, 4) CHK(square_prims[i]);
+ CHK(s2d_shape_enable(line, 1) == RES_OK);
CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
CHK(s2d_scene_ref_put(scn) == RES_OK);
}
+static void
+test_contour_length
+ (struct s2d_device* dev,
+ struct s2d_shape* square,
+ struct s2d_shape* line)
+{
+ struct s2d_scene* scn;
+ struct s2d_scene_view* scnview;
+ float length;
+
+ CHK(s2d_scene_create(dev, &scn) == RES_OK);
+ CHK(s2d_scene_attach_shape(scn, square) == RES_OK);
+ CHK(s2d_scene_attach_shape(scn, line) == RES_OK);
+
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_compute_contour_length(NULL, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_contour_length(scnview, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_contour_length(NULL, &length) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_contour_length(scnview, &length) == RES_OK);
+ CHK(eq_epsf(length, 10.f, 1.e-6f));
+
+ CHK(s2d_shape_enable(line, 0) == RES_OK);
+ CHK(s2d_scene_view_compute_contour_length(scnview, &length) == RES_OK);
+ CHK(eq_epsf(length, 10.f, 1.e-6f));
+
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_compute_contour_length(scnview, &length) == RES_OK);
+ CHK(eq_epsf(length, 8.f, 1.e-6f));
+
+ CHK(s2d_shape_enable(line, 1) == RES_OK);
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
+
+ CHK(s2d_scene_ref_put(scn) == RES_OK);
+}
+
+static void
+test_area
+ (struct s2d_device* dev, struct s2d_shape* square)
+{
+ struct s2d_scene* scn;
+ struct s2d_scene_view* scnview;
+ float area;
+
+ CHK(s2d_scene_create(dev, &scn) == RES_OK);
+ CHK(s2d_scene_attach_shape(scn, square) == RES_OK);
+
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_compute_area(NULL, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_area(scnview, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_area(NULL, &area) == RES_BAD_ARG);
+ CHK(s2d_scene_view_compute_area(scnview, &area) == RES_OK);
+ CHK(eq_epsf(area, 4.f, 1.e-6f));
+
+ CHK(s2d_shape_flip_contour(square) == RES_OK);
+ CHK(s2d_scene_view_compute_area(scnview, &area) == RES_OK);
+ CHK(eq_epsf(area, 4.f, 1.e-6f));
+
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_compute_area(scnview, &area) == RES_OK);
+ CHK(eq_epsf(area, -4.f, 1.e-6f));
+
+ CHK(s2d_shape_flip_contour(square) == RES_OK);
+ CHK(s2d_shape_enable(square, 0) == RES_OK);
+ CHK(s2d_scene_view_compute_area(scnview, &area) == RES_OK);
+ CHK(eq_epsf(area, -4.f, 1.e-6f));
+
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_compute_area(scnview, &area) == RES_OK);
+ CHK(area == 0.f);
+
+ CHK(s2d_shape_enable(square, 1) == RES_OK);
+
+ CHK(s2d_scene_ref_put(scn) == RES_OK);
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
+}
+
+static void
+test_aabb
+ (struct s2d_device* dev, struct s2d_shape* square, struct s2d_shape* line)
+{
+ struct s2d_scene* scn;
+ struct s2d_scene_view* scnview;
+ float lower[2];
+ float upper[2];
+
+ CHK(s2d_scene_create(dev, &scn) == RES_OK);
+ CHK(s2d_scene_attach_shape(scn, square) == RES_OK);
+ CHK(s2d_scene_attach_shape(scn, line) == RES_OK);
+
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_get_aabb(NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_get_aabb(scnview, NULL, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_get_aabb(NULL, lower, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_get_aabb(scnview, lower, NULL) == RES_BAD_ARG);
+ CHK(s2d_scene_view_get_aabb(NULL, lower, upper) == RES_BAD_ARG);
+ CHK(s2d_scene_view_get_aabb(scnview, lower, upper) == RES_OK);
+ CHK(lower[0] == -1.f && upper[0] == 1.f);
+ CHK(lower[1] == -1.f && upper[1] == 1.f);
+
+ CHK(s2d_shape_enable(square, 0) == RES_OK);
+ CHK(s2d_scene_view_get_aabb(scnview, lower, upper) == RES_OK);
+ CHK(lower[0] == -1.f && upper[0] == 1.f);
+ CHK(lower[1] == -1.f && upper[1] == 1.f);
+
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_get_aabb(scnview, lower, upper) == RES_OK);
+ CHK(lower[0] == -1.f && upper[0] == 1.f);
+ CHK(lower[1] == 0.f && upper[1] == 0.f);
+
+ CHK(s2d_scene_detach_shape(scn, line) == RES_OK);
+ CHK(s2d_scene_view_get_aabb(scnview, lower, upper) == RES_OK);
+ CHK(lower[0] == -1.f && upper[0] == 1.f);
+ CHK(lower[1] == 0.f && upper[1] == 0.f);
+
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
+ CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
+ CHK(s2d_scene_view_get_aabb(scnview, lower, upper) == RES_OK);
+ CHK(lower[0] > upper[0]);
+ CHK(lower[1] > upper[1]);
+
+ CHK(s2d_shape_enable(square, 1) == RES_OK);
+
+ CHK(s2d_scene_ref_put(scn) == RES_OK);
+ CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
+}
+
/*******************************************************************************
* Main test function
******************************************************************************/
@@ -389,6 +520,9 @@ main(int argc, char** argv)
test_trace_ray(dev, square, line);
test_sample(dev, square, line);
test_get_primitive(dev, square, line);
+ test_contour_length(dev, square, line);
+ test_area(dev, square);
+ test_aabb(dev, square, line);
CHK(s2d_shape_ref_put(square) == RES_OK);
CHK(s2d_shape_ref_put(line) == RES_OK);