build.py 10.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 33 34 35 36 37 38
'animation/AnimationHandler.js',
'animation/Animation.js',
'cameras/Camera.js',
'lights/Light.js',
'lights/AmbientLight.js',
'lights/DirectionalLight.js',
'lights/PointLight.js',
39
'materials/Material.js',
M
Mr.doob 已提交
40
'materials/Mappings.js',
41 42 43 44 45 46 47 48 49 50 51 52
'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',
'materials/ParticleCircleMaterial.js',
'materials/ParticleDOMMaterial.js',
'materials/Texture.js',
53
'materials/RenderTarget.js',
54
'materials/Uniforms.js',
55 56 57 58 59 60 61
'objects/Particle.js',
'objects/ParticleSystem.js',
'objects/Line.js',
'objects/Mesh.js',
'objects/Bone.js',
'objects/SkinnedMesh.js',
'objects/Ribbon.js',
M
Mr.doob 已提交
62
'objects/Sound.js',
63
'objects/LOD.js',
64
'scenes/Scene.js',
A
alteredq 已提交
65
'scenes/Fog.js',
A
alteredq 已提交
66
'scenes/FogExp2.js',
67 68 69 70
'renderers/Projector.js',
'renderers/DOMRenderer.js',
'renderers/CanvasRenderer.js',
'renderers/SVGRenderer.js',
71
'renderers/WebGLShaders.js',
72
'renderers/WebGLRenderer.js',
A
alteredq 已提交
73
'renderers/SoundRenderer.js',
74
'renderers/renderables/RenderableObject.js',
75 76 77 78 79
'renderers/renderables/RenderableFace3.js',
'renderers/renderables/RenderableParticle.js',
'renderers/renderables/RenderableLine.js'
]

80
EXTRAS_FILES = [
81 82 83 84 85 86 87
'extras/GeometryUtils.js',
'extras/ImageUtils.js',
'extras/SceneUtils.js',
'extras/ShaderUtils.js',
'extras/primitives/Cube.js',
'extras/primitives/Cylinder.js',
'extras/primitives/Plane.js',
A
alteredq 已提交
88 89
'extras/primitives/Sphere.js',
'extras/primitives/Torus.js',
M
Mr.doob 已提交
90
'extras/primitives/Icosahedron.js',
A
alteredq 已提交
91
'extras/primitives/LathedObject.js',
A
alteredq 已提交
92
'extras/objects/MarchingCubes.js',
93 94
'extras/cameras/QuakeCamera.js',
'extras/cameras/PathCamera.js',
95 96 97
'extras/io/Loader.js'
]

98
CANVAS_FILES = [
99 100 101 102 103 104 105 106 107
'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',
108
'core/Object3D.js',
109
'core/Quaternion.js',
110 111 112 113
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
114
'core/Geometry.js',
115
'cameras/Camera.js',
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
'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',
'materials/ParticleCircleMaterial.js',
'materials/Texture.js',
132
'objects/Particle.js',
133 134 135 136
'objects/Line.js',
'objects/Mesh.js',
'objects/Bone.js',
'objects/Sound.js',
137 138
'scenes/Scene.js',
'renderers/Projector.js',
139 140 141 142
'renderers/CanvasRenderer.js',
'renderers/SoundRenderer.js',
'renderers/renderables/RenderableObject.js',
'renderers/renderables/RenderableFace3.js',
143
'renderers/renderables/RenderableParticle.js',
144
'renderers/renderables/RenderableLine.js'
145 146
]

147
DOM_FILES = [
148 149 150 151 152 153 154 155 156
'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',
157
'core/Object3D.js',
158
'core/Quaternion.js',
159 160 161 162 163
'core/Vertex.js',
'core/Face3.js',
'core/Face4.js',
'core/UV.js',
'cameras/Camera.js',
164
'materials/ParticleDOMMaterial.js',
165
'objects/Particle.js',
166 167
'objects/Bone.js',
'objects/Sound.js',
168 169
'scenes/Scene.js',
'renderers/Projector.js',
170 171
'renderers/DOMRenderer.js',
'renderers/SoundRenderer.js',
172 173 174
'renderers/renderables/RenderableParticle.js',
]

175
SVG_FILES = [
176 177 178 179 180 181 182 183 184
'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',
185
'core/Object3D.js',
186
'core/Quaternion.js',
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
'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',
'materials/ParticleCircleMaterial.js',
207 208 209
'objects/Particle.js',
'objects/Line.js',
'objects/Mesh.js',
210 211
'objects/Bone.js',
'objects/Sound.js',
212 213
'scenes/Scene.js',
'renderers/Projector.js',
214 215
'renderers/SVGRenderer.js',
'renderers/SoundRenderer.js',
216
'renderers/renderables/RenderableObject.js',
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
'renderers/renderables/RenderableFace3.js',
'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',
232
'core/Object3D.js',
233
'core/Quaternion.js',
234 235 236 237 238 239 240 241 242 243 244
'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',
M
Mr.doob 已提交
245
'materials/Mappings.js',
246 247 248 249 250 251 252 253 254 255 256
'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',
'materials/ParticleCircleMaterial.js',
'materials/Texture.js',
257
'materials/RenderTarget.js',
258
'materials/Uniforms.js',
259 260 261 262
'objects/Particle.js',
'objects/ParticleSystem.js',
'objects/Line.js',
'objects/Mesh.js',
263
'objects/Bone.js',
264 265
'objects/SkinnedMesh.js',
'objects/Ribbon.js',
266
'objects/Sound.js',
267
'objects/LOD.js',
268
'scenes/Scene.js',
A
alteredq 已提交
269
'scenes/Fog.js',
A
alteredq 已提交
270
'scenes/FogExp2.js',
271
'renderers/SoundRenderer.js',
272
'renderers/WebGLShaders.js',
273 274
'renderers/WebGLRenderer.js',
]
S
sole 已提交
275 276 277

