commit 1fab474aecb6433ea98163ecd0f16c498be894cd
parent 7942343bd4ab2995f1673e0b7e6f9fd8e94f8a54
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 27 Jul 2016 10:24:19 +0200
Fix the deletion of the cached geometry
The geometry was not unregistered from the session cache.
Diffstat:
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/s3d_session.c b/src/s3d_session.c
@@ -103,7 +103,10 @@ on_shape_detach
geom = *pgeom;
if(session->mask == 0) {
/* The session is NOT in use. Directly rm the cached geometry */
+ size_t n; (void)n;
session_destroy_geometry(session, geom);
+ n = htable_geom_erase(&session->cached_geoms, &shape_id);
+ ASSERT(n == 1);
} else {
/* The session is in use. Delay the deletion of the cached geometry */
res_T res = darray_uint_push_back(&session->detached_shapes, &shape_id);
@@ -815,6 +818,7 @@ session_create(struct s3d_scene* scn, struct s3d_session** out_session)
darray_geom_init(scn->dev->allocator, &session->embree2geoms);
darray_fltui_init(scn->dev->allocator, &session->cdf);
darray_nprims_cdf_init(scn->dev->allocator, &session->nprims_cdf);
+ darray_uint_init(scn->dev->allocator, &session->detached_shapes);
f3_splat(session->lower, FLT_MAX);
f3_splat(session->upper,-FLT_MAX);
ref_init(&session->ref);
@@ -826,6 +830,7 @@ session_create(struct s3d_scene* scn, struct s3d_session** out_session)
goto error;
}
+ CLBK_INIT(&session->on_shape_detach_cb);
CLBK_SETUP(&session->on_shape_detach_cb, on_shape_detach, session);
SIG_CONNECT_CLBK(&scn->sig_shape_detach, &session->on_shape_detach_cb);
}
@@ -872,7 +877,10 @@ session_release(ref_T* ref)
const unsigned shape_id = darray_uint_cdata_get(&session->detached_shapes)[i];
struct geometry** pgeom = htable_geom_find(&session->cached_geoms, &shape_id);
struct geometry* geom = *pgeom;
+ size_t n; (void)n;
session_destroy_geometry(session, geom);
+ n = htable_geom_erase(&session->cached_geoms, &shape_id);
+ ASSERT(n == 1);
}
darray_uint_clear(&session->detached_shapes);
@@ -1384,7 +1392,7 @@ session_destroy(struct s3d_session* session)
/* Delete the cached geometries */
htable_geom_begin(&session->cached_geoms, &it);
htable_geom_end(&session->cached_geoms, &end);
- while(htable_geom_iterator_eq(&it, &end)) {
+ while(!htable_geom_iterator_eq(&it, &end)) {
struct geometry** pgeom = htable_geom_iterator_data_get(&it);
struct geometry* geom = *pgeom;
session_destroy_geometry(session, geom);