Exemplo n.º 1
0
 public void Dispose()
 {
     labels.Clear();
     sounds.Clear();
     for (var i = 0; i < 2; i++)
     {
         customImages[i] = null;
     }
     if (backgroundSound != null)
     {
         backgroundSound.Dispose();
         backgroundSound = null;
     }
     if (backgroundMusic != null)
     {
         backgroundMusic.Dispose();
         backgroundMusic = null;
     }
     if (videosnapVideo != null)
     {
         videosnapVideo.Dispose();
         videosnapVideo = null;
     }
     backgroundImage  = null;
     screenSaverImage = null;
     images.Clear();
 }
Exemplo n.º 2
0
 public void ResetImages()
 {
     images.Clear();
     onTopImages.Clear();
     CImage[] customImages = new CImage[2];
     backgroundImage = bezelImage = actorsImage = null;
 }
Exemplo n.º 3
0
 public void SetCustomImage(string fileName)
 {
     if (customImages[0] == null)
     {
         customImages[0] = new CImage(fileName, screenResX, screenResY, "", false, true);
     }
     else
     if (File.Exists(fileName))
     {
         customImages[0].LoadImage(fileName);
     }
 }
Exemplo n.º 4
0
        public CImage CreateImage(ImageType type, string filename, int width, int height, int posX, int posY, string fileNotFoundImage, bool stretch, bool isVisible, bool blackBackground, bool onTop)
        {
            var image = new CImage(filename, width, height, fileNotFoundImage, stretch, isVisible, blackBackground);

            image.X = posX;
            image.Y = posY;

            if (!onTop)
            {
                images.Add(new KeyValuePair <ImageType, CImage>(type, image));
            }
            else
            {
                onTopImages.Add(new KeyValuePair <ImageType, CImage>(type, image));
            }

            if (type == ImageType.Snapshot)
            {
                snapshotImage = image;
            }
            return(image);
        }
