gulp-processShaders.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. var through = require('through2');
  2. var PluginError = require('gulp-util').PluginError;
  3. let path = require('path');
  4. let fs = require('fs');
  5. let tsShaderTemplate =
  6. `import { Effect } from "babylonjs";
  7. let name = '##NAME_PLACEHOLDER##';
  8. let shader = \`##SHADER_PLACEHOLDER##\`;
  9. Effect.##SHADERSTORE_PLACEHOLDER##[name] = shader;
  10. export { shader, name };
  11. `;
  12. function getShaderName(filename) {
  13. let parts = filename.split('.');
  14. if (parts[1] !== 'fx') {
  15. return parts[0] + (parts[1] === 'fragment' ? 'Pixel' : 'Vertex') + "Shader";
  16. } else {
  17. return parts[0];
  18. }
  19. }
  20. function main() {
  21. return through.obj(function (file, enc, cb) {
  22. if (file.isNull()) {
  23. cb(null, file);
  24. return;
  25. }
  26. if (file.isStream()) {
  27. cb(new PluginError("Remove Shader Comments", "Streaming not supported."));
  28. }
  29. const filename = path.basename(file.path);
  30. const normalized = path.normalize(file.path);
  31. const directory = path.dirname(normalized);
  32. const shaderName = getShaderName(filename);
  33. const tsFilename = filename.replace('.fx', '.ts');
  34. let fxData = file.contents.toString();
  35. // Trailing whitespace...
  36. fxData = fxData.replace(/[^\S\r\n]+$/gm, "");
  37. const shaderStore = directory.indexOf("ShadersInclude") > -1 ? "IncludesShadersStore" : "ShadersStore";
  38. let tsContent = tsShaderTemplate.replace('##NAME_PLACEHOLDER##', shaderName);
  39. tsContent = tsContent.replace('##SHADER_PLACEHOLDER##', fxData);
  40. tsContent = tsContent.replace('##SHADERSTORE_PLACEHOLDER##', shaderStore);
  41. fs.writeFileSync(directory + '/' + tsFilename, tsContent);
  42. return cb();
  43. });
  44. }
  45. module.exports = main;