void IsotropicPhongSPF::Scatter( const RayIntersectionGeometric& ri, ///< [in] Geometric intersection details for point of intersection const RandomNumberGenerator& random, ///< [in] Random number generator ScatteredRayContainer& scattered, ///< [out] The list of scattered rays from the surface const IORStack* const ior_stack ///< [in/out] Index of refraction stack ) const { const Scalar rdotn = Vector3Ops::Dot(ri.ray.dir, ri.vNormal); const Vector3 n = rdotn > 0 ? -ri.onb.w() : ri.onb.w(); const Vector3 reflected = Optics::CalculateReflectedRay( ri.ray.dir, n ); const RISEPel N = exponent.GetColor(ri); ScatteredRay diffuse, specular; GenerateDiffuseRay( diffuse, rdotn, ri, Point2( random.CanonicalRandom(), random.CanonicalRandom() ) ); if( N[0] == N[1] && N[1] == N[2] ) { GenerateSpecularRay( specular, n, reflected, ri, Point2( random.CanonicalRandom(), random.CanonicalRandom() ), N[0] ); specular.kray = Rs.GetColor(ri); scattered.AddScatteredRay( specular ); } else { const RISEPel spec = Rs.GetColor(ri); const Point2 ptrand( random.CanonicalRandom(), random.CanonicalRandom() ); for( int i=0; i<3; i++ ) { GenerateSpecularRay( specular, n, reflected, ri, ptrand, N[i] ); specular.kray = 0.0; specular.kray[i] = spec[i]; scattered.AddScatteredRay( specular ); } } diffuse.kray = Rd.GetColor(ri); scattered.AddScatteredRay( diffuse ); }
void IsotropicPhongSPF::ScatterNM( const RayIntersectionGeometric& ri, ///< [in] Geometric intersection details for point of intersection const RandomNumberGenerator& random, ///< [in] Random number generator const Scalar nm, ///< [in] Wavelength the material is to consider (only used for spectral processing) ScatteredRayContainer& scattered, ///< [out] The list of scattered rays from the surface const IORStack* const ior_stack ///< [in/out] Index of refraction stack ) const { const Scalar rdotn = Vector3Ops::Dot(ri.ray.dir, ri.vNormal); const Vector3 n = rdotn > 0 ? -ri.onb.w() : ri.onb.w(); const Vector3 reflected = Optics::CalculateReflectedRay( ri.ray.dir, n ); ScatteredRay diffuse, specular; GenerateDiffuseRay( diffuse, rdotn, ri, Point2( random.CanonicalRandom(), random.CanonicalRandom() ) ); GenerateSpecularRay( specular, n, reflected, ri, Point2( random.CanonicalRandom(), random.CanonicalRandom() ), exponent.GetColorNM(ri,nm) ); diffuse.krayNM = Rd.GetColorNM(ri,nm); specular.krayNM = Rs.GetColorNM(ri,nm); scattered.AddScatteredRay( diffuse ); scattered.AddScatteredRay( specular ); }