def Li(self, scene: Scene, renderer: Renderer, ray: Ray, intersection: Intersection, sample: Sample) -> Spectrum: L = Spectrum(0.0) wo = -ray.direction bsdf = intersection.get_bsdf(ray) # Compute emitted light if ray hit an area light source L += intersection.Le(wo) if len(scene.lights) > 0: if self.strategy == LightStrategy.SAMPLE_ALL_UNIFORM: L += UniformSampleAllLights(scene, renderer, intersection.differentialGeometry.point, intersection.differentialGeometry.normal, wo, ray.time, bsdf, sample, self.lightSampleOffsets, self.bsdfSampleOffsets) elif self.strategy == LightStrategy.SAMPLE_ONE_UNIFORM: L += UniformSampleOneLight(scene, renderer, intersection.differentialGeometry.point, intersection.differentialGeometry.normal, wo, ray.time, bsdf, sample, self.lightSampleOffsets, self.bsdfSampleOffsets, self.lightNumOffset) return L
def Li(self, scene: Scene, renderer: Renderer, ray: Ray, intersection: Intersection, sample: Sample)->Spectrum: occlusion = 0 intersection.ray_epsilon = infinity_max_f bsdf = intersection.get_bsdf(ray) p = bsdf.dgShading.point n = maths.tools.get_face_forward(intersection.differentialGeometry.normal, -ray.direction) for i in range(self.samples_count): w = maths.tools.get_uniform_sample_sphere(random(), random()) if Vector3d.dot(w, n) < 0.0: w = -w r = Ray(p, w, 0.01, self.max_distance) if scene.get_is_intersected(r): occlusion += 1 return Spectrum(1.0-(float(occlusion) / float(self.samples_count)))