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 7b25850885890e45e21b83f3c031acdd9fd6481a
parent a6c78644de5d314813a68a48f0a365dddc968e58
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu,  6 Oct 2016 14:54:46 +0200

Create the Embree handle of a scene only if RT is required

Do not create the Embree scene on a scene view created without the
S3D_TRACE flag. This drastically reduces the memory when a lot of scene
views are created (e.g. several instantiated scenes) since the Embree
scene handle is quite heavy.

Diffstat:
Msrc/s3d_scene_view.c | 36+++++++++++++++++++++---------------
1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/src/s3d_scene_view.c b/src/s3d_scene_view.c @@ -319,10 +319,27 @@ static INLINE res_T scene_view_setup_embree(struct s3d_scene_view* scnview) { struct htable_geom_iterator it, end; + const RTCSceneFlags rtc_scene_mask = + RTC_SCENE_DYNAMIC + | RTC_SCENE_INCOHERENT + | RTC_SCENE_ROBUST; + const RTCAlgorithmFlags rtc_algorithm_mask = + RTC_INTERSECT1 + | RTC_INTERSECT4; int rtc_outdated = 0; res_T res = RES_OK; ASSERT(scnview); + /* The rtc_scn could be already allocated since the scene views are cached */ + if(!scnview->rtc_scn) { + scnview->rtc_scn = rtcDeviceNewScene + (scnview->scn->dev->rtc, rtc_scene_mask, rtc_algorithm_mask); + if(!scnview->rtc_scn) { + res = RES_MEM_ERR; + goto error; + } + } + htable_geom_begin(&scnview->cached_geoms, &it); htable_geom_end(&scnview->cached_geoms, &end); @@ -365,6 +382,10 @@ scene_view_setup_embree(struct s3d_scene_view* scnview) exit: return res; error: + if(scnview->rtc_scn) { + scnview->rtc_scn = NULL; + rtcDeleteScene(scnview->rtc_scn); + } darray_geom_clear(&scnview->embree2geoms); goto exit; } @@ -809,14 +830,6 @@ scene_view_create(struct s3d_scene* scn, struct s3d_scene_view** out_scnview) list_del(&scnview->node); ref_get(&scnview->ref); } else { - const RTCSceneFlags rtc_scene_mask = - RTC_SCENE_DYNAMIC - | RTC_SCENE_INCOHERENT - | RTC_SCENE_ROBUST; - const RTCAlgorithmFlags rtc_algorithm_mask = - RTC_INTERSECT1 - | RTC_INTERSECT4; - scnview = (struct s3d_scene_view*)MEM_CALLOC (scn->dev->allocator, 1, sizeof(struct s3d_scene_view)); if(!scnview) { @@ -833,13 +846,6 @@ scene_view_create(struct s3d_scene* scn, struct s3d_scene_view** out_scnview) f3_splat(scnview->upper,-FLT_MAX); ref_init(&scnview->ref); - scnview->rtc_scn = rtcDeviceNewScene - (scn->dev->rtc, rtc_scene_mask, rtc_algorithm_mask); - if(!scnview->rtc_scn) { - res = RES_MEM_ERR; - goto error; - } - CLBK_INIT(&scnview->on_shape_detach_cb); CLBK_SETUP(&scnview->on_shape_detach_cb, on_shape_detach, scnview); SIG_CONNECT_CLBK(&scn->sig_shape_detach, &scnview->on_shape_detach_cb);