Exemplo n.º 5
0
        /* LED LAYOUT
         * //                       28  29  30  31
         * //
         * //          03 04 05 06                  17 18 19 20
         * //                        11                           25
         * // 13  02   07 08 09 10             16   21 22 23 24       27
         * //                        12                           26
         * //          00  01                       14  15
         */

        /*
         * HYBRID MODE
         * ===========
         * PLAYER 1
         * d6 = start
         * d7 = joy
         * d8 = button 1
         * d9 = button 2
         * d10 = button 3
         * d11 = button 4
         *
         * PLAYER 2
         * d18 = start
         * d19 = joy
         * d20 = button 1
         * d21 = button 2
         * d22 = button 3
         * d23 = button 4
         *
         * DEDICATED MODE
         * ==============
         * PLAYER 1
         * e1a = start
         * e1b = coindoor
         * e2a = joy
         * e2b..d7 = button 1..8
         * d8 = spinner
         * d9 = trackball
         *
         * PLAYER 2
         * e3a = start
         * e3b = coindoor
         * e4a = joy
         * e4b..d19 = button 1..8
         * d20 = spinner
         * d21 = trackball
         */

        public static void Initialize(OBJScene scene, string name, bool debugMode, SmartAsdMode wiringMode)
        {
            _smartAsd     = IntPtr.Zero;
            _scene        = scene;
            _smartAsdName = name;
            _wiringMode   = wiringMode;
            _debugMode    = debugMode;

            var xOffset = scene.screenResX - 380;
            var yOffset = scene.screenResY - 90;

            var dedicatedMode = _wiringMode == SmartAsdMode.Dedicated || _wiringMode == SmartAsdMode.Dedicated6Buttons ? 1 : 0;

            _background = _scene.CreateImage(OBJScene.ImageType.Led, null, 400, 130, xOffset - 20, yOffset - 40, string.Empty, false, true, true, true);
            _background.StartTransition(CDrawable.Transition.Freeze);

            var ledIndex = 0;

            for (var iPlayers = 0; iPlayers < 2; iPlayers++)
            {
                // start [0]
                _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*start", 20, 20, xOffset + 50 + iPlayers * 180, yOffset + 60, string.Empty, false, true, false, true);
                _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                ledIndex++;
                // coindoor [1]
                _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*coindoor", 30 * dedicatedMode, 30 * dedicatedMode, xOffset + 90 + iPlayers * 180, yOffset + 55, string.Empty, false, true, false, true);
                _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                ledIndex++;
                // joy [2]
                _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*joy", 30, 30, xOffset + 15 + iPlayers * 180, yOffset + 15, string.Empty, false, true, false, true);
                _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                ledIndex++;
                // buttons 1..4 [3-6]
                for (var iLoop = 0; iLoop < 4; iLoop++)
                {
                    var size = 20;
                    if (iLoop == 3 && _wiringMode == SmartAsdMode.Dedicated6Buttons)
                    {
                        size = 0;
                    }
                    _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*button", size, size, xOffset + 50 + iLoop * 20 + iPlayers * 180, yOffset + 10, string.Empty, false, true, false, true);
                    _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                    ledIndex++;
                }
                // buttons 5..8 [7-10]
                for (var iLoop = 0; iLoop < 4; iLoop++)
                {
                    var size = 20;
                    if (iLoop == 3 && _wiringMode == SmartAsdMode.Dedicated6Buttons)
                    {
                        size = 0;
                    }
                    _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*button", size * dedicatedMode, size * dedicatedMode, xOffset + 50 + iLoop * 20 + iPlayers * 180, yOffset + 30, string.Empty, false, true, false, true);
                    _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                    ledIndex++;
                }
                // spinner [11]
                _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*spinner", 30 * dedicatedMode, 30 * dedicatedMode, xOffset + 135 + iPlayers * 180, yOffset + 0, string.Empty, false, true, false, true);
                _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                ledIndex++;
                // trackball [12]
                _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*trackball", 40 * dedicatedMode, 40 * dedicatedMode, xOffset + 130 + iPlayers * 180, yOffset + 30, string.Empty, false, true, false, true);
                _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                ledIndex++;
                // side button [13]
                _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*button", 20 * dedicatedMode, 20 * dedicatedMode, xOffset - 10 + iPlayers * 360, yOffset + 20, string.Empty, false, true, false, true);
                _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                ledIndex++;
            }
            // extra buttons 1..4 [28-31]
            for (var iLoop = 0; iLoop < 4; iLoop++)
            {
                _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*button", 20 * dedicatedMode, 20 * dedicatedMode, xOffset + 120 + iLoop * 30, yOffset - 30, string.Empty, false, true, false, true);
                _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze);
                ledIndex++;
            }

            // initialize "none" transition frames
            noneFrames[0] = 0xffffffff;

            // initialize "wake-up" and "reverse-wake-up" transition frames
            for (var frame = 0; frame < 14; frame++)
            {
                for (var led = 0; led < 14; led++)
                {
                    wakeUpFrames[frame] |= led <= frame ? 1u << led : 0u;
                    wakeUpFrames[frame] |= led <= frame ? 1u << led + 14 : 0u;
                }
                reverseWakeUpFrames[frame]  = ReverseWord(wakeUpFrames[frame] & 0xFFFF);
                reverseWakeUpFrames[frame] |= ReverseWord(wakeUpFrames[frame] >> 16) << 16;
            }
            for (var frame = 14; frame < 17; frame++)
            {
                for (var led = 0; led < 32; led++)
                {
                    wakeUpFrames[frame] |= led <= frame + 14 ? 1u << led : 0u;
                }
                reverseWakeUpFrames[frame]  = ReverseWord(wakeUpFrames[frame] & 0xFFFF);
                reverseWakeUpFrames[frame] |= ReverseWord(wakeUpFrames[frame] >> 16) << 16;
            }

            // initialize "chase" transition frames
            for (var frame = 0; frame < 14; frame++)
            {
                for (var led = 0; led < 14; led++)
                {
                    chaseFrames[frame] |= led == frame ? 1u << led - 1: 0u;
                    //chaseFrames[frame] |= led == frame ? 1u << led + 14 : 0u;
                    chaseFrames[frame] |= led == 14 - frame ? 1u << led + 13 : 0u;
                }
            }
            for (var frame = 14; frame < 26; frame++)
            {
                for (var led = 0; led < 14; led++)
                {
                    chaseFrames[frame] |= led == 14 - (frame - 14) ? 1u << led - 1 : 0u;
                    //chaseFrames[frame] |= led == 14 - (frame - 14) ? 1u << led + 14: 0u;
                    chaseFrames[frame] |= led == frame - 14 ? 1u << led + 13 : 0u;
                }
            }

            // initialize "curtain" transition frames
            if (_wiringMode == SmartAsdMode.Dedicated6Buttons)
            {
                curtainFrames = new uint[] {
                    0xFEEFFBBF, 0xFEEFFBBF,
                    0xFEEFFBBF, 0xFEEFFBBF,
                    0x9EEEE3BF, 0x9EEEE3BF,
                    0x0ECCA19D, 0x0ECCA19D,
                    0x0E88208C, 0x0E88208C,
                    0x0E002004, 0x0E002004,
                    0x08002000, 0x08002000,
                    0x00000000, 0x00000000,
                    0x00000000, 0x00000000,
                    0x08002000, 0x08002000,
                    0x0E002004, 0x0E002004,
                    0x0E88208C, 0x0E88208C,
                    0x0ECCA19D, 0x0ECCA19D,
                    0x9EEEE3BF, 0x9EEEE3BF,
                    0xFEEFFBBF, 0xFEEFFBBF,
                    0xFEEFFBBF, 0xFEEFFBBF,
                }
            }
            ;
            // dungeonmaster's version
            //curtainFrames = new uint[] {
            //    0x00000000, 0x00000000,
            //    0x00000000, 0x00000000,
            //    0x00884089, 0x00884089,
            //    0x90440110, 0x90440110,
            //    0x60220220, 0x60220220,
            //    0x08012004, 0x08012004,
            //    0x60220220, 0x60220220,
            //    0x90440110, 0x90440110,
            //    0x00884089, 0x00884089
            //};
            else
            {
                curtainFrames = new uint[] {
                    0x00000000, 0x00000000,
                    0x00000000, 0x00000000,
                    0x08002000, 0x08002000,
                    0x0E002004, 0x0E002004,
                    0x0F10208C, 0x0F10208C,
                    0x0F98A19D, 0x0F98A19D,
                    0x0FDCE3BF, 0x0FDCE3BF,
                    0x9FFEE7FF, 0x9FFEE7FF,
                    0xFFFFFFFF, 0xFFFFFFFF,
                    0xFFFFFFFF, 0xFFFFFFFF
                };

                curtainFrames = new uint[] {
                    0xFFFFFFFF, 0xFFFFFFFF,
                    0xFFFFFFFF, 0xFFFFFFFF,
                    0x9FFFFFFF, 0x9FFFFFFF,
                    0x0FFFFFFF, 0x0FFFFFFF,
                    0x0FFEE7FF, 0x0FFEE7FF,
                    0x0FDCE3BF, 0x0FDCE3BF,
                    0x0F98A19D, 0x0F98A19D,
                    0x0F10208C, 0x0F10208C,
                    0x0E002004, 0x0E002004,
                    0x08002000, 0x08002000,
                    0x00000000, 0x00000000,
                    0x00000000, 0x00000000,
                    0x08002000, 0x08002000,
                    0x0E002004, 0x0E002004,
                    0x0F10208C, 0x0F10208C,
                    0x0F98A19D, 0x0F98A19D,
                    0x0FDCE3BF, 0x0FDCE3BF,
                    0x9FFEE7FF, 0x9FFEE7FF,
                    0xFFFFFFFF, 0xFFFFFFFF
                };
            }

            _curFETransition     = FETransition.None;
            _curTransitionFrames = noneFrames;
            ResetLed(false);
        }
