babylon.postProcessRenderPipeline.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. public enableEffect(renderEffectName: string, cameras: Camera);
  22. public enableEffect(renderEffectName: string, cameras: Camera[]);
  23. public enableEffect(renderEffectName: string, cameras: any): void {
  24. var renderEffects = this._renderEffects[renderEffectName];
  25. if (!renderEffects) {
  26. return;
  27. }
  28. renderEffects.enable(Tools.MakeArray(cameras || this._cameras));
  29. }
  30. public disableEffect(renderEffectName: string, cameras: Camera);
  31. public disableEffect(renderEffectName: string, cameras: Camera[]);
  32. public disableEffect(renderEffectName: string, cameras): void {
  33. var renderEffects = this._renderEffects[renderEffectName];
  34. if (!renderEffects) {
  35. return;
  36. }
  37. renderEffects.disable(Tools.MakeArray(cameras || this._cameras));
  38. }
  39. public attachCameras(cameras: Camera, unique: boolean);
  40. public attachCameras(cameras: Camera[], unique: boolean);
  41. public attachCameras(cameras: any, unique: boolean): void {
  42. var _cam = Tools.MakeArray(cameras || this._cameras);
  43. var indicesToDelete = [];
  44. for (var i = 0; i < _cam.length; i++) {
  45. var camera = _cam[i];
  46. var cameraName = camera.name;
  47. if (this._cameras.indexOf(camera) === -1) {
  48. this._cameras[cameraName] = camera;
  49. }
  50. else if (unique) {
  51. indicesToDelete.push(i);
  52. }
  53. }
  54. for (var i = 0; i < indicesToDelete.length; i++) {
  55. cameras.splice(indicesToDelete[i], 1);
  56. }
  57. for (var renderEffectName in this._renderEffects) {
  58. this._renderEffects[renderEffectName]._attachCameras(_cam);
  59. }
  60. }
  61. // todo
  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. this._renderEffectsForIsolatedPass[_cam[i].name] = this._renderEffectsForIsolatedPass[_cam[i].name] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
  93. this._renderEffectsForIsolatedPass[_cam[i].name].emptyPasses();
  94. this._renderEffectsForIsolatedPass[_cam[i].name].addPass(pass);
  95. this._renderEffectsForIsolatedPass[_cam[i].name]._attachCameras(_cam[i]);
  96. }
  97. }
  98. public disableDisplayOnlyPass(cameras: Camera);
  99. public disableDisplayOnlyPass(cameras: Camera[]);
  100. public disableDisplayOnlyPass(cameras: any): void {
  101. var _cam = Tools.MakeArray(cameras || this._cameras);
  102. for (var i = 0; i < _cam.length; i++) {
  103. this._renderEffectsForIsolatedPass[_cam[i].name] = this._renderEffectsForIsolatedPass[_cam[i].name] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
  104. this._renderEffectsForIsolatedPass[_cam[i].name]._disable(_cam[i]);
  105. }
  106. for (var renderEffectName in this._renderEffects) {
  107. this._renderEffects[renderEffectName]._enable(_cam);
  108. }
  109. }
  110. public _update(): void {
  111. for (var renderEffectName in this._renderEffects) {
  112. this._renderEffects[renderEffectName]._update();
  113. }
  114. for (var i = 0; i < this._cameras.length; i++) {
  115. if (this._renderEffectsForIsolatedPass[this._cameras[i].name]) {
  116. this._renderEffectsForIsolatedPass[this._cameras[i].name]._update();
  117. }
  118. }
  119. }
  120. }
  121. }