index.html 10.9 KB
Newer Older
M
Mr.doob 已提交
1 2
<!DOCTYPE html>
<html lang="en">
3
	<head>
M
Mr.doob 已提交
4
		<title>three.js editor</title>
5 6
		<style>
			body {
M
Mr.doob 已提交
7 8
				font-family: Arial, sans-serif;
				font-size: 14px;
9 10 11 12
				margin: 0;
				overflow: hidden;
			}

M
Mr.doob 已提交
13 14 15
			hr {
				border: 0px;
				border-top: 1px solid #ccc;
16
			}
M
Mr.doob 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

			.menubar {
				background-color: #eee;
				padding: 0px;
				margin: 0px;
			}

				.menubar .menu {
					float: left;
					width: 50px;
					cursor: pointer;
				}

					.menubar .menu .options {
						display: none;
M
Mr.doob 已提交
32
						padding: 5px 0px;
M
Mr.doob 已提交
33
						background-color: #fff;
M
Mr.doob 已提交
34
						width: 140px;
M
Mr.doob 已提交
35 36 37 38 39 40
					}

					.menubar .menu:hover .options {
						display: block;
					}

M
Mr.doob 已提交
41 42 43 44
						.menubar .menu .options hr {
							border-color: #ddd;
						}

M
Mr.doob 已提交
45 46 47 48 49
						.menubar .menu .options .option {
							color: #666;
							background-color: transparent;
							padding: 5px 10px;
							margin: 0px !important;
M
Mr.doob 已提交
50 51
						}

M
Mr.doob 已提交
52
							.menubar .menu .options .option:hover {
M
Mr.doob 已提交
53 54
								color: #fff;
								background-color: #08f;
M
Mr.doob 已提交
55 56
							}

57 58 59 60 61 62 63 64 65 66
			.sidebar {
				width: 300px;
				background-color: #eee;
				overflow: auto;
			}

				.sidebar .Panel {
					margin-bottom: 10px;
				}

67 68 69 70
		</style>
	</head>
	<body>

M
Mr.doob 已提交
71
		<script src="../build/three.min.js"></script>
M
Mr.doob 已提交
72
		<script src="../examples/js/controls/TrackballControls.js"></script>
73
		<script src="../examples/js/loaders/BinaryLoader.js"></script>
M
Mr.doob 已提交
74 75 76 77 78
		<script src="../examples/js/loaders/ColladaLoader.js"></script>
		<script src="../examples/js/loaders/OBJLoader.js"></script>
		<script src="../examples/js/loaders/STLLoader.js"></script>
		<script src="../examples/js/loaders/UTF8Loader.js"></script>
		<script src="../examples/js/loaders/VTKLoader.js"></script>
M
Mr.doob 已提交
79 80 81
		<script src="../examples/js/loaders/ctm/lzma.js"></script>
		<script src="../examples/js/loaders/ctm/ctm.js"></script>
		<script src="../examples/js/loaders/ctm/CTMLoader.js"></script>
82
		<script src="../examples/js/exporters/GeometryExporter.js"></script>
83
		<script src="../examples/js/exporters/SceneExporter.js"></script>
M
Mr.doob 已提交
84
		<script src="../examples/js/exporters/OBJExporter.js"></script>
M
Mr.doob 已提交
85 86
		<script src="../examples/js/renderers/SoftwareRenderer.js"></script>
		<script src="../examples/js/renderers/SVGRenderer.js"></script>
M
Mr.doob 已提交
87

M
Mr.doob 已提交
88 89 90
		<script src="../examples/js/loaders/SceneLoader2.js"></script>
		<script src="../examples/js/exporters/SceneExporter2.js"></script>

M
Mr.doob 已提交
91 92 93
		<script src="js/libs/signals.min.js"></script>

		<script src="js/UI.js"></script>
94
		<script src="js/UI.three.js"></script>
M
Mr.doob 已提交
95
		<script src="js/ui/Menubar.js"></script>
M
Mr.doob 已提交
96
		<script src="js/ui/Menubar.File.js"></script>