def merge(files):

278
	buffer = []
S
sole 已提交
279

280 281
	for filename in files:
		with open(os.path.join('..', 'src', filename), 'r') as f:
282
			buffer.append(f.read())
283

284
	return "".join(buffer)
S
sole 已提交
285 286 287


def output(text, filename):
288 289 290

	with open(os.path.join('..', 'build', filename), 'w') as f:
		f.write(text)
S
sole 已提交
291 292 293 294


def compress(text):

295 296 297
	in_tuple = tempfile.mkstemp()
	with os.fdopen(in_tuple[0], 'w') as handle:
		handle.write(text)
S
sole 已提交
298

299
	# uncomment to get concatenated JS if you can't figure out Closure compiler errors :|
300

301 302 303
	#f = open( "debug.js" , "w" )
	#f.write(text)
	#f.close()
304

305
	out_tuple = tempfile.mkstemp()
M
Mr.doob 已提交
306
	# os.system("java -jar yuicompressor-2.4.2.jar %s --type js -o %s --charset utf-8 -v" % (in_tuple[1], out_tuple[1]))
307
	os.system("java -jar compiler.jar --language_in=ECMASCRIPT5 --js %s --js_output_file %s" % (in_tuple[1], out_tuple[1]))
S
sole 已提交
308

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

312 313 314 315
	os.unlink(in_tuple[1])
	os.unlink(out_tuple[1])

	return compressed
S
sole 已提交
316 317


318
def addHeader(text, endFilename):
M
Mr.doob 已提交
319
	with open(os.path.join('..', 'REVISION'), 'r') as handle:
320
		revision = handle.read().rstrip()
S
sole 已提交
321

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


325 326 327 328 329 330 331 332 333 334 335 336
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 已提交
337
def buildLib(files, debug, filename):
S
sole 已提交
338

339 340 341 342
	text = merge(files)

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

M
Mr.doob 已提交
345 346 347 348 349 350
	if filename == "Three":
		folder = ''
	else:
		folder = 'custom/'

	filename = filename + '.js'
351

M
Mr.doob 已提交
352
	print "=" * 40
M
Mr.doob 已提交
353
	print "Compiling", filename
M
Mr.doob 已提交
354 355
	print "=" * 40

M
Mr.doob 已提交
356
	output(addHeader(compress(text), filename), folder + filename)
S
sole 已提交
357 358


M
Mr.doob 已提交
359
def buildIncludes(files, filename):
360

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

M
Mr.doob 已提交
364
	output(text, filename + '.js')
365 366


367
def parse_args():
S
sole 已提交
368

369 370
	if ap:
		parser = argparse.ArgumentParser(description='Build and compress Three.js')
371
		parser.add_argument('--includes', help='Build includes.js', action='store_true')
M
Mr.doob 已提交
372
		parser.add_argument('--common', help='Build Three.js', action='store_const', const=True)
M
Mr.doob 已提交
373
		parser.add_argument('--extras', help='Build ThreeExtras.js', action='store_const', const=True)
374 375 376 377
		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')
378
		parser.add_argument('--debug', help='Generate debug versions', action='store_const', const=True, default=False)
379
		parser.add_argument('--all', help='Build all Three.js versions', action='store_true')
S
sole 已提交
380

381
		args = parser.parse_args()
S
sole 已提交
382

383 384
	else:
		parser = optparse.OptionParser(description='Build and compress Three.js')
385
		parser.add_option('--includes', dest='includes', help='Build includes.js', action='store_true')
M
Mr.doob 已提交
386
		parser.add_option('--common', dest='common', help='Build Three.js', action='store_const', const=True)
M
Mr.doob 已提交
387
		parser.add_option('--extras', dest='extras', help='Build ThreeExtras.js', action='store_const', const=True)
388 389 390 391
		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')
392
		parser.add_option('--debug', dest='debug', help='Generate debug versions', action='store_const', const=True, default=False)
393
		parser.add_option('--all', dest='all', help='Build all Three.js versions', action='store_true')
S
sole 已提交
394

395
		args, remainder = parser.parse_args()
S
sole 已提交
396

397 398 399 400 401
	# If no arguments have been passed, show the help message and exit
	if len(sys.argv) == 1:
		parser.print_help()
		sys.exit(1)

402
	return args
S
sole 已提交
403 404 405 406


def main(argv=None):

407
	args = parse_args()
408 409
	debug = args.debug

410
	config = [
A
alteredq 已提交
411
	['Three', 'includes', COMMON_FILES + EXTRAS_FILES, args.common],
412
	['ThreeCanvas', 'includes_canvas', CANVAS_FILES, args.canvas],
M
Mr.doob 已提交
413 414 415 416
	['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]
417
	]
418

419 420 421 422 423
	for fname_lib, fname_inc, files, enabled in config:
		if enabled or args.all:
			buildLib(files, debug, fname_lib)
			if args.includes:
				buildIncludes(files, fname_inc)
S
sole 已提交
424 425

if __name__ == "__main__":
426
	main()
S
sole 已提交
427