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 25320c779fcd8356123e57e47d1ea23029c47182
parent 9e5a4eb0bb76b28fcc5ab8d08563af6dba327e87
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 25 Jul 2016 10:55:03 +0200

Change the CDF and #primitives CDF data layout

Map the CDF and #prims CDF with the shape identifier rather than with
the back-end Embree identifier since the Embree scene may be not
initialized if no TRACE sessions is active on the Star-3D scene.

Diffstat:
Msrc/s3d_scene.c | 51+++++++++++++++++++++++++++------------------------
Msrc/s3d_scene_c.h | 2+-
2 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/src/s3d_scene.c b/src/s3d_scene.c @@ -598,7 +598,7 @@ scene_compute_cdf(struct s3d_scene* scn) break; default: FATAL("Unreachable code\n"); break; } - fltui.ui = geom->irtc; + fltui.ui = *shape_id; fltui.flt = area; if(len) { res = darray_fltui_push_back(&scn->cdf, &fltui); @@ -714,7 +714,7 @@ scene_compute_nprims_cdf } cdf.nprims = nprims; - cdf.irtc = geom->irtc; + cdf.ishape = *shape_id; if(store_cdf && len) { res = darray_nprims_cdf_push_back(&scn->nprims_cdf, &cdf); if(res != RES_OK) goto error; @@ -785,7 +785,6 @@ scene_sync } goto error; } - htable_shape_iterator_next(&it); } scene_compute_aabb(scn); @@ -1152,10 +1151,11 @@ s3d_scene_sample struct s3d_primitive* primitive, /* sampled primitive */ float st[2]) { + 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; @@ -1185,7 +1185,7 @@ s3d_scene_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; + ishape = 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); @@ -1193,14 +1193,15 @@ s3d_scene_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; /* Transform u to the geometry CDF bounds */ if(fltui_found != fltui_begin) f -= fltui_found[-1].flt; } - geom = darray_geom_data_get(&scn->embree2geoms)[igeom]; - ASSERT(geom); + pgeom = htable_geom_find(&scn->cached_geoms, &ishape); + ASSERT(pgeom); + geom = *pgeom; if(geom->type == GEOM_MESH) { primitive->inst__ = NULL; @@ -1213,21 +1214,21 @@ s3d_scene_sample primitive->inst_id = geom->name; primitive->scene_prim_id = geom->scene_prim_id_offset; if(darray_fltui_size_get(&geom->data.instance->scene->cdf) == 1) { - igeom = darray_fltui_cdata_get(&geom->data.instance->scene->cdf)[0].ui; + ishape = darray_fltui_cdata_get(&geom->data.instance->scene->cdf)[0].ui; } else { fltui_begin = darray_fltui_cdata_get(&geom->data.instance->scene->cdf); fltui_end = fltui_begin + darray_fltui_size_get(&geom->data.instance->scene->cdf); fltui_found = std::lower_bound(fltui_begin, fltui_end, f); ASSERT(fltui_found != fltui_end); - igeom = fltui_found->ui; + ishape = fltui_found->ui; /* Transform u to the geometry CDF bounds */ if(fltui_found != fltui_begin) f -= fltui_found[-1].flt; } - geom = darray_geom_data_get - (&geom->data.instance->scene->embree2geoms)[igeom]; - ASSERT(geom); + pgeom = htable_geom_find(&geom->data.instance->scene->cached_geoms, &ishape); + ASSERT(pgeom); + geom = *pgeom; } ASSERT(geom->type == GEOM_MESH); @@ -1254,10 +1255,11 @@ res_T s3d_scene_get_primitive (struct s3d_scene* scn, const unsigned iprim, struct s3d_primitive* prim) { + struct geometry** pgeom; struct geometry* geom; const struct nprims_cdf* begin, *end, *found; size_t nprims; - size_t igeom; + unsigned ishape; size_t i; res_T res = RES_OK; @@ -1283,20 +1285,21 @@ s3d_scene_get_primitive i = iprim; if(darray_nprims_cdf_size_get(&scn->nprims_cdf) == 1) { - igeom = darray_nprims_cdf_cdata_get(&scn->nprims_cdf)[0].irtc; + ishape = darray_nprims_cdf_cdata_get(&scn->nprims_cdf)[0].ishape; } else { begin = darray_nprims_cdf_cdata_get(&scn->nprims_cdf); end = begin + darray_nprims_cdf_size_get(&scn->nprims_cdf); found = std::lower_bound(begin, end, i); ASSERT(found != end); - igeom = found->irtc; + ishape = found->ishape; if(found != begin) { ASSERT(i >= found[-1].nprims); i -= found[-1].nprims; } } - geom = darray_geom_data_get(&scn->embree2geoms)[igeom]; - ASSERT(geom); + pgeom = htable_geom_find(&scn->cached_geoms, &ishape); + ASSERT(pgeom); + geom = *pgeom; if(geom->type == GEOM_MESH) { prim->inst__ = NULL; @@ -1308,8 +1311,8 @@ s3d_scene_get_primitive prim->inst_id = geom->name; prim->scene_prim_id = geom->scene_prim_id_offset; if(darray_nprims_cdf_size_get(&geom->data.instance->scene->nprims_cdf)==1) { - igeom = darray_nprims_cdf_cdata_get - (&geom->data.instance->scene->nprims_cdf)[0].irtc; + ishape = darray_nprims_cdf_cdata_get + (&geom->data.instance->scene->nprims_cdf)[0].ishape; } else { begin = darray_nprims_cdf_cdata_get (&geom->data.instance->scene->nprims_cdf); @@ -1317,15 +1320,15 @@ s3d_scene_get_primitive (&geom->data.instance->scene->nprims_cdf); found = std::lower_bound(begin, end, i); ASSERT(found != end); - igeom = found->irtc; + ishape = found->ishape; if(found != begin) { ASSERT(i >= found[-1].nprims); i -= found[-1].nprims; } } - geom = darray_geom_data_get - (&geom->data.instance->scene->embree2geoms)[igeom]; - ASSERT(geom); + pgeom = htable_geom_find(&geom->data.instance->scene->cached_geoms, &ishape); + ASSERT(pgeom); + geom = *pgeom; } ASSERT(geom->type == GEOM_MESH); ASSERT(i < mesh_get_ntris(geom->data.mesh)); diff --git a/src/s3d_scene_c.h b/src/s3d_scene_c.h @@ -75,7 +75,7 @@ struct fltui { float flt; unsigned ui; }; #include <rsys/dynamic_array.h> /* Generate the darray_geom_nprims array */ -struct nprims_cdf { unsigned nprims, irtc; }; +struct nprims_cdf { unsigned nprims, ishape; }; #define DARRAY_NAME nprims_cdf #define DARRAY_DATA struct nprims_cdf #include <rsys/dynamic_array.h>