private void UpdateCubeMapFacePassCBs()
        {
            for (int i = 0; i < 6; i++)
            {
                PassConstants cubeFacePassCB = _mainPassCB;

                Matrix view = _cubeMapCameras[i].View;
                Matrix proj = _cubeMapCameras[i].Proj;

                Matrix viewProj    = view * proj;
                Matrix invView     = Matrix.Invert(view);
                Matrix invProj     = Matrix.Invert(proj);
                Matrix invViewProj = Matrix.Invert(viewProj);

                cubeFacePassCB.View                = Matrix.Transpose(view);
                cubeFacePassCB.InvView             = Matrix.Transpose(invView);
                cubeFacePassCB.Proj                = Matrix.Transpose(proj);
                cubeFacePassCB.InvProj             = Matrix.Transpose(invProj);
                cubeFacePassCB.ViewProj            = Matrix.Transpose(viewProj);
                cubeFacePassCB.InvViewProj         = Matrix.Transpose(invViewProj);
                cubeFacePassCB.EyePosW             = _cubeMapCameras[i].Position;
                cubeFacePassCB.RenderTargetSize    = new Vector2(_dynamicCubeMap.Width, _dynamicCubeMap.Height);
                cubeFacePassCB.InvRenderTargetSize = new Vector2(1.0f / _dynamicCubeMap.Width, 1.0f / _dynamicCubeMap.Height);

                UploadBuffer <PassConstants> currPassCB = CurrFrameResource.PassCB;

                // Cube map pass cbuffers are stored in elements 1-6.
                currPassCB.CopyData(1 + i, ref cubeFacePassCB);
            }
        }
        private void UpdateReflectedPassCB()
        {
            _reflectedPassCB = _mainPassCB;

            var    mirrorPlane = new Plane(new Vector3(0, 0, 1), 0); // XY plane.
            Matrix r           = MathHelper.Reflection(mirrorPlane);

            // Reflect the lighting.
            for (int i = 0; i < 3; i++)
            {
                Vector3 lightDir          = _mainPassCB.Lights[i].Direction;
                Vector3 reflectedLightDir = Vector3.TransformNormal(lightDir, r);
                Light   reflectedLight    = _reflectedPassCB.Lights[i];
                reflectedLight.Direction   = reflectedLightDir;
                _reflectedPassCB.Lights[i] = reflectedLight;
            }

            // Reflected pass stored in index 1.
            CurrFrameResource.PassCB.CopyData(1, ref _reflectedPassCB);
        }