def UniformSampleOneLight(scene: Scene, renderer: Renderer, p: Point3d, n: Normal, wo: Vector3d, time: float, bsdf: BSDF, sample: Sample, lightSampleOffsets: [LightSampleOffsets]=None, bsdfSampleOffsets: [BSDFSampleOffsets]=None, lightNumOffset: int=-1) -> Spectrum: L = Spectrum(0.0) nLights = int(len(scene.lights)) if nLights == 0: return Spectrum(0.0) if lightNumOffset != -1: lightNum = int((sample.values_array_1d[lightNumOffset][0] * nLights)) # todo floor to int else: lightNum = int((random() * nLights)) # todo floor to int lightNum = min(lightNum, nLights - 1) light = scene.lights[lightNum] # Initialize light and bsdf samples for single light sample if lightSampleOffsets is not None and bsdfSampleOffsets is not None: lightSample = LightSample.create_from_sample(sample, lightSampleOffsets, 0) bsdfSample = BSDFSample.create_from_sample(sample, bsdfSampleOffsets, 0) else: lightSample = LightSample.create_from_random() bsdfSample = BSDFSample.create_from_random() Ld = EstimateDirect(scene, renderer, light, p, n, wo, time, bsdf, lightSample, bsdfSample, BxDFType.BSDF_ALL & ~BxDFType.BSDF_SPECULAR) return Ld * float(nLights)
def UniformSampleAllLights(scene: Scene, renderer: Renderer, p: Point3d, n: Normal, wo: Vector3d, time: float, bsdf: BSDF, sample: Sample, lightSampleOffsets: [LightSampleOffsets], bsdfSampleOffsets: [BSDFSampleOffsets]) -> Spectrum: L = Spectrum(0.0) for i in range(len(scene.lights)): light = scene.lights[i] if lightSampleOffsets is None: nSamples = 1 else: nSamples = lightSampleOffsets[i].nSamples # Estimate direct lighting from _light_ samples Ld = Spectrum(0.0) for j in range(nSamples): # Find light and BSDF sample values for direct lighting estimate if lightSampleOffsets is not None and bsdfSampleOffsets is not None: lightSample = LightSample.create_from_sample(sample, lightSampleOffsets[i], j) bsdfSample = BSDFSample.create_from_sample(sample, bsdfSampleOffsets[i], j) else: lightSample = LightSample.create_from_random() bsdfSample = BSDFSample.create_from_random() Ld += EstimateDirect(scene, renderer, light, p, n, wo, time, bsdf, lightSample, bsdfSample, BxDFType.BSDF_ALL & ~BxDFType.BSDF_SPECULAR) L += Ld / nSamples return L