build.py 11.9 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',
M
Mr.doob 已提交
92 93
'extras/cameras/QuakeCamera.js',
'extras/cameras/PathCamera.js',
94
'extras/cameras/FlyCamera.js',
M
Mikael Emtinger 已提交
95
'extras/cameras/RollCamera.js',
96
'extras/cameras/TrackballCamera.js',
M
Mr.doob 已提交
97 98 99 100 101 102 103 104 105
'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 已提交
106
'extras/io/Loader.js',
M
Mr.doob 已提交
107
'extras/io/JSONLoader.js',
M
Mr.doob 已提交
108
'extras/io/BinaryLoader.js',
109
'extras/io/SceneLoader.js',
M
Mr.doob 已提交
110
'extras/objects/MarchingCubes.js',
111
'extras/objects/Trident.js',
M
Mr.doob 已提交
112
'extras/physics/Collisions.js',
M
Mr.doob 已提交
113
'extras/physics/CollisionUtils.js',
A
alteredq 已提交
114 115
'extras/renderers/AnaglyphWebGLRenderer.js',
'extras/renderers/CrosseyedWebGLRenderer.js'
116 117
]

118
CANVAS_FILES = [
119 120 121 122 123 124 125 126 127
'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',
128
'core/Object3D.js',
129
'core/Quaternion.js',
130 131 132 133
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
134
'core/Geometry.js',
135
'cameras/Camera.js',
136 137 138 139 140 141 142 143 144 145 146 147 148 149
'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',
150
'materials/ParticleCanvasMaterial.js',
151
'materials/Texture.js',
152
'objects/Particle.js',
153 154 155 156
'objects/Line.js',
'objects/Mesh.js',
'objects/Bone.js',
'objects/Sound.js',
157 158
'scenes/Scene.js',
'renderers/Projector.js',
159 160
'renderers/CanvasRenderer.js',
'renderers/SoundRenderer.js',
M
Mr.doob 已提交
161
'renderers/renderables/RenderableVertex.js',
162
'renderers/renderables/RenderableFace3.js',
163
'renderers/renderables/RenderableFace4.js',
M
Mr.doob 已提交
164
'renderers/renderables/RenderableObject.js',
165
'renderers/renderables/RenderableParticle.js',
166
'renderers/renderables/RenderableLine.js'
167 168
]

169
DOM_FILES = [
170 171 172 173 174 175 176 177 178
'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',
179
'core/Object3D.js',
180
'core/Quaternion.js',
181 182 183 184 185
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
'cameras/Camera.js',
186
'materials/ParticleDOMMaterial.js',
187
'objects/Particle.js',
188 189
'objects/Bone.js',
'objects/Sound.js',
190 191
'scenes/Scene.js',
'renderers/Projector.js',
192 193
'renderers/DOMRenderer.js',
'renderers/SoundRenderer.js',
194
'renderers/renderables/RenderableParticle.js'
195 196
]

