solstice-solver

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

commit 0eb9e7d9ba4a52a920c1c206296291b5b8ac26a3
parent 4a6a6bfe909be4058b7c6baff13f40dcbee6c5e7
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu,  1 Dec 2016 14:19:48 +0100

Implement and test ssol_material_set_param_buffer

Diffstat:
Msrc/ssol.h | 6++++++
Msrc/ssol_material.c | 23+++++++++++++++++------
Msrc/ssol_material_c.h | 1+
Msrc/test_ssol_material.c | 12+++++++++---
Msrc/test_ssol_materials.h | 59++++++++++++++++++++++++++++++++---------------------------
5 files changed, 65 insertions(+), 36 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -189,6 +189,7 @@ static const struct ssol_punched_surface SSOL_PUNCHED_SURFACE_NULL = typedef void (*ssol_shader_getter_T) (struct ssol_device* dev, + struct ssol_param_buffer* buf, const double wavelength, /* In nanometer */ const double P[3], /* World space position */ const double Ng[3], /* World space geometry normal */ @@ -431,6 +432,11 @@ ssol_material_ref_put (struct ssol_material* mtl); SSOL_API res_T +ssol_material_set_param_buffer + (struct ssol_material* mtl, + struct ssol_param_buffer* buf); + +SSOL_API res_T ssol_mirror_set_shader (struct ssol_material* mtl, const struct ssol_mirror_shader* shader); diff --git a/src/ssol_material.c b/src/ssol_material.c @@ -54,12 +54,12 @@ mirror_shade shader = &mtl->data.mirror; /* Fetch material attribs */ - shader->normal(mtl->dev, wavelength, fragment->pos, fragment->Ng, - fragment->Ns, fragment->uv, fragment->dir, normal); - shader->reflectivity(mtl->dev, wavelength, fragment->pos, fragment->Ng, - fragment->Ns, fragment->uv, fragment->dir, &reflectivity); - shader->roughness(mtl->dev, wavelength, fragment->pos, fragment->Ng, - fragment->Ns, fragment->uv, fragment->dir, &roughness); + shader->normal(mtl->dev, mtl->buf, wavelength, fragment->pos, + fragment->Ng, fragment->Ns, fragment->uv, fragment->dir, normal); + shader->reflectivity(mtl->dev, mtl->buf, wavelength, fragment->pos, + fragment->Ng, fragment->Ns, fragment->uv, fragment->dir, &reflectivity); + shader->roughness(mtl->dev, mtl->buf, wavelength, fragment->pos, + fragment->Ng, fragment->Ns, fragment->uv, fragment->dir, &roughness); /* Setup the fresnel term */ res = ssf_fresnel_create(mtl->dev->allocator, &ssf_fresnel_constant, &fresnel); @@ -107,6 +107,7 @@ material_release(ref_T* ref) struct ssol_material* material = CONTAINER_OF(ref, struct ssol_material, ref); ASSERT(ref); dev = material->dev; + if(material->buf) SSOL(param_buffer_ref_put(material->buf)); ASSERT(dev && dev->allocator); MEM_RM(dev->allocator, material); SSOL(device_ref_put(dev)); @@ -187,6 +188,16 @@ ssol_material_ref_put(struct ssol_material* material) } res_T +ssol_material_set_param_buffer + (struct ssol_material* mtl, struct ssol_param_buffer* buf) +{ + if(!mtl || !buf) return RES_BAD_ARG; + SSOL(param_buffer_ref_get(buf)); + mtl->buf = buf; + return RES_OK; +} + +res_T ssol_material_create_mirror (struct ssol_device* dev, struct ssol_material** out_material) { diff --git a/src/ssol_material_c.h b/src/ssol_material_c.h @@ -47,6 +47,7 @@ struct ssol_material { struct ssol_mirror_shader mirror; } data; + struct ssol_param_buffer* buf; struct ssol_device* dev; ref_T ref; }; diff --git a/src/test_ssol_material.c b/src/test_ssol_material.c @@ -19,9 +19,6 @@ #include <rsys/logger.h> -/******************************************************************************* - * Test main program - ******************************************************************************/ int main(int argc, char** argv) { @@ -30,6 +27,7 @@ main(int argc, char** argv) struct ssol_device* dev; struct ssol_material* material; struct ssol_mirror_shader shader = SSOL_MIRROR_SHADER_NULL; + struct ssol_param_buffer* pbuf = NULL; (void) argc, (void) argv; mem_init_proxy_allocator(&allocator, &mem_default_allocator); @@ -52,6 +50,8 @@ main(int argc, char** argv) CHECK(ssol_material_ref_put(NULL), RES_BAD_ARG); CHECK(ssol_material_ref_put(material), RES_OK); + CHECK(ssol_param_buffer_create(dev, &pbuf), RES_OK); + shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; @@ -61,6 +61,11 @@ main(int argc, char** argv) CHECK(ssol_mirror_set_shader(material, &shader), RES_OK); CHECK(ssol_mirror_set_shader(material, &shader), RES_OK); + CHECK(ssol_material_set_param_buffer(NULL, NULL), RES_BAD_ARG); + CHECK(ssol_material_set_param_buffer(material, NULL), RES_BAD_ARG); + CHECK(ssol_material_set_param_buffer(NULL, pbuf), RES_BAD_ARG); + CHECK(ssol_material_set_param_buffer(material, pbuf), RES_OK); + shader.normal = NULL; CHECK(ssol_mirror_set_shader(material, &shader), RES_BAD_ARG); shader.normal = get_shader_normal; @@ -80,6 +85,7 @@ main(int argc, char** argv) CHECK(ssol_material_create_virtual(dev, &material), RES_OK); CHECK(ssol_material_ref_put(material), RES_OK); + CHECK(ssol_param_buffer_ref_put(pbuf), RES_OK); CHECK(ssol_device_ref_put(dev), RES_OK); diff --git a/src/test_ssol_materials.h b/src/test_ssol_materials.h @@ -20,47 +20,52 @@ struct ssol_device; static void get_shader_normal -(struct ssol_device* dev, - const double wavelength, - const double P[3], - const double Ng[3], - const double Ns[3], - const double uv[2], - const double w[3], - double* val) + (struct ssol_device* dev, + struct ssol_param_buffer* buf, + const double wavelength, + const double P[3], + const double Ng[3], + const double Ns[3], + const double uv[2], + const double w[3], + double* val) { int i; - (void)dev, (void)wavelength, (void)P, (void)Ng, (void)uv, (void)w; + (void)dev, (void)buf, (void)wavelength, (void)P, (void)Ng, (void)uv, (void)w; FOR_EACH(i, 0, 3) val[i] = Ns[i]; } static void get_shader_reflectivity -(struct ssol_device* dev, - const double wavelength, - const double P[3], - const double Ng[3], - const double Ns[3], - const double uv[2], - const double w[3], - double* val) + (struct ssol_device* dev, + struct ssol_param_buffer* buf, + const double wavelength, + const double P[3], + const double Ng[3], + const double Ns[3], + const double uv[2], + const double w[3], + double* val) { - (void)dev, (void)wavelength, (void)P, (void)Ng, (void)Ns, (void)uv, (void) w; + (void)dev, (void)buf, (void)wavelength; + (void)P, (void)Ng, (void)Ns, (void)uv, (void) w; *val = 1; } static void get_shader_roughness -(struct ssol_device* dev, - const double wavelength, - const double P[3], - const double Ng[3], - const double Ns[3], - const double uv[2], - const double w[3], - double* val) + (struct ssol_device* dev, + struct ssol_param_buffer* buf, + const double wavelength, + const double P[3], + const double Ng[3], + const double Ns[3], + const double uv[2], + const double w[3], + double* val) { - (void)dev, (void)wavelength, (void)P, (void)Ng, (void)Ns, (void)uv, (void) w; + (void)dev, (void)buf, (void)wavelength; + (void)P, (void)Ng, (void)Ns, (void)uv, (void) w; *val = 0; }