97 98 99
		<script src="js/ui/Menubar.Edit.js"></script>
		<script src="js/ui/Menubar.Add.js"></script>
		<script src="js/ui/Menubar.Help.js"></script>
M
Mr.doob 已提交
100
		<script src="js/ui/Sidebar.js"></script>
M
Mr.doob 已提交
101
		<script src="js/ui/Sidebar.Renderer.js"></script>
102
		<script src="js/ui/Sidebar.Scene.js"></script>
M
Mr.doob 已提交
103 104 105
		<script src="js/ui/Sidebar.Object3D.js"></script>
		<script src="js/ui/Sidebar.Geometry.js"></script>
		<script src="js/ui/Sidebar.Material.js"></script>
M
Mr.doob 已提交
106
		<script src="js/ui/Viewport.js"></script>
107 108 109

		<script>

110 111 112
			window.URL = window.URL || window.webkitURL;
			window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

113
			var SIGNALS = signals;
114

115 116
			var signals = {

117 118
				// actions

M
Mr.doob 已提交
119
				cloneSelectedObject: new SIGNALS.Signal(),
120
				removeSelectedObject: new SIGNALS.Signal(),
M
Mr.doob 已提交
121
				exportGeometry: new SIGNALS.Signal(),
122
				exportScene: new SIGNALS.Signal(),
123 124 125

				// notifications

M
Mr.doob 已提交
126
				rendererChanged: new SIGNALS.Signal(),
127
				sceneChanged: new SIGNALS.Signal(),
128 129
				objectAdded: new SIGNALS.Signal(),
				objectSelected: new SIGNALS.Signal(),
M
Mr.doob 已提交
130
				objectChanged: new SIGNALS.Signal(),
M
Mr.doob 已提交
131
				materialChanged: new SIGNALS.Signal(),
A
alteredq 已提交
132
				clearColorChanged: new SIGNALS.Signal(),
133
				cameraChanged: new SIGNALS.Signal(),
134 135 136
				fogTypeChanged: new SIGNALS.Signal(),
				fogColorChanged: new SIGNALS.Signal(),
				fogParametersChanged: new SIGNALS.Signal(),
137
				windowResize: new SIGNALS.Signal()
138 139 140

			};

141 142
			//

M
Mr.doob 已提交
143 144
			var viewport = new Viewport( signals );
			viewport.setTop( '32px' );
145 146 147
			viewport.setLeft( '0px' );
			viewport.setRight( '300px' );
			viewport.setBottom( '0px' );
M
Mr.doob 已提交
148 149
			document.body.appendChild( viewport.dom );

150 151 152 153 154 155
			var menubar = new Menubar( signals );
			menubar.setWidth( '100%' );
			menubar.setHeight( '32px' );
			document.body.appendChild( menubar.dom );

			var sidebar = new Sidebar( signals );
156
			sidebar.setRight( '0px' );
157
			sidebar.setTop( '32px' );
158
			sidebar.setBottom( '0px' );
159
			document.body.appendChild( sidebar.dom );
160

161 162 163 164 165 166 167
			document.addEventListener( 'dragover', function ( event ) {

				event.preventDefault();
				event.dataTransfer.dropEffect = 'copy';

			}, false );

168 169 170 171 172 173
			document.addEventListener( 'drop', function ( event ) {

				event.preventDefault();

				var file = event.dataTransfer.files[ 0 ];

174 175 176 177 178
				var chunks = file.name.split( '.' );
				var extension = chunks.pop().toLowerCase();
				var filename = chunks.join( '.' );

				parseFile( file, filename, extension );
179

M
Mr.doob 已提交
180
			}, false );
181

