solstice-solver

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

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:
Msrc/ssol_solver.c | 294++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/ssol_sun_c.h | 5+++--
Msrc/test_ssol_geometries.h | 13+++++--------
Msrc/test_ssol_solver.c | 7++++---
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);