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