build.py 12.0 KB
Newer Older
S
sole 已提交
1 2
#!/usr/bin/env python

3
try:
4 5
	import argparse
	ap = 1
6
except ImportError:
7 8 9
	import optparse
	ap = 0

S
sole 已提交
10 11
import os
import tempfile
12
import sys
S
sole 已提交
13

14 15 16 17 18 19 20 21 22 23
COMMON_FILES = [
'Three.js',
'core/Color.js',
'core/Vector2.js',
'core/Vector3.js',
'core/Vector4.js',
'core/Ray.js',
'core/Rectangle.js',
'core/Matrix3.js',
'core/Matrix4.js',
24
'core/Object3D.js',
25
'core/Quaternion.js',
26 27 28 29 30
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
'core/Geometry.js',
31
'core/Spline.js',
32
'core/Edge.js',
33 34 35 36 37
'cameras/Camera.js',
'lights/Light.js',
'lights/AmbientLight.js',
'lights/DirectionalLight.js',
'lights/PointLight.js',
38
'lights/LensFlare.js',
39
'materials/Material.js',
M
Mr.doob 已提交
40
'materials/Mappings.js',
41 42 43 44 45 46 47 48
'materials/LineBasicMaterial.js',
'materials/MeshBasicMaterial.js',
'materials/MeshLambertMaterial.js',
'materials/MeshPhongMaterial.js',
'materials/MeshDepthMaterial.js',
'materials/MeshNormalMaterial.js',
'materials/MeshFaceMaterial.js',
'materials/MeshShaderMaterial.js',
M
Mikael Emtinger 已提交
49
'materials/ShadowVolumeDynamicMaterial.js',
50
'materials/ParticleBasicMaterial.js',
51
'materials/ParticleCanvasMaterial.js',
52 53
'materials/ParticleDOMMaterial.js',
'materials/Texture.js',
54 55 56 57 58 59 60
'objects/Particle.js',
'objects/ParticleSystem.js',
'objects/Line.js',
'objects/Mesh.js',
'objects/Bone.js',
'objects/SkinnedMesh.js',
'objects/Ribbon.js',
M
Mr.doob 已提交
61
'objects/Sound.js',
62
'objects/LOD.js',
M
Mikael Emtinger 已提交
63
'objects/ShadowVolume.js',
64
'objects/Sprite.js',
65
'scenes/Scene.js',
A
alteredq 已提交
66
'scenes/Fog.js',
A
alteredq 已提交
67
'scenes/FogExp2.js',
68 69 70 71
'renderers/Projector.js',
'renderers/DOMRenderer.js',
'renderers/CanvasRenderer.js',
'renderers/SVGRenderer.js',
72
'renderers/WebGLShaders.js',
73
'renderers/WebGLRenderer.js',
74
'renderers/WebGLRenderTarget.js',
A
alteredq 已提交
75
'renderers/SoundRenderer.js',
76
'renderers/renderables/RenderableVertex.js',
77
'renderers/renderables/RenderableFace3.js',
78
'renderers/renderables/RenderableFace4.js',
79
'renderers/renderables/RenderableObject.js',
80
'renderers/renderables/RenderableParticle.js',
M
Mr.doob 已提交
81
'renderers/renderables/RenderableLine.js'
82 83
]

84
EXTRAS_FILES = [
85
'extras/ColorUtils.js',
86 87 88 89
'extras/GeometryUtils.js',
'extras/ImageUtils.js',
'extras/SceneUtils.js',
'extras/ShaderUtils.js',
90 91
'extras/animation/AnimationHandler.js',
'extras/animation/Animation.js',
92
'extras/cameras/FirstPersonCamera.js',
M
Mr.doob 已提交
93
'extras/cameras/PathCamera.js',
94
'extras/cameras/FlyCamera.js',
M
Mikael Emtinger 已提交
95
'extras/cameras/RollCamera.js',
96
'extras/cameras/TrackballCamera.js',
C
Chris Killpack 已提交
97
'extras/cameras/QuakeCamera.js',
M
Mr.doob 已提交
98 99 100 101 102 103 104 105 106
'extras/geometries/CubeGeometry.js',
'extras/geometries/CylinderGeometry.js',
'extras/geometries/IcosahedronGeometry.js',
'extras/geometries/LatheGeometry.js',
'extras/geometries/PlaneGeometry.js',
'extras/geometries/SphereGeometry.js',
'extras/geometries/TextGeometry.js',
'extras/geometries/TorusGeometry.js',
'extras/geometries/TorusKnotGeometry.js',
M
Mr.doob 已提交
107
'extras/io/Loader.js',
M
Mr.doob 已提交
108
'extras/io/JSONLoader.js',
M
Mr.doob 已提交
109
'extras/io/BinaryLoader.js',
110
'extras/io/SceneLoader.js',
M
Mr.doob 已提交
111
'extras/objects/MarchingCubes.js',
112
'extras/objects/Trident.js',
M
Mr.doob 已提交
113
'extras/physics/Collisions.js',
M
Mr.doob 已提交
114
'extras/physics/CollisionUtils.js',
A
alteredq 已提交
115 116
'extras/renderers/AnaglyphWebGLRenderer.js',
'extras/renderers/CrosseyedWebGLRenderer.js'
117 118
]

