babylon.postProcessRenderPipeline.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. module BABYLON {
  2. export class PostProcessRenderPipeline {
  3. private _engine: Engine;
  4. private _renderEffects: PostProcessRenderEffect[];
  5. private _renderEffectsForIsolatedPass: PostProcessRenderEffect[];
  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 = 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 = 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, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
  95. this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
  96. this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
  97. this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
  98. }
  99. }
  100. public _disableDisplayOnlyPass(cameras: Camera);
  101. public _disableDisplayOnlyPass(cameras: Camera[]);
  102. public _disableDisplayOnlyPass(cameras: any): void {
  103. var _cam = Tools.MakeArray(cameras || this._cameras);
  104. for (var i = 0; i < _cam.length; i++) {
  105. var camera = _cam[i];
  106. var cameraName = camera.name;
  107. this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
  108. this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
  109. }
  110. for (var renderEffectName in this._renderEffects) {
  111. this._renderEffects[renderEffectName]._enable(_cam);
  112. }
  113. }
  114. public _update(): void {
  115. for (var renderEffectName in this._renderEffects) {
  116. this._renderEffects[renderEffectName]._update();
  117. }
  118. for (var i = 0; i < this._cameras.length; i++) {
  119. var cameraName = this._cameras[i].name;
  120. if (this._renderEffectsForIsolatedPass[cameraName]) {
  121. this._renderEffectsForIsolatedPass[cameraName]._update();
  122. }
  123. }
  124. }
  125. }
  126. }