modularize.js 5.9 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4 5
/**
 * @author mrdoob / http://mrdoob.com/
 */

var fs = require( 'fs' );
6
THREE = require( '../build/three.js' );
M
Mr.doob 已提交
7

D
Don McCurdy 已提交
8 9
var srcFolder = __dirname + '/../examples/js/';
var dstFolder = __dirname + '/../examples/jsm/';
M
Mr.doob 已提交
10 11

var files = [
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
	{ path: 'controls/DragControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/DeviceOrientationControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/EditorControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/FirstPersonControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/FlyControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/OrbitControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/MapControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/OrthographicTrackballControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/PointerLockControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/TrackballControls.js', dependencies: [], ignoreList: [] },
	{ path: 'controls/TransformControls.js', dependencies: [], ignoreList: [] },

	{ path: 'exporters/GLTFExporter.js', dependencies: [], ignoreList: [ 'AnimationClip', 'Camera', 'Geometry', 'Material', 'Mesh', 'Object3D', 'RGBFormat', 'Scenes', 'ShaderMaterial', 'VertexColors' ] },
	{ path: 'exporters/MMDExporter.js', dependencies: [], ignoreList: [] },
	{ path: 'exporters/OBJExporter.js', dependencies: [], ignoreList: [] },
	{ path: 'exporters/PLYExporter.js', dependencies: [], ignoreList: [] },
	{ path: 'exporters/STLExporter.js', dependencies: [], ignoreList: [] },
	{ path: 'exporters/TypedGeometryExporter.js', dependencies: [], ignoreList: [] },

	{ path: 'loaders/BVHLoader.js', dependencies: [], ignoreList: [ 'Bones' ] },
	{ path: 'loaders/PCDLoader.js', dependencies: [], ignoreList: [] },
	{ path: 'loaders/GLTFLoader.js', dependencies: [], ignoreList: [ 'NoSide', 'Matrix2', 'DDSLoader' ] },
	{ path: 'loaders/OBJLoader.js', dependencies: [], ignoreList: [] },
	{ path: 'loaders/MTLLoader.js', dependencies: [], ignoreList: [ 'BackSide', 'DoubleSide', 'ClampToEdgeWrapping', 'MirroredRepeatWrapping' ] },
	{ path: 'loaders/PLYLoader.js', dependencies: [], ignoreList: [ 'Mesh' ] },
	{ path: 'loaders/STLLoader.js', dependencies: [], ignoreList: [ 'Mesh', 'MeshPhongMaterial', 'VertexColors' ] },
	{ path: 'loaders/SVGLoader.js', dependencies: [], ignoreList: [] },
	{ path: 'loaders/TGALoader.js', dependencies: [], ignoreList: [] },
	{ path: 'loaders/VRMLLoader.js', dependencies: [], ignoreList: [] },

	{ path: 'pmrem/PMREMCubeUVPacker.js', dependencies: [], ignoreList: [] },
	{ path: 'pmrem/PMREMGenerator.js', dependencies: [], ignoreList: [] },

	{ path: 'shaders/UnpackDepthRGBAShader.js', dependencies: [], ignoreList: [] },

	{ path: 'renderers/CSS2DRenderer.js', dependencies: [], ignoreList: [] },
	{ path: 'renderers/CSS3DRenderer.js', dependencies: [], ignoreList: [] },

	{ path: 'utils/BufferGeometryUtils.js', dependencies: [], ignoreList: [] },
	{ path: 'utils/GeometryUtils.js', dependencies: [], ignoreList: [] },
	{ path: 'utils/MathUtils.js', dependencies: [], ignoreList: [] },
	{ path: 'utils/SceneUtils.js', dependencies: [], ignoreList: [] },
	{ path: 'utils/ShadowMapViewer.js', dependencies: [ { name: 'UnpackDepthRGBAShader', module: 'shaders/UnpackDepthRGBAShader' } ], ignoreList: [ 'DirectionalLight', 'SpotLight' ] },
	{ path: 'utils/SkeletonUtils.js', dependencies: [], ignoreList: [] },
	{ path: 'utils/TypedArrayUtils.js', dependencies: [], ignoreList: [] },
	{ path: 'utils/UVsDebug.js', dependencies: [], ignoreList: [ 'SphereBufferGeometry' ] },
M
Mr.doob 已提交
58 59 60 61 62
];