197
SVG_FILES = [
198 199 200 201 202 203 204 205 206
'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',
207
'core/Object3D.js',
208
'core/Quaternion.js',
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
'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',
228 229 230
'objects/Particle.js',
'objects/Line.js',
'objects/Mesh.js',
231 232
'objects/Bone.js',
'objects/Sound.js',
233 234
'scenes/Scene.js',
'renderers/Projector.js',
235 236
'renderers/SVGRenderer.js',
'renderers/SoundRenderer.js',
M
Mr.doob 已提交
237
'renderers/renderables/RenderableVertex.js',
238
'renderers/renderables/RenderableFace3.js',
239
'renderers/renderables/RenderableFace4.js',
M
Mr.doob 已提交
240
'renderers/renderables/RenderableObject.js',
241 242 243 244 245 246 247 248 249 250 251 252 253 254
'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',
255
'core/Object3D.js',
256
'core/Quaternion.js',
257 258 259 260 261
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
'core/Geometry.js',
262 263
'core/Spline.js',
'core/Edge.js',
264 265 266 267 268
'cameras/Camera.js',
'lights/Light.js',
'lights/AmbientLight.js',
'lights/DirectionalLight.js',
'lights/PointLight.js',
269
'lights/LensFlare.js',
270
'materials/Material.js',
M
Mr.doob 已提交
271
'materials/Mappings.js',
272 273 274 275 276 277 278 279 280
'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 已提交
281
'materials/ShadowVolumeDynamicMaterial.js',
282
'materials/Texture.js',
283
'objects/Particle.js',
284 285 286
'objects/ParticleSystem.js',
'objects/Line.js',
'objects/Mesh.js',
287
'objects/Bone.js',
288 289
'objects/SkinnedMesh.js',
'objects/Ribbon.js',
290
'objects/Sound.js',
291
'objects/LOD.js',
M
Mr.doob 已提交
292
'objects/ShadowVolume.js',
293
'objects/Sprite.js',
294
'scenes/Scene.js',
A
alteredq 已提交
295
'scenes/Fog.js',
A
alteredq 已提交
296
'scenes/FogExp2.js',
297
'renderers/Projector.js',
298
'renderers/SoundRenderer.js',
299
'renderers/WebGLShaders.js',
300 301
'renderers/WebGLRenderer.js',
'renderers/WebGLRenderTarget.js'
302
]
S
sole 已提交
303 304 305

def merge(files):

306
	buffer = []
S
sole 已提交
307

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

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


def output(text, filename):
316 317 318

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


def compress(text):

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

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

	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 已提交
330

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

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

	return compressed
S
sole 已提交
338 339


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

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


347 348 349 350 351 352 353 354 355 356 357 358
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 已提交
359
def buildLib(files, debug, minified, filename):
S
sole 已提交
360

361 362 363 364
	text = merge(files)

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

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

	filename = filename + '.js'
373

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

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

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


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

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

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


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

394 395
	if ap:
		parser = argparse.ArgumentParser(description='Build and compress Three.js')
396
		parser.add_argument('--includes', help='Build includes.js', action='store_true')
M
Mr.doob 已提交
397
		parser.add_argument('--common', help='Build Three.js', action='store_const', const=True)
M
Mr.doob 已提交
398
		parser.add_argument('--extras', help='Build ThreeExtras.js', action='store_const', const=True)
399 400 401 402
		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')
403
		parser.add_argument('--debug', help='Generate debug versions', action='store_const', const=True, default=False)
M
Mr.doob 已提交
404
		parser.add_argument('--minified', help='Generate minified versions', action='store_const', const=True, default=False)
405
		parser.add_argument('--all', help='Build all Three.js versions', action='store_true')
S
sole 已提交
406

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

409 410
	else:
		parser = optparse.OptionParser(description='Build and compress Three.js')
411
		parser.add_option('--includes', dest='includes', help='Build includes.js', action='store_true')
M
Mr.doob 已提交
412
		parser.add_option('--common', dest='common', help='Build Three.js', action='store_const', const=True)
M
Mr.doob 已提交
413
		parser.add_option('--extras', dest='extras', help='Build ThreeExtras.js', action='store_const', const=True)
414 415 416 417
		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')
418
		parser.add_option('--debug', dest='debug', help='Generate debug versions', action='store_const', const=True, default=False)
M
Mr.doob 已提交
419
		parser.add_option('--minified', help='Generate minified versions', action='store_const', const=True, default=False)
420
		parser.add_option('--all', dest='all', help='Build all Three.js versions', action='store_true')
S
sole 已提交
421

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

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

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


def main(argv=None):

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

438
	config = [
A
alteredq 已提交
439
	['Three', 'includes', COMMON_FILES + EXTRAS_FILES, args.common],
440
	['ThreeCanvas', 'includes_canvas', CANVAS_FILES, args.canvas],
M
Mr.doob 已提交
441 442 443 444
	['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]
445
	]
446

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

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