commit a54873753feb8314fef967e0de8f8e8bd94ffe2c
parent b33a8c751dc1ac008d96f7d6e6ff41bd1fe7cf78
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 9 Sep 2015 18:23:18 +0200
Re-enable the sampler test with the new sampling API
The s3d_sampler does not exist anymore: this is the s3d_scene that is
sampled.
Diffstat:
4 files changed, 75 insertions(+), 70 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -129,7 +129,7 @@ if(NOT NO_TEST)
endfunction(new_test)
new_test(test_s3d_device)
- # new_test(test_s3d_sampler)
+ new_test(test_s3d_sampler)
new_test(test_s3d_scene)
new_test(test_s3d_shape)
new_test(test_s3d_trace_ray)
diff --git a/src/s3d_primitive.c b/src/s3d_primitive.c
@@ -57,6 +57,13 @@ s3d_primitive_get_attrib
if(!prim || usage == S3D_ATTRIBS_COUNT__ || !uv || !attrib)
return RES_BAD_ARG;
+ if(prim->geom_id == S3D_INVALID_ID
+ || prim->prim_id == S3D_INVALID_ID
+ || prim->mesh__ == NULL
+ || (prim->inst_id != S3D_INVALID_ID && prim->inst__ == NULL)) {
+ return RES_BAD_ARG;
+ }
+
/* Unormalized barycentric coordinates */
w = CLAMP(1.f - uv[0] - uv[1], 0.f, 1.f);
if(uv[0] < 0.f || uv[1] < 0.f)
diff --git a/src/s3d_scene.c b/src/s3d_scene.c
@@ -357,6 +357,8 @@ scene_compute_cdf(struct s3d_scene* scn)
geom = *pgeom;
struct fltui fltui;
+ if(!geom->is_enabled) continue;
+
switch(geom->type) {
case GEOM_MESH:
res = mesh_compute_cdf(geom->data.mesh);
@@ -381,8 +383,10 @@ scene_compute_cdf(struct s3d_scene* scn)
break;
default: FATAL("Unreachable code\n"); break;
}
- res = darray_fltui_push_back(&scn->cdf, &fltui);
- if(res != RES_OK) goto error;
+ if(len) {
+ res = darray_fltui_push_back(&scn->cdf, &fltui);
+ if(res != RES_OK) goto error;
+ }
}
exit:
return res;
@@ -791,16 +795,22 @@ s3d_scene_sample
}
/* Find the sampled geometry */
- if(darray_fltui_size_get(&scn->cdf) == 1) {
+ if(darray_fltui_size_get(&scn->cdf) == 0) {
+ /* No geometry to sample */
+ *primitive = S3D_PRIMITIVE_NULL;
+ goto exit;
+ } else if(darray_fltui_size_get(&scn->cdf) == 1) {
igeom = darray_fltui_cdata_get(&scn->cdf)[0].ui;
+ f = u * darray_fltui_cdata_get(&scn->cdf)[0].flt;/* Map u to the CDF bounds */
} else {
fltui_begin = darray_fltui_cdata_get(&scn->cdf);
fltui_end = fltui_begin + darray_fltui_size_get(&scn->cdf);
- f = u * fltui_end[-1].flt;
+ 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;
+ /* Transform u to the geometry CDF bounds */
if(fltui_found != fltui_begin)
f -= fltui_found[-1].flt;
}
@@ -823,6 +833,7 @@ s3d_scene_sample
ASSERT(fltui_found != fltui_end);
igeom = fltui_found->ui;
+ /* Transform u to the geometry CDF bounds */
if(fltui_found != fltui_begin)
f -= fltui_found[-1].flt;
}
diff --git a/src/test_s3d_sampler.c b/src/test_s3d_sampler.c
@@ -52,12 +52,12 @@ main(int argc, char** argv)
struct mem_allocator allocator;
struct s3d_device* dev;
struct s3d_scene* scn;
+ struct s3d_scene* scn2;
struct s3d_shape* cbox;
struct s3d_shape* walls;
struct s3d_shape* short_block;
struct s3d_shape* tall_block;
struct s3d_vertex_data attribs[2];
- struct s3d_sampler* sampler;
struct s3d_primitive prim;
struct s3d_primitive prim1;
struct s3d_attrib attr0, attr1;
@@ -75,7 +75,9 @@ main(int argc, char** argv)
CHECK(s3d_device_create(NULL, &allocator, 1, &dev), RES_OK);
CHECK(s3d_scene_create(dev, &scn), RES_OK);
+ CHECK(s3d_scene_create(dev, &scn2), RES_OK);
CHECK(s3d_scene_instantiate(scn, &cbox), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn2, cbox), RES_OK);
CHECK(s3d_shape_create_mesh(dev, &walls), RES_OK);
CHECK(s3d_shape_create_mesh(dev, &short_block), RES_OK);
CHECK(s3d_shape_create_mesh(dev, &tall_block), RES_OK);
@@ -85,13 +87,24 @@ main(int argc, char** argv)
CHECK(s3d_shape_get_id(short_block, &short_block_id), RES_OK);
CHECK(s3d_shape_get_id(tall_block, &tall_block_id), RES_OK);
- CHECK(s3d_sampler_create(NULL, NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_create(walls, NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_create(NULL, &sampler), RES_BAD_ARG);
- CHECK(s3d_sampler_create(walls, &sampler), RES_OK);
-
- CHECK(s3d_sampler_begin_sampling(NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_BAD_ARG);
+ CHECK(s3d_scene_begin_session(scn, S3D_SESSION_SAMPLE), RES_OK);
+ CHECK(s3d_scene_sample(NULL, 0, 0, 0, NULL, NULL), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0, 0, 0, NULL, NULL), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(NULL, 0, 0, 0, &prim, NULL), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0, 0, 0, &prim, NULL), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(NULL, 0, 0, 0, NULL, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0, 0, 0, NULL, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(NULL, 0, 0, 0, &prim, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0, 0, 0, &prim, uv), RES_OK);
+ CHECK(s3d_scene_sample(scn, -1, 0, 0, &prim, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0, -1, 0, &prim, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0, 0, -1, &prim, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 1, 0, 0, &prim, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0, 1, 0, &prim, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0, 0, 1, &prim, uv), RES_BAD_ARG);
+ CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
+ CHECK(S3D_PRIMITIVE_EQ(&prim, &S3D_PRIMITIVE_NULL), 1);
+ CHECK(s3d_scene_end_session(scn), RES_OK);
attribs[0].usage = S3D_POSITION;
attribs[0].type = S3D_FLOAT3;
@@ -105,34 +118,21 @@ main(int argc, char** argv)
CHECK(s3d_mesh_setup_indexed_vertices
(walls, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_BAD_OP);
-
- CHECK(s3d_sampler_get(NULL, 0, 0, 0, NULL, NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 0, 0, 0, NULL, NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_get(NULL, 0, 0, 0, &prim, NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 0, 0, 0, &prim, NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_get(NULL, 0, 0, 0, NULL, uv), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 0, 0, 0, NULL, uv), RES_BAD_ARG);
- CHECK(s3d_sampler_get(NULL, 0, 0, 0, &prim, uv), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 0, 0, 0, &prim, uv), RES_OK);
- CHECK(s3d_sampler_get(sampler, -1, 0, 0, &prim, uv), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 0, -1, 0, &prim, uv), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 0, 0, -1, &prim, uv), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 1, 0, 0, &prim, uv), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 0, 1, 0, &prim, uv), RES_BAD_ARG);
- CHECK(s3d_sampler_get(sampler, 0, 0, 1, &prim, uv), RES_BAD_ARG);
-
- CHECK(s3d_sampler_get(sampler, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, walls), RES_OK);
+
+ CHECK(s3d_scene_begin_session(scn, S3D_SESSION_SAMPLE), RES_OK);
+ CHECK(s3d_scene_begin_session(scn, S3D_SESSION_SAMPLE), RES_BAD_OP);
+
+ CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr0), RES_OK);
- CHECK(s3d_sampler_get(sampler, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
+ CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr1), RES_OK);
prim1 = prim;
CHECK(S3D_PRIMITIVE_EQ(&prim, &prim1), 1);
prim1.inst_id = prim.inst_id + 1;
CHECK(S3D_PRIMITIVE_EQ(&prim, &prim1), 0);
- prim1.inst_id = prim.inst_id;;
+ prim1.inst_id = prim.inst_id;
CHECK(S3D_PRIMITIVE_EQ(&prim, &prim1), 1);
prim1.prim_id = S3D_INVALID_ID;
CHECK(S3D_PRIMITIVE_EQ(&prim, &prim1), 0);
@@ -144,27 +144,20 @@ main(int argc, char** argv)
CHECK(attr1.type, S3D_FLOAT3);
CHECK(f3_eq_eps(attr0.value, attr1.value, 1.e-6f), 1);
- CHECK(s3d_sampler_get(sampler, 0.3f, 0.1f, 0.2f, &prim, uv), RES_OK);
+ CHECK(s3d_scene_sample(scn, 0.3f, 0.1f, 0.2f, &prim, uv), RES_OK);
CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr1), RES_OK);
NCHECK(f3_eq_eps(attr0.value, attr1.value, 1.e-6f), 1);
- CHECK(s3d_sampler_end_sampling(NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_end_sampling(sampler), RES_OK);
+ CHECK(s3d_scene_end_session(scn), RES_OK);
CHECK(s3d_shape_enable(walls, 0), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_BAD_ARG);
+ CHECK(s3d_scene_begin_session(scn, S3D_SESSION_SAMPLE), RES_OK);
+ CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
+ CHECK(S3D_PRIMITIVE_EQ(&prim, &S3D_PRIMITIVE_NULL), 1);
+ CHECK(s3d_scene_end_session(scn), RES_OK);
CHECK(s3d_shape_enable(walls, 1), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_OK);
- CHECK(s3d_sampler_end_sampling(sampler), RES_OK);
- CHECK(s3d_sampler_end_sampling(sampler), RES_BAD_OP);
- CHECK(s3d_sampler_get(sampler, 0.5f, 0.5f, 0.5f, &prim, uv), RES_BAD_OP);
-
- CHECK(s3d_sampler_ref_get(NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_ref_get(sampler), RES_OK);
- CHECK(s3d_sampler_ref_put(NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_ref_put(sampler), RES_OK);
- CHECK(s3d_sampler_ref_put(sampler), RES_OK);
+ CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_BAD_OP);
ntris = sizeof(cbox_block_ids)/sizeof(unsigned[3]);
nverts = sizeof(cbox_short_block)/sizeof(float[3]);
@@ -173,39 +166,38 @@ main(int argc, char** argv)
CHECK(s3d_mesh_setup_indexed_vertices
(short_block, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK);
- CHECK(s3d_sampler_create(cbox, &sampler), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_BAD_ARG);
-
- CHECK(s3d_scene_attach_shape(scn, walls), RES_OK);
CHECK(s3d_scene_attach_shape(scn, short_block), RES_OK);
CHECK(s3d_scene_attach_shape(scn, tall_block), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_OK);
- CHECK(s3d_sampler_get(sampler, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
+ CHECK(s3d_scene_begin_session(scn, S3D_SESSION_SAMPLE), RES_OK);
+ CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr0), RES_OK);
desc.vertices = cbox_tall_block;
CHECK(s3d_mesh_setup_indexed_vertices
(tall_block, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK);
- CHECK(s3d_sampler_get(sampler, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
+ CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr1), RES_OK);
CHECK(f3_eq_eps(attr0.value, attr1.value, 1.e-6f), 1);
- CHECK(s3d_sampler_end_sampling(sampler), RES_OK);
+ CHECK(s3d_scene_end_session(scn), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_OK);
- CHECK(s3d_sampler_get(sampler, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
+ CHECK(s3d_scene_begin_session(scn, S3D_SESSION_SAMPLE), RES_OK);
+ CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr1), RES_OK);
NCHECK(f3_eq_eps(attr0.value, attr1.value, 1.e-6f), 1);
- CHECK(s3d_sampler_end_sampling(sampler), RES_OK);
+ CHECK(s3d_scene_end_session(scn), RES_OK);
CHECK(s3d_shape_enable(cbox, 0), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_BAD_ARG);
+ CHECK(s3d_scene_begin_session(scn2, S3D_SESSION_SAMPLE|S3D_SESSION_TRACE), RES_OK);
+ CHECK(s3d_scene_sample(scn2, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK);
+ CHECK(S3D_PRIMITIVE_EQ(&prim, &S3D_PRIMITIVE_NULL), 1);
+ CHECK(s3d_scene_end_session(scn2), RES_OK);
CHECK(s3d_shape_enable(cbox, 1), RES_OK);
- CHECK(s3d_sampler_begin_sampling(sampler), RES_OK);
+ CHECK(s3d_scene_begin_session(scn2, S3D_SESSION_SAMPLE|S3D_SESSION_TRACE), RES_OK);
FOR_EACH(i, 0, NSAMPS) {
const float u = rand_canonic();
const float v = rand_canonic();
const float w = rand_canonic();
- CHECK(s3d_sampler_get(sampler, u, v, w, &prim, uv), RES_OK);
+ CHECK(s3d_scene_sample(scn2, u, v, w, &prim, uv), RES_OK);
CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr0), RES_OK);
CHECK(prim.inst_id, cbox_id);
@@ -213,18 +205,13 @@ main(int argc, char** argv)
|| prim.geom_id == tall_block_id
|| prim.geom_id == short_block_id, 1);
CHECK(prim.geom_id < 10, 1);
- /* printf("%f %f %f\n", SPLIT3(attr0.value));*/
+ printf("%f %f %f\n", SPLIT3(attr0.value));
}
- CHECK(s3d_sampler_end_sampling(sampler), RES_OK);
-
- CHECK(s3d_sampler_ref_get(NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_ref_get(sampler), RES_OK);
- CHECK(s3d_sampler_ref_put(NULL), RES_BAD_ARG);
- CHECK(s3d_sampler_ref_put(sampler), RES_OK);
- CHECK(s3d_sampler_ref_put(sampler), RES_OK);
+ CHECK(s3d_scene_end_session(scn2), RES_OK);
CHECK(s3d_device_ref_put(dev), RES_OK);
CHECK(s3d_scene_ref_put(scn), RES_OK);
+ CHECK(s3d_scene_ref_put(scn2), RES_OK);
CHECK(s3d_shape_ref_put(cbox), RES_OK);
CHECK(s3d_shape_ref_put(walls), RES_OK);
CHECK(s3d_shape_ref_put(short_block), RES_OK);