babylon.postProcessRenderEffect.js 8.6 KB

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