babylon.postProcessRenderEffect.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. "use strict";
  2. var BABYLON = BABYLON || {};
  3. (function () {
  4. BABYLON.PostProcessRenderEffect = function PostProcessRenderEffect(engine, name, postProcessType, ratio, samplingMode, singleInstance) {
  5. this._engine = engine;
  6. this._name = name;
  7. this._singleInstance = singleInstance || true;
  8. this._postProcesses = [];
  9. this._postProcessType = postProcessType;
  10. this._ratio = ratio || 1.0;
  11. this._samplingMode = samplingMode || null;
  12. this._cameras = [];
  13. this._indicesForCamera = [];
  14. this._renderPasses = [];
  15. this._renderEffectAsPasses = [];
  16. this.parameters = function () { };
  17. };
  18. BABYLON.PostProcessRenderEffect.prototype.addPass = function(renderPass) {
  19. this._renderPasses[renderPass._name] = renderPass;
  20. this._linkParameters();
  21. };
  22. BABYLON.PostProcessRenderEffect.prototype.removePass = function (renderPass) {
  23. delete this._renderPasses[renderPass._name];
  24. this._linkParameters();
  25. };
  26. BABYLON.PostProcessRenderEffect.prototype.addRenderEffectAsPass = function(renderEffect) {
  27. this._renderEffectAsPasses[renderEffect._name] = renderEffect;
  28. this._linkParameters();
  29. };
  30. BABYLON.PostProcessRenderEffect.prototype.getPass = function (passName) {
  31. for (var renderPassName in this._renderPasses) {
  32. if (renderPassName == passName) {
  33. return this._renderPasses[passName];
  34. }
  35. }
  36. };
  37. BABYLON.PostProcessRenderEffect.prototype.emptyPasses = function () {
  38. this._renderPasses.length = 0;
  39. this._linkParameters();
  40. };
  41. BABYLON.PostProcessRenderEffect.prototype.attachCameras = function (cameras) {
  42. var postProcess = null;
  43. cameras = BABYLON.Tools.MakeArray(cameras || this._cameras);
  44. for (var i = 0; i < cameras.length; i++) {
  45. if (this._singleInstance) {
  46. postProcess = this._postProcesses[0] || BABYLON.PostProcessRenderEffect.getInstance(this._engine, this._postProcessType, this._ratio, this._samplingMode);
  47. this._postProcesses[0] = postProcess;
  48. }
  49. else {
  50. postProcess = this._postProcesses[cameras[i]] || BABYLON.PostProcessRenderEffect.getInstance(this._engine, this._postProcessType, this._ratio, this._samplingMode);
  51. this._postProcesses[cameras[i].name] = postProcess;
  52. }
  53. var index = cameras[i].attachPostProcess(postProcess);
  54. if (this._indicesForCamera[cameras[i].name] == null) {
  55. this._indicesForCamera[cameras[i].name] = [];
  56. }
  57. this._indicesForCamera[cameras[i].name].push(index);
  58. if (this._cameras.indexOf(cameras[i].name) == -1) {
  59. this._cameras.push(cameras[i].name);
  60. }
  61. for (var passName in this._renderPasses) {
  62. this._renderPasses[passName].incRefCount();
  63. }
  64. }
  65. this._linkParameters();
  66. };
  67. BABYLON.PostProcessRenderEffect.prototype.detachCameras = function (cameras) {
  68. cameras = BABYLON.Tools.MakeArray(cameras || this._cameras);
  69. for (var i = 0; i < cameras.length; i++) {
  70. if (this._singleInstance) {
  71. cameras[i].detachPostProcess(this._postProcesses[0], this._indicesForCamera[cameras[i].name]);
  72. }
  73. else {
  74. cameras[i].detachPostProcess(this._postProcesses[cameras[i].name], this._indicesForCamera[cameras[i].name]);
  75. }
  76. this._indicesForCamera.splice(cameras[i].name, 1);
  77. this._cameras.splice(this._cameras.indexOf(cameras[i].name), 1);
  78. for (var passName in this._renderPasses) {
  79. this._renderPasses[passName].decRefCount();
  80. }
  81. }
  82. };
  83. BABYLON.PostProcessRenderEffect.prototype._linkParameters = function () {
  84. var that = this;
  85. for (var index in this._postProcesses) {
  86. this._postProcesses[index].onApply = function (effect) {
  87. that.parameters(effect);
  88. that._linkTextures(effect);
  89. };
  90. }
  91. };
  92. BABYLON.PostProcessRenderEffect.prototype._linkTextures = function (effect) {
  93. for (var renderPassName in this._renderPasses) {
  94. effect.setTexture(renderPassName, this._renderPasses[renderPassName].getRenderTexture());
  95. }
  96. for (var renderEffectName in this._renderEffectAsPasses) {
  97. effect.setTextureFromPostProcess(renderEffectName + "Sampler", this._renderEffectAsPasses[renderEffectName].getPostProcess());
  98. }
  99. };
  100. BABYLON.PostProcessRenderEffect.prototype._update = function () {
  101. for (var renderPassName in this._renderPasses) {
  102. this._renderPasses[renderPassName]._update();
  103. }
  104. };
  105. BABYLON.PostProcessRenderEffect.prototype.enable = function (cameras) {
  106. cameras = BABYLON.Tools.MakeArray(cameras || this._cameras);
  107. for (var i = 0; i < cameras.length; i++) {
  108. for (var j = 0; j < this._indicesForCamera[cameras[i].name].length; j++) {
  109. if (cameras[i]._postProcesses[this._indicesForCamera[cameras[i].name][j]] === undefined) {
  110. if (this._singleInstance) {
  111. cameras[i].attachPostProcess(this._postProcesses[0], this._indicesForCamera[cameras[i].name][j]);
  112. }
  113. else {
  114. cameras[i].attachPostProcess(this._postProcesses[cameras[i].name], this._indicesForCamera[cameras[i].name][j]);
  115. }
  116. }
  117. }
  118. for (var passName in this._renderPasses) {
  119. this._renderPasses[passName].incRefCount();
  120. }
  121. }
  122. };
  123. BABYLON.PostProcessRenderEffect.prototype.disable = function (cameras) {
  124. cameras = BABYLON.Tools.MakeArray(cameras || this._cameras);
  125. for (var i = 0; i < cameras.length; i++) {
  126. if (this._singleInstance) {
  127. cameras[i].detachPostProcess(this._postProcesses[0], this._indicesForCamera[cameras[i].name]);
  128. }
  129. else {
  130. cameras[i].detachPostProcess(this._postProcesses[cameras[i].name], this._indicesForCamera[cameras[i].name]);
  131. }
  132. for (var passName in this._renderPasses) {
  133. this._renderPasses[passName].decRefCount();
  134. }
  135. }
  136. };
  137. BABYLON.PostProcessRenderEffect.prototype.getPostProcess = function(camera) {
  138. return this._postProcess;
  139. };
  140. BABYLON.PostProcessRenderEffect.getInstance = function (engine, postProcessType, ratio, samplingMode) {
  141. var tmpClass;
  142. var instance;
  143. var args = new Array();
  144. var parameters = BABYLON.PostProcessRenderEffect.getParametersNames(postProcessType);
  145. for (var i = 0; i < parameters.length; i++) {
  146. switch (parameters[i]) {
  147. case "name":
  148. args[i] = postProcessType.toString();
  149. break;
  150. case "ratio":
  151. args[i] = ratio;
  152. break;
  153. case "camera":
  154. args[i] = null;
  155. break;
  156. case "samplingMode":
  157. args[i] = samplingMode;
  158. break;
  159. case "engine":
  160. args[i] = engine;
  161. break;
  162. case "reusable":
  163. args[i] = true;
  164. break;
  165. default:
  166. args[i] = null;
  167. break;
  168. }
  169. }
  170. tmpClass = function () { };
  171. tmpClass.prototype = postProcessType.prototype;
  172. instance = new tmpClass();
  173. postProcessType.apply(instance, args);
  174. return instance;
  175. };
  176. BABYLON.PostProcessRenderEffect.getParametersNames = function (func) {
  177. var commentsRegex = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
  178. var functWithoutComments = eval(func).toString().replace(commentsRegex, '');
  179. var parameters = functWithoutComments.slice(functWithoutComments.indexOf('(') + 1, functWithoutComments.indexOf(')')).match(/([^\s,]+)/g);
  180. if (parameters === null)
  181. parameters = [];
  182. return parameters;
  183. };
  184. })();