Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagecpp
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
languagecpp
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.

Code Block
languagecpp
void 

...

PxrLightFilterCombiner::Filter(
    RixLightFilterContext const *lfCtx,
    

...

RtConstPointer instanceData,
    

...

int const numSamples,
    

...

int const * shadingCtxIndex,

...

    

...

RtVector3 const * toLight,
    

...

float const * dist,
    

...

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