Esempio n. 1
0
 public ConstSpectrumTexture(RgbSpectrumInfo data, int w, int h)
 {
     this.data = data;
     this.width = w;
     this.height = h;
     this.DUDV = new UV(1f / Width, 1f / Height);
 }
Esempio n. 2
0
 public MeshLight(FrameLightsource lightsource)
 {
     MeshName = lightsource.Parameters.Get<string>(FrameLightsource.AreaLightGeometryName);
     LightName = MeshName;
     spectra = SPD_Data.FromSampled(SPD_Data.D5000, SpectrumType.Illuminant);//FromFile(@"F:\3D\spds\cie.stdillum.F10.spd")
     gain = lightsource.Parameters.Get<RgbSpectrum>(FrameLightsource.LightsourcePower);
     infoGain = new RgbSpectrumInfo(gain);
 }
Esempio n. 3
0
 public TriangleLight(IRayEngineScene sc, string meshName, RgbSpectrum gain = new RgbSpectrum())
 {
     this.scene = (RayEngineScene)sc;
     this.meshName = meshName;
     this.Gain = (RgbSpectrumInfo)gain;
     //cie.stdillum.F1.spd
     //@"F:\3D\spds\cie.stdillum.F1.spd"
     //cie.stdillum.A.spd
     //macbeth-1.spd
     //FromFile(@"F:\3D\spds\cie.stdillum.F9.spd")
     spectra = SPD_Data.FromSampled(SPD_Data.FromFile(@"F:\3D\spds\cie.stdillum.D5000.spd"), SpectrumType.Illuminant);
 }
Esempio n. 4
0
        public static RgbSpectrumTexture FreeImageLoadBitmap(string fileName)
        {
            Console.WriteLine("..Loading ldr bitmap {0}", fileName);
            using (var bmp = new FreeImageBitmap(fileName))
            {
                //bmp.AdjustGamma(2.2);

                var pdata = new RgbSpectrumInfo[bmp.Width * bmp.Height];
                for (int i = 0; i < bmp.Height; i++)
                {

                    if (bmp.ColorDepth == 24)
                    {
                        Scanline<RGBTRIPLE> s = bmp.GetScanline<RGBTRIPLE>(i);
                        for (int j = 0; j < bmp.Width; j++)
                        {
                            pdata[j + i * bmp.Width] =
                                RgbSpectrumInfo.Create(s[j].rgbtRed, s[j].rgbtGreen, s[j].rgbtBlue, false).Abs();
                        }
                    }

                    if (bmp.ColorDepth == 32)
                    {
                        Scanline<RGBQUAD> s = bmp.GetScanline<RGBQUAD>(i);
                        for (int j = 0; j < bmp.Width; j++)
                        {
                            pdata[j + i * bmp.Width] =
                                RgbSpectrumInfo.Create(s[j].rgbRed, s[j].rgbGreen, s[j].rgbBlue, false).Abs();
                        }
                    }

                    if (bmp.ColorDepth == 8)
                    {

                        Scanline<byte> s = bmp.GetScanline<byte>(i);
                        for (int j = 0; j < bmp.Width; j++)
                        {
                            pdata[j + i * bmp.Width] =
                                RgbSpectrumInfo.Create(bmp.Palette[s[j]].rgbRed, bmp.Palette[s[j]].rgbGreen, bmp.Palette[s[j]].rgbBlue, false).Abs();
                        }
                    }

                }
                Console.WriteLine("... Converted size {0:F5} MBytes", (bmp.Width * bmp.Height * 12.0f) / (1024f * 1024f));
                MemoryOccupied += (ulong)(bmp.Width * bmp.Height * 12u);

                var tex = new RgbSpectrumTexture(fileName, pdata, bmp.Width, bmp.Height);
                return tex;
            }
        }
