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