182
			var parseFile = function ( file, filename, extension ) {
183

M
Mr.doob 已提交
184
				switch ( extension ) {
185

M
Mr.doob 已提交
186
					case 'ctm':
187

M
Mr.doob 已提交
188 189
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
190

M
Mr.doob 已提交
191
							var contents = event.target.result;
192

M
Mr.doob 已提交
193 194
							var stream = new CTM.Stream( contents );
							stream.offset = 0;
195

M
Mr.doob 已提交
196 197
							var loader = new THREE.CTMLoader();
							loader.createModelClassic( new CTM.File( stream ), function( geometry ) {
198

199 200 201
								geometry.sourceType = "ctm";
								geometry.sourceFile = file.name;

202
								var mesh = new THREE.Mesh( geometry, createDummyMaterial() );
203
								mesh.name = filename;
204

M
Mr.doob 已提交
205 206
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
207

M
Mr.doob 已提交
208
							} );
209

M
Mr.doob 已提交
210 211
						}, false );
						reader.readAsBinaryString( file );
212

M
Mr.doob 已提交
213
						break;
M
Mr.doob 已提交
214

M
Mr.doob 已提交
215
					case 'dae':
M
Mr.doob 已提交
216

M
Mr.doob 已提交
217 218
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
M
Mr.doob 已提交
219

M
Mr.doob 已提交
220
							var contents = event.target.result;
M
Mr.doob 已提交
221

M
Mr.doob 已提交
222 223
							var parser = new DOMParser();
							var xml = parser.parseFromString( contents, 'text/xml' );
224

M
Mr.doob 已提交
225 226
							var loader = new THREE.ColladaLoader();
							loader.parse( xml, function ( collada ) {
227

228
								collada.scene.name = filename;
229

M
Mr.doob 已提交
230 231 232 233
								signals.objectAdded.dispatch( collada.scene );
								signals.objectSelected.dispatch( collada.scene );

							} );
M
Mr.doob 已提交
234

M
Mr.doob 已提交
235 236
						}, false );
						reader.readAsText( file );
M
Mr.doob 已提交
237 238 239

						break;

M
Mr.doob 已提交
240
					case 'js':
M
Mr.doob 已提交
241
					case 'json':
242

243
						var handleJSON = function ( data ) {
244

245 246 247 248 249 250 251 252 253 254 255
							if ( data.metadata === undefined ) { // 2.0

								data.metadata = { type: 'geometry' };

							}

							if ( data.metadata.type === undefined ) { // 3.0

								data.metadata.type = 'geometry';

							}
256

M
Mr.doob 已提交
257 258 259 260 261 262
							if ( data.metadata.version === undefined ) {

								data.metadata.version = data.metadata.formatVersion;

							}

M
Mr.doob 已提交
263
							if ( data.metadata.type === 'geometry' ) {
264

265
								var loader = new THREE.JSONLoader();
266
								var result = loader.parse( data );
267

268 269
								var geometry = result.geometry;
								var materials = result.materials;
270

271 272
								geometry.sourceType = "ascii";
								geometry.sourceFile = file.name;
273

274 275
								var mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
								mesh.name = filename;
276

277 278
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
M
Mr.doob 已提交
279

M
Mr.doob 已提交
280
							} else if ( data.metadata.type === 'scene' ) {
281

M
Mr.doob 已提交
282 283 284 285 286
								var loader;

								if ( data.metadata.version < 4 ) {

									loader = new THREE.SceneLoader();
M
Mr.doob 已提交
287
									loader.parse( data, function ( result ) {
M
Mr.doob 已提交
288

M
Mr.doob 已提交
289
										result.scene.name = filename;
M
Mr.doob 已提交
290

M
Mr.doob 已提交
291 292
										signals.objectAdded.dispatch( result.scene );
										signals.objectSelected.dispatch( result.scene );
M
Mr.doob 已提交
293

M
Mr.doob 已提交
294
									}, '' );
M
Mr.doob 已提交
295

M
Mr.doob 已提交
296
								} else {
M
Mr.doob 已提交
297

M
Mr.doob 已提交
298 299 300
									loader = new THREE.SceneLoader2();

									var scene = loader.parse( data );
301

M
Mr.doob 已提交
302 303
									signals.objectAdded.dispatch( scene );
									signals.objectSelected.dispatch( scene );
M
Mr.doob 已提交
304

M
Mr.doob 已提交
305
								}
M
Mr.doob 已提交
306

M
Mr.doob 已提交
307
							}
M
Mr.doob 已提交
308

309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
						};

						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;

							// 2.0

							if ( contents.indexOf( 'postMessage' ) !== -1 ) {

								var blob = new Blob( [ contents ], { type: 'text/javascript' } );
								var url = URL.createObjectURL( blob );

								var worker = new Worker( url );

								worker.onmessage = function ( event ) {

M
Mr.doob 已提交
327
									event.data.metadata = { version: 2 };
328 329 330 331 332 333 334 335 336 337
									handleJSON( event.data );

								};

								worker.postMessage( Date.now() );

								return;

							}

