star-2d

Contour structuring for efficient 2D geometric queries
git clone git://git.meso-star.fr/star-2d.git
Log | Files | Refs | README | LICENSE

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:
Mcmake/CMakeLists.txt | 2+-
Msrc/s2d_scene_view.c | 8++++++++
Msrc/test_s2d_scene.c | 57++++++++++-----------------------------------------------
Msrc/test_s2d_scene_view.c | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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);