Esempio n. 5
0
        public void Sample(ref Vector dir, out RgbSpectrumInfo outputColor)
        {
            outputColor = new RgbSpectrumInfo(0f);

            if ((Math.Abs(dir.x) >= Math.Abs(dir.y))
                && (Math.Abs(dir.x) >= Math.Abs(dir.z)))
            {
                if (dir.x > 0.0f)
                {
                    outputColor = Right.Sample(
                        1.0f - (dir.z / dir.x + 1.0f) * 0.5f, (dir.y / dir.x + 1.0f) * 0.5f);
                }
                else if (dir.x < 0.0f)
                {

                    outputColor = Left.Sample(
                        1.0f - (dir.z / dir.x + 1.0f) * 0.5f,
                        1.0f - (dir.y / dir.x + 1.0f) * 0.5f);

                }
            }
            else if ((Math.Abs(dir.y) >= Math.Abs(dir.x)) && (Math.Abs(dir.y) >= Math.Abs(dir.z)))
            {
                if (dir.y > 0.0f)
                {
                    outputColor = Top.Sample((dir.x / dir.y + 1.0f) * 0.5f,
                                              1.0f - (dir.z / dir.y + 1.0f) * 0.5f);
                }
                else if (dir.y < 0.0f)
                {
                    outputColor = Bottom.Sample(
                                              1.0f - (dir.x / dir.y + 1.0f) * 0.5f,
                                              (dir.z / dir.y + 1.0f) * 0.5f);
                }
            }
            else if ((Math.Abs(dir.z) >= Math.Abs(dir.x))
                     && (Math.Abs(dir.z) >= Math.Abs(dir.y)))
            {
                if (dir.z > 0.0f)
                {
                    outputColor = Forward.Sample((dir.x / dir.z + 1.0f) * 0.5f, (dir.y / dir.z + 1.0f) * 0.5f);
                }
                else if (dir.z < 0.0f)
                {
                    outputColor = Backward.Sample((dir.x / dir.z + 1.0f) * 0.5f,
                                              1.0f - (dir.y / dir.z + 1) * 0.5f);
                }
            }
        }
Esempio n. 6
0
        public TriangleLight(RayEngineScene sc, int triIndex, ITriangleMesh mesh, RgbSpectrum gain = new RgbSpectrum())
            : this(sc, string.Empty, gain)
        {
            Gain = (RgbSpectrumInfo)gain;

            triangleIndex = triIndex;

            this.Owner = mesh;


            //Configuration.Instance.Get("Integrator.ComputeNormals", false);
            //Configuration.Instance.Get("Integrator.InverseLightNormals", false);

            var multiplicator = normalInverse ? -1f : 1f;
            this.TriangleNormal = multiplicator * ((computeNormal || !mesh.HasNormals) ? scene.Triangles[triangleIndex].ComputeNormal(scene.Vertices)
                : (Normal)scene.SceneGeometry.Normals[Math.Min(scene.SceneGeometry.Normals.Length - 1, triIndex)]);
            this.area = Math.Max(scene.Triangles[triangleIndex].AreaV(scene.Vertices), 0.00001f);
            Assert.IsNotNaN(this.TriangleNormal.x);
            Assert.IsTrue(this.area > 0f);
            lightSpectra = GlobalConfiguration.Instance.SpectralRendering ? (ISpectrum)spectra : gain;

        }
Esempio n. 7
0
        public ISpectrum Evaluate(float u, float v)
        {
            if (SpectralRendering)
            {
                if (EmissionTexture != null)
                    return ColorFactory.FromRgb(EmissionTexture.Sample(u, v), SpectrumType.Illuminant);
                if (EmissionSpectra.Length == 3)
                    return ColorFactory.FromRgb(new RgbSpectrumInfo(EmissionSpectra), SpectrumType.Illuminant);
                return sspd ?? (sspd = new SampledSpectrum(EmissionSpectra));
            }
            else
            {
                if (EmissionTexture != null)
                {
                    return InvertTexture ? (RgbSpectrumInfo.UnitSpectrum() - EmissionTexture.Sample(u, v)) : EmissionTexture.Sample(u, v);
                }
                if (spd == null || spd.IsBlack())
                    spd = getSpectrum();

                return spd;
            }
        }
Esempio n. 8
0
        public static RgbSpectrumTexture FreeImageLoadExrBitmap(string fileName)
        {

            Console.WriteLine("..Loading hdr bitmap {0}", fileName);
            using (var bmp = new FreeImageBitmap(fileName))
            {
                //bmp.AdjustGamma(2.2);
                var pdata = new RgbSpectrumInfo[bmp.Width * bmp.Height];
                for (int i = 0; i < bmp.Height; i++)
                {
                    Scanline<FIRGBF> s = bmp.GetScanline<FIRGBF>(i);
                    for (int j = 0; j < bmp.Width; j++)
                    {
                        pdata[j + i * bmp.Width] = new RgbSpectrumInfo(s[j].red, s[j].green, s[j].blue);
                        //pdata[j + i * bmp.Width] .DeGamma();
                    }
                }
                Console.WriteLine("... Converted size {0:F5} MBytes", (bmp.Width * bmp.Height * 12.0f) / (1024f * 1024f));
                MemoryOccupied += (ulong)(bmp.Width * bmp.Height * 12u);
                var tex = new RgbSpectrumTexture(fileName, pdata, bmp.Width, bmp.Height);
                return tex;
            }
        }
