babylon.particleHelper.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. module BABYLON {
  2. export enum ParticleSystemType { None, Fire, Smoke }
  3. export class ParticleHelper {
  4. /**
  5. * Base Assets URL.
  6. */
  7. private static _baseAssetsUrl = "https://assets.babylonjs.com/particles/";
  8. private static _scene: Scene;
  9. private static _emitter: AbstractMesh;
  10. public static create(type: string, emitter: AbstractMesh, scene: Nullable<Scene> = Engine.LastCreatedScene, gpu: boolean = false): ParticleSystem {
  11. const typeParsed = this._parseType(type);
  12. if (typeParsed === ParticleSystemType.None) {
  13. throw new Error("This particle system type doesn't exist.");
  14. }
  15. if (scene) {
  16. this._scene = scene;
  17. } else {
  18. throw new Error("A particle system need a scene.");
  19. }
  20. this._emitter = emitter;
  21. switch (typeParsed) {
  22. case ParticleSystemType.Fire:
  23. return this._createFire();
  24. case ParticleSystemType.Smoke:
  25. return this._createSmoke();
  26. default:
  27. throw new Error("Not yet implemented.");
  28. }
  29. }
  30. private static _parseType(type: string): ParticleSystemType {
  31. switch (type) {
  32. case "fire":
  33. case "Fire":
  34. case "FIRE":
  35. return ParticleSystemType.Fire;
  36. case "smoke":
  37. case "Smoke":
  38. case "SMOKE":
  39. return ParticleSystemType.Smoke;
  40. default:
  41. return ParticleSystemType.None;
  42. }
  43. }
  44. private static _createFire(): ParticleSystem {
  45. // Create a particle system
  46. const fireSystem = new ParticleSystem("particles", 2000, this._scene);
  47. // Texture of each particle
  48. fireSystem.particleTexture = new Texture(`${this._baseAssetsUrl}textures/flare.png`, this._scene);
  49. // Where the particles come from
  50. fireSystem.emitter = this._emitter; // the starting object, the emitter
  51. fireSystem.minEmitBox = new Vector3(-0.5, 1, -0.5); // Starting all from
  52. fireSystem.maxEmitBox = new Vector3(0.5, 1, 0.5); // To...
  53. // Colors of all particles
  54. fireSystem.color1 = new Color4(1, 0.5, 0, 1.0);
  55. fireSystem.color2 = new Color4(1, 0.5, 0, 1.0);
  56. fireSystem.colorDead = new Color4(0, 0, 0, 0.0);
  57. // Size of each particle (random between...
  58. fireSystem.minSize = 0.3;
  59. fireSystem.maxSize = 1;
  60. // Life time of each particle (random between...
  61. fireSystem.minLifeTime = 0.2;
  62. fireSystem.maxLifeTime = 0.4;
  63. // Emission rate
  64. fireSystem.emitRate = 600;
  65. // Blend mode : BLENDMODE_ONEONE, or BLENDMODE_STANDARD
  66. fireSystem.blendMode = ParticleSystem.BLENDMODE_ONEONE;
  67. // Set the gravity of all particles
  68. fireSystem.gravity = new Vector3(0, 0, 0);
  69. // Direction of each particle after it has been emitted
  70. fireSystem.direction1 = new Vector3(0, 4, 0);
  71. fireSystem.direction2 = new Vector3(0, 4, 0);
  72. // Angular speed, in radians
  73. fireSystem.minAngularSpeed = 0;
  74. fireSystem.maxAngularSpeed = Math.PI;
  75. // Speed
  76. fireSystem.minEmitPower = 1;
  77. fireSystem.maxEmitPower = 3;
  78. fireSystem.updateSpeed = 0.007;
  79. return fireSystem;
  80. }
  81. private static _createSmoke(): ParticleSystem {
  82. const smokeSystem = new ParticleSystem("smoke", 1000, this._scene);
  83. smokeSystem.particleTexture = new Texture(`${this._baseAssetsUrl}textures/flare.png`, this._scene);
  84. smokeSystem.emitter = this._emitter;
  85. smokeSystem.minEmitBox = new Vector3(-0.5, 1, -0.5);
  86. smokeSystem.maxEmitBox = new Vector3(0.5, 1, 0.5);
  87. smokeSystem.color1 = new Color4(0.1, 0.1, 0.1, 1.0);
  88. smokeSystem.color2 = new Color4(0.1, 0.1, 0.1, 1.0);
  89. smokeSystem.colorDead = new Color4(0, 0, 0, 0.0);
  90. smokeSystem.minSize = 0.3;
  91. smokeSystem.maxSize = 1;
  92. smokeSystem.minLifeTime = 0.3;
  93. smokeSystem.maxLifeTime = 1.5;
  94. smokeSystem.emitRate = 350;
  95. smokeSystem.blendMode = ParticleSystem.BLENDMODE_ONEONE;
  96. smokeSystem.gravity = new Vector3(0, 0, 0);
  97. smokeSystem.direction1 = new Vector3(-1.5, 8, -1.5);
  98. smokeSystem.direction2 = new Vector3(1.5, 8, 1.5);
  99. smokeSystem.minAngularSpeed = 0;
  100. smokeSystem.maxAngularSpeed = Math.PI;
  101. smokeSystem.minEmitPower = 0.5;
  102. smokeSystem.maxEmitPower = 1.5;
  103. smokeSystem.updateSpeed = 0.005;
  104. return smokeSystem;
  105. }
  106. }
  107. }