/Rendering/EffectTests/Effect2DTests.cs
C# | 494 lines | 365 code | 27 blank | 102 comment | 13 complexity | bd58ecfd1a3b583bef4c438571291c68 MD5 | raw file
Possible License(s): Apache-2.0
- using Delta.ContentSystem.Rendering;
- using Delta.ContentSystem.Rendering.Helpers;
- using Delta.Engine;
- using Delta.InputSystem;
- using Delta.Rendering.Basics.Fonts;
- using Delta.Rendering.Basics.Materials;
- using Delta.Rendering.Effects;
- using Delta.Rendering.Effects.Modifiers;
- using Delta.Rendering.Enums;
- using Delta.Utilities.Datatypes;
- using Delta.Utilities.Helpers;
- using Delta.Utilities.Math;
- using NUnit.Framework;
-
- namespace Delta.Rendering.EffectTests
- {
- /// <summary>
- /// Effect test in 2D space.
- /// </summary>
- [Category("Visual")]
- internal class Effect2DTests
- {
- #region Helpers
- /// <summary>
- /// The default 2d material modifier, so we don't have to write the code
- /// in every test again.
- /// </summary>
- public static readonly MaterialModifier Default2DMaterialModifier =
- new MaterialModifier
- {
- Material = new Material2DColored(
- //"SmokeSmallAdditive")
- //"DeltaEngineLogo")
- "BreakoutEffect")
- {
- DrawLayer = RenderLayer.Normal,
- BlendColor = Color.White,
- }
- };
- #endregion
-
- #region SimpleEffect (Static)
- /// <summary>
- /// Spawn simple effect
- /// </summary>
- [Test]
- public static void SimpleEffect()
- {
- // Create a new template.
- EffectData data = EffectData.Get("<SimpleEffect>");
- // With one emitter.
- EmitterData emitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- emitter.Modifiers.Add(Default2DMaterialModifier);
- emitter.Modifiers.Add(new AlwaysSpawnModifier());
- emitter.Modifiers.Add(new FadeModifier
- {
- AlphaFade = new Range(1f, 0f),
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(2, 0),
- HeightRange = new Range(2, 0),
- });
- emitter.Modifiers.Add(new RotationModifier
- {
- Rotation = new Range(0, 360),
- });
- emitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0f, 0.1f, 0f)
- });
- data.Emitters.Add(emitter);
- // We want to start and stop the effect by hand, so save the invalid id.
- int effectId = MathHelper.InvalidIndex;
-
- // Start the application.
- Application.Start(delegate
- {
- // On enter or touch we start/stop the effect.
- if (Input.Keyboard.EnterReleased ||
- Input.Touch.TouchReleased)
- {
- if (effectId == MathHelper.InvalidIndex)
- {
- effectId = Effect.Spawn(data, ScreenSpace.DrawArea.Center);
- }
- else
- {
- Effect.Stop(effectId);
- effectId = MathHelper.InvalidIndex;
- }
- }
- // Write some debug info.
- Font.DrawTopLeftInformation(
- "Press Enter or Touch to activate spawning." +
- "\nEffect.IsActive=" + (effectId != MathHelper.InvalidIndex) +
- "\nEffect.ActiveParticles=" +
- Effect.NumberOfActiveParticles(effectId));
- });
- }
- #endregion
-
- #region MultiEmitterEffect (Static)
- /// <summary>
- /// Spawn a simple effect with multiple emitters.
- /// </summary>
- [Test]
- public static void MultiEmitterEffect()
- {
- // Create a new template.
- EffectData data = EffectData.Get("<MultiEmitterEffect>");
- // With one emitter that spawns always.
- EmitterData constantEmitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- constantEmitter.Modifiers.Add(new AlwaysSpawnModifier());
- constantEmitter.Modifiers.Add(Default2DMaterialModifier);
- constantEmitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0f, 0.1f, 0f)
- });
- data.Emitters.Add(constantEmitter);
-
- // And one emitter that starts at 3s and spawns all the time after that.
- EmitterData timeRangeEmitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- timeRangeEmitter.Modifiers.Add(new AlwaysSpawnModifier());
- timeRangeEmitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(3, float.PositiveInfinity)
- });
- timeRangeEmitter.Modifiers.Add(Default2DMaterialModifier);
- timeRangeEmitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0.1f, 0f, 0f)
- });
- data.Emitters.Add(timeRangeEmitter);
-
- // Start the effect.
- int effectId = Effect.Spawn(data, ScreenSpace.DrawArea.Center);
-
- // Start the application.
- Application.Start();
- }
- #endregion
-
- #region CollisionEffect (Static)
- [Test]
- public static void CollisionEffect()
- {
- // Setup the visual collision effect for the ball
- var collision = new Material2DColored("BreakoutEffect");
- EffectData effectTemplate = EffectData.Get("<BrickDestroyEffect>");
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new SpawnOnceModifier());
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(1.0f, 4.0f),
- HeightRange = new Range(1.0f, 4.0f),
- });
- emitter.Modifiers.Add(new FadeModifier
- {
- AlphaFade = new Range(1.0f, 0.0f),
- });
- emitter.Modifiers.Add(new MaterialModifier
- {
- BillboardMode = BillboardMode.Only2D,
- Material = collision,
- });
- effectTemplate.Emitters.Add(emitter);
-
- Application.Start(delegate
- {
- Font.DrawTopLeftInformation("Click to spawn effect");
- if (Input.Mouse.LeftButtonReleased)
- {
- Effect.Spawn(effectTemplate, Input.Mouse.Position);
- }
- });
- }
- #endregion
-
- #region SimpleEffectWithAnimatedMaterial (Static)
- /// <summary>
- /// Spawn simple effect.
- /// </summary>
- [Test]
- public static void SimpleEffectWithAnimatedMaterial()
- {
- // Create a new template.
- EffectData data = EffectData.Get("<SimpleEffectWithAnimatedMaterial>");
- // With one emitter.
- EmitterData emitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- emitter.Modifiers.Add(new MaterialModifier
- {
- Material = new Material2DColored("BigExplosion")
- });
- emitter.Modifiers.Add(new AlwaysSpawnModifier());
- data.Emitters.Add(emitter);
- // Start the effect.
- int effectId = Effect.Spawn(data, ScreenSpace.DrawArea.Center);
-
- // Start the application.
- Application.Start();
- }
- #endregion
-
- #region OnceEffect (Static)
- /// <summary>
- /// Spawn once effect
- /// </summary>
- [Test]
- public static void OnceEffect()
- {
- // Create a new template.
- EffectData data = EffectData.Get("<OnceEffect>");
- // With one emitter.
- EmitterData emitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- emitter.Modifiers.Add(Default2DMaterialModifier);
- emitter.Modifiers.Add(new SpawnOnceModifier());
- data.Emitters.Add(emitter);
-
- // Start the application.
- Application.Start(delegate
- {
- // This effect will only spawn a particle once, so we can activate
- // the effect whenever we hit enter or touch or press the screen.
- if (Input.Keyboard.EnterReleased)
- {
- Effect.Spawn(data, ScreenSpace.DrawArea.Center);
- }
- if (Input.Touch.TouchReleased)
- {
- Effect.Spawn(data, Input.Touch.Position);
- }
- else if (Input.Mouse.LeftButtonReleased)
- {
- Effect.Spawn(data, Input.Mouse.Position);
- }
- });
- }
- #endregion
-
- #region SimpleElapsingEffect (Static)
- /// <summary>
- /// Spawn simple elapsing effect.
- /// This effect is exceeding after 5s and then stopping itself.
- /// </summary>
- [Test]
- public static void SimpleElapsingEffect()
- {
- // Create a new template.
- EffectData data = EffectData.Get("<SimpleElapsingEffect>");
- // With one emitter.
- EmitterData emitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- emitter.Modifiers.Add(Default2DMaterialModifier);
- emitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(0f, 5f)
- });
- emitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0f, 0.01f, 0f)
- });
- data.Emitters.Add(emitter);
- // Start the effect.
- int effectId = Effect.Spawn(data, ScreenSpace.DrawArea.Center);
-
- // Start the application.
- Application.Start();
- }
- #endregion
-
- #region AdvancedElapsingEffect (Static)
- /// <summary>
- /// Spawn advanced elapsing effect.
- ///
- /// First an emitter is spawning until 3s and then an other emitter is
- /// spawning particles until 6s. Then the effect stops automatically.
- /// </summary>
- [Test]
- public static void AdvancedElapsingEffect()
- {
- // Create a new template.
- EffectData data = EffectData.Get("<MultiEmitterEffect>");
- // With one emitter that spawns the first 3 seconds
- EmitterData timeRangeEmitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- timeRangeEmitter.Modifiers.Add(new AlwaysSpawnModifier());
- timeRangeEmitter.Modifiers.Add(Default2DMaterialModifier);
- timeRangeEmitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0f, 0.1f, 0f)
- });
- timeRangeEmitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(0f, 3f)
- });
- timeRangeEmitter.Modifiers.Add(new FadeModifier
- {
- AlphaFade = new Range(1.0f, 0.0f),
- });
- data.Emitters.Add(timeRangeEmitter);
-
- // And another emitter that starts at 3s and ends at 6s.
- EmitterData delayedEmitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- delayedEmitter.Modifiers.Add(new AlwaysSpawnModifier());
- delayedEmitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(3f, 6f)
- });
- delayedEmitter.Modifiers.Add(Default2DMaterialModifier);
- delayedEmitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0.1f, 0f, 0f)
- });
- data.Emitters.Add(delayedEmitter);
-
- // Start the effect.
- int effectId = Effect.Spawn(data, ScreenSpace.DrawArea.Center);
-
- // Start the application.
- Application.Start();
- }
- #endregion
-
- #region SimpleEffectPerformance (Static)
- /// <summary>
- /// Simple Effect performance.
- ///
- /// Marcel: ~2100 FPS with Debugger attached
- /// - Win Vista, Dual Core 3.00 GHZ, 4 GB Ram, NVIDIA GeForce GTS 250
- /// </summary>
- [Test]
- public static void SimpleEffectPerformance()
- {
- // Create a new template.
- EffectData data = EffectData.Get("<SimpleEffectPerformance>");
- // With one emitter.
- EmitterData emitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- emitter.Modifiers.Add(Default2DMaterialModifier);
- emitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(0f, float.PositiveInfinity),
- });
- emitter.Modifiers.Add(new SpawnIntervalModifier
- {
- SpawnInterval = 0.01f,
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(2, 0),
- HeightRange = new Range(2, 0),
- });
- emitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0f, 0.1f, 0f)
- });
- data.Emitters.Add(emitter);
-
- // Start the effect.
- int effectId = Effect.Spawn(data, ScreenSpace.DrawArea.Center);
-
- // Start the application.
- Application.Start(delegate
- {
- Font.DrawTopLeftInformation(
- "Fps=" + Time.Fps + "\n" +
- "Current active particles=" +
- Effect.NumberOfActiveParticles(effectId));
- });
- }
- #endregion
-
- #region TestMultiEffectPerformance (Static)
- /// <summary>
- /// Spawn multiple effects
- /// Marcel: ~1400 FPS with Debugger attached
- /// - Win Vista, Dual Core 3.00 GHZ, 4 GB Ram, NVIDIA GeForce GTS 250
- /// </summary>
- [Test]
- public static void TestMultiEffectPerformance()
- {
- // We use numberX * numberY particles here in a grid for performance test
- int numberX = 15;
- int numberY = 15;
- float offsetX = (numberX / 2f) * 0.05f;
- float offsetY = (numberY / 2f) * 0.05f;
- Point startPos = new Point(0.5f - offsetX, 0.5f - offsetY);
- int index = 0;
- for (int iy = 0; iy < numberY; iy++)
- {
- for (int ix = 0; ix < numberX; ix++)
- {
- // Create a new template.
- EffectData data = EffectData.Get("<Effect" + index + ">");
- // With one emitter.
- EmitterData emitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- emitter.Modifiers.Add(new MaterialModifier
- {
- Material = new Material2DColored("SmokeSmallAdditive")
- {
- BlendColor = Color.NextSolidColor,
- },
- BillboardMode = BillboardMode.Only2D,
- });
- if (index % 2 == 0)
- {
- emitter.Modifiers.Add(new RotationModifier
- {
- Rotation = new Range(0f, 360f),
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(1, 0),
- HeightRange = new Range(1, 0),
- });
- }
- else
- {
- emitter.Modifiers.Add(new FadeModifier
- {
- AlphaFade = new Range(1f, 0f),
- });
- }
- emitter.Modifiers.Add(new AlwaysSpawnModifier());
- data.Emitters.Add(emitter);
- // Start the effect.
- Effect.Spawn(data, startPos + new Point(ix * 0.05f, iy * 0.05f));
- index++;
- }
- }
-
- // Start the application.
- Application.Start(delegate
- {
- Font.DrawTopLeftInformation("Fps: " + Time.Fps);
- });
- }
- #endregion
-
- #region MassiveEffectPerformance (Static)
- /// <summary>
- /// Massive Effect performance.
- ///
- /// Marcel: ~560 FPS with Debugger attached
- /// - Win Vista, Dual Core 3.00 GHZ, 4 GB Ram, NVIDIA GeForce GTS 250
- /// </summary>
- [Test]
- public static void MassiveEffectPerformance()
- {
- // Create a new template.
- EffectData data = EffectData.Get("<MassiveEffectPerformance>");
- // With one emitter.
- EmitterData emitter = new EmitterData();
- // Add some modifiers for the emitter and particles.
- emitter.Modifiers.Add(Default2DMaterialModifier);
- emitter.Modifiers.Add(new AlwaysSpawnModifier());
- emitter.Modifiers.Add(new SpawnIntervalModifier
- {
- SpawnInterval = 0.0001f,
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(0.1f),
- HeightRange = new Range(4, 1),
- });
- emitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = Vector.UnitX
- });
- data.Emitters.Add(emitter);
-
- // Start the effect.
- int effectId = Effect.Spawn(data, new Point(0f, 0.5f));
-
- // Start the application.
- Application.Start(delegate
- {
- Font.DrawTopLeftInformation(
- "Fps: " + Time.Fps + "\n" +
- "Currently active particles: " +
- Effect.NumberOfActiveParticles(effectId));
- });
- }
- #endregion
- }
- }