Source code for eradiate.test_tools.plugin
"""
Helper tools for plugin tests.
"""
from __future__ import annotations
import drjit as dr
import mitsuba as mi
[docs]def sample_eval_pdf_bsdf(
plugin: mi.BSDF,
wi: mi.ScalarVector3f,
sample_count: int = 100000,
seed: int = 0,
):
"""
Sample a BSDF and get corresponding ``eval()`` and ``pdf()`` values.
Parameters
----------
plugin : mitsuba.BSDF
A BSDF plugin to be evaluated.
wi : mitsuba.ScalarVector3f
An incoming direction.
sample_count : int, optional, default: 100000
The number of samples to generate.
seed : int, optional, default: 0
RNG seed to be used.
Returns
-------
sample
The result of a call to the plugin's ``sample()`` method.
eval
The result of a call to the plugin's ``eval()`` method.
pdf
The result of a call to the plugin's ``pdf()`` method.
Warnings
--------
This function requires a JIT active variant (*e.g.* ``llvm_ad_rgb``).
"""
# Generate a table of uniform variates
idx = dr.arange(mi.UInt64, sample_count)
v0, v1 = mi.sample_tea_32(idx, seed)
# Scramble seed and stream index using TEA, a linearly increasing sequence
# does not produce a sufficiently statistically independent set of streams
rng = mi.PCG32(initstate=v0, initseq=v1)
sample = mi.Vector3f()
for i in range(3):
sample[i] = rng.next_float32() if mi.Float is mi.Float32 else rng.next_float64()
# Invoke sampling strategy
n = dr.width(sample)
ctx = mi.BSDFContext()
si = dr.zeros(mi.SurfaceInteraction3f, n)
si.wi = wi
bs, weight = plugin.sample(ctx, si, sample[0], [sample[1], sample[2]])
# Get corresponding eval() and pdf() calls
eval = plugin.eval(ctx, si, bs.wo)
pdf = plugin.pdf(ctx, si, bs.wo)
return (bs, weight), eval, pdf