babylon.postProcessRenderEffect.js 8.9 KB

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