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); }
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); }