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:
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)