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; }
public void StartScreenTransition(CDrawable.Transition pendingTransition) { _pendingTransition = pendingTransition; }