public static Vector4 IntegrateOverQuad(this ScatteringProfile profile, Vector3 receiverPosition, PositionedQuad quad) { int nearestIdx = quad.FindClosestCorner(receiverPosition); SubQuad orientedSubQuad = SubQuad.MakeRotatedWhole(nearestIdx); return(IntegrateOverSubQuad(profile, receiverPosition, quad, orientedSubQuad)); }
private static Vector4 IntegrateOverSubQuad(ScatteringProfile profile, Vector3 receiverPosition, PositionedQuad root, SubQuad subQuad) { var quad = subQuad.AsPositionedQuad(root); double area = quad.Area; //this assume that P0 is the closest point to the receiver double closestDistance = Vector3.Distance(receiverPosition, quad.P0); double maximumContribution = profile.CalculateMaximumContribution(closestDistance, area); if (maximumContribution < SubdivisionThreshold) { double distance = Vector3.Distance(receiverPosition, quad.Center); return(subQuad.CenterWeight * (float)(area * profile.CalculateDiffuseReflectance(distance))); } else { Vector4 total = Vector4.Zero; foreach (SubQuad subSubQuad in subQuad.Split()) { total += IntegrateOverSubQuad(profile, receiverPosition, root, subSubQuad); } return(total); } }