star-3d

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

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:
Mcmake/CMakeLists.txt | 2+-
Msrc/s3d_primitive.c | 7+++++++
Msrc/s3d_scene.c | 19+++++++++++++++----
Msrc/test_s3d_sampler.c | 117+++++++++++++++++++++++++++++++++++--------------------------------------------
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);