Esempio n. 9
0
        public static SampledSpectrum FromRgb(ref RgbSpectrumInfo rgb, SpectrumType type = SpectrumType.Reflectance)
        {
            var r = new SampledSpectrum(0f);
            if (type == SpectrumType.Reflectance)
            {
                // Convert reflectance spectrum to RGB
                if (rgb.c1 <= rgb.c2 && rgb.c1 <= rgb.c3)
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb.c1_ as minimum
                    //r += rgb.c1 * rgbRefl2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectWhite, rgb.c1, ref r);

                    //SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectWhite, rgb.c1);
                    if (rgb.c2 <= rgb.c3)
                    {
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectCyan, (rgb.c2 - rgb.c1), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectBlue, (rgb.c3 - rgb.c2), ref r);
                        //r += (rgb.c2 - rgb.c1) * rgbRefl2SpectCyan;
                        //r += (rgb.c3 - rgb.c2) * rgbRefl2SpectBlue;
                    }
                    else
                    {
                        //r += (rgb.c3 - rgb.c1) * rgbRefl2SpectCyan;
                        //r += (rgb.c2 - rgb.c3) * rgbRefl2SpectGreen;

                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectCyan, (rgb.c3 - rgb.c1), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectGreen, (rgb.c2 - rgb.c3), ref r);
                    }
                }
                else if (rgb.c2 <= rgb.c1 && rgb.c2 <= rgb.c3)
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb.c2_ as minimum
                    //r += rgb.c2 * rgbRefl2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectWhite, rgb.c2, ref r);

                    if (rgb.c1 <= rgb.c3)
                    {
                        //r += (rgb.c1 - rgb.c2) * rgbRefl2SpectMagenta;
                        //r += (rgb.c3 - rgb.c1) * rgbRefl2SpectBlue;

                        SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectMagenta, (rgb.c1 - rgb.c2), ref r);
                        SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectBlue, (rgb.c3 - rgb.c1), ref r);
                    }
                    else
                    {
                        //r += (rgb.c3 - rgb.c2) * rgbRefl2SpectMagenta;
                        //r += (rgb.c1 - rgb.c3) * rgbRefl2SpectRed;
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectMagenta, (rgb.c3 - rgb.c2), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectRed, (rgb.c1 - rgb.c3), ref r);
                    }
                }
                else
                {
                    // Compute reflectance _SampledSpectrum_ with _rgb.c3_ as minimum
                    //r += rgb.c3 * rgbRefl2SpectWhite;
                    SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectWhite, rgb.c3, ref r);

                    if (rgb.c1 <= rgb.c2)
                    {
                        //r += (rgb.c1 - rgb.c3) * rgbRefl2SpectYellow;
                        //r += (rgb.c2 - rgb.c1) * rgbRefl2SpectGreen;
                        SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectYellow, (rgb.c1 - rgb.c3), ref r);
                        SSE.MAddSSE(ref  SampledSpectrum.rgbRefl2SpectGreen, (rgb.c2 - rgb.c1), ref r);
                    }
                    else
                    {
                        //r += (rgb.c2 - rgb.c3) * rgbRefl2SpectYellow;
                        //r += (rgb.c1 - rgb.c2) * rgbRefl2SpectRed;

                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectYellow, (rgb.c2 - rgb.c3), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbRefl2SpectRed, (rgb.c1 - rgb.c2), ref r);
                    }
                }
                SSE.MulSSE(ref r, .94f, ref r);

                //r *= .94f;
            }
            else
            {
                // Convert illuminant spectrum to RGB
                if (rgb.c1 <= rgb.c2 && rgb.c1 <= rgb.c3)
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb.c1_ as minimum
                    //r += rgb.c1 * rgbIllum2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectWhite, rgb.c1, ref r);
                    if (rgb.c2 <= rgb.c3)
                    {
                        //r += (rgb.c2 - rgb.c1) * rgbIllum2SpectCyan;
                        //r += (rgb.c3 - rgb.c2) * rgbIllum2SpectBlue;
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectCyan, (rgb.c2 - rgb.c1), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectBlue, (rgb.c3 - rgb.c2), ref r);

                    }
                    else
                    {
                        // r += (rgb.c3 - rgb.c1) * rgbIllum2SpectCyan;
                        //r += (rgb.c2 - rgb.c3) * rgbIllum2SpectGreen;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectCyan, (rgb.c3 - rgb.c1), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectGreen, (rgb.c2 - rgb.c3), ref r);
                    }
                }
                else if (rgb.c2 <= rgb.c1 && rgb.c2 <= rgb.c3)
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb.c2_ as minimum
                    //r += rgb.c2 * rgbIllum2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectWhite, rgb.c2, ref r);

                    if (rgb.c1 <= rgb.c3)
                    {
                        //r += (rgb.c1 - rgb.c2) * rgbIllum2SpectMagenta;
                        //r += (rgb.c3 - rgb.c1) * rgbIllum2SpectBlue;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectMagenta, (rgb.c1 - rgb.c2), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectBlue, (rgb.c3 - rgb.c1), ref r);
                    }
                    else
                    {
                        //r += (rgb.c3 - rgb.c2) * rgbIllum2SpectMagenta;
                        //r += (rgb.c1 - rgb.c3) * rgbIllum2SpectRed;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectMagenta, (rgb.c3 - rgb.c2), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectRed, (rgb.c1 - rgb.c3), ref r);
                    }
                }
                else
                {
                    // Compute illuminant _SampledSpectrum_ with _rgb.c3_ as minimum
                    //r += rgb.c3 * rgbIllum2SpectWhite;
                    SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectWhite, rgb.c3, ref r);

                    if (rgb.c1 <= rgb.c2)
                    {
                        //r += (rgb.c1 - rgb.c3) * rgbIllum2SpectYellow;
                        //r += (rgb.c2 - rgb.c1) * rgbIllum2SpectGreen;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectYellow, (rgb.c1 - rgb.c3), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectGreen, (rgb.c2 - rgb.c1), ref r);
                    }
                    else
                    {
                        //r += (rgb.c2 - rgb.c3) * rgbIllum2SpectYellow;
                        //r += (rgb.c1 - rgb.c2) * rgbIllum2SpectRed;

                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectYellow, (rgb.c2 - rgb.c3), ref r);
                        SSE.MAddSSE(ref SampledSpectrum.rgbIllum2SpectRed, (rgb.c1 - rgb.c2), ref r);
                    }
                }
                SSE.MulSSE(ref r, .86445f, ref r);
                //r *= .86445f;
            }
            //SSE.ClampSSE(ref r, ref r);
            //r.ClampSelf();
            return r;
        }
