processShaders.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. let glob = require('glob');
  2. let path = require('path');
  3. let fs = require('fs');
  4. // Usage - node .\processShaders.js ../../gui/
  5. let shaderProcessor = require('./parser');
  6. let shadersPath = process.argv[2] || '../../';
  7. let tsTemplate = `import { Effect } from "babylonjs";
  8. let shader = '';
  9. let name = '';
  10. let registerShader = false;
  11. ##PLACEHOLDER##
  12. if(registerShader && name && shader) {
  13. Effect.ShadersStore[name] = shader;
  14. }
  15. export { shader, name };
  16. `;
  17. glob(shadersPath + '/**/*.fx', (err, shaderFiles) => {
  18. if (err) {
  19. console.log('error', err);
  20. } else {
  21. console.log('processing shaders');
  22. shaderFiles.forEach(file => {
  23. let filename = path.basename(file);
  24. let normalized = path.normalize(file);
  25. let directory = path.dirname(normalized);
  26. let shaderName = getShaderName(filename);
  27. let tsFilename = filename.replace('.fx', '.ts');
  28. let shaderContent = fs.readFileSync(file).toString();
  29. //TODO - take care of includes!!!
  30. shaderProcessor(undefined, shaderContent, undefined, (err, data) => {
  31. let tsContent = tsTemplate.replace('##PLACEHOLDER##', `name = '${shaderName}'; shader = \`${data}\`; `);
  32. fs.writeFileSync(directory + '/' + tsFilename, tsContent);
  33. });
  34. });
  35. }
  36. })
  37. function getShaderName(filename) {
  38. let parts = filename.split('.');
  39. if (parts[1] !== 'fx') {
  40. return parts[0] + (parts[1] === 'fragment' ? 'Pixel' : 'Vertex') + "Shader";
  41. } else {
  42. return parts[0];
  43. }
  44. }