commit 26448d429ba04670b617bde8f27f1af5ff97a8b8
parent c917b8bec4cc2abdf1d34e817df4c5c7718397ba
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 7 Oct 2016 16:40:53 +0200
Draft of multiple shapes per object
Note that the solver tests still crash.
Diffstat:
16 files changed, 237 insertions(+), 59 deletions(-)
diff --git a/src/ssol.h b/src/ssol.h
@@ -403,9 +403,6 @@ ssol_mirror_set_shader
SSOL_API res_T
ssol_object_create
(struct ssol_device* dev,
- struct ssol_shape* shape,
- struct ssol_material* mtl_front, /* Material to apply to front faces */
- struct ssol_material* mtl_back, /* Material to apply to back faces */
struct ssol_object** obj);
SSOL_API res_T
@@ -416,6 +413,18 @@ SSOL_API res_T
ssol_object_ref_put
(struct ssol_object* obj);
+SSOL_API res_T
+ssol_object_add_shaded_shape
+ (struct ssol_object* object,
+ struct ssol_shape* shape,
+ struct ssol_material* mtl_front, /* Front face material of the shape */
+ struct ssol_material* mtl_back); /* Back face material of the shape */
+
+/* Remove all the shaded shapes */
+SSOL_API res_T
+ssol_object_clear
+ (struct ssol_object* object);
+
/*******************************************************************************
* Object Instance API - Clone of an object with a set of per instance data as
* world transformation, material parameters, etc. Note that the object
diff --git a/src/ssol_object.c b/src/ssol_object.c
@@ -33,9 +33,10 @@ object_release(ref_T* ref)
ASSERT(ref);
dev = object->dev;
ASSERT(dev && dev->allocator);
- SSOL(shape_ref_put(object->shape));
- SSOL(material_ref_put(object->mtl_front));
- SSOL(material_ref_put(object->mtl_back));
+ SSOL(object_clear(object));
+ darray_shaded_shape_release(&object->shaded_shapes);
+ htable_shaded_shape_release(&object->shaded_shapes_rt);
+ htable_shaded_shape_release(&object->shaded_shapes_samp);
if(object->scn_rt) S3D(scene_ref_put(object->scn_rt));
if(object->scn_samp) S3D(scene_ref_put(object->scn_samp));
MEM_RM(dev->allocator, object);
@@ -48,15 +49,12 @@ object_release(ref_T* ref)
res_T
ssol_object_create
(struct ssol_device* dev,
- struct ssol_shape* shape,
- struct ssol_material* mtl_front,
- struct ssol_material* mtl_back,
struct ssol_object** out_object)
{
struct ssol_object* object = NULL;
res_T res = RES_OK;
- if(!dev || !shape || !mtl_front || !mtl_back || !out_object) {
+ if(!dev || !out_object) {
res = RES_BAD_ARG;
goto error;
}
@@ -66,28 +64,19 @@ ssol_object_create
res = RES_MEM_ERR;
goto error;
}
- /* Check if material/shape association is legit: TODO */
- SSOL(shape_ref_get(shape));
- SSOL(material_ref_get(mtl_front));
- SSOL(material_ref_get(mtl_back));
SSOL(device_ref_get(dev));
object->dev = dev;
- object->shape = shape;
- object->mtl_front = mtl_front;
- object->mtl_back = mtl_back;
ref_init(&object->ref);
+ darray_shaded_shape_init(dev->allocator, &object->shaded_shapes);
+ htable_shaded_shape_init(dev->allocator, &object->shaded_shapes_rt);
+ htable_shaded_shape_init(dev->allocator, &object->shaded_shapes_samp);
/* Create the Star-3D RT scene to instantiate through the instance */
res = s3d_scene_create(dev->s3d, &object->scn_rt);
if(res != RES_OK) goto error;
- res = s3d_scene_attach_shape(object->scn_rt, object->shape->shape_rt);
- if(res != RES_OK) goto error;
-
/* Create the Star-3D sampling scene to instantiated through the instance */
res = s3d_scene_create(dev->s3d, &object->scn_samp);
if(res != RES_OK) goto error;
- res = s3d_scene_attach_shape(object->scn_samp, object->shape->shape_samp);
- if(res != RES_OK) goto error;
exit:
if(out_object) *out_object = object;
@@ -99,7 +88,6 @@ error:
}
goto exit;
}
-
res_T
ssol_object_ref_get(struct ssol_object* object)
{
@@ -116,3 +104,113 @@ ssol_object_ref_put(struct ssol_object* object)
return RES_OK;
}
+res_T
+ssol_object_add_shaded_shape
+ (struct ssol_object* object,
+ struct ssol_shape* shape,
+ struct ssol_material* front,
+ struct ssol_material* back)
+{
+ enum {
+ ATTACH_S3D_RT, ATTACH_S3D_SAMP, REGISTER_RT, REGISTER_SAMP, REGISTER_SHAPE
+ };
+ struct shaded_shape* shaded_shape;
+ unsigned id_rt, id_samp;
+ size_t i;
+ int mask = 0;
+ res_T res = RES_OK;
+
+ if(!object || !shape || !front || !back) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ S3D(shape_get_id(shape->shape_rt, &id_rt));
+ S3D(shape_get_id(shape->shape_rt, &id_samp));
+ if(htable_shaded_shape_find(&object->shaded_shapes_rt, &id_rt)) {
+ log_warning
+ (object->dev, "%s: the already already own the shape.\n", FUNC_NAME);
+ goto exit;
+ }
+
+ /* Add the shape RT to the RT scene of the object */
+ res = s3d_scene_attach_shape(object->scn_rt, shape->shape_rt);
+ if(res != RES_OK) goto error;
+ mask |= BIT(ATTACH_S3D_RT);
+
+ /* Add the shape samp to the sampling scene of the object */
+ res = s3d_scene_attach_shape(object->scn_samp, shape->shape_samp);
+ if(res != RES_OK) goto error;
+ mask |= BIT(ATTACH_S3D_SAMP);
+
+ /* Ask for a shaded shape identifier */
+ i = darray_shaded_shape_size_get(&object->shaded_shapes);
+ res = darray_shaded_shape_resize(&object->shaded_shapes, i+1);
+ if(res != RES_OK) goto error;
+ mask |= BIT(REGISTER_SHAPE);
+
+ /* Register the RT shape identifer */
+ res = htable_shaded_shape_set(&object->shaded_shapes_rt, &id_rt, &i);
+ if(res != RES_OK) goto error;
+ mask |= BIT(REGISTER_RT);
+
+ /* Register the samp shape identifier */
+ res = htable_shaded_shape_set(&object->shaded_shapes_samp, &id_samp, &i);
+ if(res != RES_OK) goto error;
+ mask |= BIT(REGISTER_SAMP);
+
+ /* Setup the object shaded shape */
+ SSOL(shape_ref_get(shape));
+ SSOL(material_ref_get(front));
+ SSOL(material_ref_get(back));
+ shaded_shape = darray_shaded_shape_data_get(&object->shaded_shapes)+i;
+ shaded_shape->shape = shape;
+ shaded_shape->mtl_front = front;
+ shaded_shape->mtl_back = back;
+
+exit:
+ return res;
+error:
+ if(mask & BIT(ATTACH_S3D_RT)) {
+ S3D(scene_detach_shape(object->scn_rt, shape->shape_rt));
+ }
+ if(mask & BIT(ATTACH_S3D_SAMP)) {
+ S3D(scene_detach_shape(object->scn_samp, shape->shape_samp));
+ }
+ if(mask & BIT(REGISTER_SHAPE)) {
+ darray_shaded_shape_pop_back(&object->shaded_shapes);
+ }
+ if(mask & BIT(REGISTER_RT)) {
+ i = htable_shaded_shape_erase(&object->shaded_shapes_rt, &id_rt);
+ ASSERT(i == 1);
+ }
+ if(mask & BIT(REGISTER_SAMP)) {
+ i = htable_shaded_shape_erase(&object->shaded_shapes_samp, &id_samp);
+ ASSERT(i == 1);
+ }
+ goto exit;
+}
+
+res_T
+ssol_object_clear(struct ssol_object* obj)
+{
+ size_t i, n;
+ if(!obj) return RES_BAD_ARG;
+
+ n = darray_shaded_shape_size_get(&obj->shaded_shapes);
+ FOR_EACH(i, 0, n) {
+ struct shaded_shape* s = darray_shaded_shape_data_get(&obj->shaded_shapes);
+ SSOL(shape_ref_put(s->shape));
+ SSOL(material_ref_put(s->mtl_front));
+ SSOL(material_ref_put(s->mtl_back));
+ }
+ darray_shaded_shape_clear(&obj->shaded_shapes);
+ htable_shaded_shape_clear(&obj->shaded_shapes_rt);
+ htable_shaded_shape_clear(&obj->shaded_shapes_samp);
+
+ S3D(scene_clear(obj->scn_rt));
+ S3D(scene_clear(obj->scn_samp));
+
+ return RES_OK;
+}
+
diff --git a/src/ssol_object_c.h b/src/ssol_object_c.h
@@ -16,12 +16,34 @@
#ifndef SSOL_OBJECT_C_H
#define SSOL_OBJECT_C_H
+#include <rsys/dynamic_array.h>
+#include <rsys/hash_table.h>
#include <rsys/ref_count.h>
-struct ssol_object {
+struct shaded_shape {
struct ssol_shape* shape;
- struct ssol_material* mtl_front; /* Front faces material */
- struct ssol_material* mtl_back; /* Back faces material */
+ struct ssol_material* mtl_back; /* Material of the front faces */
+ struct ssol_material* mtl_front; /* Material of the back faces */
+};
+
+/* Define the darray_shaded_shapedata structure */
+#define DARRAY_NAME shaded_shape
+#define DARRAY_DATA struct shaded_shape
+#include <rsys/dynamic_array.h>
+
+/* Define the htable_shaded_shape data structure */
+#define HTABLE_NAME shaded_shape
+#define HTABLE_KEY unsigned /* S3D object instance identifier */
+#define HTABLE_DATA size_t
+#include <rsys/hash_table.h>
+
+struct ssol_object {
+ /* List of shaded shapes added to the object */
+ struct darray_shaded_shape shaded_shapes;
+
+ /* Map the RT/Samp S3D id to an entry into the shaded_shapes array */
+ struct htable_shaded_shape shaded_shapes_rt;
+ struct htable_shaded_shape shaded_shapes_samp;
struct s3d_scene* scn_rt; /* RT scene to instantiate */
struct s3d_scene* scn_samp; /* Sampling scene to instantiate */
diff --git a/src/ssol_scene.c b/src/ssol_scene.c
@@ -289,9 +289,8 @@ scene_setup_s3d_sampling_scene
unsigned id;
htable_instance_iterator_next(&it);
- if (!str_is_empty(&inst->receiver_back)
- || !str_is_empty(&inst->receiver_front))
- {
+ if(!str_is_empty(&inst->receiver_back)
+ || !str_is_empty(&inst->receiver_front)) {
hr = 1;
}
@@ -338,10 +337,12 @@ hit_filter_function
void* filter_data)
{
struct ssol_instance* inst;
+ const struct shaded_shape* shaded_shape;
const struct ssol_shape* shape;
const struct str* receiver_name;
struct realisation* rs = realisation;
struct segment* seg;
+ size_t id;
(void) filter_data, (void) org, (void) dir;
ASSERT(rs);
@@ -355,7 +356,10 @@ hit_filter_function
ASSERT(seg->self_front != NON_BOOL);
inst = *htable_instance_find(&rs->data.scene->instances_rt, &hit->prim.inst_id);
- shape = inst->object->shape;
+ id = *htable_shaded_shape_find
+ (&inst->object->shaded_shapes_rt, &hit->prim.geom_id);
+ shaded_shape = darray_shaded_shape_cdata_get(&inst->object->shaded_shapes)+id;
+ shape = shaded_shape->shape;
seg->on_punched = (shape->type == SHAPE_PUNCHED);
switch (shape->type) {
case SHAPE_MESH: {
@@ -413,11 +417,11 @@ hit_filter_function
}
if(seg->hit_front) {
- seg->hit_material = inst->object->mtl_front;
+ seg->hit_material = shaded_shape->mtl_front;
receiver_name = &inst->receiver_front;
} else {
d3_muld(seg->hit_normal, seg->hit_normal, -1);
- seg->hit_material = inst->object->mtl_back;
+ seg->hit_material = shaded_shape->mtl_back;
receiver_name = &inst->receiver_back;
}
diff --git a/src/ssol_solver.c b/src/ssol_solver.c
@@ -470,6 +470,7 @@ sample_starting_point(struct realisation* rs)
struct solver_data* data;
struct s3d_primitive sampl_prim;
struct starting_point* start;
+ size_t id;
ASSERT(rs);
data = &rs->data;
@@ -488,7 +489,11 @@ sample_starting_point(struct realisation* rs)
start->instance = *htable_instance_find
(&data->scene->instances_samp, &sampl_prim.inst_id);
start->sampl_primitive = sampl_prim;
- shape = start->instance->object->shape;
+ id = *htable_shaded_shape_find
+ (&start->instance->object->shaded_shapes_samp, &sampl_prim.geom_id);
+ start->shaded_shape = darray_shaded_shape_cdata_get
+ (&start->instance->object->shaded_shapes)+id;
+ shape = start->shaded_shape->shape;
start->on_punched = (shape->type == SHAPE_PUNCHED);
/* set sampling normal */
S3D(primitive_get_attrib(&sampl_prim, S3D_GEOMETRY_NORMAL, start->uv, &attrib));
@@ -581,9 +586,9 @@ receive_sunlight(struct realisation* rs)
start->geom_cos = d3_dot(start->rt_normal, start->sundir);
start->front_exposed = start->geom_cos < 0;
if (start->front_exposed) {
- start->material = start->instance->object->mtl_front;
+ start->material = start->shaded_shape->mtl_front;
} else {
- start->material = start->instance->object->mtl_back;
+ start->material = start->shaded_shape->mtl_back;
}
/* normals must face the sun and cos must be positive */
if (start->geom_cos > 0) {
diff --git a/src/ssol_solver_c.h b/src/ssol_solver_c.h
@@ -80,6 +80,7 @@ struct segment {
struct starting_point {
struct ssol_instance* instance;
+ const struct shaded_shape* shaded_shape;
const struct ssol_material* material;
struct s3d_primitive sampl_primitive;
double sundir[3];
diff --git a/src/test_ssol_instance.c b/src/test_ssol_instance.c
@@ -44,7 +44,8 @@ main(int argc, char** argv)
CHECK(ssol_material_create_virtual(dev, &material), RES_OK);
CHECK(ssol_shape_create_punched_surface(dev, &shape), RES_OK);
- CHECK(ssol_object_create(dev, shape, material, material, &object), RES_OK);
+ CHECK(ssol_object_create(dev, &object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(object, shape, material, material), RES_OK);
CHECK(ssol_object_instantiate(object, &instance), RES_OK);
diff --git a/src/test_ssol_object.c b/src/test_ssol_object.c
@@ -43,11 +43,27 @@ main(int argc, char** argv)
CHECK(ssol_material_create_virtual(dev, &mtl2), RES_OK);
CHECK(ssol_shape_create_punched_surface(dev, &shape), RES_OK);
- CHECK(ssol_object_create(NULL, shape, mtl, NULL, &object), RES_BAD_ARG);
- CHECK(ssol_object_create(dev, NULL, mtl, NULL, &object), RES_BAD_ARG);
- CHECK(ssol_object_create(dev, shape, NULL, mtl, &object), RES_BAD_ARG);
- CHECK(ssol_object_create(dev, shape, mtl, mtl, NULL), RES_BAD_ARG);
- CHECK(ssol_object_create(dev, shape, mtl, mtl, &object), RES_OK);
+ CHECK(ssol_object_create(NULL, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_create(dev, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_create(NULL, &object), RES_BAD_ARG);
+ CHECK(ssol_object_create(dev, &object), RES_OK);
+
+ CHECK(ssol_object_add_shaded_shape(NULL, NULL, NULL, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(object, NULL, NULL, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(NULL, shape, NULL, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(object, shape, NULL, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(NULL, NULL, mtl, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(object, NULL, mtl, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(NULL, shape, mtl, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(object, shape, mtl, NULL), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(NULL, NULL, NULL, mtl), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(object, NULL, NULL, mtl), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(NULL, shape, NULL, mtl), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(object, shape, NULL, mtl), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(NULL, NULL, mtl, mtl), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(object, NULL, mtl, mtl), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(NULL, shape, mtl, mtl), RES_BAD_ARG);
+ CHECK(ssol_object_add_shaded_shape(object, shape, mtl, mtl), RES_OK);
CHECK(ssol_object_ref_get(NULL), RES_BAD_ARG);
CHECK(ssol_object_ref_get(object), RES_OK);
@@ -55,7 +71,12 @@ main(int argc, char** argv)
CHECK(ssol_object_ref_put(object), RES_OK);
CHECK(ssol_object_ref_put(object), RES_OK);
- CHECK(ssol_object_create(dev, shape, mtl, mtl2, &object), RES_OK);
+ CHECK(ssol_object_create(dev, &object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(object, shape, mtl, mtl2), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(object, shape, mtl2, mtl), RES_OK);
+
+ CHECK(ssol_object_clear(NULL), RES_BAD_ARG);
+ CHECK(ssol_object_clear(object), RES_OK);
CHECK(ssol_object_ref_put(object), RES_OK);
CHECK(ssol_shape_ref_put(shape), RES_OK);
diff --git a/src/test_ssol_scene.c b/src/test_ssol_scene.c
@@ -53,7 +53,8 @@ main(int argc, char** argv)
CHECK(ssol_material_create_virtual(dev, &material), RES_OK);
CHECK(ssol_shape_create_punched_surface(dev, &shape), RES_OK);
- CHECK(ssol_object_create(dev, shape, material, material, &object), RES_OK);
+ CHECK(ssol_object_create(dev, &object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(object, shape, material, material), RES_OK);
CHECK(ssol_object_instantiate(object, &instance), RES_OK);
CHECK(ssol_instance_set_transform(instance, transform), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun), RES_OK);
diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c
@@ -121,7 +121,8 @@ main(int argc, char** argv)
CHECK(ssol_mirror_set_shader(m_mtl, &shader), RES_OK);
CHECK(ssol_material_create_virtual(dev, &v_mtl), RES_OK);
- CHECK(ssol_object_create(dev, square, m_mtl, m_mtl, &m_object), RES_OK);
+ CHECK(ssol_object_create(dev, &m_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(m_object, square, m_mtl, m_mtl), RES_OK);
CHECK(ssol_object_instantiate(m_object, &heliostat), RES_OK);
CHECK(ssol_instance_set_receiver(heliostat, "miroir", NULL), RES_OK);
CHECK(ssol_instance_set_target_mask(heliostat, 0x1, 0), RES_OK);
@@ -133,7 +134,8 @@ main(int argc, char** argv)
CHECK(ssol_instance_set_target_mask(secondary, 0x2, 0), RES_OK);
CHECK(ssol_scene_attach_instance(scene, secondary), RES_OK);
- CHECK(ssol_object_create(dev, square, v_mtl, v_mtl, &t_object), RES_OK);
+ CHECK(ssol_object_create(dev, &t_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK);
CHECK(ssol_object_instantiate(t_object, &target), RES_OK);
CHECK(ssol_instance_set_transform(target, transform2), RES_OK);
CHECK(ssol_instance_set_receiver(target, "cible", NULL), RES_OK);
diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c
@@ -146,7 +146,8 @@ main(int argc, char** argv)
CHECK(ssol_mirror_set_shader(m_mtl, &shader), RES_OK);
CHECK(ssol_material_create_virtual(dev, &v_mtl), RES_OK);
- CHECK(ssol_object_create(dev, rect, m_mtl, m_mtl, &m_object), RES_OK);
+ CHECK(ssol_object_create(dev, &m_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(m_object, rect, m_mtl, m_mtl), RES_OK);
CHECK(ssol_object_instantiate(m_object, &heliostat1), RES_OK);
CHECK(ssol_object_instantiate(m_object, &heliostat2), RES_OK);
CHECK(ssol_instance_set_receiver(heliostat1, "miroir", NULL), RES_OK);
@@ -158,14 +159,16 @@ main(int argc, char** argv)
CHECK(ssol_scene_attach_instance(scene, heliostat1), RES_OK);
CHECK(ssol_scene_attach_instance(scene, heliostat2), RES_OK);
- CHECK(ssol_object_create(dev, quad_square, m_mtl, m_mtl, &s_object), RES_OK);
+ CHECK(ssol_object_create(dev, &s_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(s_object, quad_square, m_mtl, m_mtl), RES_OK);
CHECK(ssol_object_instantiate(s_object, &secondary), RES_OK);
CHECK(ssol_instance_set_receiver(secondary, "secondaire", NULL), RES_OK);
CHECK(ssol_instance_set_transform(secondary, transform1), RES_OK);
CHECK(ssol_instance_dont_sample(secondary, 1), RES_OK);
CHECK(ssol_scene_attach_instance(scene, secondary), RES_OK);
- CHECK(ssol_object_create(dev, square, v_mtl, v_mtl, &t_object), RES_OK);
+ CHECK(ssol_object_create(dev, &t_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK);
CHECK(ssol_object_instantiate(t_object, &target), RES_OK);
CHECK(ssol_instance_set_transform(target, transform2), RES_OK);
CHECK(ssol_instance_set_receiver(target, "cible", NULL), RES_OK);
diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c
@@ -151,7 +151,8 @@ main(int argc, char** argv)
CHECK(ssol_mirror_set_shader(m_mtl, &shader), RES_OK);
CHECK(ssol_material_create_virtual(dev, &v_mtl), RES_OK);
- CHECK(ssol_object_create(dev, quad_rect, m_mtl, m_mtl, &m_object), RES_OK);
+ CHECK(ssol_object_create(dev, &m_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(m_object, quad_rect, m_mtl, m_mtl), RES_OK);
CHECK(ssol_object_instantiate(m_object, &heliostat1), RES_OK);
CHECK(ssol_object_instantiate(m_object, &heliostat2), RES_OK);
CHECK(ssol_instance_set_receiver(heliostat1, "miroir", NULL), RES_OK);
@@ -163,14 +164,16 @@ main(int argc, char** argv)
CHECK(ssol_scene_attach_instance(scene, heliostat1), RES_OK);
CHECK(ssol_scene_attach_instance(scene, heliostat2), RES_OK);
- CHECK(ssol_object_create(dev, quad_square, m_mtl, m_mtl, &s_object), RES_OK);
+ CHECK(ssol_object_create(dev, &s_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(s_object, quad_square, m_mtl, m_mtl), RES_OK);
CHECK(ssol_object_instantiate(s_object, &secondary), RES_OK);
CHECK(ssol_instance_set_receiver(secondary, "secondaire", NULL), RES_OK);
CHECK(ssol_instance_set_transform(secondary, transform1), RES_OK);
CHECK(ssol_instance_dont_sample(secondary, 1), RES_OK);
CHECK(ssol_scene_attach_instance(scene, secondary), RES_OK);
- CHECK(ssol_object_create(dev, rect, v_mtl, v_mtl, &t_object), RES_OK);
+ CHECK(ssol_object_create(dev, &t_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(t_object, rect, v_mtl, v_mtl), RES_OK);
CHECK(ssol_object_instantiate(t_object, &target), RES_OK);
CHECK(ssol_instance_set_transform(target, transform2), RES_OK);
CHECK(ssol_instance_set_receiver(target, "cible", NULL), RES_OK);
diff --git a/src/test_ssol_solver3.c b/src/test_ssol_solver3.c
@@ -121,12 +121,14 @@ main(int argc, char** argv)
CHECK(ssol_mirror_set_shader(m_mtl, &shader), RES_OK);
CHECK(ssol_material_create_virtual(dev, &v_mtl), RES_OK);
- CHECK(ssol_object_create(dev, quad_square, m_mtl, m_mtl, &m_object), RES_OK);
+ CHECK(ssol_object_create(dev, &m_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(m_object, quad_square, m_mtl, m_mtl), RES_OK);
CHECK(ssol_object_instantiate(m_object, &heliostat), RES_OK);
CHECK(ssol_instance_set_receiver(heliostat, "heliostat", NULL), RES_OK);
CHECK(ssol_scene_attach_instance(scene, heliostat), RES_OK);
- CHECK(ssol_object_create(dev, square, v_mtl, v_mtl, &t_object), RES_OK);
+ CHECK(ssol_object_create(dev, &t_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK);
CHECK(ssol_object_instantiate(t_object, &target), RES_OK);
CHECK(ssol_instance_set_transform(target, transform), RES_OK);
CHECK(ssol_instance_set_receiver(target, "cible", NULL), RES_OK);
diff --git a/src/test_ssol_solver3N.c b/src/test_ssol_solver3N.c
@@ -164,7 +164,8 @@ main(int argc, char** argv)
CHECK(ssol_mirror_set_shader(m_mtl, &shader), RES_OK);
CHECK(ssol_material_create_virtual(dev, &v_mtl), RES_OK);
- CHECK(ssol_object_create(dev, quad_square, m_mtl, v_mtl, &m_object), RES_OK);
+ CHECK(ssol_object_create(dev, &m_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(m_object, quad_square, m_mtl, v_mtl), RES_OK);
common.scene = scene;
d3_set(common.sun_dir, sun_dir);
@@ -190,7 +191,8 @@ main(int argc, char** argv)
d33_rotation_pitch(transform, PI); /* flip faces: invert normal */
d3_set(transform + 9, target_pos);
- CHECK(ssol_object_create(dev, square, v_mtl, v_mtl, &t_object), RES_OK);
+ CHECK(ssol_object_create(dev, &t_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK);
CHECK(ssol_object_instantiate(t_object, &target), RES_OK);
CHECK(ssol_instance_set_transform(target, transform), RES_OK);
CHECK(ssol_instance_set_receiver(target, "cible", NULL), RES_OK);
diff --git a/src/test_ssol_solver4.c b/src/test_ssol_solver4.c
@@ -123,11 +123,13 @@ main(int argc, char** argv)
CHECK(ssol_mirror_set_shader(m_mtl, &shader), RES_OK);
CHECK(ssol_material_create_virtual(dev, &v_mtl), RES_OK);
- CHECK(ssol_object_create(dev, quad_square, m_mtl, m_mtl, &m_object), RES_OK);
+ CHECK(ssol_object_create(dev, &m_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(m_object, quad_square, m_mtl, m_mtl), RES_OK);
CHECK(ssol_object_instantiate(m_object, &heliostat), RES_OK);
CHECK(ssol_scene_attach_instance(scene, heliostat), RES_OK);
- CHECK(ssol_object_create(dev, square, v_mtl, v_mtl, &t_object), RES_OK);
+ CHECK(ssol_object_create(dev, &t_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK);
CHECK(ssol_object_instantiate(t_object, &target1), RES_OK);
CHECK(ssol_instance_set_transform(target1, transform), RES_OK);
CHECK(ssol_instance_set_receiver(target1, "cible1", NULL), RES_OK);
diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c
@@ -122,11 +122,13 @@ main(int argc, char** argv)
CHECK(ssol_mirror_set_shader(m_mtl, &shader), RES_OK);
CHECK(ssol_material_create_virtual(dev, &v_mtl), RES_OK);
- CHECK(ssol_object_create(dev, quad_square, m_mtl, m_mtl, &m_object), RES_OK);
+ CHECK(ssol_object_create(dev, &m_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(m_object, quad_square, m_mtl, m_mtl), RES_OK);
CHECK(ssol_object_instantiate(m_object, &heliostat), RES_OK);
CHECK(ssol_scene_attach_instance(scene, heliostat), RES_OK);
- CHECK(ssol_object_create(dev, rect, v_mtl, v_mtl, &t_object), RES_OK);
+ CHECK(ssol_object_create(dev, &t_object), RES_OK);
+ CHECK(ssol_object_add_shaded_shape(t_object, rect, v_mtl, v_mtl), RES_OK);
CHECK(ssol_object_instantiate(t_object, &target), RES_OK);
CHECK(ssol_instance_set_transform(target, transform), RES_OK);
CHECK(ssol_instance_set_receiver(target, "cible", NULL), RES_OK);