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 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:
Msrc/s3d_session.c | 10+++++++++-
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);