Пример #1
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;
        }
Пример #2
0
 public void StartScreenTransition(CDrawable.Transition pendingTransition)
 {
     _pendingTransition = pendingTransition;
 }