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 538da797c5c66a790a728ef28d65a0fe17f6be26
parent 86b5e1df3f0b4586834e7bec0e8d4e5bf9618581
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 28 Jun 2016 15:05:33 +0200

Implement and test the s2d_scene_get_aabb function

Diffstat:
Msrc/s2d_scene.c | 14++++++++++++++
Msrc/test_s2d_scene.c | 25+++++++++++++++++++++++++
2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/src/s2d_scene.c b/src/s2d_scene.c @@ -1070,3 +1070,17 @@ error: goto exit; } +res_T +s2d_scene_get_aabb(struct s2d_scene* scn, float lower[2], float upper[2]) +{ + if(!scn || !lower || !upper) return RES_BAD_ARG; + if(!scn->session_mask) { + log_error(scn->dev, + "%s: A session must be active on the submitted scene.\n", __FUNCTION__); + return RES_BAD_OP; + } + f2_set(lower, scn->lower); + f2_set(upper, scn->upper); + return RES_OK; +} + diff --git a/src/test_s2d_scene.c b/src/test_s2d_scene.c @@ -42,6 +42,8 @@ main(int argc, char** argv) struct s2d_primitive prim; size_t nprims; size_t i; + float lower[2], upper[2]; + float tmp[2]; float length; float area; int mask; @@ -169,10 +171,22 @@ main(int argc, char** argv) CHECK(s2d_scene_compute_area(scn, &area), RES_OK); CHECK(eq_epsf(area, 4.f, 1.e-6f), 1); + CHECK(s2d_scene_get_aabb(NULL, NULL, NULL), RES_BAD_ARG); + CHECK(s2d_scene_get_aabb(scn, NULL, NULL), RES_BAD_ARG); + CHECK(s2d_scene_get_aabb(NULL, lower, NULL), RES_BAD_ARG); + CHECK(s2d_scene_get_aabb(scn, lower, NULL), RES_BAD_ARG); + CHECK(s2d_scene_get_aabb(NULL, NULL, upper), RES_BAD_ARG); + CHECK(s2d_scene_get_aabb(scn, NULL, upper), RES_BAD_ARG); + CHECK(s2d_scene_get_aabb(NULL, lower, upper), RES_BAD_ARG); + CHECK(s2d_scene_get_aabb(scn, lower, upper), RES_OK); + CHECK(f2_eq_eps(lower, f2(tmp, -1.f, -1.f), 1.e-6f), 1); + CHECK(f2_eq_eps(upper, f2(tmp, 1.f, 1.f), 1.e-6f), 1); + CHECK(s2d_scene_end_session(scn), RES_OK); CHECK(s2d_scene_compute_contour_length(scn, &length), RES_BAD_OP); CHECK(s2d_scene_compute_area(scn, &area), RES_BAD_OP); + CHECK(s2d_scene_get_aabb(scn, lower, upper), RES_BAD_OP); CHECK(s2d_shape_flip_contour(shape), RES_OK); @@ -186,6 +200,17 @@ main(int argc, char** argv) CHECK(s2d_scene_end_session(scn), RES_OK); + CHECK(s2d_scene_clear(scn), RES_OK); + CHECK(s2d_scene_begin_session(scn, S2D_SAMPLE), RES_OK); + CHECK(s2d_scene_compute_contour_length(scn, &length), RES_OK); + CHECK(length, 0.f); + CHECK(s2d_scene_compute_area(scn, &area), RES_OK); + CHECK(area, 0.f); + CHECK(s2d_scene_get_aabb(scn, lower, upper), RES_OK); + CHECK(lower[0] > upper[0], 1); + CHECK(lower[1] > upper[1], 1); + CHECK(s2d_scene_end_session(scn), RES_OK); + CHECK(s2d_shape_ref_put(shape), RES_OK); CHECK(s2d_scene_ref_put(scn), RES_OK); CHECK(s2d_device_ref_put(dev), RES_OK);