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 183236becc0a8f22baf6f1d1fd9f90b2a70900f3
parent eb04342ecda781aa7262c6844808b6c5cd9f3d29
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 27 Jul 2016 11:37:35 +0200

Avoid duplicate computations on instantiated shapes

Once registered, the instance already computed the whole sets of
internal data like its AABB or its sampling CDF. The parent session can
thus directly relies on these structures.

Diffstat:
Msrc/s3d_session.c | 18+++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/s3d_session.c b/src/s3d_session.c @@ -562,8 +562,7 @@ session_compute_cdf(struct s3d_session* session) } break; case GEOM_INSTANCE: - res = session_compute_cdf(geom->data.instance->session); - if(res != RES_OK) goto error; + /* The instance CDF was computed during its session synchronisation */ len = darray_fltui_size_get(&geom->data.instance->session->cdf); if(len) { area += darray_fltui_cdata_get @@ -596,8 +595,7 @@ session_compute_nprims_cdf unsigned nprims; res_T res = RES_OK; ASSERT(session); - - darray_nprims_cdf_clear(&session->nprims_cdf); + ASSERT(darray_nprims_cdf_size_get(&session->nprims_cdf) == 0); htable_geom_begin(&session->cached_geoms, &it); htable_geom_end(&session->cached_geoms, &end); @@ -620,9 +618,7 @@ session_compute_nprims_cdf nprims += (unsigned)len; break; case GEOM_INSTANCE: - res = session_compute_nprims_cdf - (geom->data.instance->session, store_cdf); - if(res != RES_OK) goto error; + /* The instance CDF was computed during its session synchronisation */ len = darray_nprims_cdf_size_get (&geom->data.instance->session->nprims_cdf); if(len) { @@ -673,7 +669,11 @@ session_compute_scene_aabb(struct s3d_session* session) case GEOM_MESH: mesh_compute_aabb(geom->data.mesh, lower, upper); break; case GEOM_INSTANCE: inst = geom->data.instance; - session_compute_scene_aabb(inst->session); + /* Note that the instance AABB was computed during its session + * synchronisation. */ + ASSERT(inst->session->lower[0] < inst->session->upper[0]); + ASSERT(inst->session->lower[1] < inst->session->upper[1]); + ASSERT(inst->session->lower[2] < inst->session->upper[2]); /* Transform local scene AABB in world space */ f33_mulf3(lower, inst->transform, inst->session->lower); f33_mulf3(upper, inst->transform, inst->session->upper); @@ -880,7 +880,7 @@ session_release(ref_T* ref) size_t n; (void)n; session_destroy_geometry(session, geom); n = htable_geom_erase(&session->cached_geoms, &shape_id); - ASSERT(n == 1); + ASSERT(n == 1); } darray_uint_clear(&session->detached_shapes);