...
Code Block |
---|
|
virtual void Filter(
RixLightFilterContext const *lfCtx,
RtConstPointer instanceData,
RtIntint const numSamples,
RtIntint const * shadingCtxIndex,
RtVector3 const * toLight,
RtFloatfloat const * dist,
RtFloatfloat const * lightPdfIllum,
RixBXLobeWeights *contribution); |
...
Code Block |
---|
|
struct myData
{
int arrayLen;
RixLightFilter** filters;
RtConstPointer* instances;
};
static
void releaseInstanceData(RtPointer data)
{
myData* md = (myData*) data;
delete[] md->filters;
delete[] md->instances;
delete md;
}
int
PxrLightFilterCombiner::CreateInstanceData(
RixContext &ctx,
char const *handle,
RixParameterList const *plist,
RixShadingPlugin::InstanceData *idata)
{
RixSCType typ;
bool isconnected;
int arraylen;
plist->GetParamInfo(k_mult, &typ, &isconnected, &arraylen);
myData* mydata = new myData;
mydata->arrayLen = arraylen;
mydata->filters = new RixLightFilter* [arraylen];
mydata->instances = new RtConstPointer [arraylen];
for (int i=0; i<arraylen; ++i)
plist->EvalParam(k_mult, i, &mydata->filters[i], &mydata->instances[i]);
idata->data = (void *) mydata;
idata->freefunc = releaseInstanceData;
return 0;
} |
...
Like bxdfs, light filters can be parameters to other light filters. The last filter given before an AreaLightSource call (the root filter in a tree of filters) is responsible for delegating to the filters in its parameter list. Furthermore, light filters can be disabled on a gprim basis. To respect this, it is the responsibility of the filter to call RixLightFilterContext::IsEnabled()
. If the upstream filter is not enabled, don't run it. IsEnabled()
also returns a pointer to the upstream filter's instanceData
, which should be passed to its Filter()
method.
...
PxrLightFilterCombiner::Filter(
RixLightFilterContext const *lfCtx,
|
...
RtConstPointer instanceData,
|
...
...
int const * shadingCtxIndex,
|
...
...
RtVector3 const * toLight,
|
...
...
float const * lightPdfIllum,
|
...
RixBXLobeWeights *contribution |
...
)
{
myData const * mydata = (myData const *) instanceData;
for (int i=0; i<mydata->arrayLen; ++i) {
RtConstPointer nextInstanceData;
if (lfCtx->IsEnabled(mydata->instances[i], &nextInstanceData))
{
mydata->filters[i]->Filter(
lfCtx, nextInstanceData,
numSamples, shadingCtxIndex,
toLight, dist, lightPdfIllum, contribution);
}
}
} |