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 935d8bfe6f6131060b774e7477c8604cc093e9e9
parent 5d738909556e9107897503fe62f1f5c30acefe26
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 12 Jan 2018 11:27:08 +0100

Test the scene view API

Diffstat:
Mcmake/CMakeLists.txt | 1+
Msrc/s2d_scene_view.c | 25++++++++++++++-----------
Msrc/test_s2d_utils.h | 18++++++++++++------
3 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -130,6 +130,7 @@ if(NOT NO_TEST) endfunction() new_test(test_s2d_device) + new_test(test_s2d_scene_view) # new_test(test_s2d_primitive) # new_test(test_s2d_sample) # new_test(test_s2d_scene) diff --git a/src/s2d_scene_view.c b/src/s2d_scene_view.c @@ -170,7 +170,7 @@ embree_geometry_register /* Create the Embree geometry if it is not valid */ if(geom->irtc == RTC_INVALID_GEOMETRY_ID) { - rtcNewQuadMesh + geom->irtc = rtcNewQuadMesh (scnview->rtc_scn, RTC_GEOMETRY_DYNAMIC, line_segments_get_nsegments(geom->lines), @@ -532,7 +532,7 @@ scene_view_compute_cdf(struct s2d_scene_view* scnview) { struct htable_geom_iterator it, end; size_t len; - float area = 0.f; + float length = 0.f; res_T res = RES_OK; ASSERT(scnview); ASSERT(darray_fltui_size_get(&scnview->cdf) == 0); @@ -552,10 +552,11 @@ scene_view_compute_cdf(struct s2d_scene_view* scnview) res = line_segments_compute_cdf(geom->lines); if(res != RES_OK) goto error; len = darray_float_size_get(&geom->lines->cdf); - - fltui.ui = *shape_id; - fltui.flt = area; if(len) { + length += darray_float_cdata_get(&geom->lines->cdf)[len - 1]; + + fltui.ui = *shape_id; + fltui.flt = length; res = darray_fltui_push_back(&scnview->cdf, &fltui); if(res != RES_OK) goto error; } @@ -757,7 +758,7 @@ s2d_scene_view_ref_put(struct s2d_scene_view* scnview) res_T s2d_scene_view_get_mask(struct s2d_scene_view* scnview, int* mask) { - if(scnview || !mask) return RES_BAD_ARG; + if(!scnview || !mask) return RES_BAD_ARG; *mask = scnview->mask; return RES_OK; } @@ -851,10 +852,11 @@ s2d_scene_view_sample struct s2d_primitive* primitive, float* s) { + struct geometry** pgeom; struct geometry* geom; const struct fltui* fltui_begin, *fltui_end, *fltui_found; const float* flt_begin, *flt_end, *flt_found; - size_t igeom; + unsigned ishape; float f; res_T res = RES_OK; @@ -883,7 +885,7 @@ s2d_scene_view_sample *primitive = S2D_PRIMITIVE_NULL; goto exit; } else if(darray_fltui_size_get(&scnview->cdf) == 1) { - igeom = darray_fltui_cdata_get(&scnview->cdf)[0].ui; + ishape = darray_fltui_cdata_get(&scnview->cdf)[0].ui; /* Map u to the CDF bounds */ f = u * darray_fltui_cdata_get(&scnview->cdf)[0].flt; } else { @@ -892,13 +894,14 @@ s2d_scene_view_sample f = u * fltui_end[-1].flt; /* Map u to the CDF bounds */ fltui_found = std::lower_bound(fltui_begin, fltui_end, f); ASSERT(fltui_found != fltui_end); - igeom = fltui_found->ui; + ishape = fltui_found->ui; if(fltui_found != fltui_begin) /* Transform u to the geometry CDF bounds */ f -= fltui_found[-1].flt; } - geom = darray_geom_data_get(&scnview->embree2geoms)[igeom]; - ASSERT(geom); + pgeom = htable_geom_find(&scnview->cached_geoms, &ishape); + ASSERT(pgeom); + geom = *pgeom; /* Find the sampled segment */ flt_begin = darray_float_cdata_get(&geom->lines->cdf); diff --git a/src/test_s2d_utils.h b/src/test_s2d_utils.h @@ -38,25 +38,31 @@ struct line_segments_desc { }; /******************************************************************************* - * Box geometry + * Geometries ******************************************************************************/ -static const float box_verts[] = { +static const float square_verts[] = { 1.f, -1.f, -1.f, -1.f, -1.f, 1.f, 1.f, 1.f }; -const unsigned box_nverts = sizeof(box_verts)/sizeof(float[2]); +const unsigned square_nverts = sizeof(square_verts)/sizeof(float[2]); -const unsigned box_ids[] = { +const unsigned square_ids[] = { 0, 1, /* Bottom */ 1, 2, /* Left */ 2, 3, /* Top */ 3, 0 /* Right */ }; -const unsigned box_nsegs = sizeof(box_ids)/sizeof(unsigned[2]); +const unsigned square_nsegs = sizeof(square_ids)/sizeof(unsigned[2]); -static const struct line_segments_desc box_desc = { box_verts, box_ids }; +static const struct line_segments_desc square_desc = { square_verts, square_ids }; + +static const float line_verts[] = { -1.f, 0.f, 1.f, 0.f }; +const unsigned line_nverts = sizeof(line_verts)/sizeof(float[2]); +const unsigned line_ids[] = { 0, 1 }; +const unsigned line_nsegs = sizeof(line_ids)/sizeof(unsigned[2]); +static const struct line_segments_desc line_desc = { line_verts, line_ids }; static INLINE void line_segments_get_ids(const unsigned isegment, unsigned ids[2], void* data)