solstice-solver

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

commit a1ac617b29739bd07dcf84cf94da2e8d521355c2
parent 86b77d732ec84f1a8db50169d60dcc79d8786565
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu,  2 Mar 2017 14:53:17 +0100

Merge remote-tracking branch 'origin/develop' into feature_hyperbols

Diffstat:
Msrc/ssol.h | 2+-
Msrc/ssol_c.h | 4++--
Msrc/ssol_draw.c | 21++++++++++++++++++++-
Msrc/ssol_material.c | 9+++++----
Msrc/test_ssol_material.c | 6+++---
Msrc/test_ssol_materials.h | 4++--
6 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -249,7 +249,7 @@ static const struct ssol_matte_shader SSOL_MATTE_SHADER_NULL = /* Thin dielectric shader */ struct ssol_thin_dielectric_shader { ssol_shader_getter_T normal; - ssol_shader_getter_T transmissivity; + ssol_shader_getter_T absorption; ssol_shader_getter_T thickness; ssol_shader_getter_T refractive_index; }; diff --git a/src/ssol_c.h b/src/ssol_c.h @@ -41,11 +41,11 @@ struct ray_data { /* Output data */ double N[3]; /* Normal of the nearest punched surface point */ - double dst; /* Hit distance of the nearest punced surface point */ + double dst; /* Hit distance of the nearest punched surface point */ }; static const struct ray_data RAY_DATA_NULL = { - NULL, S3D_PRIMITIVE_NULL__, NULL, SSOL_INVALID_SIDE, 0, 0, 0, {0, 0, 0}, 0 + NULL, S3D_PRIMITIVE_NULL__, NULL, SSOL_INVALID_SIDE, 0, 0, 0, {0,0,0}, FLT_MAX }; diff --git a/src/ssol_draw.c b/src/ssol_draw.c @@ -17,7 +17,9 @@ #include "ssol_c.h" #include "ssol_camera.h" #include "ssol_device_c.h" +#include "ssol_object_c.h" #include "ssol_scene_c.h" +#include "ssol_shape_c.h" #include <rsys/double3.h> #include <rsys/math.h> @@ -59,8 +61,25 @@ Li(struct ssol_scene* scn, if(S3D_HIT_NONE(&hit)) { d3_splat(val, 0); } else { + struct ssol_instance* inst; + const struct shaded_shape* sshape; + size_t isshape; float N[3]={0}; - f3_normalize(N, hit.normal); + + /* Retrieve the hit shaded shape */ + inst = *htable_instance_find(&scn->instances_rt, &hit.prim.inst_id); + isshape = *htable_shaded_shape_find + (&inst->object->shaded_shapes_rt, &hit.prim.geom_id); + sshape = darray_shaded_shape_cdata_get + (&inst->object->shaded_shapes) + isshape; + + /* Retrieve and normalized the hit normal */ + switch(sshape->shape->type) { + case SHAPE_MESH: f3_normalize(N, hit.normal); break; + case SHAPE_PUNCHED: f3_normalize(N, f3_set_d3(N, ray_data.N)); break; + default: FATAL("Unreachable code"); break; + } + ASSERT(f3_is_normalized(N)); d3_splat(val, fabs(f3_dot(N, dir))); } } diff --git a/src/ssol_material.c b/src/ssol_material.c @@ -151,7 +151,7 @@ thin_dielectric_shade const struct ssol_thin_dielectric_shader* shader; double N[3]; double thickness; - double T; + double absorption; const double eta_i = 1.0002772; /* Refractive index of the air */ double eta_t; res_T res = RES_OK; @@ -166,7 +166,7 @@ thin_dielectric_shade fragment->Ng, fragment->Ns, fragment->uv, fragment->dir, Dst) FETCH(normal, N); FETCH(thickness, &thickness); - FETCH(transmissivity, &T); + FETCH(absorption, &absorption); FETCH(refractive_index, &eta_t); #undef FETCH @@ -174,7 +174,8 @@ thin_dielectric_shade res = ssf_bxdf_create (mtl->dev->allocator, &ssf_thin_specular_dielectric, &bxdf); if(res != RES_OK) goto error; - res = ssf_thin_specular_dielectric_setup(bxdf, T, eta_i, eta_t, thickness); + res = ssf_thin_specular_dielectric_setup + (bxdf, absorption, eta_i, eta_t, thickness); if(res != RES_OK) goto error; /* Setup the BSDF */ @@ -210,7 +211,7 @@ check_shader_thin_differential(const struct ssol_thin_dielectric_shader* shader) { return shader && shader->normal - && shader->transmissivity + && shader->absorption && shader->thickness && shader->refractive_index; } diff --git a/src/test_ssol_material.c b/src/test_ssol_material.c @@ -122,7 +122,7 @@ test_thin_dielectric(struct ssol_device* dev) CHECK(type, SSOL_MATERIAL_THIN_DIELECTRIC); thin_dielectric.normal = get_shader_normal; - thin_dielectric.transmissivity = get_shader_transmissivity; + thin_dielectric.absorption = get_shader_absorption; thin_dielectric.thickness = get_shader_thickness; thin_dielectric.refractive_index = get_shader_refractive_index; @@ -135,9 +135,9 @@ test_thin_dielectric(struct ssol_device* dev) CHECK(ssol_thin_dielectric_set_shader(material, &thin_dielectric), RES_BAD_ARG); thin_dielectric.normal = get_shader_normal; - thin_dielectric.transmissivity = NULL; + thin_dielectric.absorption = NULL; CHECK(ssol_thin_dielectric_set_shader(material, &thin_dielectric), RES_BAD_ARG); - thin_dielectric.transmissivity = get_shader_transmissivity; + thin_dielectric.absorption = get_shader_absorption; thin_dielectric.thickness = NULL; CHECK(ssol_thin_dielectric_set_shader(material, &thin_dielectric), RES_BAD_ARG); diff --git a/src/test_ssol_materials.h b/src/test_ssol_materials.h @@ -91,7 +91,7 @@ get_shader_roughness } static INLINE void -get_shader_transmissivity +get_shader_absorption (struct ssol_device* dev, struct ssol_param_buffer* buf, const double wavelength, @@ -104,7 +104,7 @@ get_shader_transmissivity { (void)dev, (void)buf, (void)wavelength; (void)P, (void)Ng, (void)Ns, (void)uv, (void) w; - *val = 1; + *val = 0; } static INLINE void