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