solstice-solver

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

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:
Msrc/ssol.h | 15++++++++++++---
Msrc/ssol_object.c | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
Msrc/ssol_object_c.h | 28+++++++++++++++++++++++++---
Msrc/ssol_scene.c | 16++++++++++------
Msrc/ssol_solver.c | 11++++++++---
Msrc/ssol_solver_c.h | 1+
Msrc/test_ssol_instance.c | 3++-
Msrc/test_ssol_object.c | 33+++++++++++++++++++++++++++------
Msrc/test_ssol_scene.c | 3++-
Msrc/test_ssol_solver1.c | 6++++--
Msrc/test_ssol_solver2.c | 9++++++---
Msrc/test_ssol_solver2b.c | 9++++++---
Msrc/test_ssol_solver3.c | 6++++--
Msrc/test_ssol_solver3N.c | 6++++--
Msrc/test_ssol_solver4.c | 6++++--
Msrc/test_ssol_solver5.c | 6++++--
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);