Esempio n. 10
0
 public static SampledSpectrum FromRgb(RgbSpectrumInfo rgb, SpectrumType type = SpectrumType.Reflectance)
 {
     return FromRgb(ref rgb, type);
 }
Esempio n. 11
0
        public RgbSpectrumInfo Sub(ref RgbSpectrumInfo a)
        {
            this.c1 -= a.c1;
            this.c2 -= a.c2;
            this.c3 -= a.c3;

            return this;
        }
Esempio n. 12
0
 private void Sample(RgbSpectrumTexture t, ref Vector dir, out RgbSpectrumInfo outputColor)
 {
     float shiftU = 0f, shiftV = 0f;
     float theta = Vector.SphericalTheta(ref dir);
     outputColor = t.Sample(Vector.SphericalPhi(ref dir) * MathLab.INVTWOPI + shiftU, theta * MathLab.INVPI + shiftV);
 }
Esempio n. 13
0
 public void SampleBackground(ref Vector dir, out RgbSpectrumInfo outputColor)
 {
     Sample(ref dir, out outputColor);
 }
Esempio n. 14
0
 public void MAdd(ref RgbSpectrumInfo arg, float f)
 {
     this.c1 += f * arg.c1;
     this.c2 += f * arg.c2;
     this.c3 += f * arg.c3;
 }
Esempio n. 15
0
 public RgbSpectrumInfo MADD(RgbSpectrumInfo arg)
 {
     this.c1 += this.c1 * arg.c1;
     this.c2 += this.c2 * arg.c2;
     this.c3 += this.c3 * arg.c3;
     return this;
 }
Esempio n. 16
0
 public static RgbSpectrumInfo Exp(RgbSpectrumInfo s)
 {
     RgbSpectrumInfo ret = new RgbSpectrumInfo();
     for (int i = 0; i < SamplesCount; ++i)
         ret[i] = (float)Math.Exp((float)s[i]);
     return ret;
 }
Esempio n. 17
0
 public RgbSpectrumInfo Clamp(float low,
                float high)
 {
     RgbSpectrumInfo ret = new RgbSpectrumInfo();
     for (int i = 0; i < SamplesCount; ++i)
         ret[i] = Clamp(this[i], low, high);
     return ret;
 }
