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