lensFlareSystemSceneComponent.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import { Tools } from "../Misc/tools";
  2. import { Nullable } from "../types";
  3. import { Camera } from "../Cameras/camera";
  4. import { Scene } from "../scene";
  5. import { SceneComponentConstants, ISceneSerializableComponent } from "../sceneComponent";
  6. import { AbstractScene } from "../abstractScene";
  7. import { AssetContainer } from "../assetContainer";
  8. import { LensFlareSystem } from "./lensFlareSystem";
  9. // Adds the parser to the scene parsers.
  10. AbstractScene.AddParser(SceneComponentConstants.NAME_LENSFLARESYSTEM, (parsedData: any, scene: Scene, container: AssetContainer, rootUrl: string) => {
  11. // Lens flares
  12. if (parsedData.lensFlareSystems !== undefined && parsedData.lensFlareSystems !== null) {
  13. if (!container.lensFlareSystems) {
  14. container.lensFlareSystems = new Array<LensFlareSystem>();
  15. }
  16. for (let index = 0, cache = parsedData.lensFlareSystems.length; index < cache; index++) {
  17. var parsedLensFlareSystem = parsedData.lensFlareSystems[index];
  18. var lf = LensFlareSystem.Parse(parsedLensFlareSystem, scene, rootUrl);
  19. container.lensFlareSystems.push(lf);
  20. }
  21. }
  22. });
  23. declare module "../abstractScene" {
  24. export interface AbstractScene {
  25. /**
  26. * The list of lens flare system added to the scene
  27. * @see https://doc.babylonjs.com/how_to/how_to_use_lens_flares
  28. */
  29. lensFlareSystems: Array<LensFlareSystem>;
  30. /**
  31. * Removes the given lens flare system from this scene.
  32. * @param toRemove The lens flare system to remove
  33. * @returns The index of the removed lens flare system
  34. */
  35. removeLensFlareSystem(toRemove: LensFlareSystem): number;
  36. /**
  37. * Adds the given lens flare system to this scene
  38. * @param newLensFlareSystem The lens flare system to add
  39. */
  40. addLensFlareSystem(newLensFlareSystem: LensFlareSystem): void;
  41. /**
  42. * Gets a lens flare system using its name
  43. * @param name defines the name to look for
  44. * @returns the lens flare system or null if not found
  45. */
  46. getLensFlareSystemByName(name: string): Nullable<LensFlareSystem>;
  47. /**
  48. * Gets a lens flare system using its id
  49. * @param id defines the id to look for
  50. * @returns the lens flare system or null if not found
  51. */
  52. getLensFlareSystemByID(id: string): Nullable<LensFlareSystem>;
  53. }
  54. }
  55. AbstractScene.prototype.getLensFlareSystemByName = function(name: string): Nullable<LensFlareSystem> {
  56. for (var index = 0; index < this.lensFlareSystems.length; index++) {
  57. if (this.lensFlareSystems[index].name === name) {
  58. return this.lensFlareSystems[index];
  59. }
  60. }
  61. return null;
  62. };
  63. AbstractScene.prototype.getLensFlareSystemByID = function(id: string): Nullable<LensFlareSystem> {
  64. for (var index = 0; index < this.lensFlareSystems.length; index++) {
  65. if (this.lensFlareSystems[index].id === id) {
  66. return this.lensFlareSystems[index];
  67. }
  68. }
  69. return null;
  70. };
  71. AbstractScene.prototype.removeLensFlareSystem = function(toRemove: LensFlareSystem): number {
  72. var index = this.lensFlareSystems.indexOf(toRemove);
  73. if (index !== -1) {
  74. this.lensFlareSystems.splice(index, 1);
  75. }
  76. return index;
  77. };
  78. AbstractScene.prototype.addLensFlareSystem = function(newLensFlareSystem: LensFlareSystem): void {
  79. this.lensFlareSystems.push(newLensFlareSystem);
  80. };
  81. /**
  82. * Defines the lens flare scene component responsible to manage any lens flares
  83. * in a given scene.
  84. */
  85. export class LensFlareSystemSceneComponent implements ISceneSerializableComponent {
  86. /**
  87. * The component name helpfull to identify the component in the list of scene components.
  88. */
  89. public readonly name = SceneComponentConstants.NAME_LENSFLARESYSTEM;
  90. /**
  91. * The scene the component belongs to.
  92. */
  93. public scene: Scene;
  94. /**
  95. * Creates a new instance of the component for the given scene
  96. * @param scene Defines the scene to register the component in
  97. */
  98. constructor(scene: Scene) {
  99. this.scene = scene;
  100. scene.lensFlareSystems = new Array<LensFlareSystem>();
  101. }
  102. /**
  103. * Registers the component in a given scene
  104. */
  105. public register(): void {
  106. this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_LENSFLARESYSTEM, this, this._draw);
  107. }
  108. /**
  109. * Rebuilds the elements related to this component in case of
  110. * context lost for instance.
  111. */
  112. public rebuild(): void {
  113. // Nothing to do for lens flare
  114. }
  115. /**
  116. * Adds all the elements from the container to the scene
  117. * @param container the container holding the elements
  118. */
  119. public addFromContainer(container: AbstractScene): void {
  120. if (!container.lensFlareSystems) {
  121. return;
  122. }
  123. container.lensFlareSystems.forEach((o) => {
  124. this.scene.addLensFlareSystem(o);
  125. });
  126. }
  127. /**
  128. * Removes all the elements in the container from the scene
  129. * @param container contains the elements to remove
  130. * @param dispose if the removed element should be disposed (default: false)
  131. */
  132. public removeFromContainer(container: AbstractScene, dispose?: boolean): void {
  133. if (!container.lensFlareSystems) {
  134. return;
  135. }
  136. container.lensFlareSystems.forEach((o) => {
  137. this.scene.removeLensFlareSystem(o);
  138. if (dispose) {
  139. o.dispose();
  140. }
  141. });
  142. }
  143. /**
  144. * Serializes the component data to the specified json object
  145. * @param serializationObject The object to serialize to
  146. */
  147. public serialize(serializationObject: any): void {
  148. // Lens flares
  149. serializationObject.lensFlareSystems = [];
  150. let lensFlareSystems = this.scene.lensFlareSystems;
  151. for (let lensFlareSystem of lensFlareSystems) {
  152. serializationObject.lensFlareSystems.push(lensFlareSystem.serialize());
  153. }
  154. }
  155. /**
  156. * Disposes the component and the associated ressources.
  157. */
  158. public dispose(): void {
  159. let lensFlareSystems = this.scene.lensFlareSystems;
  160. while (lensFlareSystems.length) {
  161. lensFlareSystems[0].dispose();
  162. }
  163. }
  164. private _draw(camera: Camera): void {
  165. // Lens flares
  166. if (this.scene.lensFlaresEnabled) {
  167. let lensFlareSystems = this.scene.lensFlareSystems;
  168. Tools.StartPerformanceCounter("Lens flares", lensFlareSystems.length > 0);
  169. for (let lensFlareSystem of lensFlareSystems) {
  170. if ((camera.layerMask & lensFlareSystem.layerMask) !== 0) {
  171. lensFlareSystem.render();
  172. }
  173. }
  174. Tools.EndPerformanceCounter("Lens flares", lensFlareSystems.length > 0);
  175. }
  176. }
  177. }
  178. LensFlareSystem._SceneComponentInitialization = (scene: Scene) => {
  179. let component = scene._getComponent(SceneComponentConstants.NAME_LENSFLARESYSTEM) as LensFlareSystemSceneComponent;
  180. if (!component) {
  181. component = new LensFlareSystemSceneComponent(scene);
  182. scene._addComponent(component);
  183. }
  184. };