Esempio n. 18
0
 public RgbSpectrumInfo Pow(RgbSpectrumInfo e)
 {
     RgbSpectrumInfo ret = new RgbSpectrumInfo();
     for (int i = 0; i < SamplesCount; ++i)
         ret[i] = this[i] > 0 ? (float)Math.Pow((float)this[i], (float)e[i]) : 0f;
     return ret;
 }
Esempio n. 19
0
        public RgbSpectrumInfo Div(RgbSpectrumInfo a)
        {
            this.c1 /= a.c1;
            this.c2 /= a.c2;
            this.c3 /= a.c3;

            return this;
        }
Esempio n. 20
0
        public RgbSpectrumInfo Mul(RgbSpectrumInfo a)
        {
            this.c1 *= a.c1;
            this.c2 *= a.c2;
            this.c3 *= a.c3;
            return this;

        }
Esempio n. 21
0
 public void MAdd(ref RgbSpectrum arg, ref RgbSpectrumInfo ths)
 {
     this.c1 += ths.c1 * arg.c1;
     this.c2 += ths.c2 * arg.c2;
     this.c3 += ths.c3 * arg.c3;
 }
Esempio n. 22
0
 public void Sample(ref Vector dir, out RgbSpectrumInfo outputColor)
 {
     var t = lightMap ?? tex;
     this.Sample(t, ref dir, out outputColor);
 }
Esempio n. 23
0
        public static RgbSpectrumInfo Create(byte clrColorR, byte clrColorG, byte clrColorB, bool correct)
        {

            var cl = new RgbSpectrumInfo((float)clrColorR / 255.0f, (float)clrColorG / 255.0f, (float)clrColorB / 255.0f);

            if (correct) return cl;

            cl.c1 = (float)Math.Log(1.001f - cl.c1);
            cl.c2 = (float)Math.Log(1.001f - cl.c2);
            cl.c3 = (float)Math.Log(1.001f - cl.c3);
            return cl;
        }
Esempio n. 24
0
 public static RgbSpectrumInfo Max(RgbSpectrumInfo ks, RgbSpectrumInfo kd)
 {
     if (ks > kd)
     {
         return ks;
     }
     if (kd > ks)
     {
         return kd;
     }
     return kd;
 }
Esempio n. 25
0
 public static RgbSpectrumInfo Transform(RgbSpectrumInfo c)
 {
     float[] xyz = new float[3];
     c.XYZ(ref xyz);
     var r = ((rWeight[0] * xyz[0] +
                       rWeight[1] * xyz[1] +
                       rWeight[2] * xyz[2]));
     var g = ((gWeight[0] * xyz[0] +
                       gWeight[1] * xyz[1] +
                       gWeight[2] * xyz[2]));
     var b = ((bWeight[0] * xyz[0] +
                       bWeight[1] * xyz[1] +
                       bWeight[2] * xyz[2]));
     return new RgbSpectrumInfo(r, g, b);
 }
Esempio n. 26
0
 public static void Max(ref RgbSpectrumInfo ks, ref RgbSpectrumInfo kd, out RgbSpectrumInfo max)
 {
     max = kd;
     if (ks > kd)
     {
         max = ks;
     }
     if (kd > ks)
     {
         max = kd;
     }
 }
Esempio n. 27
0
        public static RgbSpectrumInfo Sqrt(ref RgbSpectrumInfo r)
        {
            for (int i = 0; i < 3; i++)
            {
                r[i] = MathLab.Sqrt(r[i]);
            }

            return r;
        }
Esempio n. 28
0
 public static RegularSPD CreateRegularSpd(ref RgbSpectrumInfo col, SpectrumType t)
 {
     float[] l, v;
     FromRgb(ref col, t).ToSpectra(out l, out v);
     return new RegularSPD(v, SampledSpectrum.sampledLambdaStart, SampledSpectrum.sampledLambdaEnd, SampledSpectrum.nSpectralSamples);
 }
Esempio n. 29
0
 public static RgbSpectrumInfo Max(RgbSpectrumInfo ks, ref RgbSpectrum kd)
 {
     if (ks > (RgbSpectrumInfo) kd)
     {
         return ks;
     }
     if (kd > (RgbSpectrum) ks)
     {
         return (RgbSpectrumInfo) kd;
     }
     return (RgbSpectrumInfo) kd;
 }
Esempio n. 30
0
 public void Add(ref RgbSpectrumInfo a)
 {
     this.c1 += a.c1;
     this.c2 += a.c2;
     this.c3 += a.c3;
 }