PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/Rendering/EffectTests/Tutorials.cs

#
C# | 393 lines | 294 code | 22 blank | 77 comment | 5 complexity | 390d9adb9d97347ecde29360b2629280 MD5 | raw file
Possible License(s): Apache-2.0
  1. using Delta.ContentSystem.Rendering;
  2. using Delta.ContentSystem.Rendering.Helpers;
  3. using Delta.Engine;
  4. using Delta.Engine.Game;
  5. using Delta.InputSystem;
  6. using Delta.Rendering.Basics.Drawing;
  7. using Delta.Rendering.Basics.Fonts;
  8. using Delta.Rendering.Basics.Materials;
  9. using Delta.Rendering.Cameras;
  10. using Delta.Rendering.Effects;
  11. using Delta.Rendering.Effects.Modifiers;
  12. using Delta.Rendering.Enums;
  13. using Delta.Utilities.Datatypes;
  14. using Delta.Utilities.Helpers;
  15. using Delta.Utilities.Math;
  16. using NUnit.Framework;
  17. namespace Delta.Rendering.EffectTests
  18. {
  19. /// <summary>
  20. /// Effect tutorials.
  21. /// </summary>
  22. public class Tutorials
  23. {
  24. #region FireEffect (Static)
  25. /// <summary>
  26. /// Tutorial: Particle Effect Tutorial 1: Fire Effect
  27. /// Difficulty: Medium
  28. /// Description: Draw a simple fire effect.
  29. /// Image: http://DeltaEngine.net/Icons/EffectTutorial1.png
  30. /// </summary>
  31. [Test, Category("Visual")]
  32. public static void FireEffect()
  33. {
  34. // Create a new template.
  35. EffectData data = EffectData.Get("<FireEffect>");
  36. // Add emitters and modifiers.
  37. EmitterData emitter = new EmitterData();
  38. emitter.Modifiers.Add(new SpawnIntervalModifier
  39. {
  40. SpawnInterval = 0.05f,
  41. });
  42. emitter.Modifiers.Add(new ParticleLifetimeModifier
  43. {
  44. ParticleLifetime = 3f
  45. });
  46. emitter.Modifiers.Add(new TimeRangeModifier
  47. {
  48. TimeRange = new Range(0f, float.PositiveInfinity),
  49. });
  50. Graph alphaFade = new Graph();
  51. alphaFade.Add(0f, 0f);
  52. alphaFade.Add(0.1f, 1f);
  53. alphaFade.Add(1f, 0f);
  54. emitter.Modifiers.Add(new FadeModifier
  55. {
  56. AdvancedAlphaFade = alphaFade,
  57. });
  58. emitter.Modifiers.Add(new SizeModifier
  59. {
  60. WidthRange = new Range(1f, 0.05f),
  61. HeightRange = new Range(1f, 0.05f),
  62. });
  63. emitter.Modifiers.Add(new MaterialModifier
  64. {
  65. Material = new Material2DColored(
  66. "FlamesAdditive"),
  67. //"SmokeAdditive")
  68. //{
  69. //BlendColor = new Color(1f, 0.5f, 0f),
  70. //},
  71. });
  72. emitter.Modifiers.Add(new RandomSpawnOffsetModifier
  73. {
  74. MinOffset = new Vector(-0.02f, 0f, 0f),
  75. MaxOffset = new Vector(0.02f, 0f, 0f),
  76. });
  77. emitter.Modifiers.Add(new RandomVelocityModifier
  78. {
  79. MinVelocity = new Vector(-0.01f, -0.08f, 0f),
  80. MaxVelocity = new Vector(0.01f, -0.1f, 0f),
  81. });
  82. data.Emitters.Add(emitter);
  83. //Effect.Spawn(data, new Vector(0.5f, 0.5f, 0f));
  84. // Always follow the mouse :)
  85. Effect.Spawn(data, new MouseTracker());
  86. Application.Start();
  87. }
  88. #endregion
  89. #region SmokeEffect (Static)
  90. /// <summary>
  91. /// Tutorial: Particle Effect Tutorial 2: Smoke Effect
  92. /// Difficulty: Medium
  93. /// Description: Draw a simple smoke effect.
  94. /// Image: http://DeltaEngine.net/Icons/EffectTutorial2.png
  95. /// </summary>
  96. [Test, Category("Visual")]
  97. public static void SmokeEffect()
  98. {
  99. // Create a new template.
  100. EffectData data = EffectData.Get("<SmokeEffect>");
  101. // Add an emitter and modifiers.
  102. EmitterData emitter = new EmitterData();
  103. emitter.Modifiers.Add(new SpawnIntervalModifier
  104. {
  105. SpawnInterval = 0.05f,
  106. });
  107. emitter.Modifiers.Add(new ParticleLifetimeModifier
  108. {
  109. ParticleLifetime = 2f
  110. });
  111. emitter.Modifiers.Add(new TimeRangeModifier
  112. {
  113. TimeRange = new Range(0f, float.PositiveInfinity),
  114. });
  115. emitter.Modifiers.Add(new FadeModifier
  116. {
  117. // Create simple graph for fading in and out!
  118. AdvancedAlphaFade =
  119. new Graph().Add(0, 0).Add(0.25f, 1.0f).Add(1.0f, 0.0f),
  120. });
  121. emitter.Modifiers.Add(new MaterialModifier
  122. {
  123. Material = new Material2DColored(
  124. //"SmokeBrightTransparency"),
  125. "Smoke"),
  126. //"SmokeAdditive"),
  127. //"SmokeSmallAdditive"),
  128. });
  129. emitter.Modifiers.Add(new RandomVelocityModifier
  130. {
  131. MinVelocity = new Vector(-0.05f, -0.1f, 0f),
  132. MaxVelocity = new Vector(0.05f, -0.1f, 0f),
  133. });
  134. emitter.Modifiers.Add(new RandomRotationModifier
  135. {
  136. RotationRange = new Range(0, 360),
  137. });
  138. data.Emitters.Add(emitter);
  139. //Effect.Spawn(data, new Vector(0.5f, 0.5f, 0f));
  140. // Always follow the mouse :)
  141. Effect.Spawn(data, new MouseTracker());
  142. Application.Start();
  143. }
  144. #endregion
  145. #region RocketEffect (Static)
  146. /// <summary>
  147. /// Tutorial: Particle Effect Tutorial 3: Rocket Effect
  148. /// Difficulty: Medium
  149. /// Description: Draw a simple rocket effect.
  150. /// Image: http://DeltaEngine.net/Icons/EffectTutorial3.png
  151. /// </summary>
  152. [Test, Category("Visual")]
  153. public static void RocketEffect()
  154. {
  155. // Create a new template.
  156. EffectData data = EffectData.Get("<RocketEffect>");
  157. // Add an emitter and modifiers.
  158. EmitterData emitter = new EmitterData();
  159. emitter.Modifiers.Add(new SpawnIntervalModifier
  160. {
  161. SpawnInterval = 0.05f,
  162. });
  163. emitter.Modifiers.Add(new ParticleLifetimeModifier
  164. {
  165. ParticleLifetime = 4f
  166. });
  167. emitter.Modifiers.Add(new TimeRangeModifier
  168. {
  169. TimeRange = new Range(0f, float.PositiveInfinity),
  170. });
  171. Graph alphaFade = new Graph();
  172. alphaFade.Add(0f, 0f);
  173. alphaFade.Add(0.1f, 1f);
  174. alphaFade.Add(1f, 0f);
  175. emitter.Modifiers.Add(new FadeModifier
  176. {
  177. AdvancedAlphaFade = alphaFade,
  178. });
  179. emitter.Modifiers.Add(new SizeModifier
  180. {
  181. HeightRange = new Range(1f, 0f),
  182. WidthRange = new Range(1f, 0f),
  183. });
  184. emitter.Modifiers.Add(new MaterialModifier
  185. {
  186. Material = new Material2DColored("GlowLightEffect"),
  187. });
  188. emitter.Modifiers.Add(new RandomSpawnOffsetModifier
  189. {
  190. MinOffset = new Vector(0f, -0.01f, 0f),
  191. MaxOffset = new Vector(0f, 0.01f, 0f),
  192. });
  193. emitter.Modifiers.Add(new RandomVelocityModifier
  194. {
  195. MinVelocity = new Vector(0.05f, 0f, 0f),
  196. MaxVelocity = new Vector(0.05f, 0f, 0f),
  197. });
  198. data.Emitters.Add(emitter);
  199. Effect.Spawn(data, new Vector(0.5f, 0.5f, 0f));
  200. Application.Start();
  201. }
  202. #endregion
  203. #region SparksEffect (Static)
  204. /// <summary>
  205. /// Tutorial: Particle Effect Tutorial 4: Sparks Effect
  206. /// Difficulty: Medium
  207. /// Description: Draw a simple sparks effect.
  208. /// Image: http://DeltaEngine.net/Icons/EffectTutorial4.png
  209. /// </summary>
  210. [Test, Category("Visual")]
  211. public static void SparksEffect()
  212. {
  213. // Create a new template.
  214. EffectData data = EffectData.Get("<SparksEffect>");
  215. // Add an emitter and modifiers.
  216. EmitterData emitter = new EmitterData();
  217. emitter.Modifiers.Add(new SpawnIntervalModifier
  218. {
  219. SpawnInterval = 0.1f, //1.5f,
  220. });
  221. emitter.Modifiers.Add(new ParticleLifetimeModifier
  222. {
  223. ParticleLifetime = 1.0f, //0.4f
  224. });
  225. emitter.Modifiers.Add(new TimeRangeModifier
  226. {
  227. TimeRange = new Range(0f, float.PositiveInfinity),
  228. });
  229. emitter.Modifiers.Add(new RotationModifier
  230. {
  231. Rotation = new Range(-90f, 90f),
  232. });
  233. emitter.Modifiers.Add(new SizeModifier
  234. {
  235. HeightRange = new Range(0.25f, 2.0f),
  236. WidthRange = new Range(0.25f, 2.0f),
  237. });
  238. emitter.Modifiers.Add(new FadeModifier
  239. {
  240. AlphaFade = new Range(1.0f, 0.0f),
  241. });
  242. emitter.Modifiers.Add(new MaterialModifier
  243. {
  244. Material = new Material2DColored("BreakoutEffect"),
  245. });
  246. emitter.Modifiers.Add(new RandomSpawnOffsetModifier
  247. {
  248. MinOffset = new Vector(-0.025f, -0.025f, 0f),
  249. MaxOffset = new Vector(0.025f, 0.025f, 0f),
  250. });
  251. emitter.Modifiers.Add(new RandomVelocityModifier
  252. {
  253. MinVelocity = new Vector(-0.15f, -0.15f, 0f),
  254. MaxVelocity = new Vector(0.15f, 0.15f, 0f),
  255. });
  256. data.Emitters.Add(emitter);
  257. // Always follow the mouse :)
  258. Effect.Spawn(data, new MouseTracker());
  259. Application.Start();
  260. }
  261. #endregion
  262. #region LensFlareEffect (Static)
  263. /// <summary>
  264. /// Tutorial: Particle Effect Tutorial 5: Lens-Flare Effect
  265. /// Difficulty: Medium
  266. /// Description: Draw a simple lens flare effect.
  267. /// Image: http://DeltaEngine.net/Icons/EffectTutorial5.png
  268. /// </summary>
  269. [Test, Category("Visual")]
  270. public static void LensFlareEffect()
  271. {
  272. // Create a new template.
  273. EffectData data = EffectData.Get("<LensFlareEffect>");
  274. // Add an emitter and modifiers.
  275. EmitterData emitter = new EmitterData();
  276. emitter.Modifiers.Add(new SpawnOnceModifier());
  277. emitter.Modifiers.Add(new ParticleLifetimeModifier
  278. {
  279. // only show the particle the first tick. The next tick a new one
  280. // will be spawned.
  281. ParticleLifetime = 0f,
  282. });
  283. emitter.Modifiers.Add(new MaterialModifier
  284. {
  285. Material = new Material2DColored("LensflareDTransparency"),
  286. });
  287. data.Emitters.Add(emitter);
  288. Application.Start(delegate
  289. {
  290. Circle.DrawFilled(Input.Mouse.Position, 0.05f, Color.Yellow);
  291. Vector mousePos = new Vector(Input.Mouse.Position, 0f);
  292. Vector center = new Vector(0.5f, 0.5f, 0f);
  293. Vector dir = mousePos - center;
  294. float distanceHalf = dir.Length * 0.5f;
  295. dir.Normalize();
  296. Effect.Spawn(data, center + (dir * distanceHalf));
  297. });
  298. }
  299. #endregion
  300. #region BillboardTest (Static)
  301. /// <summary>
  302. /// Tutorial: Particle Effect Tutorial 6: Billboard Test
  303. /// Difficulty: Medium
  304. /// Description: Test all the billboard modes.
  305. /// Image: http://DeltaEngine.net/Icons/EffectTutorial6.png
  306. /// </summary>
  307. [Test, Category("Visual")]
  308. public static void BillboardTest()
  309. {
  310. // Create a default camera.
  311. LookAtCamera cam = new LookAtCamera(new Vector(1, -5, 3));
  312. BillboardMode currentMode = BillboardMode.CameraFacing;
  313. // Create the new effect template with the first billboard mode.
  314. EffectData data = EffectData.Get("<BillboardModeTest>");
  315. // Add an emitter and modifiers.
  316. EmitterData emitter = new EmitterData();
  317. emitter.Modifiers.Add(new AlwaysSpawnModifier());
  318. emitter.Modifiers.Add(new SizeModifier
  319. {
  320. HeightRange = new Range(10),
  321. WidthRange = new Range(15),
  322. });
  323. MaterialModifier materialModifier = new MaterialModifier
  324. {
  325. Material = new MaterialColored("DeltaEngineLogo")
  326. {
  327. DrawLayer = RenderLayer.Normal,
  328. BlendColor = Color.White,
  329. },
  330. BillboardMode = BillboardMode.CameraFacingPrecise,
  331. };
  332. materialModifier.BillboardMode = currentMode;
  333. emitter.Modifiers.Add(materialModifier);
  334. data.Emitters.Add(emitter);
  335. int effectId = Effect.Spawn(data, Vector.Zero);
  336. // Start the application.
  337. Application.Start(delegate
  338. {
  339. // Draw a grid for orientation.
  340. Grid.Draw();
  341. // Show which mode we're currently using.
  342. Font.Default.Draw("currentMode=" + currentMode,
  343. new Rectangle(0.0f, ScreenSpace.DrawArea.Top, 1.0f,
  344. Font.Default.LineHeight));
  345. // Every time we hit enter or release a touch we want to go to the
  346. // next billboard mode for easy debugging of all modes.
  347. if (Input.Keyboard.EnterReleased ||
  348. Input.Touch.TouchReleased)
  349. {
  350. // Go to the next mode
  351. currentMode = (BillboardMode)currentMode.Next();
  352. // Skip the only2D mode cause this is working in all the 2d tests
  353. // anyways.
  354. if (currentMode == BillboardMode.Only2D)
  355. {
  356. currentMode = (BillboardMode)currentMode.Next();
  357. }
  358. // Kill the previous effect if it exists.
  359. if (effectId != MathHelper.InvalidIndex)
  360. {
  361. Effect.Kill(effectId);
  362. }
  363. // Set the current mode and then spawn the new effect.
  364. materialModifier.BillboardMode = currentMode;
  365. effectId = Effect.Spawn(data, Vector.Zero);
  366. }
  367. });
  368. }
  369. #endregion
  370. }
  371. }