solstice-solver

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

commit bded6edefa46e89034f766c97170ff954589cee4
parent 62ff97ee72b9944937e10cc9ba9083bfaab55130
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 23 Aug 2016 18:49:55 +0200

Use new s3d_view API.

Diffstat:
Msrc/ssol_object_instance.c | 2+-
Msrc/ssol_scene.c | 19-------------------
Msrc/ssol_scene_c.h | 19+++++++++++++++++++
Msrc/ssol_solver.c | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Msrc/ssol_solver_c.h | 18++++++------------
5 files changed, 91 insertions(+), 54 deletions(-)

diff --git a/src/ssol_object_instance.c b/src/ssol_object_instance.c @@ -148,8 +148,8 @@ res_T ssol_object_instance_is_attached (struct ssol_object_instance* instance, char* is_attached) { + FATAL("Not implemented yet."); if(!instance || !is_attached) return RES_BAD_ARG; - S3D(shape_is_attached(instance->s3d_shape, is_attached)); return RES_OK; } diff --git a/src/ssol_scene.c b/src/ssol_scene.c @@ -22,30 +22,11 @@ #include "ssol_object_c.h" #include "ssol_object_instance_c.h" -#include <rsys/hash_table.h> #include <rsys/list.h> #include <rsys/mem_allocator.h> -#include <rsys/ref_count.h> #include <rsys/rsys.h> #include <rsys/float3.h> -/* Define the htable_instance data structure */ -#define HTABLE_NAME instance -#define HTABLE_KEY unsigned /* S3D object instance identifier */ -#define HTABLE_DATA struct ssol_object_instance* -#include <rsys/hash_table.h> - -struct ssol_scene -{ - struct htable_instance instances; - struct s3d_scene* s3d_scn; - struct s3d_scene* s3d_sampling_scn; - struct ssol_sun* sun; - - struct ssol_device* dev; - ref_T ref; -}; - /******************************************************************************* * Helper functions ******************************************************************************/ diff --git a/src/ssol_scene_c.h b/src/ssol_scene_c.h @@ -17,6 +17,25 @@ #define SSOL_SCENE_C_H #include <rsys/rsys.h> +#include <rsys/ref_count.h> +#include <rsys/hash_table.h> + + /* Define the htable_instance data structure */ +#define HTABLE_NAME instance +#define HTABLE_KEY unsigned /* S3D object instance identifier */ +#define HTABLE_DATA struct ssol_object_instance* +#include <rsys/hash_table.h> + +struct ssol_scene +{ + struct htable_instance instances; + struct s3d_scene* s3d_scn; + struct s3d_scene* s3d_sampling_scn; + struct ssol_sun* sun; + + struct ssol_device* dev; + ref_T ref; +}; struct s3d_hit; struct s3d_scene; diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -157,19 +157,19 @@ get_transform(const struct ssol_object_instance* instance) * Local functions ******************************************************************************/ res_T -set_sun_distributions - (const struct ssol_sun* sun, - struct solver_data* data) -{ +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 (!sun || !data) return RES_BAD_ARG; + 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 */ @@ -298,31 +298,79 @@ quadric_transform return RES_OK; } +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) { res_T res = RES_OK; - const struct ssol_sun* sun; - struct s3d_scene* scene3d; + if (!data || !scene) return RES_BAD_ARG; - sun = scene_get_sun(scene); - ASSERT(sun); data->scene = scene; - /* create geometry-related data */ - /* res = process_instances(data); */ + /* create 2 s3d_scene_view for raytracing and sampling */ + res = set_views(data); if (res != RES_OK) goto error; /* create sun distributions */ - res = set_sun_distributions(sun, data); + res = set_sun_distributions(data); if (res != RES_OK) goto error; - scene3d = scene_get_s3d_scene(scene); - S3D(scene_begin_session(scene3d, S3D_TRACE)); exit: return res; error: + /* TODO: clear data */ goto exit; } @@ -408,8 +456,6 @@ ssol_solve FILE* output) { struct solver_data data; - struct s3d_scene* s3d_scn = NULL; - struct s3d_scene* s3d_sampling_scn = NULL; struct brdf_composite* brdfs = NULL; struct s3d_primitive primitive; struct s3d_attrib attrib; @@ -438,8 +484,6 @@ ssol_solve res = init_solver_data(scene, &data); if (res != RES_OK) goto error; - s3d_scn = scene_get_s3d_scene(scene); - s3d_sampling_scn = scene_get_s3d_sampling_scn(scene); sun = scene_get_sun(scene); rz.sun_segment.weight = ssol_sun_get_dni(sun); for (r = 0; r < realisations_count; r++) { @@ -456,7 +500,7 @@ ssol_solve r1 = ssp_rng_canonical_float(rng); r2 = ssp_rng_canonical_float(rng); r3 = ssp_rng_canonical_float(rng); - S3D(scene_sample(s3d_sampling_scn, r1, r2, r3, &primitive, uv)); + S3D(scene_view_sample(data.sample_view, r1, r2, r3, &primitive, uv)); S3D(primitive_get_attrib(&primitive, S3D_POSITION, uv, &attrib)); CHECK(attrib.type, S3D_FLOAT3); @@ -475,7 +519,7 @@ ssol_solve /* check if the point receives sunlight */ /* TODO: need only an occlusion test */ - S3D(scene_trace_ray(s3d_scn, 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; @@ -512,7 +556,7 @@ ssol_solve brdf_composite_sample(brdfs, rng, prev->dir, tmp, seg->dir); /* then check if the ray hits something */ - S3D(scene_trace_ray(s3d_scn, 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; @@ -541,7 +585,6 @@ ssol_solve exit: /* TODO: release data */ - S3D(scene_end_session(s3d_scn)); clear_realization(&rz); return res; error: diff --git a/src/ssol_solver_c.h b/src/ssol_solver_c.h @@ -34,11 +34,10 @@ struct solver_data { struct ssol_scene* scene; - /* data comming from instances of the scene */ - struct darray_quadric quadrics; - struct darray_3dshape shapes; - /* the 3D scene used for raytracing */ - struct s3d_scene* scene3d; + /* the s3d_scene_view used for raytracing */ + struct s3d_scene_view* trace_view; + /* the s3d_scene_view used for sampling */ + struct s3d_scene_view* sample_view; /* the random distributions for sun sampling */ struct ranst_sun_dir* sun_dir_ran; struct ssp_ranst_piecewise_linear* sun_spectrum_ran; @@ -47,15 +46,10 @@ struct solver_data { /* TODO: refcount management for data */ extern LOCAL_SYM res_T -set_sun_distributions - (const struct ssol_sun* sun, - struct solver_data* data); +set_sun_distributions(struct solver_data* data); -#if 0 extern LOCAL_SYM res_T -process_instances - (struct solver_data* data); -#endif +set_views(struct solver_data* data); /* transform a single quadric in world space */ extern LOCAL_SYM res_T