f32 Rectangle::IntegrateMRP( const vec3f & integrationPos, const vec3f & integrationNrm ) const { const vec3f d0p = -ez; const vec3f d1p = integrationNrm; const f32 nDotpN = std::max( 0.f, Dot( integrationNrm, ez ) ); vec3f d0 = Normalize( d0p + integrationNrm * nDotpN ); vec3f d1 = Normalize( d1p - ez * nDotpN ); vec3f dh = Normalize( d0 + d1 ); Plane rectPlane = { position, ez }; vec3f pH = rectPlane.RayIntersection( integrationPos, dh ); pH = rectPlane.ClampPointInRect( *this, pH ); const f32 solidAngle = SolidAngle( integrationPos ); vec3f rayDir = Normalize( pH - integrationPos ); return solidAngle * std::max( 0.f, Dot( integrationNrm, rayDir ) ); }