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