solstice-solver

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

commit e5645bad933e0416dd172ab4b95411ebb85df9db
parent a97269bdcdb8fc0c1f51f61a39a535ceed7c1018
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri,  8 Jul 2016 11:35:22 +0200

Continue solver utility code.

Diffstat:
Msrc/ssol_solver.c | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Msrc/ssol_solver_c.h | 17+++++++++++++++--
2 files changed, 87 insertions(+), 8 deletions(-)

diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -19,12 +19,16 @@ #include "ssol_scene_c.h" #include "ssol_shape_c.h" #include "ssol_object_c.h" +#include "ssol_sun_c.h" +#include "ssol_spectrum_c.h" #include "ssol_object_instance_c.h" #include <rsys/rsys.h> #include <rsys/mem_allocator.h> #include <rsys/ref_count.h> +#include <star/ssp.h> + /******************************************************************************* * Helper functions ******************************************************************************/ @@ -128,12 +132,70 @@ get_transform } /******************************************************************************* -* Local functions +* ssol_solver functions ******************************************************************************/ -/******************************************************************************* -* Exported ssol_solver functions -******************************************************************************/ +res_T +init_solver_data +(struct solver_data* data, + struct ssol_device* dev) +{ + res_T res = RES_OK; + if (!data || !dev) return RES_BAD_ARG; + + data->dev = dev; + darray_quadric_init(dev->allocator, &data->quadrics); + darray_3dshape_init(dev->allocator, &data->shapes); + res = ssp_ranst_piecewise_linear_create(dev->allocator, &data->sun_spectrum_ran); + if (res != RES_OK) return res; + res = ssol_ran_sun_dir_create(dev->allocator, &data->sun_dir_ran); + if (res != RES_OK) { + SSP(ranst_piecewise_linear_ref_put(data->sun_spectrum_ran)); + return res; + } + return res; +} + +res_T +set_sun_distributions + (const struct ssol_sun* sun, + struct solver_data* data) +{ + struct ssol_spectrum* spectrum; + struct mem_allocator* allocator; + const double* frequencies; + const double* intensities; + res_T res = RES_OK; + size_t sz; + if (!sun || !data) return RES_BAD_ARG; + + ASSERT(data->dev && data->dev->allocator); + allocator = data->dev->allocator; + /* first set the spectrum distribution */ + 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) return res; + /* then the direction distribution */ + switch (sun->type) { + case SUN_DIRECTIONAL: + res = ssol_ran_sun_dir_dirac_setup(data->sun_dir_ran, sun->direction); + break; + case SUN_PILLBOX: + res = ssol_ran_sun_dir_pillbox_setup(data->sun_dir_ran, sun->data.pillbox.aperture, sun->direction); + break; + case SUN_CSR: + res = ssol_ran_sun_dir_buie_setup(data->sun_dir_ran, sun->data.csr.ratio, sun->direction); + break; + default: + res = RES_OK; + FATAL("Unreachable code \n"); + } + + return res; +} /* Implementation notes: * @@ -225,6 +287,9 @@ process_instances struct solver_data* data) { struct list_node* node; + const double* transform; + int i; + float tr[12]; if (!scene || !data) return RES_BAD_ARG; @@ -240,9 +305,9 @@ process_instances struct s3d_scene* scene3D; struct s3d_shape* shape3D; + transform = get_transform(instance); if (is_instance_punched(instance)) { const struct ssol_quadric* quadric = get_quadric(instance); - const double* transform = get_transform(instance); struct ssol_quadric transformed; quadric_transform(quadric, transform, &transformed); darray_quadric_push_back(&data->quadrics, &transformed); @@ -252,7 +317,8 @@ process_instances scene3D = get_3dscene(instance); s3d_scene_instantiate(scene3D, &shape3D); /* apply transform: TODO */ - + FOR_EACH(i, 0, 12) tr[i] = (float)transform[i]; + s3d_instance_set_transform(shape3D, tr); darray_3dshape_push_back(&data->shapes, &shape3D); /* and attach it to the main scene */ diff --git a/src/ssol_solver_c.h b/src/ssol_solver_c.h @@ -16,10 +16,15 @@ #ifndef SSOL_SOLVER_C_H #define SSOL_SOLVER_C_H +#include "ssol_distributions_c.h" + #include <rsys/ref_count.h> #include <rsys/list.h> #include <rsys/dynamic_array.h> +#include <star/ssp.h> + + #define DARRAY_NAME quadric #define DARRAY_DATA struct ssol_quadric #include <rsys/dynamic_array.h> @@ -33,6 +38,7 @@ #undef DARRAY_DATA struct solver_data { + struct ssol_device* dev; /* data comming from instances of the scene */ size_t shapes_count; size_t quadrics_count; @@ -41,15 +47,22 @@ struct solver_data { /* the 3D scene used for raytracing */ struct s3d_scene *scene; /* the random distribution for sun sampling */ + struct ssol_ran_sun_dir* sun_dir_ran; + struct ssp_ranst_piecewise_linear* sun_spectrum_ran; }; -SSOL_API res_T +res_T +set_sun_distributions +(const struct ssol_sun* sun, + struct solver_data* data); + +res_T process_instances (const struct ssol_scene* scene, struct solver_data* data); /* transform a single quadric in world space */ -SSOL_API res_T +res_T quadric_transform (const struct ssol_quadric* quadric, const double transform[],