Spectrum CreateRadianceProbes::Li(const Scene *scene, const RayDifferential &ray, const Sample *sample, RNG &rng, MemoryArena &arena, Intersection *isect, Spectrum *T) const { Assert(ray.time == sample->time); Spectrum localT; if (!T) T = &localT; Intersection localIsect; if (!isect) isect = &localIsect; Assert(!ray.HasNaNs()); Spectrum Lo = 0.f; if (scene->Intersect(ray, isect)) Lo = surfaceIntegrator->Li(scene, this, ray, *isect, sample, rng, arena); else { for (uint32_t i = 0; i < scene->lights.size(); ++i) Lo += scene->lights[i]->Le(ray); } Spectrum Lv = volumeIntegrator->Li(scene, this, ray, sample, rng, T, arena); return *T * Lo + Lv; }
Spectrum SamplerRenderer::Li(const Scene *scene, const RayDifferential &ray, const Sample *sample, RNG &rng, MemoryArena &arena, Intersection *isect, Spectrum *T) const { Assert(ray.time == sample->time); Assert(!ray.HasNaNs()); // Allocate local variables for _isect_ and _T_ if needed Spectrum localT; if (!T) T = &localT; Intersection localIsect; if (!isect) isect = &localIsect; Spectrum Lo = 0.f; if (scene->Intersect(ray, isect)) Lo = surfaceIntegrator->Li(scene, this, ray, *isect, sample, rng, arena); else { // Handle ray that doesn't intersect any geometry for (uint32_t i = 0; i < scene->lights.size(); ++i) Lo += scene->lights[i]->Le(ray); } Spectrum Lv = volumeIntegrator->Li(scene, this, ray, sample, rng, T, arena); return *T * Lo + Lv; }