Exemplo n.º 6
0
        public void ShowMenu(List <List <string> > menuCols, string titleText, string statusbarText, string currentMenu,
                             string additionalData, string additionalInfo, bool menuChanged, string preselectedMenuKey, bool isWindowTextReader,
                             string snapshotPath, string iconPath, bool showSideBar)
        {
            _currentMenu          = currentMenu;
            _additionalData       = additionalData;
            _additionalInfo       = additionalInfo;
            _menuStrings          = menuCols;
            menuColumnCount       = menuCols.Count;
            _isMenuTextReader     = isWindowTextReader;
            _snapshotPath         = snapshotPath != string.Empty ? snapshotPath + (snapshotPath[snapshotPath.Length - 1] != '\\' ? "\\" : string.Empty) : string.Empty;
            _iconPath             = iconPath;
            _showSideBar          = showSideBar;
            Width                 = menu_min_width;
            menu_first_item_shown = 0;

            var currentCol = 0;
            var indent     = menuCols.Count == 1 ? "      " : string.Empty;

            _menuItems.Clear();
            _titlebar = _statusbar = null;

            // create titlebar
            if (titleText != string.Empty)
            {
                _titlebar = new CLabel(0, 0,
                                       Width, (int)(menu_item_height * 1.2),
                                       titleText,
                                       menu_font_name, menu_font_size + 1, menu_font_style,
                                       menu_selected_font_color, menu_selected_backcolor, TextAlign.Left,
                                       false);
                _titlebar.BorderColor = menu_font_color;
            }

            // additional info
            _additionalInfoLayout             = BuildTable(additionalInfo, TextAlign.Left, 0);
            _additionalInfoLayout.PaddingLeft = 10;

            var itemWidth = Width;
            var yCounter  = 0;

            foreach (var menuRows in menuCols)
            {
                // on first column, decide menu size
                if (currentCol == 0)
                {
                    var maxWidth = Width;
                    foreach (var menuRow in menuRows)
                    {
                        var text = menuRow.Split('|').Length < 3 ? indent + menuRow.Split('|')[1] + indent : menuRow.Split('|')[1];
                        maxWidth = Math.Max(maxWidth, (int)menu_sprite_font.MeasureString(Utils.StringCleanup(text)).X + 8);
                    }
                    itemWidth = (int)Math.Min(maxWidth,
                                              _showSideBar && _currentMenu != "show_game_info" ? screenResX / 1.2 : screenResX - screenResX / 64) / menuColumnCount;
                }

                for (yCounter = 0; yCounter < menuRows.Count; yCounter++)
                {
                    var menuRow = menuRows[yCounter];
                    var arr     = menuRow.Split('|');
                    if (arr[1].StartsWith(("*#*T")))
                    {
                        // process table
                        var alignChar   = arr[1].Substring("*#*T".Length, 1);
                        var textAlign   = alignChar == "L" ? TextAlign.Left : alignChar == "C" ? TextAlign.Center : TextAlign.Right;
                        var tableString = string.Empty;
                        for (; yCounter < menuRows.Count; yCounter++)
                        {
                            var tableRow  = menuRows[yCounter].Split('|');
                            var rowString = menuRows[yCounter].Replace("*#*TL*#*", string.Empty).
                                            Replace("*#*TC*#*", string.Empty).
                                            Replace("*#*TR*#*", string.Empty).
                                            Replace("*#*/T*#*", string.Empty);
                            tableString += rowString + "\n";
                            if (tableRow[1].Contains("*#*/T*#*"))
                            {
                                break;
                            }
                        }
                        // remove last \n
                        tableString = tableString.Substring(0, tableString.Length - 1);

                        // inject table in menu
                        _menuItems.AddRange(BuildTable(tableString, textAlign, itemWidth).Items);
                    }
                    else
                    {
                        // process item
                        var lbl = new CLabel(0, 0,
                                             itemWidth, menu_item_height,
                                             arr.Length < 3 ? indent + arr[1] + indent : arr[1],
                                             menu_font_name, menu_font_size, menu_font_style,
                                             menu_font_color, Color.TransparentWhite,
                                             TextAlign.Left,
                                             arr.Length < 3 ? true : false);
                        lbl.KeyName   = arr[0];
                        lbl.Scrolling = false;
                        _menuItems.Add(lbl);
                    }
                }
                currentCol++;
            }
            menuRowsCount = yCounter;

            // create statusbar
            if (statusbarText != string.Empty)
            {
                _statusbar = new CLabel(0, 0,
                                        Width, (int)(menu_item_height * 0.9),
                                        statusbarText,
                                        menu_font_name, menu_font_size - 1, menu_font_style,
                                        menu_selected_font_color, menu_selected_backcolor, TextAlign.Right,
                                        false);
                _statusbar.BorderColor = menu_font_color;
            }

            _snapshotImage             = new CImage(string.Empty, screenResX / 4, screenResY / 4, null, false, true, true);
            _snapshotImage.BorderColor = menu_font_color;
            _previousSnapshotPath      = string.Empty;

            _iconImage        = new CImage(string.Empty, screenResX / 12, screenResX / 12, null, false, true, false);
            _previousIconPath = string.Empty;

            StartTransition(CDrawable.Transition.FadeIn, 0);
            SelectMenuItem(preselectedMenuKey, menuChanged);
        }
