Ejemplo n.º 1
0
    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));
    }
Ejemplo n.º 2
0
    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);
        }
    }