119
CANVAS_FILES = [
120 121 122 123 124 125 126 127 128
'Three.js',
'core/Color.js',
'core/Vector2.js',
'core/Vector3.js',
'core/Vector4.js',
'core/Ray.js',
'core/Rectangle.js',
'core/Matrix3.js',
'core/Matrix4.js',
129
'core/Object3D.js',
130
'core/Quaternion.js',
131 132 133 134
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
135
'core/Geometry.js',
136
'cameras/Camera.js',
137 138 139 140 141 142 143 144 145 146 147 148 149 150
'lights/Light.js',
'lights/AmbientLight.js',
'lights/DirectionalLight.js',
'lights/PointLight.js',
'materials/Material.js',
'materials/Mappings.js',
'materials/LineBasicMaterial.js',
'materials/MeshBasicMaterial.js',
'materials/MeshLambertMaterial.js',
'materials/MeshPhongMaterial.js',
'materials/MeshDepthMaterial.js',
'materials/MeshNormalMaterial.js',
'materials/MeshFaceMaterial.js',
'materials/ParticleBasicMaterial.js',
151
'materials/ParticleCanvasMaterial.js',
152
'materials/Texture.js',
153
'objects/Particle.js',
154 155 156 157
'objects/Line.js',
'objects/Mesh.js',
'objects/Bone.js',
'objects/Sound.js',
158 159
'scenes/Scene.js',
'renderers/Projector.js',
160 161
'renderers/CanvasRenderer.js',
'renderers/SoundRenderer.js',
M
Mr.doob 已提交
162
'renderers/renderables/RenderableVertex.js',
163
'renderers/renderables/RenderableFace3.js',
164
'renderers/renderables/RenderableFace4.js',
M
Mr.doob 已提交
165
'renderers/renderables/RenderableObject.js',
166
'renderers/renderables/RenderableParticle.js',
167
'renderers/renderables/RenderableLine.js'
168 169
]

170
DOM_FILES = [
171 172 173 174 175 176 177 178 179
'Three.js',
'core/Color.js',
'core/Vector2.js',
'core/Vector3.js',
'core/Vector4.js',
'core/Ray.js',
'core/Rectangle.js',
'core/Matrix3.js',
'core/Matrix4.js',
180
'core/Object3D.js',
181
'core/Quaternion.js',
182 183 184 185 186
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
'cameras/Camera.js',
187
'materials/ParticleDOMMaterial.js',
188
'objects/Particle.js',
189 190
'objects/Bone.js',
'objects/Sound.js',
191 192
'scenes/Scene.js',
'renderers/Projector.js',
193 194
'renderers/DOMRenderer.js',
'renderers/SoundRenderer.js',
195
'renderers/renderables/RenderableParticle.js'
196 197
]

198
SVG_FILES = [
199 200 201 202 203 204 205 206 207
'Three.js',
'core/Color.js',
'core/Vector2.js',
'core/Vector3.js',
'core/Vector4.js',
'core/Ray.js',
'core/Rectangle.js',
'core/Matrix3.js',
'core/Matrix4.js',
208
'core/Object3D.js',
209
'core/Quaternion.js',
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
'core/Geometry.js',
'cameras/Camera.js',
'lights/Light.js',
'lights/AmbientLight.js',
'lights/DirectionalLight.js',
'lights/PointLight.js',
'materials/Material.js',
'materials/LineBasicMaterial.js',
'materials/MeshBasicMaterial.js',
'materials/MeshLambertMaterial.js',
'materials/MeshPhongMaterial.js',
'materials/MeshDepthMaterial.js',
'materials/MeshNormalMaterial.js',
'materials/MeshFaceMaterial.js',
'materials/ParticleBasicMaterial.js',
229 230 231
'objects/Particle.js',
'objects/Line.js',
'objects/Mesh.js',
232 233
'objects/Bone.js',
'objects/Sound.js',
234 235
'scenes/Scene.js',
'renderers/Projector.js',
236 237
'renderers/SVGRenderer.js',
'renderers/SoundRenderer.js',
M
Mr.doob 已提交
238
'renderers/renderables/RenderableVertex.js',
239
'renderers/renderables/RenderableFace3.js',
240
'renderers/renderables/RenderableFace4.js',
M
Mr.doob 已提交
241
'renderers/renderables/RenderableObject.js',
242 243 244 245 246 247 248 249 250 251 252 253 254 255
'renderers/renderables/RenderableParticle.js',
'renderers/renderables/RenderableLine.js'
]

