Пример #1
0
        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();
        }
Пример #2
0
        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();
        }