star-gf

Compute Gebhart factors
git clone git://git.meso-star.fr/star-gf.git
Log | Files | Refs | README | LICENSE

commit 73d5158a39b2ea230665aa786ee8f35826720cd5
parent 9bccc772b1e8ec590b3063c3d455605ca3243942
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 19 Oct 2016 11:56:42 +0200

Add and test the primitives_count/integration_<begin|end> scene functions

Diffstat:
Msrc/sgf.h | 13+++++++++++++
Msrc/sgf_scene.c | 43+++++++++++++++++++++++++++++++++++++++++--
Msrc/test_sgf_scene3d.c | 15+++++++++++++++
3 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/src/sgf.h b/src/sgf.h @@ -156,6 +156,19 @@ sgf_scene3d_setup (struct sgf_scene* scn, const struct sgf_scene3d_desc* desc); +SGF_API res_T +sgf_scene_primitives_count + (struct sgf_scene* scn, + unsigned* nprims); + +SGF_API res_T +sgf_scene_integration_begin + (struct sgf_scene* scn); + +SGF_API res_T +sgf_scene_integration_end + (struct sgf_scene* scn); + /******************************************************************************* * Integration API ******************************************************************************/ diff --git a/src/sgf_scene.c b/src/sgf_scene.c @@ -33,8 +33,8 @@ struct sgf_scene { struct darray_double emi; /* Per primitive emissivity */ struct darray_double refl; /* Per primitive reflectivity */ struct darray_double spec; /* Per primitive specularity */ - size_t nprims; /* #primitives */ - size_t nbands; /* #spectral bands */ + unsigned nprims; /* #primitives */ + unsigned nbands; /* #spectral bands */ ref_T ref; struct sgf_device* dev; @@ -236,7 +236,46 @@ error: darray_double_clear(&scn->emi); darray_double_clear(&scn->refl); darray_double_clear(&scn->spec); + scn->nprims = 0; + scn->nbands = 0; } goto exit; } +res_T +sgf_scene_primitives_count(struct sgf_scene* scn, unsigned* nprims) +{ + if(!scn || !nprims) return RES_BAD_ARG; + *nprims = scn->nprims; + return RES_OK; +} + +res_T +sgf_scene_integration_begin(struct sgf_scene* scn) +{ + int session_mask; + if(!scn) return RES_BAD_ARG; + S3D(scene_get_session_mask(scn->s3d_scn, &session_mask)); + if(session_mask != 0) { + log_error(scn->dev, "%s: an integration process is already active.\n", + FUNC_NAME); + return RES_BAD_OP; + } + return s3d_scene_begin_session(scn->s3d_scn, S3D_TRACE|S3D_GET_PRIMITIVE); +} + +res_T +sgf_scene_integration_end(struct sgf_scene* scn) +{ + int session_mask; + if(!scn) return RES_BAD_ARG; + S3D(scene_get_session_mask(scn->s3d_scn, &session_mask)); + if(session_mask == 0) { + log_error(scn->dev, "%s: there is no active integration process.\n", + FUNC_NAME); + return RES_BAD_OP; + } + S3D(scene_end_session(scn->s3d_scn)); + return RES_OK; +} + diff --git a/src/test_sgf_scene3d.c b/src/test_sgf_scene3d.c @@ -41,6 +41,7 @@ main(int argc, char** argv) struct sgf_scene* scn; struct sgf_scene3d_desc desc = SGF_SCENE3D_DESC_NULL; struct shape_context ctx; + unsigned n; (void)argc, (void)argv; mem_init_proxy_allocator(&allocator, &mem_default_allocator); @@ -74,6 +75,12 @@ main(int argc, char** argv) CHECK(sgf_scene3d_setup(NULL, &desc), RES_BAD_ARG); CHECK(sgf_scene3d_setup(scn, &desc), RES_OK); + CHECK(sgf_scene_primitives_count(NULL, NULL), RES_BAD_ARG); + CHECK(sgf_scene_primitives_count(scn, NULL), RES_BAD_ARG); + CHECK(sgf_scene_primitives_count(NULL, &n), RES_BAD_ARG); + CHECK(sgf_scene_primitives_count(scn, &n), RES_OK); + CHECK(n, 2); + desc.get_position = NULL; CHECK(sgf_scene3d_setup(scn, &desc), RES_BAD_ARG); desc.get_position = get_pos; @@ -110,6 +117,14 @@ main(int argc, char** argv) ctx.absorption = absorption_bad; CHECK(sgf_scene3d_setup(scn, &desc), RES_BAD_ARG); + CHECK(sgf_scene_integration_begin(NULL), RES_BAD_ARG); + CHECK(sgf_scene_integration_begin(scn), RES_OK); + CHECK(sgf_scene_integration_begin(scn), RES_BAD_OP); + + CHECK(sgf_scene_integration_end(NULL), RES_BAD_ARG); + CHECK(sgf_scene_integration_end(scn), RES_OK); + CHECK(sgf_scene_integration_end(scn), RES_BAD_OP); + CHECK(sgf_scene_ref_get(NULL), RES_BAD_ARG); CHECK(sgf_scene_ref_get(scn), RES_OK); CHECK(sgf_scene_ref_put(NULL), RES_BAD_ARG);