Пример #1
0
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 ) );
}