solstice-solver

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

commit 3b3f5c46c57b83c7b571ca122c1493e1c4b743b1
parent 0fd3636788215cb77a185eabf53e74f1448665d3
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 11 Oct 2016 15:01:52 +0200

Update the ssol_instance_set_receiver API

Use a bitfield to define the face sides that are receivers.

Diffstat:
Msrc/ssol.h | 9+++++++--
Msrc/ssol_instance.c | 8+++-----
Msrc/ssol_instance_c.h | 3+--
Msrc/ssol_scene.c | 6+++---
Msrc/ssol_solver.c | 4++--
Msrc/test_ssol_instance.c | 4++--
Msrc/test_ssol_solver1.c | 18+++++++++---------
Msrc/test_ssol_solver2.c | 8++++----
Msrc/test_ssol_solver2b.c | 8++++----
Msrc/test_ssol_solver3.c | 4++--
Msrc/test_ssol_solver3N.c | 2+-
Msrc/test_ssol_solver4.c | 4++--
Msrc/test_ssol_solver5.c | 2+-
13 files changed, 41 insertions(+), 39 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -58,6 +58,11 @@ struct ssol_spectrum; struct ssol_sun; struct ssol_estimator; +enum ssol_face_flag { + SSOL_FRONT = BIT(0), + SSOL_BACK = BIT(1) +}; + enum ssol_clipping_op { SSOL_AND, SSOL_SUB, @@ -479,11 +484,11 @@ ssol_instance_set_transform (struct ssol_instance* instance, const double transform[12]); /* 3x4 column major matrix */ +/* Specify which sides of the faces are receivers */ SSOL_API res_T ssol_instance_set_receiver (struct ssol_instance* instance, - const int front, /* Define wether or not front faces are receivers */ - const int back); /* Define wheter or not back faces are receivers */ + const int mask); /* Combination of ssol_face_flags */ SSOL_API res_T ssol_instance_set_target_mask diff --git a/src/ssol_instance.c b/src/ssol_instance.c @@ -153,12 +153,10 @@ error: } res_T -ssol_instance_set_receiver - (struct ssol_instance* instance, const int front, const int back) +ssol_instance_set_receiver(struct ssol_instance* instance, const int mask) { if(!instance) return RES_BAD_ARG; - instance->receiver_front = front; - instance->receiver_back = back; + instance->receiver_mask = mask; return RES_OK; } @@ -189,7 +187,7 @@ ssol_instance_dont_sample res_T ssol_instance_get_id(struct ssol_instance* instance, uint32_t* id) { - unsigned u; + unsigned u; STATIC_ASSERT (sizeof(unsigned) <= sizeof(uint32_t), Unexpected_sizeof_unsigned); if(!instance || !id) return RES_BAD_ARG; diff --git a/src/ssol_instance_c.h b/src/ssol_instance_c.h @@ -26,8 +26,7 @@ struct ssol_instance { struct s3d_shape* shape_samp; /* Instantiated Star-3D shape to sample */ double transform[12]; /* Column major 4x3 affine transformation */ 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 receiver_mask; /* Combination of ssol_face_flag */ int dont_sample; struct fid id; /* Unique identifier */ diff --git a/src/ssol_scene.c b/src/ssol_scene.c @@ -291,7 +291,7 @@ scene_setup_s3d_sampling_scene unsigned id; htable_instance_iterator_next(&it); - if(inst->receiver_back || inst->receiver_front) { + if(inst->receiver_mask) { hr = 1; } @@ -423,12 +423,12 @@ hit_filter_function ASSERT(inst_id < INT32_MAX); if(seg->hit_front) { seg->hit_material = shaded_shape->mtl_front; - is_receiver = inst->receiver_front; + is_receiver = inst->receiver_mask & SSOL_FRONT; receiver_id = (int32_t)inst_id; } else { d3_muld(seg->hit_normal, seg->hit_normal, -1); seg->hit_material = shaded_shape->mtl_back; - is_receiver = inst->receiver_back; + is_receiver = inst->receiver_mask & SSOL_BACK; receiver_id = -(int32_t)inst_id; } diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -649,10 +649,10 @@ receive_sunlight(struct realisation* rs) SSOL(instance_get_id(start->instance, &inst_id)); ASSERT(inst_id < INT32_MAX); if(start->front_exposed) { - is_receiver = start->instance->receiver_front; + is_receiver = start->instance->receiver_mask & SSOL_FRONT; receiver_id = (int32_t)inst_id; } else { - is_receiver = start->instance->receiver_back; + is_receiver = start->instance->receiver_mask & SSOL_BACK; receiver_id = -(int32_t)inst_id; } /* if the sampled instance holds a receiver, push a candidate */ diff --git a/src/test_ssol_instance.c b/src/test_ssol_instance.c @@ -72,8 +72,8 @@ main(int argc, char** argv) CHECK(ssol_instance_set_transform(instance, transform), RES_OK); #define SET_RECEIVER ssol_instance_set_receiver - CHECK(ssol_instance_set_receiver(NULL, 0, 0), RES_BAD_ARG); - CHECK(ssol_instance_set_receiver(instance, 0, 0), RES_OK); + CHECK(ssol_instance_set_receiver(NULL, 0), RES_BAD_ARG); + CHECK(ssol_instance_set_receiver(instance, 0), RES_OK); #undef SET_RECEIVER CHECK(ssol_instance_set_target_mask(NULL, 1, 1), RES_BAD_ARG); 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT), 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT), 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), 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, 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_instance_set_receiver(heliostat, 0), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, 0), RES_OK); CHECK(ssol_solve(scene, rng, 10, stdout, estimator), RES_BAD_ARG); /* no receiver in scene */ - 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_instance_set_receiver(heliostat, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); CHECK(ssol_spectrum_create(dev, &abs), RES_OK); CHECK(ssol_spectrum_setup(abs, mismatch, ka, 2), RES_OK); 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, 1, 0), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat2, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat1, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat2, SSOL_FRONT), 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT), 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), 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); 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, 1, 0), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat2, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat1, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat2, SSOL_FRONT), 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT), 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), 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); 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT), 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), 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); 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), 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); 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target1, SSOL_FRONT), 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target2, SSOL_FRONT), 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); 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, 1, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), 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);