Esempio n. 1
0
        Spectrum GetIlluminanceBySphericalHarmonics(Vector direction, MVertexIlluminanceMode mode)
        {
            var directionProjected = Face.Normal.Projected(direction);
            var sphCoord           = directionProjected.ToSphCoord();

            double valR = 0;
            double valG = 0;
            double valB = 0;

            var mu  = (float)Math.Cos(sphCoord.Theta);
            var phi = (float)sphCoord.Phi;
            var qkm = SHMath.Schmidt(mu, IlluminanceAngles.NSH);

            if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Direct)
            {
                valR += SHMath.SHToAF(directIlluminanceSHR, mu, phi, qkm);
                valG += SHMath.SHToAF(directIlluminanceSHG, mu, phi, qkm);
                valB += SHMath.SHToAF(directIlluminanceSHB, mu, phi, qkm);
            }

            if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Indirect)
            {
                valR += SHMath.SHToAF(indirectIlluminanceSHR, mu, phi, qkm);
                valG += SHMath.SHToAF(indirectIlluminanceSHG, mu, phi, qkm);
                valB += SHMath.SHToAF(indirectIlluminanceSHB, mu, phi, qkm);
            }

            return(new Spectrum((float)valR, (float)valG, (float)valB));
        }
Esempio n. 2
0
        Spectrum GetIlluminanceBySpline(Vector direction, MVertexIlluminanceMode mode)
        {
            var directionProjected = Face.Normal.Projected(direction);

            directionProjected.Normalize();

            var sphCoord = directionProjected.ToSphCoord();

            //sphCoord.Theta += Math.PI / 2;

            double valR = 0;
            double valG = 0;
            double valB = 0;

            if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Direct)
            {
                valR += alglib.spline2dcalc(directIlluminanceSplineCoeffsR, sphCoord.Phi, sphCoord.Theta);
                valG += alglib.spline2dcalc(directIlluminanceSplineCoeffsG, sphCoord.Phi, sphCoord.Theta);
                valB += alglib.spline2dcalc(directIlluminanceSplineCoeffsB, sphCoord.Phi, sphCoord.Theta);
            }

            if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Indirect)
            {
                valR += alglib.spline2dcalc(indirectIlluminanceSplineCoeffsR, sphCoord.Phi, sphCoord.Theta);
                valG += alglib.spline2dcalc(indirectIlluminanceSplineCoeffsG, sphCoord.Phi, sphCoord.Theta);
                valB += alglib.spline2dcalc(indirectIlluminanceSplineCoeffsB, sphCoord.Phi, sphCoord.Theta);
            }

            return(new Spectrum((float)valR, (float)valG, (float)valB));
        }
Esempio n. 3
0
        public Spectrum GetIlluminance(Vector direction, MVertexIlluminanceMode mode, MVertexIlluminanceApproximationMode approximationMode)
        {
            Spectrum result = new Spectrum(0);

            if (Face.Material.Reflectance is DiffuseReflectanceMaterial)
            {
                if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Direct)
                {
                    result += IlluminanceDirect[0];
                }

                if (mode == MVertexIlluminanceMode.Full || mode == MVertexIlluminanceMode.Indirect)
                {
                    result += IlluminanceIndirect[0];
                }
            }
            else
            {
                switch (approximationMode)
                {
                case MVertexIlluminanceApproximationMode.Spline:
                    result = GetIlluminanceBySpline(direction, mode);
                    break;

                case MVertexIlluminanceApproximationMode.SphericalHarmonics:
                    result = GetIlluminanceBySphericalHarmonics(direction, mode);
                    break;

                default:
                    throw new NotImplementedException();
                }
            }

            /*
             * if ( result.R < 0 )
             * {
             *  //return new Spectrum();
             *  return new Spectrum( 1, 0, 0 );
             * }
             */

            return(result);
        }
Esempio n. 4
0
 public Spectrum GetIlluminance(Point3D point, MVertexIlluminanceMode mode, MVertexIlluminanceApproximationMode approximationMode)
 {
     return(GetIlluminance(new Vector(Point, point, true), mode, approximationMode));
 }