solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit 02358199a72edd1dde31cc5e1d99f72a6abb6644
parent 380d1854116c64fa5b7638ac6b426c3785fd0460
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 29 Jun 2016 18:44:22 +0200

Add sun attachement to scenes.

Diffstat:
Msrc/ssol_scene.c | 33+++++++++++++++++++++++++++++++++
Msrc/ssol_scene_c.h | 1+
Msrc/ssol_sun_c.h | 1+
Msrc/test_ssol_scene.c | 13+++++++++++++
4 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/src/ssol_scene.c b/src/ssol_scene.c @@ -15,6 +15,7 @@ #include "ssol.h" #include "ssol_scene_c.h" +#include "ssol_sun_c.h" #include "ssol_device_c.h" #include "ssol_object_instance_c.h" @@ -38,6 +39,7 @@ scene_release(ref_T* ref) ASSERT(dev && dev->allocator); SSOL(scene_clear(scene)); if (scene->scene3D) s3d_scene_ref_put(scene->scene3D); + if (scene->sun) ssol_sun_ref_put(scene->sun); MEM_RM(dev->allocator, scene); SSOL(device_ref_put(dev)); } @@ -174,4 +176,35 @@ ssol_scene_clear scene_detach_instance(scene, instance); } return RES_OK; +} + +res_T +ssol_scene_attach_sun + (struct ssol_scene* scene, + struct ssol_sun* sun) +{ + if (!scene || ! sun || sun->scene_attachment) + return RES_BAD_ARG; + + SSOL(sun_ref_get(sun)); + scene->sun = sun; + sun->scene_attachment = scene; + return RES_OK; +} + +res_T +ssol_scene_detach_sun + (struct ssol_scene* scene, + struct ssol_sun* sun) +{ + if (!scene || !sun || sun->scene_attachment != scene) + return RES_BAD_ARG; + +#ifndef NDEBUG + ASSERT(sun == scene->sun); +#endif + sun->scene_attachment = NULL; + scene->sun = NULL; + SSOL(sun_ref_put(sun)); + return RES_OK; } \ No newline at end of file diff --git a/src/ssol_scene_c.h b/src/ssol_scene_c.h @@ -23,6 +23,7 @@ struct ssol_scene { struct list_node instances; /* List of attached instances */ size_t instances_count; struct s3d_scene* scene3D; + struct ssol_sun* sun; struct ssol_device* dev; ref_T ref; diff --git a/src/ssol_sun_c.h b/src/ssol_sun_c.h @@ -36,6 +36,7 @@ struct csr { struct ssol_sun { double direction[3]; struct ssol_spectrum* spectrum; + struct ssol_scene* scene_attachment; enum sun_type type; union { struct pillbox pillbox; diff --git a/src/test_ssol_scene.c b/src/test_ssol_scene.c @@ -34,6 +34,7 @@ main(int argc, char** argv) struct ssol_material* material; struct ssol_object* object; struct ssol_object_instance* instance; + struct ssol_sun* sun; struct ssol_scene* scene; double transform[12]; (void) argc, (void) argv; @@ -62,6 +63,7 @@ main(int argc, char** argv) CHECK(ssol_object_create(dev, shape, material, &object), RES_OK); CHECK(ssol_object_instantiate(object, &instance), RES_OK); CHECK(ssol_object_instance_set_transform(instance, transform), RES_OK); + CHECK(ssol_sun_create_directional(dev, &sun), RES_OK); CHECK(ssol_scene_create(dev, &scene), RES_OK); @@ -83,11 +85,22 @@ main(int argc, char** argv) CHECK(ssol_scene_clear(NULL), RES_BAD_ARG); CHECK(ssol_scene_clear(scene), RES_OK); + CHECK(ssol_scene_attach_sun(NULL, sun), RES_BAD_ARG); + CHECK(ssol_scene_attach_sun(scene, NULL), RES_BAD_ARG); + CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); + CHECK(ssol_scene_attach_sun(scene, sun), RES_BAD_ARG); + + CHECK(ssol_scene_detach_sun(NULL, sun), RES_BAD_ARG); + CHECK(ssol_scene_detach_sun(scene, NULL), RES_BAD_ARG); + CHECK(ssol_scene_detach_sun(scene, sun), RES_OK); + CHECK(ssol_scene_detach_sun(scene, sun), RES_BAD_ARG); + CHECK(ssol_scene_ref_put(scene), RES_OK); CHECK(ssol_object_instance_ref_put(instance), RES_OK); CHECK(ssol_object_ref_put(object), RES_OK); CHECK(ssol_shape_ref_put(shape), RES_OK); + CHECK(ssol_sun_ref_put(sun), RES_OK); CHECK(ssol_material_ref_put(material), RES_OK); CHECK(ssol_device_ref_put(dev), RES_OK);