2009-01-29 00:18:34 +08:00
using System ;
using System.Collections.Generic ;
using SFML ;
using SFML.Graphics ;
using SFML.Window ;
namespace sample_postfx
{
static class Program
{
private static Dictionary < string , PostFx > Effects ;
private static Dictionary < string , PostFx > . Enumerator CurrentEffect ;
private static String2D CurFXStr ;
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main ( )
{
// Create the main window
RenderWindow App = new RenderWindow ( new VideoMode ( 800 , 600 ) , "SFML.Net PostFX" ) ;
// Setup event handlers
App . Closed + = new EventHandler ( OnClosed ) ;
App . KeyPressed + = new EventHandler < KeyEventArgs > ( OnKeyPressed ) ;
// Check that the system can use post effects
if ( PostFx . CanUsePostFX = = false )
{
DisplayError ( App ) ;
return ;
}
2009-02-06 21:54:39 +08:00
// Load a background image to display
2009-01-29 00:18:34 +08:00
Sprite Background = new Sprite ( new Image ( "datas/post-fx/background.jpg" ) ) ;
2009-02-06 21:54:39 +08:00
// Load a sprite which we'll move into the scene
Sprite Entity = new Sprite ( new Image ( "datas/post-fx/sprite.png" ) ) ;
2009-01-29 00:18:34 +08:00
// Load the text font
Font Cheeseburger = new Font ( "datas/post-fx/cheeseburger.ttf" ) ;
// Load the image needed for the wave effect
Image WaveImage = new Image ( "datas/post-fx/wave.jpg" ) ;
// Load all effects
Effects = new Dictionary < string , PostFx > ( ) ;
Effects [ "nothing" ] = new PostFx ( "datas/post-fx/nothing.sfx" ) ;
Effects [ "blur" ] = new PostFx ( "datas/post-fx/blur.sfx" ) ;
Effects [ "colorize" ] = new PostFx ( "datas/post-fx/colorize.sfx" ) ;
Effects [ "fisheye" ] = new PostFx ( "datas/post-fx/fisheye.sfx" ) ;
Effects [ "wave" ] = new PostFx ( "datas/post-fx/wave.sfx" ) ;
2009-02-06 21:54:39 +08:00
Effects [ "pixelate" ] = new PostFx ( "datas/post-fx/pixelate.sfx" ) ;
2009-01-29 00:18:34 +08:00
CurrentEffect = Effects . GetEnumerator ( ) ;
CurrentEffect . MoveNext ( ) ;
// Do specific initializations
Effects [ "nothing" ] . SetTexture ( "framebuffer" , null ) ;
Effects [ "blur" ] . SetTexture ( "framebuffer" , null ) ;
Effects [ "blur" ] . SetParameter ( "offset" , 0.0F ) ;
Effects [ "colorize" ] . SetTexture ( "framebuffer" , null ) ;
Effects [ "colorize" ] . SetParameter ( "color" , 1.0F , 1.0F , 1.0F ) ;
Effects [ "fisheye" ] . SetTexture ( "framebuffer" , null ) ;
Effects [ "wave" ] . SetTexture ( "framebuffer" , null ) ;
Effects [ "wave" ] . SetTexture ( "wave" , WaveImage ) ;
2009-02-06 21:54:39 +08:00
Effects [ "pixelate" ] . SetTexture ( "framebuffer" , null ) ;
2009-01-29 00:18:34 +08:00
// Define a string for displaying current effect description
CurFXStr = new String2D ( ) ;
CurFXStr . Text = "Current effect is \"" + CurrentEffect . Current . Key + "\"" ;
CurFXStr . Font = Cheeseburger ;
CurFXStr . Position = new Vector2 ( 20.0F , 0.0F ) ;
2009-02-06 21:54:39 +08:00
CurFXStr . Color = new Color ( 150 , 70 , 110 ) ;
2009-01-29 00:18:34 +08:00
// Define a string for displaying help
String2D InfoStr = new String2D ( ) ;
InfoStr . Text = "Move your mouse to change the effect parameters\nPress numpad + to change effect\nWarning : some effects may not work\ndepending on your graphics card" ;
InfoStr . Font = Cheeseburger ;
InfoStr . Position = new Vector2 ( 20.0F , 460.0F ) ;
InfoStr . Color = new Color ( 200 , 100 , 150 ) ;
// Start the game loop
2009-02-06 21:54:39 +08:00
float AppTime = 0.0F ;
2009-01-29 00:18:34 +08:00
while ( App . IsOpened ( ) )
{
// Process events
App . DispatchEvents ( ) ;
// Get the mouse position in the range [0, 1]
float X = App . Input . GetMouseX ( ) / ( float ) App . Width ;
float Y = App . Input . GetMouseY ( ) / ( float ) App . Height ;
// Update the current effect
if ( CurrentEffect . Current . Key = = "blur" ) CurrentEffect . Current . Value . SetParameter ( "offset" , X * Y * 0.1f ) ;
else if ( CurrentEffect . Current . Key = = "colorize" ) CurrentEffect . Current . Value . SetParameter ( "color" , 0.3f , X , Y ) ;
else if ( CurrentEffect . Current . Key = = "fisheye" ) CurrentEffect . Current . Value . SetParameter ( "mouse" , X , 1.0F - Y ) ;
else if ( CurrentEffect . Current . Key = = "wave" ) CurrentEffect . Current . Value . SetParameter ( "offset" , X , Y ) ;
2009-02-06 21:54:39 +08:00
else if ( CurrentEffect . Current . Key = = "pixelate" ) CurrentEffect . Current . Value . SetParameter ( "mouse" , X , Y ) ;
// Animate the sprite
AppTime + = App . GetFrameTime ( ) ;
float EntityX = ( float ) ( Math . Cos ( AppTime * 1.3 ) + 1.2 ) * 300 ;
float EntityY = ( float ) ( Math . Cos ( AppTime * 0.8 ) + 1.2 ) * 200 ;
Entity . Position = new Vector2 ( EntityX , EntityY ) ;
Entity . Rotation = AppTime * 100 ;
2009-01-29 00:18:34 +08:00
// Clear the window
App . Clear ( ) ;
2009-02-06 21:54:39 +08:00
// Draw background, the sprite and apply the post-fx
2009-01-29 00:18:34 +08:00
App . Draw ( Background ) ;
2009-02-06 21:54:39 +08:00
App . Draw ( Entity ) ;
2009-01-29 00:18:34 +08:00
App . Draw ( CurrentEffect . Current . Value ) ;
// Draw interface strings
App . Draw ( CurFXStr ) ;
App . Draw ( InfoStr ) ;
// Finally, display the rendered frame on screen
App . Display ( ) ;
}
}
/// <summary>
/// Fonction called when the post-effects are not supported ;
/// Display an error message and wait until the user exits
/// </summary>
private static void DisplayError ( RenderWindow App )
{
// Define a string for displaying the error message
String2D ErrorStr = new String2D ( "Sorry, your system doesn't support post-effects" ) ;
ErrorStr . Position = new Vector2 ( 100.0F , 250.0F ) ;
ErrorStr . Color = new Color ( 200 , 100 , 150 ) ;
// Start the game loop
while ( App . IsOpened ( ) )
{
// Process events
App . DispatchEvents ( ) ;
// Clear the window
App . Clear ( ) ;
// Draw the error message
App . Draw ( ErrorStr ) ;
// Finally, display the rendered frame on screen
App . Display ( ) ;
}
}
/// <summary>
/// Function called when the window is closed
/// </summary>
static void OnClosed ( object sender , EventArgs e )
{
RenderWindow window = ( RenderWindow ) sender ;
window . Close ( ) ;
}
/// <summary>
/// Function called when a key is pressed
/// </summary>
static void OnKeyPressed ( object sender , KeyEventArgs e )
{
RenderWindow window = ( RenderWindow ) sender ;
if ( e . Code = = KeyCode . Escape )
{
// Close the window
window . Close ( ) ;
}
else if ( e . Code = = KeyCode . Add )
{
// Advance to the next effect
if ( CurrentEffect . MoveNext ( ) = = false )
{
CurrentEffect = Effects . GetEnumerator ( ) ;
CurrentEffect . MoveNext ( ) ;
}
CurFXStr . Text = "Current effect is \"" + CurrentEffect . Current . Key + "\"" ;
}
}
}
}