solstice-solver

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

commit 90111b058e4a7388fd5505b8a705cd1668431119
parent c15a9a41515a5d2433fbb2190bd0c83b153fbddb
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 11 Oct 2016 14:29:43 +0200

Change the ssol_instance_set_receiver API

Diffstat:
Msrc/ssol.h | 31+++++++++++++++----------------
Msrc/ssol_c.h | 57+++++++++++++++++++++------------------------------------
Msrc/ssol_device_c.h | 6++++++
Msrc/ssol_instance.c | 72+++++++++++++++++++++---------------------------------------------------
Msrc/ssol_instance_c.h | 10++++++----
Msrc/ssol_scene.c | 21+++++++++++++--------
Msrc/ssol_scene_c.h | 7+++++++
Msrc/ssol_shape.c | 11-----------
Msrc/ssol_solver.c | 31+++++++++++++++----------------
Msrc/ssol_solver_c.h | 2+-
Msrc/test_ssol_instance.c | 9++-------
Msrc/test_ssol_shape.c | 6------
Msrc/test_ssol_solver1.c | 30+++++++++++++++---------------
Msrc/test_ssol_solver2.c | 12++++++------
Msrc/test_ssol_solver2b.c | 12++++++------
Msrc/test_ssol_solver3.c | 8++++----
Msrc/test_ssol_solver3N.c | 6+++---
Msrc/test_ssol_solver4.c | 12++++++------
Msrc/test_ssol_solver5.c | 6+++---
Msrc/test_ssol_utils.c | 6+++---
Msrc/test_ssol_utils.h | 2+-
21 files changed, 154 insertions(+), 203 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -201,13 +201,17 @@ struct ssol_mirror_shader { static const struct ssol_mirror_shader SSOL_MIRROR_SHADER_NULL = SSOL_MIRROR_SHADER_NULL__; -/* The type of data produced on receiver hits - as ssol_solve() write them on its FILE* argument */ -struct receiver_data { +/* The type of data produced on receiver hits as ssol_solve() write them on its + * FILE* argument */ +struct ssol_receiver_data { uint64_t realization_id; int64_t date; uint32_t segment_id; - uint32_t receiver_id; + + /* Its absolute value is the identifier of an SSOL instance. A negative + * value means for back faces primitive */ + int32_t receiver_id; + float wavelength; float pos[3]; float in_dir[3]; @@ -377,12 +381,6 @@ SSOL_API res_T ssol_shape_ref_put (struct ssol_shape* shape); -/* Retrieve the id of the shape */ -SSOL_API res_T -ssol_shape_get_id - (struct ssol_shape* shape, - uint32_t* id); - /* Define a punched surface in local space, i.e. no translation & no orientation */ SSOL_API res_T ssol_punched_surface_setup @@ -484,8 +482,8 @@ ssol_instance_set_transform SSOL_API res_T ssol_instance_set_receiver (struct ssol_instance* instance, - const char* name_front, /* May be NULL <=> Front faces are no more receivers */ - const char* name_back); /* May be NULL <=> back faces are no more receivers */ + const int front, /* Define wether or not front faces are receivers */ + const int back); /* Define wheter or not back faces are receivers */ SSOL_API res_T ssol_instance_set_target_mask @@ -495,13 +493,14 @@ ssol_instance_set_target_mask SSOL_API res_T ssol_instance_dont_sample -(struct ssol_instance* instance, - const int dont_sample); + (struct ssol_instance* instance, + const int dont_sample); +/* Retrieve the id of the shape */ SSOL_API res_T -ssol_instance_is_attached +ssol_instance_get_id (struct ssol_instance* instance, - char* is_attached); + uint32_t* id); /******************************************************************************* * Spectrum API - Collection of wavelengths with their associated data. diff --git a/src/ssol_c.h b/src/ssol_c.h @@ -17,12 +17,33 @@ #define SSOL_C_H #include "ssol.h" +#include "ssol_instance_c.h" + #include <star/s3d.h> +#include <math.h> + #define SSOL_TO_S3D_POSITION S3D_POSITION #define SSOL_TO_S3D_NORMAL S3D_ATTRIB_0 #define SSOL_TO_S3D_TEXCOORD S3D_ATTRIB_1 +/* hack until the needed API comes from a merge */ +#define FRONT_FLAG 0 +#define RECEIVER_ID_MASK 0x7FFFFFFF +#define BACK_FLAG 0x80000000 + +#ifndef NDEBUG + #define ASSERT_NAN(x, sz) { \ + int i__; \ + FOR_EACH(i__, 0, sz) \ + ASSERT(!IS_NaN((x)[i__])); \ + } (void)0 +#else + #define ASSERT_NAN(x, sz) +#endif + +#define NON_BOOL 99 + static FINLINE enum s3d_attrib_usage ssol_to_s3d_attrib_usage(const enum ssol_attrib_usage usage) { @@ -42,41 +63,5 @@ hit_filter_function void* realisation, void* filter_data); -#include <math.h> - -#ifndef NDEBUG - #define ASSERT_NAN(x, sz) { \ - int i__; \ - FOR_EACH(i__, 0, sz) \ - ASSERT(!IS_NaN((x)[i__])); \ - } (void)0 -#else - #define ASSERT_NAN(x, sz) -#endif - -#define NON_BOOL 99 - -/* hack until the needed API comes from a merge */ -#define FRONT_FLAG 0 -#define RECEIVER_ID_MASK 0x7FFFFFFF -#define BACK_FLAG 0x80000000 - -#include "ssol_instance_c.h" -static FINLINE res_T -get_receiver_id(struct ssol_instance* instance, const int front_face, uint32_t* id) { - struct str* rec; - - if (!instance || !id) - return RES_BAD_ARG; - rec = front_face ? &instance->receiver_front : &instance->receiver_back; - if (str_is_empty(rec)) - return RES_BAD_ARG; - - S3D(shape_get_id(instance->shape_rt, id)); - ASSERT((*id & RECEIVER_ID_MASK) == *id); - *id |= (front_face ? FRONT_FLAG : BACK_FLAG); - return RES_OK; -} - #endif /* SSOL_C_H */ diff --git a/src/ssol_device_c.h b/src/ssol_device_c.h @@ -16,11 +16,17 @@ #ifndef SSOL_DEVICE_C_H #define SSOL_DEVICE_C_H +#include <rsys/free_list.h> #include <rsys/ref_count.h> #include <star/s3d.h> struct scpr_mesh; +/* Declare the free list used to generate unique identifier */ +struct name { FITEM; }; +#define FITEM_TYPE name +#include <rsys/free_list.h> + struct ssol_device { struct logger* logger; struct mem_allocator* allocator; diff --git a/src/ssol_instance.c b/src/ssol_instance.c @@ -43,8 +43,6 @@ instance_release(ref_T* ref) SSOL(object_ref_put(instance->object)); if(instance->shape_rt) S3D(shape_ref_put(instance->shape_rt)); if(instance->shape_samp) S3D(shape_ref_put(instance->shape_samp)); - str_release(&instance->receiver_front); - str_release(&instance->receiver_back); MEM_RM(dev->allocator, instance); SSOL(device_ref_put(dev)); } @@ -61,7 +59,7 @@ ssol_object_instantiate struct ssol_device* dev; res_T res = RES_OK; - if (!object || !out_instance) { + if(!object || !out_instance) { res = RES_BAD_ARG; goto error; } @@ -70,21 +68,19 @@ ssol_object_instantiate ASSERT(dev && dev->allocator); instance = (struct ssol_instance*)MEM_CALLOC (dev->allocator, 1, sizeof(struct ssol_instance)); - if (!instance) { + if(!instance) { res = RES_MEM_ERR; goto error; } + ref_init(&instance->ref); + SSOL(device_ref_get(dev)); + SSOL(object_ref_get(object)); instance->dev = dev; instance->object = object; + instance->target_front_mask = instance->target_back_mask = 0; d33_set_identity(instance->transform); d3_splat(instance->transform + 9, 0); - instance->target_front_mask = instance->target_back_mask = 0; - str_init(dev->allocator, &instance->receiver_front); - str_init(dev->allocator, &instance->receiver_back); - SSOL(object_ref_get(object)); - SSOL(device_ref_get(dev)); - ref_init(&instance->ref); /* Create the Star-3D instance to ray-trace */ res = s3d_scene_instantiate(object->scn_rt, &instance->shape_rt); @@ -98,7 +94,7 @@ exit: if(out_instance) *out_instance = instance; return res; error: - if (instance) { + if(instance) { SSOL(instance_ref_put(instance)); instance = NULL; } @@ -118,7 +114,7 @@ res_T ssol_instance_ref_put (struct ssol_instance* instance) { - if (!instance) + if(!instance) return RES_BAD_ARG; ref_put(&instance->ref, instance_release); return RES_OK; @@ -158,39 +154,12 @@ error: res_T ssol_instance_set_receiver - (struct ssol_instance* instance, - const char* name_front, - const char* name_back) + (struct ssol_instance* instance, const int front, const int back) { - struct str front; - struct str back; - res_T res = RES_OK; - if(!instance) return RES_BAD_ARG; - - str_init(instance->dev->allocator, &front); - str_init(instance->dev->allocator, &back); - - if(name_front) { - res = str_set(&front, name_front); - if(res != RES_OK) goto error; - } - if(name_back) { - res = str_set(&back, name_back); - if(res != RES_OK) goto error; - } - - res = str_copy_and_release(&instance->receiver_front, &front); - ASSERT(res == RES_OK); - res = str_copy_and_release(&instance->receiver_back, &back); - ASSERT(res == RES_OK); - -exit: - return res; -error: - str_release(&front); - str_release(&back); - goto exit; + instance->receiver_front = front; + instance->receiver_back = back; + return RES_OK; } res_T @@ -199,7 +168,7 @@ ssol_instance_set_target_mask const uint32_t front_mask, const uint32_t back_mask) { - if (!instance) + if(!instance) return RES_BAD_ARG; instance->target_front_mask = front_mask; @@ -212,19 +181,20 @@ ssol_instance_dont_sample (struct ssol_instance* instance, const int dont_sample) { - if (!instance) - return RES_BAD_ARG; - + if(!instance) return RES_BAD_ARG; instance->dont_sample = dont_sample; return RES_OK; } res_T -ssol_instance_is_attached - (struct ssol_instance* instance, char* is_attached) +ssol_instance_get_id(struct ssol_instance* instance, uint32_t* id) { - FATAL("Not implemented yet."); - if(!instance || !is_attached) return RES_BAD_ARG; + unsigned u; + STATIC_ASSERT + (sizeof(unsigned) <= sizeof(uint32_t), Unexpected_sizeof_unsigned); + if(!instance || !id) return RES_BAD_ARG; + S3D(shape_get_id(instance->shape_rt, &u)); + *id = (uint32_t)u; return RES_OK; } diff --git a/src/ssol_instance_c.h b/src/ssol_instance_c.h @@ -16,20 +16,22 @@ #ifndef SSOL_INSTANCE_C_H #define SSOL_INSTANCE_C_H +#include <rsys/free_list.h> #include <rsys/list.h> #include <rsys/ref_count.h> -#include <rsys/str.h> struct ssol_instance { struct ssol_object* object; /* Instantiated object */ struct s3d_shape* shape_rt; /* Instantiated Star-3D shape to ray-trace */ struct s3d_shape* shape_samp; /* Instantiated Star-3D shape to sample */ - struct str receiver_front; /* Empty if front faces are not receivers */ - struct str receiver_back; /* Empty if back faces are not receivers */ double transform[12]; /* Column major 4x3 affine transformation */ - uint32_t target_front_mask, target_back_mask; + uint32_t target_front_mask, target_back_mask; /* FIXME remove this? */ + int receiver_front; /* Are front faces receivers */ + int receiver_back; /* Are back faces receivers */ int dont_sample; + struct fid id; /* Unique identifier */ + struct ssol_device* dev; ref_T ref; }; diff --git a/src/ssol_scene.c b/src/ssol_scene.c @@ -291,8 +291,7 @@ 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(inst->receiver_back || inst->receiver_front) { hr = 1; } @@ -341,10 +340,12 @@ hit_filter_function 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; + int is_receiver = 0; + uint32_t inst_id; + int32_t receiver_id; (void) filter_data, (void) org, (void) dir; ASSERT(rs); @@ -418,25 +419,29 @@ hit_filter_function return 1; } + SSOL(instance_get_id(inst, &inst_id)); + ASSERT(inst_id < INT32_MAX); if(seg->hit_front) { seg->hit_material = shaded_shape->mtl_front; - receiver_name = &inst->receiver_front; + is_receiver = inst->receiver_front; + receiver_id = (int32_t)inst_id; } else { d3_muld(seg->hit_normal, seg->hit_normal, -1); seg->hit_material = shaded_shape->mtl_back; - receiver_name = &inst->receiver_back; + is_receiver = inst->receiver_back; + receiver_id = -(int32_t)inst_id; } - /* Check if the hit surface is a receiver that registers hit data + /* Check if the hit surface is a receiver that registers hit data * impacts on receivers before sampled surfaces are not registered */ - if (!seg->sun_segment && !str_is_empty(receiver_name)) { + if (!seg->sun_segment && is_receiver) { struct receiver_record candidate; f3_set_d3(candidate.dir, seg->dir); candidate.hit_distance = (float)seg->hit_distance; f3_set_d3(candidate.hit_normal, seg->hit_normal); f3_set_d3(candidate.hit_pos, seg->hit_pos); candidate.instance = inst; - get_receiver_id(inst, seg->hit_front, &candidate.receiver_id); + candidate.receiver_id = receiver_id; f2_set(candidate.uv, seg->hit.uv); darray_receiver_record_push_back( &rs->data.receiver_record_candidates, &candidate); diff --git a/src/ssol_scene_c.h b/src/ssol_scene_c.h @@ -57,5 +57,12 @@ scene_setup_s3d_sampling_scene char* has_sampled, char* has_receiver); +/* TODO comment */ +extern LOCAL_SYM res_T +scene_create_s3d_views + (struct ssol_scene* scn, + struct s3d_scene_view** view_rt, + struct s3d_scene_view** view_samp); + #endif /* SSOL_SCENE_C_H */ diff --git a/src/ssol_shape.c b/src/ssol_shape.c @@ -842,17 +842,6 @@ ssol_shape_ref_put(struct ssol_shape* shape) } res_T -ssol_shape_get_id(struct ssol_shape* shape, uint32_t* id) -{ - unsigned ui; - STATIC_ASSERT(sizeof(unsigned) <= sizeof(uint32_t), Unexpected_sizeof_unsigned); - if(!shape || !id) return RES_BAD_ARG; - S3D(shape_get_id(shape->shape_rt, &ui)); - *id = (uint32_t)ui; - return RES_OK; -} - -res_T ssol_punched_surface_setup (struct ssol_shape* shape, const struct ssol_punched_surface* psurf) diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -565,10 +565,11 @@ static int receive_sunlight(struct realisation* rs) { struct segment* seg; - const struct str* receiver_name = NULL; const struct ssol_sun* sun; struct starting_point* start; - uint32_t receiver_id; + int is_receiver = 0; + uint32_t inst_id; + int32_t receiver_id; ASSERT(rs && rs->s_idx == 0); seg = current_segment(rs); @@ -645,28 +646,27 @@ receive_sunlight(struct realisation* rs) seg->hit_normal, &start->sampl_primitive, start->uv); /* if the sampled instance is a receiver, register the sampled point */ + SSOL(instance_get_id(start->instance, &inst_id)); + ASSERT(inst_id < INT32_MAX); if(start->front_exposed) { - receiver_name = &start->instance->receiver_front; - receiver_id = FRONT_FLAG; + is_receiver = start->instance->receiver_front; + receiver_id = (int32_t)inst_id; } else { - receiver_name = &start->instance->receiver_back; - receiver_id = BACK_FLAG; + is_receiver = start->instance->receiver_back; + receiver_id = -(int32_t)inst_id; } /* if the sampled instance holds a receiver, push a candidate */ - if(!str_is_empty(receiver_name)) { - uint32_t id; + if(is_receiver) { struct receiver_record candidate; f3_set_d3(candidate.dir, seg->dir); candidate.hit_distance = 0; /* no atmospheric attenuation for sun rays */ f3_set_d3(candidate.hit_normal, seg->hit_normal); f3_set_d3(candidate.hit_pos, seg->hit_pos); candidate.instance = start->instance; - S3D(shape_get_id(start->instance->shape_rt, &id)); - ASSERT((id & RECEIVER_ID_MASK) == id); - candidate.receiver_id = receiver_id | id; + candidate.receiver_id = receiver_id; f2_set(candidate.uv, start->uv); - darray_receiver_record_push_back( - &rs->data.receiver_record_candidates, &candidate); + darray_receiver_record_push_back + (&rs->data.receiver_record_candidates, &candidate); } return 1; @@ -703,7 +703,7 @@ filter_receiver_hit_candidates(struct realisation* rs) candidates->hit_distance <= tmax && candidates < candidates_end; candidates++) { - struct receiver_data out; + struct ssol_receiver_data out; double weight; if (candidates->hit_distance == prev_distance) { size_t i = 0, is_duplicate = 0; @@ -738,7 +738,7 @@ filter_receiver_hit_candidates(struct realisation* rs) f3_set(out.normal, candidates->hit_normal); out.weight = weight; f2_set(out.uv, candidates->uv); - fwrite(&out, sizeof(struct receiver_data), 1, rs->data.out_stream); + fwrite(&out, sizeof(struct ssol_receiver_data), 1, rs->data.out_stream); rs->success = 1; } /* reset candidates */ @@ -843,4 +843,3 @@ error: /* TODO: release data */ goto exit; } - diff --git a/src/ssol_solver_c.h b/src/ssol_solver_c.h @@ -76,7 +76,7 @@ struct starting_point { struct receiver_record { struct ssol_instance* instance; - uint32_t receiver_id; + int32_t receiver_id; float dir[4]; float hit_pos[3]; float uv[2]; diff --git a/src/test_ssol_instance.c b/src/test_ssol_instance.c @@ -61,13 +61,8 @@ main(int argc, char** argv) CHECK(ssol_instance_set_transform(instance, transform), RES_OK); #define SET_RECEIVER ssol_instance_set_receiver - CHECK(SET_RECEIVER(NULL, "receiver 1", NULL), RES_BAD_ARG); - CHECK(SET_RECEIVER(instance, NULL, NULL), RES_OK); - CHECK(SET_RECEIVER(instance, "receiver 1", NULL), RES_OK); - CHECK(SET_RECEIVER(instance, "receiver 0", NULL), RES_OK); - CHECK(SET_RECEIVER(instance, NULL, NULL), RES_OK); - CHECK(SET_RECEIVER(instance, "receiver front", "receiver back"), RES_OK); - CHECK(SET_RECEIVER(instance, NULL, "receiver back"), RES_OK); + CHECK(ssol_instance_set_receiver(NULL, 0, 0), RES_BAD_ARG); + CHECK(ssol_instance_set_receiver(instance, 0, 0), RES_OK); #undef SET_RECEIVER CHECK(ssol_instance_set_target_mask(NULL, 1, 1), RES_BAD_ARG); diff --git a/src/test_ssol_shape.c b/src/test_ssol_shape.c @@ -37,7 +37,6 @@ main(int argc, char** argv) struct ssol_punched_surface punched_surface; struct ssol_carving carving; struct ssol_quadric quadric; - uint32_t id; double polygon[] = { -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 0.f, -2.f }; @@ -59,11 +58,6 @@ main(int argc, char** argv) CHECK(ssol_shape_create_mesh(NULL, &shape), RES_BAD_ARG); CHECK(ssol_shape_create_mesh(dev, &shape), RES_OK); - CHECK(ssol_shape_get_id(NULL, NULL), RES_BAD_ARG); - CHECK(ssol_shape_get_id(shape, NULL), RES_BAD_ARG); - CHECK(ssol_shape_get_id(NULL, &id), RES_BAD_ARG); - CHECK(ssol_shape_get_id(shape, &id), RES_OK); - CHECK(ssol_shape_ref_get(NULL), RES_BAD_ARG); CHECK(ssol_shape_ref_get(shape), RES_OK); diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c @@ -130,12 +130,12 @@ main(int argc, char** argv) 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_receiver(heliostat, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(heliostat, 0x1, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, heliostat), RES_OK); CHECK(ssol_object_instantiate(m_object, &secondary), RES_OK); - CHECK(ssol_instance_set_receiver(secondary, "secondaire", NULL), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, 1, 0), RES_OK); CHECK(ssol_instance_set_transform(secondary, transform1), RES_OK); CHECK(ssol_instance_set_target_mask(secondary, 0x2, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, secondary), RES_OK); @@ -144,7 +144,7 @@ main(int argc, char** argv) 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); + CHECK(ssol_instance_set_receiver(target, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(target, 0x4, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -177,13 +177,13 @@ main(int argc, char** argv) CHECK(ssol_solve(scene, rng, 10, stdout, estimator), RES_BAD_ARG); /* sun with undefined DNI */ CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat, NULL, NULL), RES_OK); - CHECK(ssol_instance_set_receiver(secondary, NULL, NULL), RES_OK); - CHECK(ssol_instance_set_receiver(target, NULL, NULL), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, 0, 0), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, 0, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, 0, 0), RES_OK); CHECK(ssol_solve(scene, rng, 10, stdout, estimator), RES_BAD_ARG); /* no receiver in scene */ - CHECK(ssol_instance_set_receiver(heliostat, "miroir", NULL), RES_OK); - CHECK(ssol_instance_set_receiver(secondary, "secondaire", NULL), RES_OK); - CHECK(ssol_instance_set_receiver(target, "cible", NULL), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, 1, 0), RES_OK); CHECK(ssol_spectrum_create(dev, &abs), RES_OK); CHECK(ssol_spectrum_setup(abs, mismatch, ka, 2), RES_OK); @@ -200,10 +200,10 @@ main(int argc, char** argv) #define N__ 10000 CHECK(ssol_estimator_clear(estimator), RES_OK); CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); - CHECK(get_receiver_id(target, 1, &r_id), RES_OK); + CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); CHECK(ssol_estimator_get_failed_count(estimator, &fcount), RES_OK); CHECK(fcount, 0); @@ -238,7 +238,7 @@ main(int argc, char** argv) CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); CHECK(eq_eps(m, 4 * DNI_cos, MMAX(4 * DNI_cos * 1e-2, std)), 1); @@ -262,7 +262,7 @@ main(int argc, char** argv) CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); CHECK(eq_eps(m, 4 * DNI_cos, MMAX(4 * DNI_cos * 1e-2, std)), 1); @@ -290,7 +290,7 @@ main(int argc, char** argv) CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); #define K (exp(-0.1 * 4 * sqrt(2))) @@ -318,7 +318,7 @@ main(int argc, char** argv) CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g", m, std); #define K2 (exp(-0.121 * 4 * sqrt(2))) diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c @@ -155,8 +155,8 @@ main(int argc, char** argv) 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); - CHECK(ssol_instance_set_receiver(heliostat2, "miroir", NULL), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat1, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat2, 1, 0), RES_OK); transform3[9] = -0.5; /* -0.5 offset along X axis */ CHECK(ssol_instance_set_transform(heliostat1, transform3), RES_OK); transform3[9] = +0.5; /* +0.5 offset along X axis */ @@ -167,7 +167,7 @@ main(int argc, char** argv) 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_receiver(secondary, 1, 0), 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); @@ -176,7 +176,7 @@ main(int argc, char** argv) 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); + CHECK(ssol_instance_set_receiver(target, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(target, 0x1, 0), RES_OK); CHECK(ssol_instance_dont_sample(target, 1), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -184,10 +184,10 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 10000 CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); - CHECK(get_receiver_id(target, 1, &r_id), RES_OK); + CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c @@ -160,8 +160,8 @@ main(int argc, char** argv) 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); - CHECK(ssol_instance_set_receiver(heliostat2, "miroir", NULL), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat1, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat2, 1, 0), RES_OK); transform3[9] = -0.5; /* -0.5 offset along X axis */ CHECK(ssol_instance_set_transform(heliostat1, transform3), RES_OK); transform3[9] = +0.5; /* +0.5 offset along X axis */ @@ -172,7 +172,7 @@ main(int argc, char** argv) 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_receiver(secondary, 1, 0), 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); @@ -181,7 +181,7 @@ main(int argc, char** argv) 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); + CHECK(ssol_instance_set_receiver(target, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(target, 0x1, 0), RES_OK); CHECK(ssol_instance_dont_sample(target, 1), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -189,10 +189,10 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 50000 CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); - CHECK(get_receiver_id(target, 1, &r_id), RES_OK); + CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) diff --git a/src/test_ssol_solver3.c b/src/test_ssol_solver3.c @@ -128,14 +128,14 @@ main(int argc, char** argv) 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_instance_set_receiver(heliostat, 1, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, heliostat), 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); + CHECK(ssol_instance_set_receiver(target, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(target, 0x1, 0), RES_OK); CHECK(ssol_instance_dont_sample(target, 1), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -143,10 +143,10 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 20000 CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); - CHECK(get_receiver_id(target, 1, &r_id), RES_OK); + CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) diff --git a/src/test_ssol_solver3N.c b/src/test_ssol_solver3N.c @@ -200,7 +200,7 @@ main(int argc, char** argv) 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); + CHECK(ssol_instance_set_receiver(target, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(target, 0x1, 0), RES_OK); CHECK(ssol_instance_dont_sample(target, 1), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -208,10 +208,10 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 10000 CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); - CHECK(get_receiver_id(target, 1, &r_id), RES_OK); + CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 8)) diff --git a/src/test_ssol_solver4.c b/src/test_ssol_solver4.c @@ -136,13 +136,13 @@ main(int argc, char** argv) 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); + CHECK(ssol_instance_set_receiver(target1, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(target1, 0x1, 0), RES_OK); CHECK(ssol_instance_dont_sample(target1, 1), RES_OK); CHECK(ssol_scene_attach_instance(scene, target1), RES_OK); CHECK(ssol_object_instantiate(t_object, &target2), RES_OK); CHECK(ssol_instance_set_transform(target2, transform), RES_OK); - CHECK(ssol_instance_set_receiver(target2, "cible2", NULL), RES_OK); + CHECK(ssol_instance_set_receiver(target2, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(target2, 0x1, 0), RES_OK); CHECK(ssol_instance_dont_sample(target2, 1), RES_OK); CHECK(ssol_scene_attach_instance(scene, target2), RES_OK); @@ -150,12 +150,12 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 10000 CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); - CHECK(get_receiver_id(target1, 1, &r_id1), RES_OK); - CHECK(get_receiver_id(target2, 1, &r_id2), RES_OK); + CHECK(ssol_instance_get_id(target1, &r_id1), RES_OK); + CHECK(ssol_instance_get_id(target2, &r_id2), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id1, count, &m1, &std1), RES_OK); - CHECK(pp_sum(tmp, r_id2, count, &m2, &std2), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id1, count, &m1, &std1), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id2, count, &m2, &std2), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m1, std1); #define DNI_cos (1000 * cos(0)) diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c @@ -135,7 +135,7 @@ main(int argc, char** argv) 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); + CHECK(ssol_instance_set_receiver(target, 1, 0), RES_OK); CHECK(ssol_instance_set_target_mask(target, 0x1, 0), RES_OK); CHECK(ssol_instance_dont_sample(target, 1), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -143,10 +143,10 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 10000 CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK); - CHECK(get_receiver_id(target, 1, &r_id), RES_OK); + CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); - CHECK(pp_sum(tmp, r_id, count, &m, &std), RES_OK); + CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); logger_print(&logger, LOG_OUTPUT, "\nP = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(0)) diff --git a/src/test_ssol_utils.c b/src/test_ssol_utils.c @@ -27,12 +27,12 @@ res_T pp_sum (FILE* f, - const uint32_t receiver_id, + const int32_t receiver_id, const size_t count, double* mean, double* std) { - struct receiver_data hit; + struct ssol_receiver_data hit; double sum = 0; double sum2 = 0; double E, V, SE; @@ -41,7 +41,7 @@ pp_sum return RES_BAD_ARG; rewind(f); - while (1 == fread(&hit, sizeof(struct receiver_data), 1, f)) { + while (1 == fread(&hit, sizeof(struct ssol_receiver_data), 1, f)) { if (ferror(f)) return RES_BAD_ARG; diff --git a/src/test_ssol_utils.h b/src/test_ssol_utils.h @@ -41,7 +41,7 @@ check_memory_allocator(struct mem_allocator* allocator) extern LOCAL_SYM res_T pp_sum (FILE* f, - const uint32_t receiver_id, + const int32_t receiver_id, const size_t count, double* mean, double* std);