for ( var i = 0; i < files.length; i ++ ) {

	var file = files[ i ];
63
	convert( file.path, file.dependencies, file.ignoreList );
M
Mr.doob 已提交
64 65 66 67 68

}

//

69
function convert( path, exampleDependencies, ignoreList ) {
M
Mr.doob 已提交
70 71 72

	var contents = fs.readFileSync( srcFolder + path, 'utf8' );

73
	var classNames = [];
74
	var coreDependencies = {};
M
Mr.doob 已提交
75

76 77
	// imports

D
Don McCurdy 已提交
78
	contents = contents.replace( /^\/\*+[^*]*\*+(?:[^/*][^*]*\*+)*\//, function ( match ) {
79 80 81 82 83

		return `${match}\n\n_IMPORTS_`;

	} );

M
Mr.doob 已提交
84 85 86 87
	// class name

	contents = contents.replace( /THREE\.([a-zA-Z0-9]+) = /g, function ( match, p1 ) {

88
		classNames.push( p1 );
M
Mr.doob 已提交
89

90
		console.log( p1 );
M
Mr.doob 已提交
91

92
		return `var ${p1} = `;
M
Mr.doob 已提交
93 94 95

	} );

M
Mr.doob 已提交
96
	contents = contents.replace( /(\'?)THREE\.([a-zA-Z0-9]+)(\.{0,1})/g, function ( match, p1, p2, p3 ) {
M
Mr.doob 已提交
97

M
Mr.doob 已提交
98
		if ( p1 === '\'' ) return match; // Inside a string
99
		if ( classNames.includes( p2 ) ) return `${p2}${p3}`;
M
Mr.doob 已提交
100

101 102
		if ( p1 === 'Math' ) {

103
			coreDependencies[ '_Math' ] = true;
104 105 106 107 108

			return '_Math.';

		}

M
Mr.doob 已提交
109 110 111 112 113 114 115 116 117 118
		return match;

	} );

	// methods

	contents = contents.replace( /new THREE\.([a-zA-Z0-9]+)\(/g, function ( match, p1 ) {

		if ( ignoreList.includes( p1 ) ) return match;

119
		if ( p1 in THREE ) coreDependencies[ p1 ] = true;
M
Mr.doob 已提交
120 121 122 123 124 125 126

		return `new ${p1}(`;

	} );

	// constants

127
	contents = contents.replace( /(\'?)THREE\.([a-zA-Z0-9]+)/g, function ( match, p1, p2 ) {
M
Mr.doob 已提交
128

129 130
		if ( ignoreList.includes( p2 ) ) return match;
		if ( p1 === '\'' ) return match; // Inside a string
131
		if ( classNames.includes( p2 ) ) return p2;
132

133
		if ( p2 === 'Math' || p2 === '_Math' ) {
134

135
			coreDependencies[ '_Math' ] = true;
136 137 138 139

			return '_Math';

		}
M
Mr.doob 已提交
140

141
		if ( p2 in THREE ) coreDependencies[ p2 ] = true;
M
Mr.doob 已提交
142

143
		// console.log( match, p2 );
M
Mr.doob 已提交
144

145
		return `${p2}`;
M
Mr.doob 已提交
146 147 148 149 150

	} );

	//

151
	var keys = Object.keys( coreDependencies )
152
		.filter( value => ! classNames.includes( value ) )
153 154 155 156
		.map( value => value === '_Math' ? 'Math as _Math' : value )
		.map( value => '\n\t' + value )
		.sort()
		.toString();
157 158 159

	// core imports

M
Mr.doob 已提交
160
	var imports = `import {${keys}\n} from "../../../build/three.module.js";`;
161 162 163 164 165 166 167 168 169 170 171

	// example imports

	for ( var dependency of exampleDependencies ) {

		imports += `\nimport { ${dependency.name} } from "../${dependency.module}.js";`;

	}

	// exports

172
	var exports = `export { ${classNames.join( ", " )} };\n`;
M
Mr.doob 已提交
173

174
	var output = contents.replace( '_IMPORTS_', keys ? imports : '' ) + '\n' + exports;
M
Mr.doob 已提交
175 176 177 178 179

	// console.log( output );

	fs.writeFileSync( dstFolder + path, output, 'utf-8' );

M
Mugen87 已提交
180
}