babylon.postProcessRenderPipeline.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. module BABYLON {
  2. export class PostProcessRenderPipeline {
  3. private _engine: Engine;
  4. private _renderEffects: any;
  5. private _renderEffectsForIsolatedPass: any;
  6. private _cameras: Camera[];
  7. // private
  8. public _name: string;
  9. private static PASS_EFFECT_NAME: string = "passEffect";
  10. private static PASS_SAMPLER_NAME: string = "passSampler";
  11. constructor(engine: Engine, name: string) {
  12. this._engine = engine;
  13. this._name = name;
  14. this._renderEffects = {};
  15. this._renderEffectsForIsolatedPass = {};
  16. this._cameras = [];
  17. }
  18. public addEffect(renderEffect: PostProcessRenderEffect): void {
  19. this._renderEffects[renderEffect._name] = renderEffect;
  20. }
  21. // private
  22. public _enableEffect(renderEffectName: string, cameras: Camera);
  23. public _enableEffect(renderEffectName: string, cameras: Camera[]);
  24. public _enableEffect(renderEffectName: string, cameras: any): void {
  25. var renderEffects: PostProcessRenderEffect = this._renderEffects[renderEffectName];
  26. if (!renderEffects) {
  27. return;
  28. }
  29. renderEffects._enable(Tools.MakeArray(cameras || this._cameras));
  30. }
  31. public _disableEffect(renderEffectName: string, cameras: Camera);
  32. public _disableEffect(renderEffectName: string, cameras: Camera[]);
  33. public _disableEffect(renderEffectName: string, cameras): void {
  34. var renderEffects: PostProcessRenderEffect = this._renderEffects[renderEffectName];
  35. if (!renderEffects) {
  36. return;
  37. }
  38. renderEffects._disable(Tools.MakeArray(cameras || this._cameras));
  39. }
  40. public _attachCameras(cameras: Camera, unique: boolean);
  41. public _attachCameras(cameras: Camera[], unique: boolean);
  42. public _attachCameras(cameras: any, unique: boolean): void {
  43. var _cam = Tools.MakeArray(cameras || this._cameras);
  44. var indicesToDelete = [];
  45. for (var i = 0; i < _cam.length; i++) {
  46. var camera = _cam[i];
  47. var cameraName = camera.name;
  48. if (this._cameras.indexOf(camera) === -1) {
  49. this._cameras[cameraName] = camera;
  50. }
  51. else if (unique) {
  52. indicesToDelete.push(i);
  53. }
  54. }
  55. for (var i = 0; i < indicesToDelete.length; i++) {
  56. cameras.splice(indicesToDelete[i], 1);
  57. }
  58. for (var renderEffectName in this._renderEffects) {
  59. this._renderEffects[renderEffectName]._attachCameras(_cam);
  60. }
  61. }
  62. public _detachCameras(cameras: Camera);
  63. public _detachCameras(cameras: Camera[]);
  64. public _detachCameras(cameras: any): void {
  65. var _cam = Tools.MakeArray(cameras || this._cameras);
  66. for (var renderEffectName in this._renderEffects) {
  67. this._renderEffects[renderEffectName]._detachCameras(_cam);
  68. }
  69. for (var i = 0; i < _cam.length; i++) {
  70. this._cameras.splice(this._cameras.indexOf(_cam[i]), 1);
  71. }
  72. }
  73. public _enableDisplayOnlyPass(passName, cameras: Camera);
  74. public _enableDisplayOnlyPass(passName, cameras: Camera[]);
  75. public _enableDisplayOnlyPass(passName, cameras: any): void {
  76. var _cam = Tools.MakeArray(cameras || this._cameras);
  77. var pass = null;
  78. for (var renderEffectName in this._renderEffects) {
  79. pass = this._renderEffects[renderEffectName].getPass(passName);
  80. if (pass != null) {
  81. break;
  82. }
  83. }
  84. if (pass === null) {
  85. return;
  86. }
  87. for (var renderEffectName in this._renderEffects) {
  88. this._renderEffects[renderEffectName]._disable(_cam);
  89. }
  90. pass._name = PostProcessRenderPipeline.PASS_SAMPLER_NAME;
  91. for (var i = 0; i < _cam.length; i++) {
  92. var camera = _cam[i];
  93. var cameraName = camera.name;
  94. this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME,
  95. () => {return new DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, this._engine, true) });
  96. this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
  97. this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
  98. this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
  99. }
  100. }
  101. public _disableDisplayOnlyPass(cameras: Camera);
  102. public _disableDisplayOnlyPass(cameras: Camera[]);
  103. public _disableDisplayOnlyPass(cameras: any): void {
  104. var _cam = Tools.MakeArray(cameras || this._cameras);
  105. for (var i = 0; i < _cam.length; i++) {
  106. var camera = _cam[i];
  107. var cameraName = camera.name;
  108. this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME,
  109. () => {return new DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, this._engine, true) });
  110. this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
  111. }
  112. for (var renderEffectName in this._renderEffects) {
  113. this._renderEffects[renderEffectName]._enable(_cam);
  114. }
  115. }
  116. public _update(): void {
  117. for (var renderEffectName in this._renderEffects) {
  118. this._renderEffects[renderEffectName]._update();
  119. }
  120. for (var i = 0; i < this._cameras.length; i++) {
  121. var cameraName = this._cameras[i].name;
  122. if (this._renderEffectsForIsolatedPass[cameraName]) {
  123. this._renderEffectsForIsolatedPass[cameraName]._update();
  124. }
  125. }
  126. }
  127. }
  128. }