commit 8ca97109b01dcf8336173b5a51c7bbb16e54be51
parent 1d6ecd2a93c83c5eb495200d1d7f14aa3e9f9ef3
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 1 Sep 2016 15:26:26 +0200
Fix compilation on GCC
Fix warnings and compilation errors + minor refactoring of the solver
file.
Diffstat:
4 files changed, 162 insertions(+), 157 deletions(-)
diff --git a/src/ssol_solver.c b/src/ssol_solver.c
@@ -74,147 +74,32 @@ struct realisation {
size_t s_idx;
};
+/*******************************************************************************
+ * Helper functions
+ ******************************************************************************/
static INLINE int
-is_instance_punched
- (const struct ssol_object_instance* instance)
+is_instance_punched(const struct ssol_object_instance* instance)
{
ASSERT(instance);
return instance->object->shape->type == SHAPE_PUNCHED;
}
-static const struct ssol_quadric*
-get_quadric (const struct ssol_object_instance* instance)
+static INLINE const struct ssol_quadric*
+get_quadric(const struct ssol_object_instance* instance)
{
ASSERT(instance && is_instance_punched(instance));
return instance->object->shape->quadric;
}
-static struct s3d_scene*
+static INLINE struct s3d_scene*
get_3dscene(const struct ssol_object_instance* instance)
{
ASSERT(instance);
return instance->object->s3d_scn;
}
-/*******************************************************************************
- * Local functions
- ******************************************************************************/
-res_T
-set_sun_distributions(struct solver_data* data) {
- struct ssol_spectrum* spectrum;
- struct ssol_device* dev;
- const struct ssol_sun* sun;
- const double* frequencies;
- const double* intensities;
- res_T res = RES_OK;
- size_t sz;
- if (!data) return RES_BAD_ARG;
-
- ASSERT(data->scene);
- sun = scene_get_sun(data->scene);
- ASSERT(sun);
- dev = scene_get_device(data->scene);
- ASSERT(dev && dev->allocator);
- /* first set the spectrum distribution */
- res = ssp_ranst_piecewise_linear_create(dev->allocator, &data->sun_spectrum_ran);
- if (res != RES_OK) goto error;
- spectrum = sun->spectrum;
- frequencies = darray_double_cdata_get(&spectrum->frequencies);
- intensities = darray_double_cdata_get(&spectrum->intensities);
- sz = darray_double_size_get(&spectrum->frequencies);
- res = ssp_ranst_piecewise_linear_setup
- (data->sun_spectrum_ran, frequencies, intensities, sz);
- if (res != RES_OK) goto error;
- /* then the direction distribution */
- res = ranst_sun_dir_create(dev->allocator, &data->sun_dir_ran);
- if (res != RES_OK) goto error;
- switch (sun->type) {
- case SUN_DIRECTIONAL:
- res = ranst_sun_dir_dirac_setup(data->sun_dir_ran, sun->direction);
- break;
- case SUN_PILLBOX:
- res = ranst_sun_dir_pillbox_setup
- (data->sun_dir_ran, sun->data.pillbox.aperture, sun->direction);
- break;
- case SUN_BUIE:
- res = ranst_sun_dir_buie_setup
- (data->sun_dir_ran, sun->data.csr.ratio, sun->direction);
- break;
- default:
- res = RES_OK;
- FATAL("Unreachable code \n");
- }
-
-exit:
- return res;
-error:
- if (data->sun_spectrum_ran) {
- SSP(ranst_piecewise_linear_ref_put(data->sun_spectrum_ran));
- data->sun_spectrum_ran = NULL;
- }
- if (data->sun_dir_ran) {
- ASSERT(ranst_sun_dir_ref_put(data->sun_dir_ran) == RES_OK);
- data->sun_dir_ran = NULL;
- }
- goto exit;
-}
-
-res_T
-set_views(struct solver_data* data) {
- res_T res = RES_OK;
- struct ssol_scene* scene;
- struct s3d_scene* raytrace_scene;
- struct s3d_scene* sampling_scene;
- struct htable_instance_iterator it, it_end;
- int mirror_found = 0;
-
- if (!data) return RES_BAD_ARG;
-
- scene = data->scene;
- ASSERT(scene);
- raytrace_scene = scene_get_s3d_scene(scene);
- ASSERT(raytrace_scene);
- sampling_scene = scene_get_s3d_sampling_scn(scene);
- ASSERT(sampling_scene);
- /* feed sampling s3d_scene */
- S3D(scene_clear(sampling_scene));
- htable_instance_begin(&scene->instances, &it);
- htable_instance_end(&scene->instances, &it_end);
- while (!htable_instance_iterator_eq(&it, &it_end)) {
- struct ssol_object_instance* inst;
- struct ssol_material* mat;
- inst = *htable_instance_iterator_data_get(&it);
- /* keep only primary mirrors */
- mat = inst->object->material;
- if (material_get_type(mat) != MATERIAL_MIRROR)
- continue;
- mirror_found = 1;
- res = s3d_scene_attach_shape(sampling_scene, inst->s3d_shape);
- if (res != RES_OK) goto error;
- htable_instance_iterator_next(&it);
- }
- if (!mirror_found) {
- res = RES_BAD_ARG;
- log_error(scene->dev, "%s: no mirror geometry defined.\n", FUNC_NAME);
- goto error;
- }
- /* create views from scenes */
- res = s3d_scene_view_create(raytrace_scene, S3D_TRACE, &data->trace_view);
- if (res != RES_OK) goto error;
- res = s3d_scene_view_create(sampling_scene, S3D_SAMPLE, &data->sample_view);
- if (res != RES_OK) goto error;
-
-exit:
- return res;
-error:
- /* TODO: clear data */
- goto exit;
-}
-
static res_T
-init_solver_data
- (struct ssol_scene* scene,
- struct solver_data* data)
+init_solver_data(struct ssol_scene* scene, struct solver_data* data)
{
res_T res = RES_OK;
@@ -235,7 +120,7 @@ error:
goto exit;
}
-struct segment*
+static struct segment*
current_segment(struct realisation* rz)
{
ASSERT(rz);
@@ -243,7 +128,7 @@ current_segment(struct realisation* rz)
return darray_segment_data_get(&rz->segments) + rz->s_idx;
}
-res_T
+static res_T
next_segment(struct realisation* rz)
{
ASSERT(rz);
@@ -253,7 +138,7 @@ next_segment(struct realisation* rz)
return RES_OK;
}
-void
+static void
reset_realization(struct realisation* rz)
{
ASSERT(rz);
@@ -263,7 +148,7 @@ reset_realization(struct realisation* rz)
rz->mode = MODE_STD;
}
-res_T
+static res_T
init_realization(struct mem_allocator* allocator, struct realisation* rz)
{
ASSERT(rz);
@@ -272,30 +157,25 @@ init_realization(struct mem_allocator* allocator, struct realisation* rz)
return darray_segment_resize(&rz->segments, 16);
}
-void
+static void
clear_realization(struct realisation* rz)
{
ASSERT(rz);
darray_segment_clear(&rz->segments);
}
-/* TODO: move to Star3D */
-INLINE void s3d_invalidate_hit(struct s3d_hit* hit) {
- ASSERT(hit);
- hit->distance = FLT_MAX;
-}
-
-void
+static void
reset_segment(struct segment* seg)
{
ASSERT(seg);
seg->range[0] = 0;
seg->range[1] = FLT_MAX;
- s3d_invalidate_hit(&seg->hit);
+ seg->hit = S3D_HIT_NULL;
}
-struct ssol_material*
-get_material_from_hit(struct ssol_scene* scene, struct s3d_hit* hit) {
+static struct ssol_material*
+get_material_from_hit(struct ssol_scene* scene, struct s3d_hit* hit)
+{
struct ssol_object_instance* instance;
struct ssol_object* object;
struct ssol_material* material;
@@ -309,6 +189,9 @@ get_material_from_hit(struct ssol_scene* scene, struct s3d_hit* hit) {
return material;
}
+/*******************************************************************************
+ * Exported function
+ ******************************************************************************/
res_T
ssol_solve
(struct ssol_scene* scene,
@@ -346,7 +229,7 @@ ssol_solve
if (res != RES_OK) goto error;
sun = scene_get_sun(scene);
- rz.sun_segment.weight = ssol_sun_get_dni(sun);
+ rz.sun_segment.weight = sun_get_dni(sun);
for (r = 0; r < realisations_count; r++) {
struct segment* prev = NULL;
struct segment* seg = &rz.sun_segment;
@@ -380,7 +263,8 @@ ssol_solve
/* check if the point receives sunlight */
/* TODO: need only an occlusion test */
- S3D(scene_view_trace_ray(data.trace_view, seg->org, seg->dir, seg->range, NULL, &seg->hit));
+ S3D(scene_view_trace_ray
+ (data.trace_view, seg->org, seg->dir, seg->range, NULL, &seg->hit));
if (!S3D_HIT_NONE(&seg->hit)) {
rz.final_weight = 0;
rz.end = TERM_SHADOW;
@@ -417,7 +301,8 @@ ssol_solve
brdf_composite_sample(brdfs, rng, prev->dir, tmp, seg->dir);
/* then check if the ray hits something */
- S3D(scene_view_trace_ray(data.trace_view, seg->org, seg->dir, seg->range, NULL, &seg->hit));
+ S3D(scene_view_trace_ray
+ (data.trace_view, seg->org, seg->dir, seg->range, NULL, &seg->hit));
if (S3D_HIT_NONE(&seg->hit)) {
rz.final_weight = 0;
rz.end = TERM_MISSING;
@@ -428,8 +313,9 @@ ssol_solve
!= MATERIAL_VIRTUAL);
/* fill fragment from hit and loop */
- f3_set(tmp, f3_add(tmp, seg->org, f3_mulf(tmp, seg->dir, seg->hit.distance)));
- surface_fragment_setup(&fragment, tmp, seg->dir, seg->hit.normal, &seg->hit.prim, seg->hit.uv);
+ f3_add(tmp, seg->org, f3_mulf(tmp, seg->dir, seg->hit.distance));
+ surface_fragment_setup
+ (&fragment, tmp, seg->dir, seg->hit.normal, &seg->hit.prim, seg->hit.uv);
/* continue propagation with next segment */
res = next_segment(&rz);
@@ -444,10 +330,130 @@ ssol_solve
continue;
}
- exit:
+exit:
/* TODO: release data */
clear_realization(&rz);
return res;
error:
goto exit;
}
+
+/*******************************************************************************
+ * Local functions
+ ******************************************************************************/
+res_T
+set_sun_distributions(struct solver_data* data)
+{
+ struct ssol_spectrum* spectrum;
+ struct ssol_device* dev;
+ const struct ssol_sun* sun;
+ const double* frequencies;
+ const double* intensities;
+ res_T res = RES_OK;
+ size_t sz;
+
+ if (!data) return RES_BAD_ARG;
+
+ ASSERT(data->scene);
+ sun = scene_get_sun(data->scene);
+ ASSERT(sun);
+ dev = scene_get_device(data->scene);
+ ASSERT(dev && dev->allocator);
+ /* first set the spectrum distribution */
+ res = ssp_ranst_piecewise_linear_create(dev->allocator, &data->sun_spectrum_ran);
+ if (res != RES_OK) goto error;
+ spectrum = sun->spectrum;
+ frequencies = darray_double_cdata_get(&spectrum->frequencies);
+ intensities = darray_double_cdata_get(&spectrum->intensities);
+ sz = darray_double_size_get(&spectrum->frequencies);
+ res = ssp_ranst_piecewise_linear_setup
+ (data->sun_spectrum_ran, frequencies, intensities, sz);
+ if (res != RES_OK) goto error;
+ /* then the direction distribution */
+ res = ranst_sun_dir_create(dev->allocator, &data->sun_dir_ran);
+ if (res != RES_OK) goto error;
+ switch (sun->type) {
+ case SUN_DIRECTIONAL:
+ res = ranst_sun_dir_dirac_setup(data->sun_dir_ran, sun->direction);
+ break;
+ case SUN_PILLBOX:
+ res = ranst_sun_dir_pillbox_setup
+ (data->sun_dir_ran, sun->data.pillbox.aperture, sun->direction);
+ break;
+ case SUN_BUIE:
+ res = ranst_sun_dir_buie_setup
+ (data->sun_dir_ran, sun->data.csr.ratio, sun->direction);
+ break;
+ default:
+ res = RES_OK;
+ FATAL("Unreachable code \n");
+ }
+
+exit:
+ return res;
+error:
+ if (data->sun_spectrum_ran) {
+ SSP(ranst_piecewise_linear_ref_put(data->sun_spectrum_ran));
+ data->sun_spectrum_ran = NULL;
+ }
+ if (data->sun_dir_ran) {
+ ASSERT(ranst_sun_dir_ref_put(data->sun_dir_ran) == RES_OK);
+ data->sun_dir_ran = NULL;
+ }
+ goto exit;
+}
+
+res_T
+set_views(struct solver_data* data)
+{
+ res_T res = RES_OK;
+ struct ssol_scene* scene;
+ struct s3d_scene* raytrace_scene;
+ struct s3d_scene* sampling_scene;
+ struct htable_instance_iterator it, it_end;
+ int mirror_found = 0;
+
+ if (!data) return RES_BAD_ARG;
+
+ scene = data->scene;
+ ASSERT(scene);
+ raytrace_scene = scene_get_s3d_scene(scene);
+ ASSERT(raytrace_scene);
+ sampling_scene = scene_get_s3d_sampling_scn(scene);
+ ASSERT(sampling_scene);
+ /* feed sampling s3d_scene */
+ S3D(scene_clear(sampling_scene));
+ htable_instance_begin(&scene->instances, &it);
+ htable_instance_end(&scene->instances, &it_end);
+ while (!htable_instance_iterator_eq(&it, &it_end)) {
+ struct ssol_object_instance* inst;
+ struct ssol_material* mat;
+ inst = *htable_instance_iterator_data_get(&it);
+ /* keep only primary mirrors */
+ mat = inst->object->material;
+ if (material_get_type(mat) != MATERIAL_MIRROR)
+ continue;
+ mirror_found = 1;
+ res = s3d_scene_attach_shape(sampling_scene, inst->s3d_shape);
+ if (res != RES_OK) goto error;
+ htable_instance_iterator_next(&it);
+ }
+ if (!mirror_found) {
+ res = RES_BAD_ARG;
+ log_error(scene->dev, "%s: no mirror geometry defined.\n", FUNC_NAME);
+ goto error;
+ }
+ /* create views from scenes */
+ res = s3d_scene_view_create(raytrace_scene, S3D_TRACE, &data->trace_view);
+ if (res != RES_OK) goto error;
+ res = s3d_scene_view_create(sampling_scene, S3D_SAMPLE, &data->sample_view);
+ if (res != RES_OK) goto error;
+
+exit:
+ return res;
+error:
+ /* TODO: clear data */
+ goto exit;
+}
+
+
diff --git a/src/ssol_sun_c.h b/src/ssol_sun_c.h
@@ -48,8 +48,9 @@ struct ssol_sun {
ref_T ref;
};
-extern INLINE double
-ssol_sun_get_dni(const struct ssol_sun* sun) {
+static INLINE double
+sun_get_dni(const struct ssol_sun* sun)
+{
ASSERT(sun);
return sun->dni;
}
diff --git a/src/test_ssol_geometries.h b/src/test_ssol_geometries.h
@@ -21,7 +21,7 @@ struct desc {
const unsigned* indices;
};
- /*******************************************************************************
+/*******************************************************************************
* Plane
******************************************************************************/
@@ -38,12 +38,9 @@ const unsigned plane_walls_ids [] = {
};
const unsigned plane_walls_ntris = sizeof(plane_walls_ids) / sizeof(unsigned[3]);
-static struct desc plane_walls_desc = { plane_walls, plane_walls_ids };
-
/*******************************************************************************
-* Box
-******************************************************************************/
-
+ * Box
+ ******************************************************************************/
static const float box_walls [] = {
552.f, 0.f, 0.f,
0.f, 0.f, 0.f,
@@ -68,8 +65,8 @@ const unsigned box_walls_ntris = sizeof(box_walls_ids) / sizeof(unsigned[3]);
static struct desc box_walls_desc = { box_walls, box_walls_ids };
/*******************************************************************************
-* Callbacks
-******************************************************************************/
+ * Callbacks
+ ******************************************************************************/
static INLINE void
get_ids(const unsigned itri, unsigned ids[3], void* data)
{
diff --git a/src/test_ssol_solver.c b/src/test_ssol_solver.c
@@ -55,7 +55,8 @@ main(int argc, char** argv)
logger_set_stream(&logger, LOG_ERROR, log_stream, NULL);
logger_set_stream(&logger, LOG_WARNING, log_stream, NULL);
- CHECK(ssol_device_create(&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK);
+ CHECK(ssol_device_create
+ (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK);
CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
@@ -81,8 +82,8 @@ main(int argc, char** argv)
attribs[1].get = get_normal;
attribs[2].usage = SSOL_TEXCOORD;
attribs[2].get = get_uv;
- CHECK(ssol_mesh_setup
- (shape, box_walls_ntris, get_ids, box_walls_nverts, attribs, 3, &box_walls_desc), RES_OK);
+ CHECK(ssol_mesh_setup(shape, box_walls_ntris, get_ids, box_walls_nverts,
+ attribs, 3, &box_walls_desc), RES_OK);
CHECK(ssol_material_create_mirror(dev, &material), RES_OK);
CHECK(ssol_mirror_set_shader(material, &shader), RES_OK);
CHECK(ssol_object_create(dev, shape, material, &object), RES_OK);