WEBGL_FILES = [
'Three.js',
'core/Color.js',
'core/Vector2.js',
'core/Vector3.js',
'core/Vector4.js',
'core/Ray.js',
'core/Rectangle.js',
'core/Matrix3.js',
'core/Matrix4.js',
256
'core/Object3D.js',
257
'core/Quaternion.js',
258 259 260 261 262
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
'core/Geometry.js',
263 264
'core/Spline.js',
'core/Edge.js',
265 266 267 268 269
'cameras/Camera.js',
'lights/Light.js',
'lights/AmbientLight.js',
'lights/DirectionalLight.js',
'lights/PointLight.js',
270
'lights/LensFlare.js',
271
'materials/Material.js',
M
Mr.doob 已提交
272
'materials/Mappings.js',
273 274 275 276 277 278 279 280 281
'materials/LineBasicMaterial.js',
'materials/MeshBasicMaterial.js',
'materials/MeshLambertMaterial.js',
'materials/MeshPhongMaterial.js',
'materials/MeshDepthMaterial.js',
'materials/MeshNormalMaterial.js',
'materials/MeshFaceMaterial.js',
'materials/MeshShaderMaterial.js',
'materials/ParticleBasicMaterial.js',
M
Mr.doob 已提交
282
'materials/ShadowVolumeDynamicMaterial.js',
283
'materials/Texture.js',
284
'objects/Particle.js',
285 286 287
'objects/ParticleSystem.js',
'objects/Line.js',
'objects/Mesh.js',
288
'objects/Bone.js',
289 290
'objects/SkinnedMesh.js',
'objects/Ribbon.js',
291
'objects/Sound.js',
292
'objects/LOD.js',
M
Mr.doob 已提交
293
'objects/ShadowVolume.js',
294
'objects/Sprite.js',
295
'scenes/Scene.js',
A
alteredq 已提交
296
'scenes/Fog.js',
A
alteredq 已提交
297
'scenes/FogExp2.js',
298
'renderers/Projector.js',
299
'renderers/SoundRenderer.js',
300
'renderers/WebGLShaders.js',
301 302
'renderers/WebGLRenderer.js',
'renderers/WebGLRenderTarget.js'
303
]
S
sole 已提交
304 305 306

def merge(files):

307
	buffer = []
S
sole 已提交
308

309 310
	for filename in files:
		with open(os.path.join('..', 'src', filename), 'r') as f:
311
			buffer.append(f.read())
312

313
	return "".join(buffer)
S
sole 已提交
314 315 316


def output(text, filename):
317 318 319

	with open(os.path.join('..', 'build', filename), 'w') as f:
		f.write(text)
S
sole 已提交
320 321 322 323


def compress(text):

324 325 326
	in_tuple = tempfile.mkstemp()
	with os.fdopen(in_tuple[0], 'w') as handle:
		handle.write(text)
S
sole 已提交
327

328
	out_tuple = tempfile.mkstemp()
M
Mr.doob 已提交
329 330

	os.system("java -jar compiler/compiler.jar --language_in=ECMASCRIPT5_STRICT --js %s --js_output_file %s" % (in_tuple[1], out_tuple[1]))
S
sole 已提交
331

332 333
	with os.fdopen(out_tuple[0], 'r') as handle:
		compressed = handle.read()
S
sole 已提交
334

335 336 337 338
	os.unlink(in_tuple[1])
	os.unlink(out_tuple[1])

	return compressed
S
sole 已提交
339 340


341
def addHeader(text, endFilename):
M
Mr.doob 已提交
342
	with open(os.path.join('..', 'REVISION'), 'r') as handle:
343
		revision = handle.read().rstrip()
S
sole 已提交
344

345
	return ("// %s r%s - http://github.com/mrdoob/three.js\n" % (endFilename, revision)) + text
S
sole 已提交
346 347


348 349 350 351 352 353 354 355 356 357 358 359
def makeDebug(text):
	position = 0
	while True:
		position = text.find("/* DEBUG", position)
		if position == -1:
			break
		text = text[0:position] + text[position+8:]
		position = text.find("*/", position)
		text = text[0:position] + text[position+2:]
	return text


M
Mr.doob 已提交
360
def buildLib(files, debug, minified, filename):
S
sole 已提交
361

362 363 364 365
	text = merge(files)

	if debug:
		text = makeDebug(text)
M
Mr.doob 已提交
366
		filename = filename + 'Debug'
M
Mr.doob 已提交
367

