babylon.particleHelper.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. module BABYLON {
  2. /**
  3. * Represents all the data needed to create a ParticleSystem.
  4. */
  5. export interface IParticleSystemData {
  6. type: ParticleSystemType;
  7. capacity: number;
  8. textureFile: string;
  9. minEmitBox: { x: number, y: number, z: number };
  10. maxEmitBox: { x: number, y: number, z: number };
  11. color1: { r: number, g: number, b: number, a: number };
  12. color2: { r: number, g: number, b: number, a: number };
  13. colorDead: { r: number, g: number, b: number, a: number };
  14. minSize: number;
  15. maxSize: number;
  16. minLifeTime: number;
  17. maxLifeTime: number;
  18. emitRate: number;
  19. blendMode: number;
  20. gravity: { x: number, y: number, z: number };
  21. direction1: { x: number, y: number, z: number };
  22. direction2: { x: number, y: number, z: number };
  23. minAngularSpeed: number;
  24. maxAngularSpeed: number;
  25. minEmitPower: number;
  26. maxEmitPower: number;
  27. updateSpeed: number;
  28. }
  29. /**
  30. * ParticleSystemType
  31. */
  32. export enum ParticleSystemType {
  33. /**
  34. * None is to represents an error in parsing the type string in the create method.
  35. */
  36. None = "none",
  37. /**
  38. * Fire particle system.
  39. */
  40. Fire = "fire",
  41. /**
  42. * Smoke particle system.
  43. */
  44. Smoke = "smoke"
  45. }
  46. /**
  47. * This class is made for on one-liner static method to help creating particle systems.
  48. */
  49. export class ParticleHelper {
  50. /**
  51. * Base Assets URL.
  52. */
  53. private static _baseAssetsUrl = "https://assets.babylonjs.com/particles";
  54. private static _scene: Scene;
  55. private static _emitter: AbstractMesh;
  56. /**
  57. * This is the main static method (one-liner) of this helper to create different particle systems.
  58. * @param type This string will be parsed to a ParticleSystemType
  59. * @param emitter The object where the particle system will start to emit from.
  60. * @param scene The scene where the particle system should live.
  61. * @param gpu If the system will use gpu.
  62. * @returns the ParticleSystem created.
  63. */
  64. public static Create(type: string, emitter: AbstractMesh,
  65. scene: Nullable<Scene> = Engine.LastCreatedScene, gpu: boolean = false): Promise<ParticleSystem> {
  66. return new Promise((resolve, reject) => {
  67. const typeParsed = this._parseType(type);
  68. if (typeParsed === ParticleSystemType.None) {
  69. throw new Error("This particle system type doesn't exist.");
  70. }
  71. if (scene) {
  72. this._scene = scene;
  73. } else {
  74. throw new Error("A particle system need a scene.");
  75. }
  76. this._emitter = emitter;
  77. Tools.LoadFile(`${this._baseAssetsUrl}/systems/${typeParsed}.json`, (data, response) => {
  78. const newData = JSON.parse(data.toString()) as IParticleSystemData;
  79. return resolve(this._createSystem(newData));
  80. });
  81. });
  82. }
  83. private static _parseType(type: string): ParticleSystemType {
  84. switch (type) {
  85. case "fire":
  86. case "Fire":
  87. case "FIRE":
  88. return ParticleSystemType.Fire;
  89. case "smoke":
  90. case "Smoke":
  91. case "SMOKE":
  92. return ParticleSystemType.Smoke;
  93. default:
  94. return ParticleSystemType.None;
  95. }
  96. }
  97. private static _createSystem(data: IParticleSystemData): ParticleSystem {
  98. // Create a particle system
  99. const fireSystem = new ParticleSystem(data.type, data.capacity, this._scene);
  100. // Texture of each particle
  101. fireSystem.particleTexture = new Texture(`${this._baseAssetsUrl}/textures/${data.textureFile}`, this._scene);
  102. // Where the particles come from
  103. fireSystem.emitter = this._emitter; // the starting object, the emitter
  104. fireSystem.minEmitBox = new Vector3(data.minEmitBox.x, data.minEmitBox.y, data.minEmitBox.z); // Starting all from
  105. fireSystem.maxEmitBox = new Vector3(data.maxEmitBox.x, data.maxEmitBox.y, data.maxEmitBox.z); // To...
  106. // Colors of all particles
  107. fireSystem.color1 = new Color4(data.color1.r, data.color1.g, data.color1.b, data.color1.a);
  108. fireSystem.color2 = new Color4(data.color2.r, data.color2.g, data.color2.b, data.color2.a);
  109. fireSystem.colorDead = new Color4(data.colorDead.r, data.colorDead.g, data.colorDead.b, data.colorDead.a);
  110. // Size of each particle (random between...
  111. fireSystem.minSize = data.minSize;
  112. fireSystem.maxSize = data.maxSize;
  113. // Life time of each particle (random between...
  114. fireSystem.minLifeTime = data.minLifeTime;
  115. fireSystem.maxLifeTime = data.maxLifeTime;
  116. // Emission rate
  117. fireSystem.emitRate = data.emitRate;
  118. // Blend mode : BLENDMODE_ONEONE, or BLENDMODE_STANDARD
  119. fireSystem.blendMode = data.blendMode;
  120. // Set the gravity of all particles
  121. fireSystem.gravity = new Vector3(data.gravity.x, data.gravity.y, data.gravity.z);
  122. // Direction of each particle after it has been emitted
  123. fireSystem.direction1 = new Vector3(data.direction1.x, data.direction1.y, data.direction1.z);
  124. fireSystem.direction2 = new Vector3(data.direction2.x, data.direction2.y, data.direction2.z);
  125. // Angular speed, in radians
  126. fireSystem.minAngularSpeed = data.minAngularSpeed;
  127. fireSystem.maxAngularSpeed = data.maxAngularSpeed;
  128. // Speed
  129. fireSystem.minEmitPower = data.minEmitPower;
  130. fireSystem.maxEmitPower = data.maxEmitPower;
  131. fireSystem.updateSpeed = data.updateSpeed;
  132. return fireSystem;
  133. }
  134. }
  135. }