babylon.postProcessRenderEffect.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. module BABYLON {
  2. export class PostProcessRenderEffect {
  3. private _engine: Engine;
  4. private _postProcesses: PostProcess[];
  5. private _getPostProcess: () => PostProcess;
  6. private _singleInstance: boolean;
  7. private _cameras: Camera[];
  8. private _indicesForCamera: number[][];
  9. private _renderPasses: PostProcessRenderPass[];
  10. private _renderEffectAsPasses: PostProcessRenderEffect[];
  11. // private
  12. public _name: string;
  13. public applyParameters: (postProcess: PostProcess) => void;
  14. constructor(engine: Engine, name: string, getPostProcess: () => PostProcess, singleInstance?: boolean) {
  15. this._engine = engine;
  16. this._name = name;
  17. this._singleInstance = singleInstance || true;
  18. this._getPostProcess = getPostProcess;
  19. this._cameras = [];
  20. this._postProcesses = [];
  21. this._indicesForCamera = [];
  22. this._renderPasses = [];
  23. this._renderEffectAsPasses = [];
  24. }
  25. public _update(): void {
  26. for (var renderPassName in this._renderPasses) {
  27. this._renderPasses[renderPassName]._update();
  28. }
  29. }
  30. public addPass(renderPass: PostProcessRenderPass): void {
  31. this._renderPasses[renderPass._name] = renderPass;
  32. this._linkParameters();
  33. }
  34. public removePass(renderPass: PostProcessRenderPass): void {
  35. delete this._renderPasses[renderPass._name];
  36. this._linkParameters();
  37. }
  38. public addRenderEffectAsPass(renderEffect: PostProcessRenderEffect): void {
  39. this._renderEffectAsPasses[renderEffect._name] = renderEffect;
  40. this._linkParameters();
  41. }
  42. public getPass(passName: string): void {
  43. for (var renderPassName in this._renderPasses) {
  44. if (renderPassName === passName) {
  45. return this._renderPasses[passName];
  46. }
  47. }
  48. }
  49. public emptyPasses(): void {
  50. this._renderPasses.length = 0;
  51. this._linkParameters();
  52. }
  53. // private
  54. public _attachCameras(cameras: Camera);
  55. public _attachCameras(cameras: Camera[]);
  56. public _attachCameras(cameras: any): void {
  57. var cameraKey;
  58. var _cam = Tools.MakeArray(cameras || this._cameras);
  59. for (var i = 0; i < _cam.length; i++) {
  60. var camera = _cam[i];
  61. var cameraName = camera.name;
  62. if (this._singleInstance) {
  63. cameraKey = 0;
  64. }
  65. else {
  66. cameraKey = cameraName;
  67. }
  68. this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || this._getPostProcess();
  69. var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
  70. if (!this._indicesForCamera[cameraName]) {
  71. this._indicesForCamera[cameraName] = [];
  72. }
  73. this._indicesForCamera[cameraName].push(index);
  74. if (this._cameras.indexOf(camera) === -1) {
  75. this._cameras[cameraName] = camera;
  76. }
  77. for (var passName in this._renderPasses) {
  78. this._renderPasses[passName]._incRefCount();
  79. }
  80. }
  81. this._linkParameters();
  82. }
  83. // private
  84. public _detachCameras(cameras: Camera);
  85. public _detachCameras(cameras: Camera[]);
  86. public _detachCameras(cameras: any): void {
  87. var _cam = Tools.MakeArray(cameras || this._cameras);
  88. for (var i = 0; i < _cam.length; i++) {
  89. var camera = _cam[i];
  90. var cameraName = camera.name;
  91. camera.detachPostProcess(this._postProcesses[this._singleInstance ? 0 : cameraName], this._indicesForCamera[cameraName]);
  92. var index = this._cameras.indexOf(cameraName);
  93. this._indicesForCamera.splice(index, 1);
  94. this._cameras.splice(index, 1);
  95. for (var passName in this._renderPasses) {
  96. this._renderPasses[passName]._decRefCount();
  97. }
  98. }
  99. }
  100. // private
  101. public _enable(cameras: Camera);
  102. public _enable(cameras: Camera[]);
  103. public _enable(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. for (var j = 0; j < this._indicesForCamera[cameraName].length; j++) {
  109. if (camera._postProcesses[this._indicesForCamera[cameraName][j]] === undefined) {
  110. cameras[i].attachPostProcess(this._postProcesses[this._singleInstance ? 0 : cameraName], this._indicesForCamera[cameraName][j]);
  111. }
  112. }
  113. for (var passName in this._renderPasses) {
  114. this._renderPasses[passName]._incRefCount();
  115. }
  116. }
  117. }
  118. // private
  119. public _disable(cameras: Camera);
  120. public _disable(cameras: Camera[]);
  121. public _disable(cameras: any): void {
  122. var _cam = Tools.MakeArray(cameras || this._cameras);
  123. for (var i = 0; i < _cam.length; i++) {
  124. var camera = _cam[i];
  125. var cameraName = camera.Name;
  126. camera.detachPostProcess(this._postProcesses[this._singleInstance ? 0 : cameraName], this._indicesForCamera[cameraName]);
  127. for (var passName in this._renderPasses) {
  128. this._renderPasses[passName]._decRefCount();
  129. }
  130. }
  131. }
  132. public getPostProcess(camera?: Camera): PostProcess {
  133. if (this._singleInstance) {
  134. return this._postProcesses[0];
  135. }
  136. else {
  137. return this._postProcesses[camera.name];
  138. }
  139. }
  140. private _linkParameters(): void {
  141. for (var index in this._postProcesses) {
  142. if (this.applyParameters) {
  143. this.applyParameters(this._postProcesses[index]);
  144. }
  145. this._postProcesses[index].onBeforeRender = (effect: Effect) => {
  146. this._linkTextures(effect);
  147. };
  148. }
  149. }
  150. private _linkTextures(effect): void {
  151. for (var renderPassName in this._renderPasses) {
  152. effect.setTexture(renderPassName, this._renderPasses[renderPassName].getRenderTexture());
  153. }
  154. for (var renderEffectName in this._renderEffectAsPasses) {
  155. effect.setTextureFromPostProcess(renderEffectName + "Sampler", this._renderEffectAsPasses[renderEffectName].getPostProcess());
  156. }
  157. }
  158. }
  159. }