M
Mr.doob 已提交
338
							// >= 3.0
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354

							var data;

							try {

								data = JSON.parse( contents );

							} catch ( error ) {

								alert( error );
								return;

							}

							handleJSON( data );

M
Mr.doob 已提交
355 356
						}, false );
						reader.readAsText( file );
357

M
Mr.doob 已提交
358
						break;
M
Mr.doob 已提交
359

M
Mr.doob 已提交
360
					case 'obj':
M
Mr.doob 已提交
361

M
Mr.doob 已提交
362 363
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
364

M
Mr.doob 已提交
365
							var contents = event.target.result;
366

M
Mr.doob 已提交
367
							var object = new THREE.OBJLoader().parse( contents );
368
							object.name = filename;
369

M
Mr.doob 已提交
370 371
							signals.objectAdded.dispatch( object );
							signals.objectSelected.dispatch( object );
M
Mr.doob 已提交
372

M
Mr.doob 已提交
373 374
						}, false );
						reader.readAsText( file );
375

376
						break;
377

378
					case 'stl':
379

M
Mr.doob 已提交
380 381 382 383 384 385
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;

							var geometry = new THREE.STLLoader().parse( contents );
386 387 388
							geometry.sourceType = "stl";
							geometry.sourceFile = file.name;

389
							var mesh = new THREE.Mesh( geometry, createDummyMaterial() );
390
							mesh.name = filename;
391

M
Mr.doob 已提交
392 393
							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
394

M
Mr.doob 已提交
395 396
						}, false );
						reader.readAsText( file );
397

398 399
						break;

M
Mr.doob 已提交
400
					/*
401 402
					case 'utf8':

M
Mr.doob 已提交
403 404
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
405

M
Mr.doob 已提交
406
							var contents = event.target.result;
407

M
Mr.doob 已提交
408 409 410 411 412 413 414 415 416 417
							var geometry = new THREE.UTF8Loader().parse( contents );
							var material = new THREE.MeshLambertMaterial();

							var mesh = new THREE.Mesh( geometry, material );

							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );

						}, false );
						reader.readAsBinaryString( file );
418 419

						break;
M
Mr.doob 已提交
420
					*/
421

422 423
					case 'vtk':

M
Mr.doob 已提交
424 425 426 427
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;
428

M
Mr.doob 已提交
429
							var geometry = new THREE.VTKLoader().parse( contents );
430 431 432
							geometry.sourceType = "vtk";
							geometry.sourceFile = file.name;

433
							var mesh = new THREE.Mesh( geometry, createDummyMaterial() );
434
							mesh.name = filename;
M
Mr.doob 已提交
435 436 437

							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
438

M
Mr.doob 已提交
439 440
						}, false );
						reader.readAsText( file );
441 442 443 444 445 446

						break;

				}

			}
447

448
			//
449

M
Mr.doob 已提交
450
			var onWindowResize = function ( event ) {
451

452
				signals.windowResize.dispatch();
453

M
Mr.doob 已提交
454
			};
455

456
			var createDummyMaterial = function () {
457

458
				return new THREE.MeshPhongMaterial();
459 460 461

			};

462 463
			//

M
Mr.doob 已提交
464
			onWindowResize();
465

M
Mr.doob 已提交
466
			window.addEventListener( 'resize', onWindowResize, false );
467 468 469 470

		</script>
	</body>
</html>