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