lensFlareSystemSceneComponent.ts 7.8 KB

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