star-sf

Set of surface and volume scattering functions
git clone git://git.meso-star.fr/star-sf.git
Log | Files | Refs | README | LICENSE

commit b230ebbce26e91418b39693d22985641316fda39
parent b695e6b6ce02976610a0532c485ed9aa9d72a1f0
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 19 Jul 2018 15:48:36 +0200

The init/release of the BSDF/fresnel/microfacet/phase types can be NULL

Diffstat:
Msrc/ssf.h | 33++++++++++++++++++---------------
Msrc/ssf_beckmann_distribution.c | 6+-----
Msrc/ssf_blinn_distribution.c | 6+-----
Msrc/ssf_bsdf.c | 24+++++++++++++-----------
Msrc/ssf_fresnel.c | 24+++++++++++++-----------
Msrc/ssf_fresnel_dielectric_conductor.c | 25+++----------------------
Msrc/ssf_fresnel_dielectric_dielectric.c | 22++--------------------
Msrc/ssf_lambertian_reflection.c | 17++---------------
Msrc/ssf_microfacet_distribution.c | 28+++++++++++++++-------------
Msrc/ssf_microfacet_reflection.c | 15++-------------
Msrc/ssf_phase.c | 24+++++++++++++-----------
Msrc/ssf_specular_reflection.c | 10+---------
Msrc/test_ssf_bsdf.c | 17+++++++++--------
Msrc/test_ssf_fresnel.c | 16++++++++--------
Msrc/test_ssf_microfacet_distribution.c | 15+++++++++------
Msrc/test_ssf_phase.c | 18+++++++++---------
16 files changed, 119 insertions(+), 181 deletions(-)