M
Mr.doob 已提交
368 369 370 371 372 373
	if filename == "Three":
		folder = ''
	else:
		folder = 'custom/'

	filename = filename + '.js'
374

M
Mr.doob 已提交
375
	print "=" * 40
M
Mr.doob 已提交
376
	print "Compiling", filename
M
Mr.doob 已提交
377 378
	print "=" * 40

M
Mr.doob 已提交
379
	if minified:
380
		text = compress(text)
M
Mr.doob 已提交
381

382
	output(addHeader(text, filename), folder + filename)
S
sole 已提交
383 384


M
Mr.doob 已提交
385
def buildIncludes(files, filename):
386

387 388
	template = '\t\t<script type="text/javascript" src="../src/%s"></script>'
	text = "\n".join(template % f for f in files)
389

M
Mr.doob 已提交
390
	output(text, filename + '.js')
391 392


393
def parse_args():
S
sole 已提交
394

395 396
	if ap:
		parser = argparse.ArgumentParser(description='Build and compress Three.js')
397
		parser.add_argument('--includes', help='Build includes.js', action='store_true')
M
Mr.doob 已提交
398
		parser.add_argument('--common', help='Build Three.js', action='store_const', const=True)
M
Mr.doob 已提交
399
		parser.add_argument('--extras', help='Build ThreeExtras.js', action='store_const', const=True)
400 401 402 403
		parser.add_argument('--canvas', help='Build ThreeCanvas.js', action='store_true')
		parser.add_argument('--webgl', help='Build ThreeWebGL.js', action='store_true')
		parser.add_argument('--svg', help='Build ThreeSVG.js', action='store_true')
		parser.add_argument('--dom', help='Build ThreeDOM.js', action='store_true')
404
		parser.add_argument('--debug', help='Generate debug versions', action='store_const', const=True, default=False)
M
Mr.doob 已提交
405
		parser.add_argument('--minified', help='Generate minified versions', action='store_const', const=True, default=False)
406
		parser.add_argument('--all', help='Build all Three.js versions', action='store_true')
S
sole 已提交
407

408
		args = parser.parse_args()
S
sole 已提交
409

410 411
	else:
		parser = optparse.OptionParser(description='Build and compress Three.js')
412
		parser.add_option('--includes', dest='includes', help='Build includes.js', action='store_true')
M
Mr.doob 已提交
413
		parser.add_option('--common', dest='common', help='Build Three.js', action='store_const', const=True)
M
Mr.doob 已提交
414
		parser.add_option('--extras', dest='extras', help='Build ThreeExtras.js', action='store_const', const=True)
415 416 417 418
		parser.add_option('--canvas', dest='canvas', help='Build ThreeCanvas.js', action='store_true')
		parser.add_option('--webgl', dest='webgl', help='Build ThreeWebGL.js', action='store_true')
		parser.add_option('--svg', dest='svg', help='Build ThreeSVG.js', action='store_true')
		parser.add_option('--dom', dest='dom', help='Build ThreeDOM.js', action='store_true')
419
		parser.add_option('--debug', dest='debug', help='Generate debug versions', action='store_const', const=True, default=False)
M
Mr.doob 已提交
420
		parser.add_option('--minified', help='Generate minified versions', action='store_const', const=True, default=False)
421
		parser.add_option('--all', dest='all', help='Build all Three.js versions', action='store_true')
S
sole 已提交
422

423
		args, remainder = parser.parse_args()
S
sole 已提交
424

425 426 427 428 429
	# If no arguments have been passed, show the help message and exit
	if len(sys.argv) == 1:
		parser.print_help()
		sys.exit(1)

430
	return args
S
sole 已提交
431 432 433 434


def main(argv=None):

435
	args = parse_args()
436
	debug = args.debug
M
Mr.doob 已提交
437
	minified = args.minified
438

439
	config = [
A
alteredq 已提交
440
	['Three', 'includes', COMMON_FILES + EXTRAS_FILES, args.common],
441
	['ThreeCanvas', 'includes_canvas', CANVAS_FILES, args.canvas],
M
Mr.doob 已提交
442 443 444 445
	['ThreeDOM', 'includes_dom', DOM_FILES, args.dom],
	['ThreeSVG', 'includes_svg', SVG_FILES, args.svg],
	['ThreeWebGL', 'includes_webgl', WEBGL_FILES, args.webgl],
	['ThreeExtras', 'includes_extras', EXTRAS_FILES, args.extras]
446
	]
447

448 449
	for fname_lib, fname_inc, files, enabled in config:
		if enabled or args.all:
M
Mr.doob 已提交
450
			buildLib(files, debug, minified, fname_lib)
451 452
			if args.includes:
				buildIncludes(files, fname_inc)
S
sole 已提交
453 454

if __name__ == "__main__":
455
	main()
S
sole 已提交
456