babylon.postProcessRenderPipeline.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. module BABYLON {
  2. export class PostProcessRenderPipeline {
  3. private _engine: Engine;
  4. private _renderEffects: {[key: string]: PostProcessRenderEffect};
  5. private _renderEffectsForIsolatedPass: PostProcessRenderEffect[];
  6. protected _cameras: Camera[];
  7. // private
  8. @serialize()
  9. public _name: string;
  10. private static PASS_EFFECT_NAME: string = "passEffect";
  11. private static PASS_SAMPLER_NAME: string = "passSampler";
  12. constructor(engine: Engine, name: string) {
  13. this._engine = engine;
  14. this._name = name;
  15. this._renderEffects = {};
  16. this._renderEffectsForIsolatedPass = new Array<PostProcessRenderEffect>();
  17. this._cameras = [];
  18. }
  19. public getClassName(): string {
  20. return "PostProcessRenderPipeline";
  21. }
  22. public get isSupported(): boolean {
  23. for (var renderEffectName in this._renderEffects) {
  24. if (this._renderEffects.hasOwnProperty(renderEffectName)) {
  25. if (!this._renderEffects[renderEffectName].isSupported) {
  26. return false;
  27. }
  28. }
  29. }
  30. return true;
  31. }
  32. public addEffect(renderEffect: PostProcessRenderEffect): void {
  33. (<any>this._renderEffects)[renderEffect._name] = renderEffect;
  34. }
  35. // private
  36. public _rebuild() {
  37. }
  38. public _enableEffect(renderEffectName: string, cameras: Camera): void;
  39. public _enableEffect(renderEffectName: string, cameras: Camera[]): void;
  40. public _enableEffect(renderEffectName: string, cameras: any): void {
  41. var renderEffects: PostProcessRenderEffect = (<any>this._renderEffects)[renderEffectName];
  42. if (!renderEffects) {
  43. return;
  44. }
  45. renderEffects._enable(Tools.MakeArray(cameras || this._cameras));
  46. }
  47. public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void;
  48. public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void;
  49. public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void {
  50. var renderEffects: PostProcessRenderEffect = (<any>this._renderEffects)[renderEffectName];
  51. if (!renderEffects) {
  52. return;
  53. }
  54. renderEffects._disable(Tools.MakeArray(cameras || this._cameras));
  55. }
  56. public _attachCameras(cameras: Camera, unique: boolean): void;
  57. public _attachCameras(cameras: Camera[], unique: boolean): void;
  58. public _attachCameras(cameras: any, unique: boolean): void {
  59. var cams = Tools.MakeArray(cameras || this._cameras);
  60. if (!cams) {
  61. return;
  62. }
  63. var indicesToDelete = [];
  64. var i: number;
  65. for (i = 0; i < cams.length; i++) {
  66. var camera = cams[i];
  67. var cameraName = camera.name;
  68. if (this._cameras.indexOf(camera) === -1) {
  69. this._cameras[cameraName] = camera;
  70. }
  71. else if (unique) {
  72. indicesToDelete.push(i);
  73. }
  74. }
  75. for (i = 0; i < indicesToDelete.length; i++) {
  76. cameras.splice(indicesToDelete[i], 1);
  77. }
  78. for (var renderEffectName in this._renderEffects) {
  79. if (this._renderEffects.hasOwnProperty(renderEffectName)) {
  80. this._renderEffects[renderEffectName]._attachCameras(cams);
  81. }
  82. }
  83. }
  84. public _detachCameras(cameras: Camera): void;
  85. public _detachCameras(cameras: Nullable<Camera[]>): void;
  86. public _detachCameras(cameras: any): void {
  87. var cams = Tools.MakeArray(cameras || this._cameras);
  88. if (!cams) {
  89. return;
  90. }
  91. for (var renderEffectName in this._renderEffects) {
  92. if (this._renderEffects.hasOwnProperty(renderEffectName)) {
  93. this._renderEffects[renderEffectName]._detachCameras(cams);
  94. }
  95. }
  96. for (var i = 0; i < cams.length; i++) {
  97. this._cameras.splice(this._cameras.indexOf(cams[i]), 1);
  98. }
  99. }
  100. public _enableDisplayOnlyPass(passName: string, cameras: Camera): void;
  101. public _enableDisplayOnlyPass(passName: string, cameras: Nullable<Camera[]>): void;
  102. public _enableDisplayOnlyPass(passName: string, cameras: any): void {
  103. var cams = Tools.MakeArray(cameras || this._cameras);
  104. if (!cams) {
  105. return;
  106. }
  107. var pass: Nullable<PostProcessRenderPass> = null;
  108. var renderEffectName;
  109. for (renderEffectName in this._renderEffects) {
  110. if (this._renderEffects.hasOwnProperty(renderEffectName)) {
  111. pass = this._renderEffects[renderEffectName].getPass(passName);
  112. if (pass != null) {
  113. break;
  114. }
  115. }
  116. }
  117. if (pass === null) {
  118. return;
  119. }
  120. for (renderEffectName in this._renderEffects) {
  121. if (this._renderEffects.hasOwnProperty(renderEffectName)) {
  122. this._renderEffects[renderEffectName]._disable(cams);
  123. }
  124. }
  125. pass._name = PostProcessRenderPipeline.PASS_SAMPLER_NAME;
  126. for (var i = 0; i < cams.length; i++) {
  127. var camera = cams[i];
  128. var cameraName = camera.name;
  129. this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME,
  130. () => {return new DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, undefined, this._engine, true) });
  131. this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
  132. this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
  133. this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
  134. }
  135. }
  136. public _disableDisplayOnlyPass(cameras: Camera): void;
  137. public _disableDisplayOnlyPass(cameras: Camera[]): void;
  138. public _disableDisplayOnlyPass(cameras: any): void {
  139. var cams = Tools.MakeArray(cameras || this._cameras);
  140. if (!cams) {
  141. return;
  142. }
  143. for (var i = 0; i < cams.length; i++) {
  144. var camera = cams[i];
  145. var cameraName = camera.name;
  146. this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME,
  147. () => {return new DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, undefined, this._engine, true) });
  148. this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
  149. }
  150. for (var renderEffectName in this._renderEffects) {
  151. if (this._renderEffects.hasOwnProperty(renderEffectName)) {
  152. this._renderEffects[renderEffectName]._enable(cams);
  153. }
  154. }
  155. }
  156. public _update(): void {
  157. for (var renderEffectName in this._renderEffects) {
  158. if (this._renderEffects.hasOwnProperty(renderEffectName)) {
  159. this._renderEffects[renderEffectName]._update();
  160. }
  161. }
  162. for (var i = 0; i < this._cameras.length; i++) {
  163. var cameraName = this._cameras[i].name;
  164. if ((<any>this._renderEffectsForIsolatedPass)[cameraName]) {
  165. (<any>this._renderEffectsForIsolatedPass)[cameraName]._update();
  166. }
  167. }
  168. }
  169. public _reset(): void {
  170. this._renderEffects = {};
  171. this._renderEffectsForIsolatedPass = new Array<PostProcessRenderEffect>();
  172. }
  173. public dispose() {
  174. // Must be implemented by children
  175. }
  176. }
  177. }