Example #1
0
        public void             SampleCubeMap(WMath.Vector _View, CubeMapSampler _Sampler, out byte _R, out byte _G, out byte _B)
        {
            AbsView.Set(Math.Abs(_View.x), Math.Abs(_View.y), Math.Abs(_View.z));
            float MaxComponent = Math.Max(Math.Max(AbsView.x, AbsView.y), AbsView.z);

            fXYZ.Set(_View.x / MaxComponent, _View.y / MaxComponent, _View.z / MaxComponent);
            int FaceIndex = 0;

            if (Math.Abs(fXYZ.x) > 1.0 - 1e-6)
            {                   // +X or -X
                if (_View.x > 0.0)
                {
                    FaceIndex = 0;
                    fXY.Set(-fXYZ.z, fXYZ.y);
                }
                else
                {
                    FaceIndex = 1;
                    fXY.Set(fXYZ.z, fXYZ.y);
                }
            }
            else if (Math.Abs(fXYZ.y) > 1.0 - 1e-6)
            {                   // +Y or -Y
                if (_View.y > 0.0)
                {
                    FaceIndex = 2;
                    fXY.Set(fXYZ.x, -fXYZ.z);
                }
                else
                {
                    FaceIndex = 3;
                    fXY.Set(fXYZ.x, fXYZ.z);
                }
            }
            else             // if ( Math.Abs( fXYZ.z ) > 1.0-1e-6 )
            {                // +Z or -Z
                if (_View.z > 0.0)
                {
                    FaceIndex = 4;
                    fXY.Set(fXYZ.x, fXYZ.y);
                }
                else
                {
                    FaceIndex = 5;
                    fXY.Set(-fXYZ.x, fXYZ.y);
                }
            }

            fXY.y = -fXY.y;

            int X = (int)(Probe.CUBE_MAP_SIZE * 0.5 * (1.0 + fXY.x));
            int Y = (int)(Probe.CUBE_MAP_SIZE * 0.5 * (1.0 + fXY.y));

//          if ( X < 0 || X > Probe.CUBE_MAP_SIZE-1 )
//              throw new Exception();
//          if ( Y < 0 || Y > Probe.CUBE_MAP_SIZE-1 )
//              throw new Exception();

            X = Math.Min(Probe.CUBE_MAP_SIZE - 1, X);
            Y = Math.Min(Probe.CUBE_MAP_SIZE - 1, Y);

            Probe.Pixel[,]  CubeMapFace = m_Probe.m_CubeMap[FaceIndex];

            _Sampler(CubeMapFace[X, Y], out _R, out _G, out _B);
        }
Example #2
0
        private void    CubeMapSamplerSH(Probe.Pixel _Pixel, out byte _R, out byte _G, out byte _B)
        {
            WMath.Vector Dir = _Pixel.View;

            // Dot the SH together
            WMath.Vector Color = WMath.Vector.Zero;
            if (m_IsolateSet)
            {
                float Factor = 1.0f;
                if (m_bShowSHDynamic)
                {
                    for (int i = 0; i < 9; i++)
                    {
                        Color += (float)_Pixel.SHCoeffs[i] * m_Probe.m_Sets[m_IsolatedSetIndex].SH[i];
                    }

                    Factor = m_bNormalizeSH ? 2.0f * m_Probe.m_Sets[m_IsolatedSetIndex].SH[0].Max() : 1.0f;
                }

                if (m_bShowSHEmissive)
                {
                    int EmissiveSetIndex = Math.Min(m_IsolatedSetIndex, m_Probe.m_EmissiveSets.Length - 1);
                    if (EmissiveSetIndex >= 0)
                    {
                        for (int i = 0; i < 9; i++)
                        {
                            Color += (float)_Pixel.SHCoeffs[i] * m_Probe.m_EmissiveSets[EmissiveSetIndex].SH[i];
                        }
                    }

                    Factor = m_bNormalizeSH ? 2.0f * m_Probe.m_EmissiveSets[EmissiveSetIndex].SH[0].Max() : 1.0f;
                }

//				Color *= 100.0f;
                Color *= 1.0f / Factor;
            }
            else
            {
                float Factor = 0.0f;
                if (m_bShowSHStatic)
                {
                    for (int i = 0; i < 9; i++)
                    {
                        Color += (float)_Pixel.SHCoeffs[i] * m_SHStatic[i];
                    }
                    Factor = Math.Max(Factor, m_SHStatic[0].Max());
                }
                if (m_bShowSHDynamic)
                {
                    for (int i = 0; i < 9; i++)
                    {
                        Color += (float)_Pixel.SHCoeffs[i] * m_SHDynamic[i];
                    }
                    Factor = Math.Max(Factor, m_SHDynamic[0].Max());
                }
                if (m_bShowSHEmissive)
                {
                    for (int i = 0; i < 9; i++)
                    {
                        Color += (float)_Pixel.SHCoeffs[i] * m_SHEmissive[i];
                    }
                    Factor = Math.Max(Factor, m_SHEmissive[0].Max());
                }
                if (m_bShowSHOcclusion)
                {
                    for (int i = 0; i < 9; i++)
                    {
                        Color += (float)_Pixel.SHCoeffs[i] * m_SHOcclusion[i] * WMath.Vector.One;
                    }
                    Factor = Math.Max(Factor, m_SHOcclusion[0]);
                }

//				Color *= 50.0f;

                Color *= m_bNormalizeSH ? 1.0f / Factor : 1.0f;
            }

            if (Color.x < 0.0f || Color.y < 0.0f || Color.z < 0.0f)
            {
                Color.Set(1, 0, 1);
            }

            _R = (byte)Math.Min(255, 255 * Color.x);
            _G = (byte)Math.Min(255, 255 * Color.y);
            _B = (byte)Math.Min(255, 255 * Color.z);
        }