/Rendering/EffectTests/Effect3DTests.cs
C# | 744 lines | 554 code | 55 blank | 135 comment | 13 complexity | 901cd155e19ef150f653808a68145117 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.Drawing;
- using Delta.Rendering.Basics.Fonts;
- using Delta.Rendering.Cameras;
- using Delta.Rendering.Effects;
- using Delta.Rendering.Effects.Modifiers;
- using Delta.Rendering.Enums;
- using Delta.Rendering.Models;
- using Delta.Utilities.Datatypes;
- using Delta.Utilities.Helpers;
- using Delta.Utilities.Math;
- using NUnit.Framework;
-
- namespace Delta.Rendering.EffectTests
- {
- /// <summary>
- /// Effect test in 3D space.
- /// </summary>
- [Category("Visual")]
- internal class Effect3DTests
- {
- #region Helpers
- /// <summary>
- /// The default 3d material modifier, so we don't have to write the code
- /// in every test again.
- /// </summary>
- public static readonly MaterialModifier Default3DMaterialModifier =
- new MaterialModifier
- {
- Material = new MaterialColored("DeltaEngineLogo")
- {
- DrawLayer = RenderLayer.Normal,
- BlendColor = Color.White,
- },
- BillboardMode = BillboardMode.CameraFacingPrecise,
- };
- #endregion
-
- #region SimpleEffect3D (Static)
- /// <summary>
- /// Spawn simple effect
- /// </summary>
- [Test]
- public static void SimpleEffect3D()
- {
- // Create a default camera.
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- // Create a new template.
- EffectData data = EffectData.Get("<SimpleEffect3D>");
- // Add one emitter and some modifiers.
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new AlwaysSpawnModifier());
- emitter.Modifiers.Add(Default3DMaterialModifier);
- emitter.Modifiers.Add(new RotationModifier
- {
- Rotation = new Range(0.0f, 360.0f),
- });
- emitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0f, 0f, 1f)
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(0.2f, 4f),
- HeightRange = new Range(0.1f, 2f),
- });
- data.Emitters.Add(emitter);
- // Spawn the effect.
- int effectId = Effect.Spawn(data, Vector.Zero);
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation.
- Grid.Draw();
-
- if (Input.Keyboard.EnterReleased ||
- Input.Touch.TouchReleased)
- {
- if (effectId == MathHelper.InvalidIndex)
- {
- effectId = Effect.Spawn(data, Vector.Zero);
- }
- else
- {
- Effect.Stop(effectId);
- effectId = MathHelper.InvalidIndex;
- }
- }
- });
- }
- #endregion
-
- #region ElapsingEffect3D (Static)
- /// <summary>
- /// Spawn elapsing effect 3d
- /// </summary>
- [Test]
- public static void ElapsingEffect3D()
- {
- // Create a default camera.
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- // Create a new template.
- EffectData data = EffectData.Get("<ElapsingEffect3D>");
- // Add an emitter and modifiers.
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new AlwaysSpawnModifier());
- emitter.Modifiers.Add(Default3DMaterialModifier);
- emitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new Vector(0f, 0f, 1f)
- });
- emitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(0f, 5f),
- });
- data.Emitters.Add(emitter);
- int effectId = Effect.Spawn(data, Vector.Zero);
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation.
- Grid.Draw();
- });
- }
- #endregion
-
- #region BillboardModeTest (Static)
- /// <summary>
- /// Test all the billboard modes.
- /// </summary>
- [Test]
- public static void BillboardModeTest()
- {
- // Create a default camera.
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- BillboardMode currentMode = BillboardMode.CameraFacing;
-
- // Create the new effect template with the first billboard mode.
- EffectData data = EffectData.Get("<BillboardModeTest>");
- // Add an emitter and modifiers.
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new AlwaysSpawnModifier());
- emitter.Modifiers.Add(new SizeModifier
- {
- HeightRange = new Range(10),
- WidthRange = new Range(15),
- });
- MaterialModifier materialModifier = Default3DMaterialModifier;
- materialModifier.BillboardMode = currentMode;
- emitter.Modifiers.Add(materialModifier);
- data.Emitters.Add(emitter);
-
- int effectId = Effect.Spawn(data, Vector.Zero);
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation.
- Grid.Draw();
- // Show which mode we're currently using.
- Font.Default.Draw("currentMode=" + currentMode,
- new Rectangle(0.0f, ScreenSpace.DrawArea.Top, 1.0f,
- Font.Default.LineHeight));
-
- // Every time we hit enter or release a touch we want to go to the
- // next billboard mode for easy debugging of all modes.
- if (Input.Keyboard.EnterReleased ||
- Input.Touch.TouchReleased)
- {
- // Go to the next mode
- currentMode = (BillboardMode)currentMode.Next();
- // Skip the only2D mode cause this is working in all the 2d tests
- // anyways.
- if (currentMode == BillboardMode.Only2D)
- {
- currentMode = (BillboardMode)currentMode.Next();
- }
-
- // Kill the previous effect if it exists.
- if (effectId != MathHelper.InvalidIndex)
- {
- Effect.Kill(effectId);
- }
-
- // Set the current mode and then spawn the new effect.
- materialModifier.BillboardMode = currentMode;
- effectId = Effect.Spawn(data, Vector.Zero);
- }
- });
- }
- #endregion
-
- #region BillboardModeTestDirect (Static)
- /// <summary>
- /// Test all the billboard modes directly over the BillboardManager
- /// without spawning an effect.
- /// </summary>
- [Test]
- public static void BillboardModeTestDirect()
- {
- // Create a default camera.
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- BillboardMode currentMode = BillboardMode.CameraFacing;
-
- MaterialColored material = new MaterialColored("DeltaEngineLogo")
- {
- DrawLayer = RenderLayer.Normal,
- BlendColor = Color.White,
- billboardMode = currentMode,
- };
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation.
- Grid.Draw();
-
- Application.Window.Title = "currentMode=" + currentMode;
-
- // Every time we hit enter or release a touch we want to go to the
- // next billboard mode for easy debugging of all modes.
- if (Input.Keyboard.EnterReleased ||
- Input.Touch.TouchReleased)
- {
- // Go to the next mode
- currentMode = (BillboardMode)currentMode.Next();
- // Skip the only2D mode cause this is working in all the 2d tests
- // anyways.
- if (currentMode == BillboardMode.Only2D)
- {
- currentMode = (BillboardMode)currentMode.Next();
- }
-
- material.billboardMode = currentMode;
- }
-
- BillboardManager.Instance.Draw(material, Vector.Zero,
- new Size(5, 2.5f), 0f);
- BillboardManager.Instance.Draw(material, new Vector(0f, -10f, 0f),
- new Size(5, 2.5f), 0f);
- BillboardManager.Instance.Draw(material, new Vector(0f, 10f, 0f),
- new Size(5, 2.5f), 0f);
- });
- }
- #endregion
-
- #region FountainEffect3D (Static)
- /// <summary>
- /// Fountain effect 3D
- ///
- /// </summary>
- [Test]
- public static void FountainEffect3D()
- {
- // Set up camera
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- // Create a new template.
- EffectData data = EffectData.Get("<FountainEffect3D>");
- // Add the emitters and modifiers.
-
- #region HeadEmitter
- EmitterData headEmitter = new EmitterData();
- headEmitter.Modifiers.AddRange(
- new IEffectModifier[]
- {
- new AlwaysSpawnModifier(),
- new SpawnIntervalModifier
- {
- SpawnInterval = 0.4f,
- },
- new VelocityModifier
- {
- Velocity = new VectorRange(Vector.UnitZ, -Vector.UnitZ),
- },
- new SizeModifier
- {
- WidthRange = 20f,
- HeightRange = 20f,
- },
- new ParticleLifetimeModifier
- {
- ParticleLifetime = 4f,
- },
- new RotationModifier
- {
- Rotation = new Range(0f, 360f),
- },
- new MaterialModifier
- {
- Material = new MaterialColored("SmokeSmallAdditive")
- {
- BlendColor = new Color(0.3f, 0.4f, 0.8f),
- },
- BillboardMode = BillboardMode.CameraFacingPrecise,
- },
- });
- data.Emitters.Add(headEmitter);
- #endregion
-
- #region MiddleSurfaceEmitter
- EmitterData middleSurfaceEmitter = new EmitterData();
- middleSurfaceEmitter.Modifiers.AddRange(
- new IEffectModifier[]
- {
- new AlwaysSpawnModifier(),
- new SpawnIntervalModifier
- {
- SpawnInterval = 0.3333f,
- },
- new SizeModifier
- {
- WidthRange = 60f,
- HeightRange = 60f,
- },
- new EmitterOffsetModifier
- {
- Offset = new Vector(0f, 0f, -1f),
- },
- new MaterialModifier
- {
- Material = new MaterialColored("SmokeSmallAdditive")
- {
- BlendColor = new Color(0.3f, 0.4f, 0.8f),
- },
- BillboardMode = BillboardMode.Ground,
- },
- });
- data.Emitters.Add(middleSurfaceEmitter);
- #endregion
-
- #region BottomSurfaceEmitter
- EmitterData bottomSurfaceEmitter = new EmitterData();
- bottomSurfaceEmitter.Modifiers.AddRange(
- new IEffectModifier[]
- {
- new AlwaysSpawnModifier(),
- new SpawnIntervalModifier
- {
- SpawnInterval = 0.3333f,
- },
- new SizeModifier
- {
- WidthRange = 150f,
- HeightRange = 150f,
- },
- new EmitterOffsetModifier
- {
- Offset = new Vector(0f, 0f, -4f),
- },
- new MaterialModifier
- {
- Material = new MaterialColored("SmokeSmallAdditive")
- {
- BlendColor = new Color(0.3f, 0.4f, 0.8f),
- },
- BillboardMode = BillboardMode.Ground,
- },
- });
- data.Emitters.Add(bottomSurfaceEmitter);
- #endregion
-
- Effect.Spawn(data, new Vector(0.0f, 0.0f, 4.5f));
-
- Matrix mat = Matrix.CreateScale(0.45f);
-
- Application.BackgroundColor = Color.Black;
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation and the fountain for the visual.
- Grid.Draw();
- });
- }
- #endregion
-
- #region SmokeEffect3D (Static)
- /// <summary>
- /// Smoke effect 3D
- /// </summary>
- [Test]
- public static void SmokeEffect3D()
- {
- // Set up camera
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- // Create a new template.
- EffectData data = EffectData.Get("<SmokeEffect3D>");
- // Add an emitter and modifiers.
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new SpawnIntervalModifier
- {
- SpawnInterval = 0.05f,
- });
- emitter.Modifiers.Add(new ParticleLifetimeModifier
- {
- ParticleLifetime = 7f
- });
- emitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(0f, float.PositiveInfinity),
- });
- Graph alphaGraph = new Graph();
- alphaGraph.Add(0f, 0f);
- alphaGraph.Add(0.2f, 1f);
- alphaGraph.Add(0.8f, 1f);
- alphaGraph.Add(1f, 0f);
- emitter.Modifiers.Add(new FadeModifier
- {
- AdvancedAlphaFade = alphaGraph,
- });
- emitter.Modifiers.Add(new MaterialModifier
- {
- Material = new MaterialColored("SmokeAdditive"),
- BillboardMode = BillboardMode.CameraFacingPrecise
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(10f, 12f),
- HeightRange = new Range(10f, 12f),
- });
- emitter.Modifiers.Add(new RandomVelocityModifier
- {
- MinVelocity = new Vector(-0.1f, -0.3f, 0.4f),
- MaxVelocity = new Vector(0.3f, 0.3f, 0.4f),
- });
- data.Emitters.Add(emitter);
- Effect.Spawn(data, Vector.Zero);
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation.
- Grid.Draw();
- });
- }
- #endregion
-
- #region GroundMistEffect3D (Static)
- /// <summary>
- /// Mist effect 3D
- /// </summary>
- [Test]
- public static void GroundMistEffect3D()
- {
- // Set up camera
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- // Create a new template.
- EffectData data = EffectData.Get("<GroundMistEffect3D>");
- // Add an emitter and modifiers.
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new SpawnIntervalModifier
- {
- SpawnInterval = 0.1f,
- });
- emitter.Modifiers.Add(new ParticleLifetimeModifier
- {
- ParticleLifetime = 5f,
- });
- emitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(0f, float.PositiveInfinity),
- });
- Graph alphaGraph = new Graph();
- alphaGraph.Add(0f, 0f);
- alphaGraph.Add(0.5f, 0.4f);
- alphaGraph.Add(1f, 0f);
- emitter.Modifiers.Add(new FadeModifier
- {
- AdvancedAlphaFade = alphaGraph,
- });
- emitter.Modifiers.Add(new MaterialModifier
- {
- Material = new MaterialColored("SmokeAdditive")
- {
- BlendColor = new Color(1f, 1f, 1f),
- },
- BillboardMode = BillboardMode.Ground,
- });
- emitter.Modifiers.Add(new RandomVelocityModifier
- {
- MinVelocity = new Vector(-0.2f, -0.2f, 0f),
- MaxVelocity = new Vector(0.2f, 0.2f, 0f),
- });
- emitter.Modifiers.Add(new RandomSpawnOffsetModifier
- {
- MinOffset = new Vector(-5f, -5f, -0.1f),
- MaxOffset = new Vector(5f, 5f, 0.1f),
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(20f, 25f),
- HeightRange = new Range(20f, 25f),
- });
- data.Emitters.Add(emitter);
- Effect.Spawn(data, new Vector(0.0f, 0.0f, 0.2f));
-
- MaterialColored planeMat = new MaterialColored(
- "InnerGroundBestHighMediumLowDiffuse");
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a sky and a plane for orientation.
- Sky.Draw();
- BillboardManager.Instance.DrawPlane(planeMat);
- });
- }
- #endregion
-
- #region SwordClashEffect3D (Static)
- /// <summary>
- /// Sword clash effect 3D
- /// </summary>
- [Test]
- public static void SwordClashEffect3D()
- {
- // Set up camera
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- // Create a new template.
- EffectData data = EffectData.Get("<SwordClashEffect3D>");
- // Add an emitter and modifiers.
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new SpawnOnceModifier());
- emitter.Modifiers.Add(new ParticleLifetimeModifier
- {
- ParticleLifetime = 0.1f,
- });
- emitter.Modifiers.Add(new MaterialModifier
- {
- Material = new MaterialColored("WaterSplatterAdditive")
- {
- BlendColor = new Color(0.6f, 0.6f, 0.2f),
- },
- BillboardMode = BillboardMode.CameraFacingPrecise,
- });
- emitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new VectorRange(new Vector(-0.5f, -0.5f, 0f),
- new Vector(0.5f, 0.5f, 0f)),
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(3f, 10f),
- HeightRange = new Range(3f, 10f),
- });
- emitter.Modifiers.Add(new RotationModifier
- {
- Rotation = new Range(0f, 360f),
- });
- data.Emitters.Add(emitter);
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation.
- Grid.Draw();
- if (Input.Keyboard.EnterReleased)
- {
- Effect.Spawn(data, new Vector(0.0f, 0.0f, 0.1f));
- }
- });
- }
- #endregion
-
- #region FireEffect3D (Static)
- /// <summary>
- /// Fire effect 3D
- /// </summary>
- [Test]
- public static void FireEffect3D()
- {
- // Set up camera
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- // Create a new template.
- EffectData data = EffectData.Get("<FireEffect3D>");
-
- // Add emitters and modifiers.
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new SpawnIntervalModifier
- {
- SpawnInterval = 0.05f,
- });
- emitter.Modifiers.Add(new ParticleLifetimeModifier
- {
- ParticleLifetime = 1.2f
- });
- emitter.Modifiers.Add(new TimeRangeModifier
- {
- TimeRange = new Range(0f, float.PositiveInfinity),
- });
- Graph alphaFade = new Graph();
- alphaFade.Add(0f, 0f);
- alphaFade.Add(0.2f, 1f);
- alphaFade.Add(0.8f, 1f);
- alphaFade.Add(1f, 0f);
- emitter.Modifiers.Add(new FadeModifier
- {
- AdvancedAlphaFade = alphaFade,
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(10f, 0.05f),
- HeightRange = new Range(10f, 0.05f),
- });
- emitter.Modifiers.Add(new MaterialModifier
- {
- Material = new MaterialColored("SmokeAdditive")
- {
- BlendColor = new Color(0.6f, 0.3f, 0f),
- },
- BillboardMode = BillboardMode.CameraFacingPrecise,
- });
- emitter.Modifiers.Add(new RandomSpawnOffsetModifier
- {
- MinOffset = new Vector(-0.05f, -0.05f, 0f),
- MaxOffset = new Vector(0.05f, 0.05f, 0f),
- });
- emitter.Modifiers.Add(new RandomVelocityModifier
- {
- MinVelocity = new Vector(-0.1f, -0.1f, 1f),
- MaxVelocity = new Vector(0.1f, 0.1f, 1f),
- });
- data.Emitters.Add(emitter);
-
- Effect.Spawn(data, Vector.Zero);
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation.
- Grid.Draw();
- });
- }
- #endregion
-
- #region BloodSplatterEffect3D (Static)
- /// <summary>
- /// Blood splatter effect 3D
- /// </summary>
- [Test]
- public static void BloodSplatterEffect3D()
- {
- // Set up camera
- LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
-
- // Create a new template.
- EffectData data = EffectData.Get("<BloodSplatterEffect3D>");
- // Add an emitter and modifiers.
- EmitterData emitter = new EmitterData();
- emitter.Modifiers.Add(new SpawnOnceModifier());
- emitter.Modifiers.Add(new ParticleLifetimeModifier
- {
- ParticleLifetime = 0.5f,
- });
- emitter.Modifiers.Add(new MaterialModifier
- {
- Material = new MaterialColored("BloodPoints")
- {
- BlendColor = new Color(0.6f, 0.6f, 0.2f),
- },
- BillboardMode = BillboardMode.CameraFacingPrecise,
- });
- emitter.Modifiers.Add(new VelocityModifier
- {
- Velocity = new VectorRange(new Vector(-0.5f, -0.5f, 0f),
- new Vector(0.5f, 0.5f, 0f)),
- });
- emitter.Modifiers.Add(new SizeModifier
- {
- WidthRange = new Range(3f, 10f),
- HeightRange = new Range(3f, 10f),
- });
- emitter.Modifiers.Add(new RotationModifier
- {
- Rotation = new Range(0f, 180f),
- });
- data.Emitters.Add(emitter);
-
- // Start the application.
- Application.Start(delegate
- {
- // Draw a grid for orientation.
- Grid.Draw();
- if (Input.Keyboard.EnterReleased)
- {
- // Spawn the effect.
- Effect.Spawn(data, new Vector(0.0f, 0.0f, 0.1f));
- }
- });
- }
- #endregion
-
- ///// <summary>
- ///// Lens flare effect 3D, together with a sun
- ///// </summary>
- //public static void LensFlareEffect3D()
- //{
- // // Set up camera
- // LookAtCamera cam = new LookAtCamera(new Vector(-2, -5, -5));
-
- // // Sun position taken from max scene.
- // // Skydome needs to be changed to fit it. Note: Is changed now!
- // Light.Direction = Light.SoulcraftTechDemoLightDirection;
- // Light.Direction.Normalize();
-
- // // Setup Lens Flare effect
- // LensFlareEffect effect = new LensFlareEffect("LensFlareEffect",
- // new Material2DColored("PentagonAdditive"),
- // new Material2DColored("LensflareETransparency"));
- // // Setup Glare effect
- // effect.GlareMaterial = new Material2DColored("SunBlendAdditive");
- // // And activate it
- // effect.Activate();
-
- // Application.Start(delegate
- // {
- // Sky.Draw();
- // Grid.Draw();
-
- // // Calculate positions for debug (same math as in LensFlareEffect)
- // Vector sunPosition =
- // Light.GetLightPosition(ScreenSpace.ViewInverse.Translation, 50.0f);
- // Vector sunScreenPosition = ScreenSpace.Project(sunPosition);
- // Font infoFont = Font.Default;
- // float yPos = ScreenSpace.Area.Top + infoFont.LineHeight;
- // infoFont.Write(new Point(0.5f, yPos),
- // "SunScreenPosition= " + sunScreenPosition);
- // });
- //}
- }
- }