diff --git a/src/ssf.h b/src/ssf.h @@ -62,8 +62,8 @@ enum ssf_bxdf_flag { * consequence the reflected or refracted direction `wi' must point on the same * side or on the opposite side of `N', respectively. */ struct ssf_bsdf_type { - res_T (*init)(struct mem_allocator* allocator, void* bsdf); - void (*release)(void* bsdf); + res_T (*init)(struct mem_allocator* allocator, void* bsdf); /* Can be NULL */ + void (*release)(void* bsdf); /* Can be NULL */ /* Sample a direction `wi' wrt `wo' whose pdf is BSDF(wo, wi) |wi.n|. Return * the value of BSDF(wo, wi) */ @@ -94,15 +94,15 @@ struct ssf_bsdf_type { const double wi[3]);/* Normalized incoming direction */ size_t sizeof_bsdf; /* In Bytes */ - size_t alignof_bsdf; /* In Bytes */ + size_t alignof_bsdf; /* In Bytes. Must be a power of 2 */ }; #define SSF_BSDF_TYPE_NULL__ {NULL, NULL, NULL, NULL, NULL, 0, 1} static const struct ssf_bsdf_type SSF_BXDF_TYPE_NULL = SSF_BSDF_TYPE_NULL__; /* Generic Fresnel term descriptor */ struct ssf_fresnel_type { - res_T (*init)(struct mem_allocator* allocator, void* fresnel); - void (*release)(void* bxdf); + res_T (*init)(struct mem_allocator* allocator, void* fresnel); /* Can be NULL */ + void (*release)(void* bxdf); /* Can be NULL */ double (*eval) @@ -110,7 +110,7 @@ struct ssf_fresnel_type { const double cos_wi_N); /* Cosine between facet normal and incoming dir */ size_t sizeof_fresnel; /* In Bytes */ - size_t alignof_fresnel; /* In Bytes */ + size_t alignof_fresnel; /* In Bytes. Must be a power of 2 */ }; #define SSF_FRESNEL_TYPE_NULL__ {NULL, NULL, NULL, 0, 1} static const struct ssf_fresnel_type SSF_FRESNEL_TYPE_NULL = @@ -118,8 +118,8 @@ static const struct ssf_fresnel_type SSF_FRESNEL_TYPE_NULL = /* Generic descriptor of a microfacet distribution */ struct ssf_microfacet_distribution_type { - res_T (*init)(struct mem_allocator* allocator, void* distrib); - void (*release)(void* distrib); + res_T (*init)(struct mem_allocator* allocator, void* distrib); /* Can be NULL */ + void (*release)(void* distrib); /* Can be NULL */ void (*sample) @@ -142,7 +142,7 @@ struct ssf_microfacet_distribution_type { const double wh[3]); /* Normalized half vector */ size_t sizeof_distribution; /* In Bytes */ - size_t alignof_distribution; /* In Bytes */ + size_t alignof_distribution; /* In Bytes. Must be a Power of 2 */ }; #define SSF_MICROFACET_DISTRIBUTION_TYPE_NULL__ \ {NULL, NULL, NULL, NULL, NULL, 0, 1} @@ -153,12 +153,11 @@ SSF_MICROFACET_DISTRIBUTION_TYPE_NULL = SSF_MICROFACET_DISTRIBUTION_TYPE_NULL__; * direction `wo' and the incoming direction `wi' point outward the scattering * point */ struct ssf_phase_type { - res_T (*init)(struct mem_allocator* allocator, void* bsdf); - void (*release)(void* bsdf); + res_T (*init)(struct mem_allocator* allocator, void* bsdf); /*Can be NULL*/ + void (*release)(void* bsdf); /* Can be NULL */ - /* Sample a direction `wi' wrt `wo'. TODO comment the PDF and the return - * value */ - double + /* Sample a direction `wi' wrt `wo'. TODO comment the PDF */ + double /* FIXME */ (*sample) (void* phase, struct ssp_rng* rng, /* Random number generator */ @@ -180,7 +179,7 @@ struct ssf_phase_type { const double wi[3]); /* Normalized incoming direction */ size_t sizeof_phase; /* In Bytes */ - size_t alignof_phase; /* In Bytes */ + size_t alignof_phase; /* In Bytes. Must be a power of 2 */ }; #define SSF_PHASE_TYPE_NULL__ {NULL,NULL,NULL,NULL,NULL,0,1} static const struct ssf_phase_type SSF_PHASE_TYPE_NULL = SSF_PHASE_TYPE_NULL__; @@ -303,6 +302,10 @@ SSF_API const struct ssf_microfacet_distribution_type ssf_pillbox_distribution; * TODO add comments */ SSF_API const struct ssf_phase_type ssf_phase_hg; +/* Rayleigh phase function + * TODO add comments */ +SSF_API const struct ssf_phase_type ssf_phase_rayleigh; + /******************************************************************************* * BSDF API - Bidirectional Scattering Distribution Function. Describes the way * the light is scattered by a surface. Note that by convention the outgoing diff --git a/src/ssf_beckmann_distribution.c b/src/ssf_beckmann_distribution.c @@ -37,10 +37,6 @@ beckmann_distribution_init(struct mem_allocator* allocator, void* distrib) return RES_OK; } -static void -beckmann_distribution_release(void* distrib) -{ (void)distrib; } - static double beckmann_distribution_eval (void* distrib, const double N[3], const double wh[3]) @@ -121,7 +117,7 @@ beckmann_distribution_pdf ******************************************************************************/ const struct ssf_microfacet_distribution_type ssf_beckmann_distribution = { beckmann_distribution_init, - beckmann_distribution_release, + NULL, beckmann_distribution_sample, beckmann_distribution_eval, beckmann_distribution_pdf, diff --git a/src/ssf_blinn_distribution.c b/src/ssf_blinn_distribution.c @@ -37,10 +37,6 @@ blinn_distribution_init(struct mem_allocator* allocator, void* distrib) return RES_OK; } -static void -blinn_distribution_release(void* distrib) -{ (void)distrib; } - static double blinn_distribution_eval(void* distrib, const double N[3], const double wh[3]) { @@ -102,7 +98,7 @@ blinn_distribution_pdf(void* distrib, const double N[3], const double wh[3]) ******************************************************************************/ const struct ssf_microfacet_distribution_type ssf_blinn_distribution = { blinn_distribution_init, - blinn_distribution_release, + NULL, blinn_distribution_sample, blinn_distribution_eval, blinn_distribution_pdf, diff --git a/src/ssf_bsdf.c b/src/ssf_bsdf.c @@ -29,8 +29,6 @@ static INLINE int check_bsdf_type(const struct ssf_bsdf_type* type) { return type - && type->init - && type->release && type->sample && type->eval && type->pdf @@ -43,7 +41,7 @@ bsdf_release(ref_T* ref) struct ssf_bsdf* bsdf = CONTAINER_OF(ref, struct ssf_bsdf, ref); ASSERT(ref); if(bsdf->data) { - bsdf->type.release(bsdf->data); + if(bsdf->type.release) bsdf->type.release(bsdf->data); MEM_RM(bsdf->allocator, bsdf->data); } MEM_RM(bsdf->allocator, bsdf); @@ -76,15 +74,19 @@ ssf_bsdf_create bsdf->allocator = mem_allocator; bsdf->type = *type; - bsdf->data = MEM_ALLOC_ALIGNED - (bsdf->allocator, bsdf->type.sizeof_bsdf, bsdf->type.alignof_bsdf); - if(!bsdf->data) { - res = RES_MEM_ERR; - goto error; + if(bsdf->type.sizeof_bsdf) { + bsdf->data = MEM_ALLOC_ALIGNED + (bsdf->allocator, bsdf->type.sizeof_bsdf, bsdf->type.alignof_bsdf); + if(!bsdf->data) { + res = RES_MEM_ERR; + goto error; + } + memset(bsdf->data, 0, bsdf->type.sizeof_bsdf); + if(bsdf->type.init) { + res = bsdf->type.init(mem_allocator, bsdf->data); + if(res != RES_OK) goto error; + } } - memset(bsdf->data, 0, bsdf->type.sizeof_bsdf); - res = bsdf->type.init(mem_allocator, bsdf->data); - if(res != RES_OK) goto error; exit: if(out_bsdf) *out_bsdf = bsdf; diff --git a/src/ssf_fresnel.c b/src/ssf_fresnel.c @@ -27,8 +27,6 @@ static INLINE int check_fresnel_type(const struct ssf_fresnel_type* type) { return type - && type->init - && type->release && type->eval && IS_POW2(type->alignof_fresnel); } @@ -39,7 +37,7 @@ fresnel_release(ref_T* ref) struct ssf_fresnel* fresnel = CONTAINER_OF(ref, struct ssf_fresnel, ref); ASSERT(ref); if(fresnel->data) { - fresnel->type.release(fresnel->data); + if(fresnel->type.release) fresnel->type.release(fresnel->data); MEM_RM(fresnel->allocator, fresnel->data); } MEM_RM(fresnel->allocator, fresnel); @@ -73,15 +71,19 @@ ssf_fresnel_create fresnel->allocator = mem_allocator; fresnel->type = *type; - fresnel->data = MEM_ALLOC_ALIGNED(fresnel->allocator, - fresnel->type.sizeof_fresnel, fresnel->type.alignof_fresnel); - if(!fresnel->data) { - res = RES_MEM_ERR; - goto error; + if(fresnel->type.sizeof_fresnel) { + fresnel->data = MEM_ALLOC_ALIGNED(fresnel->allocator, + fresnel->type.sizeof_fresnel, fresnel->type.alignof_fresnel); + if(!fresnel->data) { + res = RES_MEM_ERR; + goto error; + } + memset(fresnel->data, 0, fresnel->type.sizeof_fresnel); + if(fresnel->type.init) { + res = fresnel->type.init(fresnel->allocator, fresnel->data); + if(res != RES_OK) goto error; + } } - memset(fresnel->data, 0, fresnel->type.sizeof_fresnel); - res = fresnel->type.init(fresnel->allocator, fresnel->data); - if(res != RES_OK) goto error; exit: if(out_fresnel) *out_fresnel = fresnel; diff --git a/src/ssf_fresnel_dielectric_conductor.c b/src/ssf_fresnel_dielectric_conductor.c @@ -27,25 +27,6 @@ struct fresnel_dielectric_conductor { /******************************************************************************* * Private functions ******************************************************************************/ -static res_T -fresnel_dielectric_conductor_init - (struct mem_allocator* allocator, void* fresnel) -{ - struct fresnel_dielectric_conductor* fc = fresnel; - (void)allocator; - ASSERT(fresnel); - fc->eta_i = 0.0; - fc->eta_t = 0.0; - fc->eta_k_t = 0.0; - return RES_OK; -} - -static void -fresnel_dielectric_conductor_release(void* fresnel) -{ - (void)fresnel; -} - /* Code from * https://seblagarde.wordpress.com/2013/04/29/memo-on-fresnel-equations/ */ static double @@ -85,8 +66,8 @@ fresnel_dielectric_conductor_eval(void* fresnel, const double cos_theta_i) * Exported symbols ******************************************************************************/ const struct ssf_fresnel_type ssf_fresnel_dielectric_conductor = { - fresnel_dielectric_conductor_init, - fresnel_dielectric_conductor_release, + NULL, + NULL, fresnel_dielectric_conductor_eval, sizeof(struct fresnel_dielectric_conductor), ALIGNOF(struct fresnel_dielectric_conductor) @@ -100,7 +81,7 @@ ssf_fresnel_dielectric_conductor_setup const double eta_k_t) { struct fresnel_dielectric_conductor* fc; - if(!fresnel + if(!fresnel || !FRESNEL_TYPE_EQ(&fresnel->type, &ssf_fresnel_dielectric_conductor)) { return RES_BAD_ARG; } diff --git a/src/ssf_fresnel_dielectric_dielectric.c b/src/ssf_fresnel_dielectric_dielectric.c @@ -26,24 +26,6 @@ struct fresnel_dielectric_dielectric { /******************************************************************************* * Private functions ******************************************************************************/ -static res_T -fresnel_dielectric_dielectric_init - (struct mem_allocator* allocator, void* fresnel) -{ - struct fresnel_dielectric_dielectric* fd = fresnel; - (void)allocator; - ASSERT(fresnel); - fd->eta_i = 0.0; - fd->eta_t = 0.0; - return RES_OK; -} - -static void -fresnel_dielectric_dielectric_release(void* fresnel) -{ - (void)fresnel; -} - static double fresnel_dielectric_dielectric_eval(void* fresnel, const double cos_theta_i) { @@ -81,8 +63,8 @@ fresnel_dielectric_dielectric_eval(void* fresnel, const double cos_theta_i) * Exported symbols ******************************************************************************/ const struct ssf_fresnel_type ssf_fresnel_dielectric_dielectric = { - fresnel_dielectric_dielectric_init, - fresnel_dielectric_dielectric_release, + NULL, + NULL, fresnel_dielectric_dielectric_eval, sizeof(struct fresnel_dielectric_dielectric), ALIGNOF(struct fresnel_dielectric_dielectric) diff --git a/src/ssf_lambertian_reflection.c b/src/ssf_lambertian_reflection.c @@ -28,19 +28,6 @@ struct lambertian_reflection { /******************************************************************************* * Private functions ******************************************************************************/ -static res_T -lambertian_reflection_init(struct mem_allocator* allocator, void* bsdf) -{ - ASSERT(bsdf); - (void)allocator; - ((struct lambertian_reflection*)bsdf)->reflectivity = 0.0; - return RES_OK; -} - -static void -lambertian_reflection_release(void* bsdf) -{ (void)bsdf; } - static double lambertian_reflection_eval (void* data, const double wo[3], const double N[3], const double wi[3]) @@ -90,8 +77,8 @@ lambertian_reflection_pdf * Exorted symbols ******************************************************************************/ const struct ssf_bsdf_type ssf_lambertian_reflection = { - lambertian_reflection_init, - lambertian_reflection_release, + NULL, + NULL, lambertian_reflection_sample, lambertian_reflection_eval, lambertian_reflection_pdf, diff --git a/src/ssf_microfacet_distribution.c b/src/ssf_microfacet_distribution.c @@ -30,8 +30,6 @@ check_microfacet_distribution_type (const struct ssf_microfacet_distribution_type* type) { return type - && type->init - && type->release && type->sample && type->eval && type->pdf @@ -45,7 +43,7 @@ microfacet_distribution_release(ref_T* ref) CONTAINER_OF(ref, struct ssf_microfacet_distribution, ref); ASSERT(ref); if(distrib->data) { - distrib->type.release(distrib->data); + if(distrib->type.release) distrib->type.release(distrib->data); MEM_RM(distrib->allocator, distrib->data); } MEM_RM(distrib->allocator, distrib); @@ -79,17 +77,21 @@ ssf_microfacet_distribution_create distrib->allocator = mem_allocator; distrib->type = *type; - distrib->data = MEM_ALLOC_ALIGNED - (distrib->allocator, - distrib->type.sizeof_distribution, - distrib->type.alignof_distribution); - if(!distrib->data) { - res = RES_MEM_ERR; - goto error; + if(distrib->type.sizeof_distribution) { + distrib->data = MEM_ALLOC_ALIGNED + (distrib->allocator, + distrib->type.sizeof_distribution, + distrib->type.alignof_distribution); + if(!distrib->data) { + res = RES_MEM_ERR; + goto error; + } + memset(distrib->data, 0, distrib->type.sizeof_distribution); + if(distrib->type.init) { + res = distrib->type.init(mem_allocator, distrib->data); + if(res != RES_OK) goto error; + } } - memset(distrib->data, 0, distrib->type.sizeof_distribution); - res = distrib->type.init(mem_allocator, distrib->data); - if(res != RES_OK) goto error; exit: if(out_distrib) *out_distrib = distrib; diff --git a/src/ssf_microfacet_reflection.c b/src/ssf_microfacet_reflection.c @@ -27,17 +27,6 @@ struct microfacet_reflection { /******************************************************************************* * Microfacet functions ******************************************************************************/ -static res_T -microfacet_reflection_init(struct mem_allocator* allocator, void* data) -{ - struct microfacet_reflection* bsdf = data; - ASSERT(bsdf); - (void)allocator; - bsdf->fresnel = NULL; - bsdf->distrib = NULL; - return RES_OK; -} - static void microfacet_reflection_release(void* data) { @@ -191,7 +180,7 @@ microfacet2_reflection_pdf * Exported symbols ******************************************************************************/ const struct ssf_bsdf_type ssf_microfacet_reflection = { - microfacet_reflection_init, + NULL, microfacet_reflection_release, microfacet_reflection_sample, microfacet_reflection_eval, @@ -201,7 +190,7 @@ const struct ssf_bsdf_type ssf_microfacet_reflection = { }; const struct ssf_bsdf_type ssf_microfacet2_reflection = { - microfacet_reflection_init, + NULL, microfacet_reflection_release, microfacet2_reflection_sample, microfacet2_reflection_eval, diff --git a/src/ssf_phase.c b/src/ssf_phase.c @@ -29,8 +29,6 @@ static INLINE int check_phase_type(const struct ssf_phase_type* type) { return type - && type->init - && type->release && type->sample && type->eval && type->pdf @@ -43,7 +41,7 @@ phase_release(ref_T* ref) struct ssf_phase* phase = CONTAINER_OF(ref, struct ssf_phase, ref); ASSERT(ref); if(phase->data) { - phase->type.release(phase->data); + if(phase->type.release) phase->type.release(phase->data); MEM_RM(phase->allocator, phase->data); } MEM_RM(phase->allocator, phase); @@ -76,15 +74,19 @@ ssf_phase_create phase->allocator = mem_allocator; phase->type = *type; - phase->data = MEM_ALLOC_ALIGNED - (phase->allocator, phase->type.sizeof_phase, phase->type.alignof_phase); - if(!phase->data) { - res = RES_MEM_ERR; - goto error; + if(phase->type.sizeof_phase) { + phase->data = MEM_ALLOC_ALIGNED + (phase->allocator, phase->type.sizeof_phase, phase->type.alignof_phase); + if(!phase->data) { + res = RES_MEM_ERR; + goto error; + } + memset(phase->data, 0, phase->type.sizeof_phase); + if(phase->type.init) { + res = phase->type.init(mem_allocator, phase->data); + if(res != RES_OK) goto error; + } } - memset(phase->data, 0, phase->type.sizeof_phase); - res = phase->type.init(mem_allocator, phase->data); - if(res != RES_OK) goto error; exit: if(out_phase) *out_phase = phase; diff --git a/src/ssf_specular_reflection.c b/src/ssf_specular_reflection.c @@ -26,14 +26,6 @@ struct specular_reflection { /******************************************************************************* * Private functions ******************************************************************************/ -static res_T -specular_reflection_init(struct mem_allocator* allocator, void* bsdf) -{ - ASSERT(bsdf); - (void)allocator, (void)bsdf; - return RES_OK; -} - static void specular_reflection_release(void* data) { @@ -88,7 +80,7 @@ specular_reflection_pdf * Exported symbols ******************************************************************************/ const struct ssf_bsdf_type ssf_specular_reflection = { - specular_reflection_init, + NULL, specular_reflection_release, specular_reflection_sample, specular_reflection_eval, diff --git a/src/test_ssf_bsdf.c b/src/test_ssf_bsdf.c @@ -114,6 +114,7 @@ main(int argc, char** argv) struct bsdf* data; struct ssf_bsdf* bsdf; struct ssf_bsdf_type type = SSF_BXDF_TYPE_NULL; + struct ssf_bsdf_type type2 = bsdf_dummy; double wo[3]; double N[3]; double wi[4]; @@ -156,14 +157,14 @@ main(int argc, char** argv) CHK(ssf_bsdf_ref_put(bsdf) == RES_OK); CHK(bsdf_is_init == 0); - type.init = NULL; - CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG); - CHK(bsdf_is_init == 0); - type.init = bsdf_init; - type.release = NULL; - CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG); - CHK(bsdf_is_init == 0); - type.release = bsdf_release; + type2.init = NULL; + CHK(ssf_bsdf_create(&allocator, &type2, &bsdf) == RES_OK); + CHK(ssf_bsdf_ref_put(bsdf) == RES_OK); + type2.init = bsdf_dummy.init; + type2.release = NULL; + CHK(ssf_bsdf_create(&allocator, &type2, &bsdf) == RES_OK); + CHK(ssf_bsdf_ref_put(bsdf) == RES_OK); + type.sample = NULL; CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG); CHK(bsdf_is_init == 0); diff --git a/src/test_ssf_fresnel.c b/src/test_ssf_fresnel.c @@ -60,6 +60,7 @@ main(int argc, char** argv) struct fresnel* data; struct ssf_fresnel* fresnel; struct ssf_fresnel_type type = SSF_FRESNEL_TYPE_NULL; + struct ssf_fresnel_type type2 = fresnel_dummy; (void)argc, (void)argv; mem_init_proxy_allocator(&allocator, &mem_default_allocator); @@ -96,14 +97,13 @@ main(int argc, char** argv) CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); CHK(fresnel_is_init == 0); - type.init = NULL; - CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG); - CHK(fresnel_is_init == 0); - type.init = fresnel_init; - type.release = NULL; - CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG); - CHK(fresnel_is_init == 0); - type.release = fresnel_release; + type2.init = NULL; + CHK(ssf_fresnel_create(&allocator, &type2, &fresnel) == RES_OK); + CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); + type2.init = fresnel_dummy.init; + CHK(ssf_fresnel_create(&allocator, &type2, &fresnel) == RES_OK); + CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); + type.eval = NULL; CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG); CHK(fresnel_is_init == 0); diff --git a/src/test_ssf_microfacet_distribution.c b/src/test_ssf_microfacet_distribution.c @@ -103,6 +103,7 @@ main(int argc, char** argv) struct ufacet* data; struct ssf_microfacet_distribution_type type = SSF_MICROFACET_DISTRIBUTION_TYPE_NULL; + struct ssf_microfacet_distribution_type type2 = microfacet_dummy; struct ssf_microfacet_distribution* distrib; struct ssp_rng* rng; double N[3], wh[3], pdf; @@ -144,12 +145,14 @@ main(int argc, char** argv) CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK); CHK(ufacet_is_init == 0); - type.init = NULL; - CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG); - type.init = ufacet_init; - type.release = NULL; - CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG); - type.release = ufacet_release; + type2.init = NULL; + CHK(CREATE(&allocator, &type2, &distrib) == RES_OK); + CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK); + type2.init = microfacet_dummy.init; + type2.release = NULL; + CHK(CREATE(&allocator, &type2, &distrib) == RES_OK); + CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK); + type.sample = NULL; CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG); type.sample = ufacet_sample; diff --git a/src/test_ssf_phase.c b/src/test_ssf_phase.c @@ -27,7 +27,6 @@ struct ALIGN(64) phase { double value; }; - static res_T phase_init(struct mem_allocator* allocator, void* phase) { @@ -101,6 +100,7 @@ main(int argc, char** argv) struct ssp_rng* rng; struct ssf_phase* phase = NULL; struct ssf_phase_type type = SSF_PHASE_TYPE_NULL; + struct ssf_phase_type type2 = phase_dummy; struct phase* data = NULL; double wi[3]; double pdf; @@ -136,14 +136,14 @@ main(int argc, char** argv) CHK(ssf_phase_ref_put(phase) == RES_OK); CHK(phase_is_init == 0); - type.init = NULL; - CHK(ssf_phase_create(&allocator, &type, &phase) == RES_BAD_ARG); - CHK(phase_is_init == 0); - type.init = phase_init; - type.release = NULL; - CHK(ssf_phase_create(&allocator, &type, &phase) == RES_BAD_ARG); - CHK(phase_is_init == 0); - type.release = phase_release; + type2.init = NULL; + CHK(ssf_phase_create(&allocator, &type2, &phase) == RES_OK); + CHK(ssf_phase_ref_put(phase) == RES_OK); + type2.init = phase_dummy.init; + type2.release = NULL; + CHK(ssf_phase_create(&allocator, &type2, &phase) == RES_OK); + CHK(ssf_phase_ref_put(phase) == RES_OK); + type.sample = NULL; CHK(ssf_phase_create(&allocator, &type, &phase) == RES_BAD_ARG); CHK(phase_is_init == 0);