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:
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