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); }
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); }
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); }
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; } }
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); } } }
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; }
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; } }
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; } }
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; }
public static SampledSpectrum FromRgb(RgbSpectrumInfo rgb, SpectrumType type = SpectrumType.Reflectance) { return FromRgb(ref rgb, type); }
public RgbSpectrumInfo Sub(ref RgbSpectrumInfo a) { this.c1 -= a.c1; this.c2 -= a.c2; this.c3 -= a.c3; return this; }
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); }
public void SampleBackground(ref Vector dir, out RgbSpectrumInfo outputColor) { Sample(ref dir, out outputColor); }
public void MAdd(ref RgbSpectrumInfo arg, float f) { this.c1 += f * arg.c1; this.c2 += f * arg.c2; this.c3 += f * arg.c3; }
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; }
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; }
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; }
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; }
public RgbSpectrumInfo Div(RgbSpectrumInfo a) { this.c1 /= a.c1; this.c2 /= a.c2; this.c3 /= a.c3; return this; }
public RgbSpectrumInfo Mul(RgbSpectrumInfo a) { this.c1 *= a.c1; this.c2 *= a.c2; this.c3 *= a.c3; return this; }
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; }
public void Sample(ref Vector dir, out RgbSpectrumInfo outputColor) { var t = lightMap ?? tex; this.Sample(t, ref dir, out outputColor); }
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; }
public static RgbSpectrumInfo Max(RgbSpectrumInfo ks, RgbSpectrumInfo kd) { if (ks > kd) { return ks; } if (kd > ks) { return kd; } return kd; }
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); }
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; } }
public static RgbSpectrumInfo Sqrt(ref RgbSpectrumInfo r) { for (int i = 0; i < 3; i++) { r[i] = MathLab.Sqrt(r[i]); } return r; }
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); }
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; }
public void Add(ref RgbSpectrumInfo a) { this.c1 += a.c1; this.c2 += a.c2; this.c3 += a.c3; }