Exemplo n.º 7
0
        public void Render(GameTime gameTime, Feel.MachineState machineState)
        {
            if (_pendingTransition != CDrawable.Transition.None || _resolutionChanged)
            {
                if (_pendingTransition != CDrawable.Transition.None && renderTarget != null)
                {
                    // save last frame
                    _lastFrame      = renderTarget.GetTexture();
                    _transitionStep = 0f;

                    effectPost.CurrentTechnique = effectPost.Techniques[
                        _pendingTransition == CDrawable.Transition.Slide ? "PostProcessSlide" : "PostProcessFade"];
                }

                // refresh render target
                PresentationParameters pp = graphics.GraphicsDevice.PresentationParameters;
                renderTarget       = new RenderTarget2D(graphics.GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, graphics.GraphicsDevice.DisplayMode.Format);
                _resolutionChanged = false;
            }

            graphics.GraphicsDevice.SetRenderTarget(0, renderTarget);
            spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None);
            if (machineState.State == Feel.MachineState.StateEnum.ScreenSaver)
            {
                graphics.GraphicsDevice.Clear(screenSaverBackcolor);

                if (screenSaverChange)
                {
                    if (screenSaverImage != null)
                    {
                        if (nextScreenSaverLeftScrolling)
                        {
                            if (screenSaverImage.X > screenSaverX)
                            {
                                screenSaverImage.X = screenSaverImage.X - (screenResX / 10);
                                if (screenSaverImage.X <= screenSaverX)
                                {
                                    screenSaverImage.X = screenSaverX;
                                    screenSaverChange  = false;
                                }
                            }
                            else
                            {
                                screenSaverImage.X = screenSaverImage.X - (screenResX / 10);
                                if (screenSaverImage.X < -screenSaverSize.Width)
                                {
                                    screenSaverImage = null;
                                }
                            }
                        }
                        else
                        {
                            if (screenSaverImage.X < screenSaverX)
                            {
                                screenSaverImage.X = screenSaverImage.X + (screenResX / 10);
                                if (screenSaverImage.X >= screenSaverX)
                                {
                                    screenSaverImage.X = screenSaverX;
                                    screenSaverChange  = false;
                                }
                            }
                            else
                            {
                                screenSaverImage.X = screenSaverImage.X + (screenResX / 10);
                                if (screenSaverImage.X > screenResX)
                                {
                                    screenSaverImage = null;
                                }
                            }
                        }
                    }
                    else
                    {
                        screenSaverImage = new CImage(nextScreenSaverFileName, screenSaverSize.Width, screenSaverSize.Height, snapshotImage.FileNotFoundName, nextScreenSaverSnapshotStretch, true);

                        if (nextScreenSaverLeftScrolling)
                        {
                            screenSaverImage.X = screenResX;
                        }
                        else
                        {
                            screenSaverImage.X = -screenSaverImage.Width;
                        }
                        screenSaverImage.Y    = screenSaverY;
                        screenSaverTitle.Text = nextScreenSaverTitle;
                    }
                }

                if (screenSaverImage != null)
                {
                    var posX    = screenSaverImage.X < 0 ? 0 : screenSaverImage.X;
                    var posY    = screenSaverImage.Y < 0 ? 0 : screenSaverImage.Y;
                    var srcRect = screenSaverImage.GetRect(screenResX, screenResY);
                    if (srcRect != null)
                    {
                        screenSaverImage.Draw(gameTime, spriteBatch, _pendingTransition);
                    }
                    screenSaverTitle.Draw(gameTime, spriteBatch, _pendingTransition);
                }

                // screensaver written directly on SB!
                var position        = new Vector2(screenResX - (int)(50 * ratioX), (screenResY - (int)(60 * ratioY)) / 2);
                var rotatedPosition = drawRotated ? new Vector2(screenResY - position.Y, position.X) : position;
                spriteBatch.Draw(screenSaverLeftArrow, rotatedPosition, null, new Color(Color.White, screenSaverChange && nextScreenSaverLeftScrolling ? .6f : .2f), drawRotated ? MathHelper.PiOver2 : 0f, Vector2.Zero, ratioX, SpriteEffects.FlipHorizontally, 0f);

                position        = new Vector2((int)(20 * ratioX), (screenResY - (int)(60 * ratioY)) / 2);
                rotatedPosition = drawRotated ? new Vector2(screenResY - position.Y, position.X) : position;
                spriteBatch.Draw(screenSaverLeftArrow, rotatedPosition, null, new Color(Color.White, screenSaverChange && !nextScreenSaverLeftScrolling ? .6f : .2f), drawRotated ? MathHelper.PiOver2 : 0f, Vector2.Zero, ratioX, SpriteEffects.None, 0f);

                // OnTop Images
                foreach (var image in onTopImages)
                {
                    image.Value.Draw(gameTime, spriteBatch, _pendingTransition);
                }
            }
            else
            {
                graphics.GraphicsDevice.Clear(Color.Black);

                // Background Image
                if (backgroundImage != null)
                {
                    backgroundImage.Draw(gameTime, spriteBatch, _pendingTransition);
                }

                // Video Image
                Texture2D texture = videosnapVideo.GetTexture();
                if (videosnapVideo.IsPlaying && texture != null)
                {
                    snapshotImage.SetTexture(texture);
                }

                // Images
                foreach (var image in images)
                {
                    image.Value.Draw(gameTime, spriteBatch, _pendingTransition);
                }

                // Labels
                foreach (var label in labels)
                {
                    label.Draw(gameTime, spriteBatch, _pendingTransition);
                }

                // Actors Image
                if (actorsImage != null)
                {
                    actorsImage.Draw(gameTime, spriteBatch, _pendingTransition);
                }

                // Bezel Image
                if (bezelImage != null)
                {
                    bezelImage.Draw(gameTime, spriteBatch, _pendingTransition);
                }

                // OnTop Images
                foreach (var image in onTopImages)
                {
                    image.Value.Draw(gameTime, spriteBatch, _pendingTransition);
                }

                // FNET
                fnetMessage.Draw(gameTime, spriteBatch, _pendingTransition);

                // Menu
                menu.Draw(gameTime, spriteBatch, _pendingTransition);

                // Mapping Image
                if (machineState.State == Feel.MachineState.StateEnum.CustomImage && currentCustomImage >= 0)
                {
                    customImages[currentCustomImage].Draw(gameTime, spriteBatch, _pendingTransition);
                }

                // Message Labels
                menu.DrawMessage(gameTime, spriteBatch, _pendingTransition);

                // Toast
                messageToast.Draw(gameTime, spriteBatch, _pendingTransition);

                PlayBackgroundMusic();
            }

            if (machineState.testMode)
            {
                // test mode written directly on SB!
                spriteBatch.DrawString(
                    testTextFont, "F.E.E.L. " + Application.ProductVersion + " (Test Mode) - FPS: " + machineState.fps + "\n" + machineState.ToString(),
                    new Vector2(testTextPosition.X, testTextPosition.Y), Color.GhostWhite);
            }
            spriteBatch.End();

            // Switch back to drawing onto the back buffer
            graphics.GraphicsDevice.SetRenderTarget(0, null);

            // Draw to backbuffer
            graphics.GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
            // Apply the post process shader
            effectPost.Parameters["fFadeAmount"].SetValue(_transitionStep);
            effectPost.Parameters["ColorMap2"].SetValue(_lastFrame);
            effectPost.Parameters["fSmoothSize"].SetValue(.3f);
            effectPost.CommitChanges();
            effectPost.Begin();
            {
                effectPost.CurrentTechnique.Passes[0].Begin();
                {
                    spriteBatch.Draw(renderTarget.GetTexture(), _screenRectangle, Color.White);
                    effectPost.CurrentTechnique.Passes[0].End();
                }
            }
            effectPost.End();
            spriteBatch.End();

            // Update transition step
            if (_transitionStep < 1f)
            {
                _transitionStep += .1f;
            }
            else
            {
                _lastFrame      = null;
                _transitionStep = 1f;
            }

            _pendingTransition = CDrawable.Transition.None;
        }