protected void UpdateBitmap() { if (m_Bitmap == null) { return; } using (Graphics G = Graphics.FromImage(m_Bitmap)) { G.FillRectangle(Brushes.White, 0, 0, Width, Height); G.DrawLine(Pens.Black, 10, 0, 10, Height); G.DrawLine(Pens.Black, 0, Height - 10, Width, Height - 10); FresnelEval Eval = null; switch (m_Type) { case FRESNEL_TYPE.SCHLICK: Eval = Fresnel_Schlick; break; case FRESNEL_TYPE.PRECISE: Eval = Fresnel_Precise; break; case FRESNEL_TYPE.TABLE: Eval = Fresnel_Table; break; } DrawLine(G, 0, 1, 1, 1, Pens.Gray); float x = 0.0f; float yr, yg, yb, yy; if (!m_PlotAgainstF0) { // Plot against IOR Eval(MIN_IOR, out yr, out yg, out yb, out yy); for (int X = 10; X <= Width; X++) { float px = x; float pyr = yr; float pyg = yg; float pyb = yb; float pyy = yy; x = (float)(X - 10.0f) / (Width - 10); float CurrentIOR = MIN_IOR + x * (m_MaxIOR - MIN_IOR); Eval(CurrentIOR, out yr, out yg, out yb, out yy); Clamp(ref yr); Clamp(ref yg); Clamp(ref yb); Clamp(ref yy); DrawLine(G, px, pyr, x, yr, Pens.Red); DrawLine(G, px, pyg, x, yg, Pens.LimeGreen); DrawLine(G, px, pyb, x, yb, Pens.Blue); DrawLine(G, px, pyy, x, yy, Pens.Gold); } // Show current IOR float x_IOR = (IOR - MIN_IOR) / (m_MaxIOR - MIN_IOR); DrawLine(G, x_IOR, 0.0f, x_IOR, 1.0f, Pens.Black); } else { // plot against F0 Eval(Form1.F0_to_IOR(0.0f), out yr, out yg, out yb, out yy); for (int X = 10; X <= Width; X++) { float px = x; float pyr = yr; float pyg = yg; float pyb = yb; float pyy = yy; x = (float)(X - 10.0f) / (Width - 10); float CurrentIOR = Form1.F0_to_IOR(x); Eval(CurrentIOR, out yr, out yg, out yb, out yy); Clamp(ref yr); Clamp(ref yg); Clamp(ref yb); Clamp(ref yy); DrawLine(G, px, pyr, x, yr, Pens.Red); DrawLine(G, px, pyg, x, yg, Pens.LimeGreen); DrawLine(G, px, pyb, x, yb, Pens.Blue); DrawLine(G, px, pyy, x, yy, Pens.Gold); } // Show current IOR float x_IOR = Form1.IOR_to_F0(IOR); DrawLine(G, x_IOR, 0.0f, x_IOR, 1.0f, Pens.Black); } // Draw values at current IOR Eval(m_IOR, out yr, out yg, out yb, out yy); string T = "R = " + yr.ToString("G4") + "\r\nG = " + yg.ToString("G4") + "\r\nB = " + yb.ToString("G4") + "\r\nA = " + yy.ToString("G4"); SizeF TextSize = G.MeasureString(T, Font); G.DrawString(T, Font, Brushes.Black, Width - TextSize.Width - 12.0f, Height - TextSize.Height - 20); } Invalidate(); }
protected void UpdateBitmap() { if (m_Bitmap == null) { return; } using (Graphics G = Graphics.FromImage(m_Bitmap)) { G.FillRectangle(Brushes.White, 0, 0, Width, Height); G.DrawLine(Pens.Black, 10, 0, 10, Height); G.DrawLine(Pens.Black, 0, Height - 10, Width, Height - 10); FresnelEval Eval = null; if (m_FromData) { switch (m_Type) { case FRESNEL_TYPE.SCHLICK: Eval = Fresnel_SchlickData; PrepareData(); break; case FRESNEL_TYPE.PRECISE: Eval = Fresnel_PreciseData; PrepareData(); break; } } else { switch (m_Type) { case FRESNEL_TYPE.SCHLICK: Eval = Fresnel_Schlick; PrepareSchlick(); break; case FRESNEL_TYPE.PRECISE: Eval = Fresnel_Precise; PreparePrecise(); break; } } DrawLine(G, 0, 1, 1, 1, Pens.Gray); float x = 0.0f; float yr, yg, yb; Eval(1.0f, out yr, out yg, out yb); for (int X = 10; X <= Width; X++) { float px = x; float pyr = yr; float pyg = yg; float pyb = yb; x = (float)(X - 10.0f) / (Width - 10); float CosTheta = (float)Math.Cos(x * 0.5 * Math.PI); // Cos(theta) Eval(CosTheta, out yr, out yg, out yb); DrawLine(G, px, pyr, x, yr, Pens.Red); DrawLine(G, px, pyg, x, yg, Pens.LimeGreen); DrawLine(G, px, pyb, x, yb, Pens.Blue); } if (!m_FromData) { Eval(1.0f, out yr, out yg, out yb); float F0 = Math.Max(Math.Max(yr, yg), yb); G.DrawString("F0 = " + F0, Font, Brushes.Black, 12.0f, Height - 30 - (Height - 20) * F0); } else { Eval(1.0f, out yr, out yg, out yb); float F0 = Math.Max(Math.Max(yr, yg), yb); float Offset = Height - 30 - 24 - (Height - 20) * F0; if (Offset < 40) { Offset = Height - (Height - 20) * Math.Min(Math.Min(yr, yg), yb); } G.DrawString("R (n = " + m_IndicesR.n + " k = " + m_IndicesR.k + ") F0 = " + yr, Font, Brushes.Black, 12.0f, Offset); G.DrawString("G (n = " + m_IndicesG.n + " k = " + m_IndicesG.k + ") F0 = " + yg, Font, Brushes.Black, 12.0f, Offset + 12); G.DrawString("B (n = " + m_IndicesB.n + " k = " + m_IndicesB.k + ") F0 = " + yb, Font, Brushes.Black, 12.0f, Offset + 24); } } Invalidate(); }