babylon.postProcessRenderEffect.ts 7.8 KB

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