modularize.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. var fs = require( 'fs' );
  5. THREE = require( '../build/three.js' );
  6. var srcFolder = __dirname + '/../examples/js/';
  7. var dstFolder = __dirname + '/../examples/jsm/';
  8. var files = [
  9. { path: 'cameras/CinematicCamera.js', dependencies: [ { name: 'BokehShader', path: 'shaders/BokehShader2.js' }, { name: 'BokehDepthShader', path: 'shaders/BokehShader2.js' } ], ignoreList: [] },
  10. { path: 'controls/DragControls.js', dependencies: [], ignoreList: [] },
  11. { path: 'controls/DeviceOrientationControls.js', dependencies: [], ignoreList: [] },
  12. { path: 'controls/EditorControls.js', dependencies: [], ignoreList: [] },
  13. { path: 'controls/FirstPersonControls.js', dependencies: [], ignoreList: [] },
  14. { path: 'controls/FlyControls.js', dependencies: [], ignoreList: [] },
  15. { path: 'controls/OrbitControls.js', dependencies: [], ignoreList: [] },
  16. { path: 'controls/MapControls.js', dependencies: [], ignoreList: [] },
  17. { path: 'controls/OrthographicTrackballControls.js', dependencies: [], ignoreList: [] },
  18. { path: 'controls/PointerLockControls.js', dependencies: [], ignoreList: [] },
  19. { path: 'controls/TrackballControls.js', dependencies: [], ignoreList: [] },
  20. { path: 'controls/TransformControls.js', dependencies: [], ignoreList: [] },
  21. { path: 'curves/NURBSCurve.js', dependencies: [ { name: 'NURBSUtils', path: 'curves/NURBSUtils.js' } ], ignoreList: [] },
  22. { path: 'curves/NURBSSurface.js', dependencies: [ { name: 'NURBSUtils', path: 'curves/NURBSUtils.js' } ], ignoreList: [] },
  23. { path: 'curves/NURBSUtils.js', dependencies: [], ignoreList: [] },
  24. { path: 'exporters/GLTFExporter.js', dependencies: [], ignoreList: [ 'AnimationClip', 'Camera', 'Geometry', 'Material', 'Mesh', 'Object3D', 'RGBFormat', 'Scenes', 'ShaderMaterial', 'VertexColors' ] },
  25. { path: 'exporters/MMDExporter.js', dependencies: [], ignoreList: [] },
  26. { path: 'exporters/OBJExporter.js', dependencies: [], ignoreList: [] },
  27. { path: 'exporters/PLYExporter.js', dependencies: [], ignoreList: [] },
  28. { path: 'exporters/STLExporter.js', dependencies: [], ignoreList: [] },
  29. { path: 'exporters/TypedGeometryExporter.js', dependencies: [], ignoreList: [] },
  30. { path: 'loaders/3MFLoader.js', dependencies: [], ignoreList: [] },
  31. { path: 'loaders/AMFLoader.js', dependencies: [], ignoreList: [] },
  32. { path: 'loaders/AssimpJSONLoader.js', dependencies: [], ignoreList: [] },
  33. { path: 'loaders/AssimpLoader.js', dependencies: [], ignoreList: [] },
  34. { path: 'loaders/BabylonLoader.js', dependencies: [], ignoreList: [] },
  35. { path: 'loaders/BVHLoader.js', dependencies: [], ignoreList: [ 'Bones' ] },
  36. { path: 'loaders/ColladaLoader.js', dependencies: [ { name: 'TGALoader', path: 'loaders/TGALoader.js' } ], ignoreList: [] },
  37. { path: 'loaders/DDSLoader.js', dependencies: [], ignoreList: [] },
  38. { path: 'loaders/EXRLoader.js', dependencies: [], ignoreList: [] },
  39. { path: 'loaders/FBXLoader.js', dependencies: [ { name: 'TGALoader', path: 'loaders/TGALoader.js' }, { name: 'NURBSCurve', path: 'curves/NURBSCurve.js' } ], ignoreList: [] },
  40. { path: 'loaders/GCodeLoader.js', dependencies: [], ignoreList: [] },
  41. { path: 'loaders/GLTFLoader.js', dependencies: [], ignoreList: [ 'NoSide', 'Matrix2', 'DDSLoader' ] },
  42. { path: 'loaders/KMZLoader.js', dependencies: [ { name: 'ColladaLoader', path: 'loaders/ColladaLoader.js' } ], ignoreList: [] },
  43. { path: 'loaders/KTXLoader.js', dependencies: [], ignoreList: [] },
  44. { path: 'loaders/MTLLoader.js', dependencies: [], ignoreList: [ 'BackSide', 'DoubleSide', 'ClampToEdgeWrapping', 'MirroredRepeatWrapping' ] },
  45. { path: 'loaders/OBJLoader.js', dependencies: [], ignoreList: [] },
  46. { path: 'loaders/PCDLoader.js', dependencies: [], ignoreList: [] },
  47. { path: 'loaders/PDBLoader.js', dependencies: [], ignoreList: [] },
  48. { path: 'loaders/PlayCanvasLoader.js', dependencies: [], ignoreList: [] },
  49. { path: 'loaders/PLYLoader.js', dependencies: [], ignoreList: [ 'Mesh' ] },
  50. { path: 'loaders/RGBELoader.js', dependencies: [], ignoreList: [ 'RGBAFormat' ] },
  51. { path: 'loaders/STLLoader.js', dependencies: [], ignoreList: [ 'Mesh', 'MeshPhongMaterial', 'VertexColors' ] },
  52. { path: 'loaders/SVGLoader.js', dependencies: [], ignoreList: [] },
  53. { path: 'loaders/TGALoader.js', dependencies: [], ignoreList: [] },
  54. { path: 'loaders/VRMLLoader.js', dependencies: [], ignoreList: [] },
  55. { path: 'pmrem/PMREMCubeUVPacker.js', dependencies: [], ignoreList: [] },
  56. { path: 'pmrem/PMREMGenerator.js', dependencies: [], ignoreList: [] },
  57. { path: 'shaders/BokehShader2.js', dependencies: [], ignoreList: [] },
  58. { path: 'shaders/UnpackDepthRGBAShader.js', dependencies: [], ignoreList: [] },
  59. { path: 'renderers/CSS2DRenderer.js', dependencies: [], ignoreList: [] },
  60. { path: 'renderers/CSS3DRenderer.js', dependencies: [], ignoreList: [] },
  61. { path: 'renderers/Projector.js', dependencies: [], ignoreList: [] },
  62. { path: 'renderers/SoftwareRenderer.js', dependencies: [ { name: 'Projector', path: 'renderers/Projector.js' }, { name: 'RenderableFace', path: 'renderers/Projector.js' }, { name: 'RenderableLine', path: 'renderers/Projector.js' }, { name: 'RenderableSprite', path: 'renderers/Projector.js' } ], ignoreList: [] },
  63. { path: 'renderers/SVGRenderer.js', dependencies: [ { name: 'Projector', path: 'renderers/Projector.js' }, { name: 'RenderableFace', path: 'renderers/Projector.js' }, { name: 'RenderableLine', path: 'renderers/Projector.js' }, { name: 'RenderableSprite', path: 'renderers/Projector.js' } ], ignoreList: [] },
  64. { path: 'renderers/RaytracingRenderer.js', dependencies: [], ignoreList: [] },
  65. { path: 'utils/BufferGeometryUtils.js', dependencies: [], ignoreList: [] },
  66. { path: 'utils/GeometryUtils.js', dependencies: [], ignoreList: [] },
  67. { path: 'utils/MathUtils.js', dependencies: [], ignoreList: [] },
  68. { path: 'utils/SceneUtils.js', dependencies: [], ignoreList: [] },
  69. { path: 'utils/ShadowMapViewer.js', dependencies: [ { name: 'UnpackDepthRGBAShader', path: 'shaders/UnpackDepthRGBAShader.js' } ], ignoreList: [ 'DirectionalLight', 'SpotLight' ] },
  70. { path: 'utils/SkeletonUtils.js', dependencies: [], ignoreList: [] },
  71. { path: 'utils/TypedArrayUtils.js', dependencies: [], ignoreList: [] },
  72. { path: 'utils/UVsDebug.js', dependencies: [], ignoreList: [ 'SphereBufferGeometry' ] },
  73. ];
  74. for ( var i = 0; i < files.length; i ++ ) {
  75. var file = files[ i ];
  76. convert( file.path, file.dependencies, file.ignoreList );
  77. }
  78. //
  79. function convert( path, exampleDependencies, ignoreList ) {
  80. var contents = fs.readFileSync( srcFolder + path, 'utf8' );
  81. var classNames = [];
  82. var coreDependencies = {};
  83. // imports
  84. contents = contents.replace( /^\/\*+[^*]*\*+(?:[^/*][^*]*\*+)*\//, function ( match ) {
  85. return `${match}\n\n_IMPORTS_`;
  86. } );
  87. // class name
  88. contents = contents.replace( /THREE\.([a-zA-Z0-9]+) = /g, function ( match, p1 ) {
  89. classNames.push( p1 );
  90. console.log( p1 );
  91. return `var ${p1} = `;
  92. } );
  93. contents = contents.replace( /(\'?)THREE\.([a-zA-Z0-9]+)(\.{0,1})/g, function ( match, p1, p2, p3 ) {
  94. if ( p1 === '\'' ) return match; // Inside a string
  95. if ( classNames.includes( p2 ) ) return `${p2}${p3}`;
  96. if ( p1 === 'Math' ) {
  97. coreDependencies[ '_Math' ] = true;
  98. return '_Math.';
  99. }
  100. return match;
  101. } );
  102. // methods
  103. contents = contents.replace( /new THREE\.([a-zA-Z0-9]+)\(/g, function ( match, p1 ) {
  104. if ( ignoreList.includes( p1 ) ) return match;
  105. if ( p1 in THREE ) coreDependencies[ p1 ] = true;
  106. return `new ${p1}(`;
  107. } );
  108. // constants
  109. contents = contents.replace( /(\'?)THREE\.([a-zA-Z0-9_]+)/g, function ( match, p1, p2 ) {
  110. if ( ignoreList.includes( p2 ) ) return match;
  111. if ( p1 === '\'' ) return match; // Inside a string
  112. if ( classNames.includes( p2 ) ) return p2;
  113. if ( p2 === 'Math' || p2 === '_Math' ) {
  114. coreDependencies[ '_Math' ] = true;
  115. return '_Math';
  116. }
  117. if ( p2 in THREE ) coreDependencies[ p2 ] = true;
  118. // console.log( match, p2 );
  119. return `${p2}`;
  120. } );
  121. //
  122. var keys = Object.keys( coreDependencies )
  123. .filter( value => ! classNames.includes( value ) )
  124. .map( value => value === '_Math' ? 'Math as _Math' : value )
  125. .map( value => '\n\t' + value )
  126. .sort()
  127. .toString();
  128. // core imports
  129. var imports = `import {${keys}\n} from "../../../build/three.module.js";`;
  130. // example imports
  131. for ( var dependency of exampleDependencies ) {
  132. imports += `\nimport { ${dependency.name} } from "../${dependency.path}";`;
  133. }
  134. // exports
  135. var exports = `export { ${classNames.join( ", " )} };\n`;
  136. var output = contents.replace( '_IMPORTS_', keys ? imports : '' ) + '\n' + exports;
  137. // console.log( output );
  138. fs.writeFileSync( dstFolder + path, output, 'utf-8' );
  139. }