public override void Draw(GraphicsDevice graphicsDevice)
        {
            // Nothing visible? Nothing more to do!
            if (!VisibleWindows.Any())
            {
                return;
            }

            // Construct a view where (0, 0) is the top-left and (width, height) is
            // bottom-right, so that popups can act more like normal window things.
            XNAView = Matrix.CreateTranslation(-ScreenSize.X / 2, -ScreenSize.Y / 2, 0) *
                      Matrix.CreateTranslation(-0.5f, -0.5f, 0) *
                      Matrix.CreateScale(1, -1, 1);
            // Project into a flat view of the same size as the viewport.
            XNAProjection = Matrix.CreateOrthographic(ScreenSize.X, ScreenSize.Y, 0, 100);

            foreach (var window in VisibleWindows)
            {
                var xnaWorld = window.XNAWorld;

                // FIXME: MonoGame cannot read backbuffer
                //if (Screen != null)
                //    graphicsDevice.ResolveBackBuffer(Screen);
                PopupWindowMaterial.SetState(graphicsDevice, Screen);
                PopupWindowMaterial.Render(graphicsDevice, window, ref xnaWorld, ref XNAView, ref XNAProjection);
                PopupWindowMaterial.ResetState(graphicsDevice);
                SpriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied, null, null, null, null);
                window.Draw(SpriteBatch);
                SpriteBatch.End();
            }
            // For performance, we call SpriteBatch.Begin() with SaveStateMode.None above, but we now need to restore
            // the state ourselves.
            graphicsDevice.BlendState        = BlendState.Opaque;
            graphicsDevice.DepthStencilState = DepthStencilState.Default;
        }
        public override void Draw(GraphicsDevice graphicsDevice)
        {
            // Nothing visible? Nothing more to do!
            if (!VisibleWindows.Any())
            {
                return;
            }

            // Construct a view where (0, 0) is the top-left and (width, height) is
            // bottom-right, so that popups can act more like normal window things.
            XNAView = Matrix.CreateTranslation(-ScreenSize.X / 2, -ScreenSize.Y / 2, 0) *
                      Matrix.CreateScale(1, -1, 1);
            // Project into a flat view of the same size as the viewport.
            XNAProjection = Matrix.CreateOrthographic(ScreenSize.X, ScreenSize.Y, 0, 100);

            foreach (var window in VisibleWindows)
            {
                var xnaWorld = window.XNAWorld;

                var oldTargets = graphicsDevice.GetRenderTargets();
                if (Viewer.Settings.WindowGlass)
                {
                    graphicsDevice.SetRenderTarget(Screen);
                    graphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer | ClearOptions.Stencil, Color.Transparent, 1, 0);
                    PopupWindowMaterial.SetState(graphicsDevice, oldTargets[0].RenderTarget as RenderTarget2D);
                }
                else
                {
                    PopupWindowMaterial.SetState(graphicsDevice, null);
                }
                PopupWindowMaterial.Render(graphicsDevice, window, ref xnaWorld, ref XNAView, ref XNAProjection);
                PopupWindowMaterial.ResetState(graphicsDevice);
                SpriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);
                window.Draw(SpriteBatch);
                SpriteBatch.End();
                if (Viewer.Settings.WindowGlass)
                {
                    graphicsDevice.SetRenderTargets(oldTargets);
                    SpriteBatchMaterial.SetState(graphicsDevice, null);
                    SpriteBatchMaterial.SpriteBatch.Draw(Screen, Vector2.Zero, Color.White);
                    SpriteBatchMaterial.ResetState(graphicsDevice);
                }
            }
            // For performance, we call SpriteBatch.Begin() with SaveStateMode.None above, but we now need to restore
            // the state ourselves.
            graphicsDevice.BlendState        = BlendState.Opaque;
            graphicsDevice.DepthStencilState = DepthStencilState.Default;
        }
        public override void Draw(GraphicsDevice graphicsDevice)
        {
            // Nothing visible? Nothing more to do!
            if (!VisibleWindows.Any())
            {
                return;
            }

            // Construct a view where (0, 0) is the top-left and (width, height) is
            // bottom-right, so that popups can act more like normal window things.
            XNAView = Matrix.CreateTranslation(-ScreenSize.X / 2, -ScreenSize.Y / 2, 0) *
                      Matrix.CreateTranslation(-0.5f, -0.5f, 0) *
                      Matrix.CreateScale(1, -1, 1);
            // Project into a flat view of the same size as the viewport.
            XNAProjection = Matrix.CreateOrthographic(ScreenSize.X, ScreenSize.Y, 0, 100);

            var rs = graphicsDevice.RenderState;

            foreach (var window in VisibleWindows)
            {
                var xnaWorld = window.XNAWorld;

                if (Screen != null)
                {
                    graphicsDevice.ResolveBackBuffer(Screen);
                }
                PopupWindowMaterial.SetState(graphicsDevice, Screen);
                PopupWindowMaterial.Render(graphicsDevice, window, ref xnaWorld, ref XNAView, ref XNAProjection);
                PopupWindowMaterial.ResetState(graphicsDevice);

                SpriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None);
                window.Draw(SpriteBatch);
                SpriteBatch.End();
            }
            // For performance, we call SpriteBatch.Begin() with SaveStateMode.None above, but we now need to restore
            // the state ourselves.
            rs.AlphaBlendEnable  = false;
            rs.AlphaFunction     = CompareFunction.Always;
            rs.AlphaTestEnable   = false;
            rs.DepthBufferEnable = true;
            rs.DestinationBlend  = Blend.Zero;
            rs.SourceBlend       = Blend.One;
        }