1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
// Copyright 2009 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#include "Plastic.ih"
#include "render/Material.ih"
#include "render/bsdfs/DielectricLayer.ih"
#include "render/bsdfs/Lambert.ih"
#include "render/bsdfs/MicrofacetDielectricLayer.ih"
// c++ shared
#include "PlasticShared.h"
///////////////////////////////////////////////////////////////////////////////
// Implementation
OSPRAY_BEGIN_ISPC_NAMESPACE
struct Plastic_BSDF
{
BSDF root;
MicrofacetDielectricLayer dielectricLayer;
BSDF lambert;
};
SYCL_EXTERNAL const varying BSDF *uniform Plastic_getBSDF(
const uniform Material *uniform super,
uniform ShadingContext *uniform ctx,
const DifferentialGeometry &dg,
const Ray &,
const Medium &,
const uniform FeatureFlagsHandler &)
{
const uniform Plastic *uniform self = (const uniform Plastic *uniform)super;
varying LinearSpace3f *uniform shadingFrame =
LinearSpace3f_create(ctx, frame(dg.Ns));
// Allocate memory and initialize material BSDF
varying Plastic_BSDF *uniform bsdf = (varying Plastic_BSDF * uniform)
ShadingContext_alloc(ctx, sizeof(Plastic_BSDF));
const vec3f _pigmentColor = self->pigmentColor;
Lambert_Constructor(&bsdf->lambert, shadingFrame, _pigmentColor);
if (self->roughness == 0.0f) {
DielectricLayer_Constructor(
(varying DielectricLayer * uniform) & bsdf->dielectricLayer,
shadingFrame,
&bsdf->lambert,
self->eta,
make_vec3f(1.0f),
1.0f,
1.0f);
} else {
MicrofacetDielectricLayer_Constructor(&bsdf->dielectricLayer,
super->microfacetAlbedoTables,
shadingFrame,
&bsdf->lambert,
self->eta,
make_vec3f(1.0f),
1.0f,
self->roughness,
0.f,
1.0f);
}
bsdf->root = bsdf->dielectricLayer.super;
bsdf->root.bsdfType = BSDF_TYPE_PLASTIC;
return &bsdf->root;
}
// DielectricLayer BSDF
inline BSDF_EvalRes DielectricLayerBSDF_eval(
const varying Plastic_BSDF *uniform self, const vec3f &wo, const vec3f &wi)
{
DIELECTRICLAYER_EVAL(self->dielectricLayer,
self->lambert.scatteringType,
&self->lambert,
Lambert_eval);
return DIELECTRICLAYER_EVAL_GET();
}
inline BSDF_SampleRes DielectricLayerBSDF_sample(
const varying Plastic_BSDF *uniform self,
const vec3f &wo,
const vec2f &s,
float ss)
{
DIELECTRICLAYER_SAMPLE(self->dielectricLayer,
self->lambert.scatteringType,
&self->lambert,
Lambert_sample);
return DIELECTRICLAYER_SAMPLE_GET();
}
// MicrofacetDielectricLayer BSDF
inline BSDF_EvalRes MicrofacetDielectricLayerBSDF_eval(
const varying Plastic_BSDF *uniform self, const vec3f &wo, const vec3f &wi)
{
MICROFACETDIELECTRICLAYER_EVAL(self->dielectricLayer,
self->lambert.scatteringType,
&self->lambert,
Lambert_eval);
return MICROFACETDIELECTRICLAYER_EVAL_GET();
}
inline BSDF_SampleRes MicrofacetDielectricLayerBSDF_sample(
const varying Plastic_BSDF *uniform self,
const vec3f &wo,
const vec2f &s,
float ss)
{
MICROFACETDIELECTRICLAYER_SAMPLE(self->dielectricLayer,
self->lambert.scatteringType,
&self->lambert,
Lambert_eval,
Lambert_sample);
return MICROFACETDIELECTRICLAYER_SAMPLE_GET();
}
// Plastic BSDF
SYCL_EXTERNAL __noinline BSDF_EvalRes Plastic_BSDF_eval(
const varying BSDF *uniform super, const vec3f &wo, const vec3f &wi)
{
const varying Plastic_BSDF *uniform self =
(const varying Plastic_BSDF *uniform)super;
if (self->dielectricLayer.super.bsdfType
== BSDF_TYPE_MICROFACET_DIELECTRIC_LAYER)
return MicrofacetDielectricLayerBSDF_eval(self, wo, wi);
else
return DielectricLayerBSDF_eval(self, wo, wi);
}
SYCL_EXTERNAL __noinline BSDF_SampleRes Plastic_BSDF_sample(
const varying BSDF *uniform super,
const vec3f &wo,
const vec2f &s,
float ss)
{
const varying Plastic_BSDF *uniform self =
(const varying Plastic_BSDF *uniform)super;
if (self->dielectricLayer.super.bsdfType
== BSDF_TYPE_MICROFACET_DIELECTRIC_LAYER)
return MicrofacetDielectricLayerBSDF_sample(self, wo, s, ss);
else
return DielectricLayerBSDF_sample(self, wo, s, ss);
}
///////////////////////////////////////////////////////////////////////////////
// External API
export void *uniform Plastic_getBSDF_addr()
{
return (void *uniform)Plastic_getBSDF;
}
OSPRAY_END_ISPC_NAMESPACE
|