index.html 10.5 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/SceneExporter2.js"></script>
M
Mr.doob 已提交
85
		<script src="../examples/js/exporters/OBJExporter.js"></script>
M
Mr.doob 已提交
86 87 88 89

		<script src="js/libs/signals.min.js"></script>

		<script src="js/UI.js"></script>
90
		<script src="js/UI.three.js"></script>
M
Mr.doob 已提交
91
		<script src="js/ui/Menubar.js"></script>
M
Mr.doob 已提交
92
		<script src="js/ui/Menubar.File.js"></script>
93 94 95
		<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 已提交
96
		<script src="js/ui/Sidebar.js"></script>
97
		<script src="js/ui/Sidebar.Scene.js"></script>
M
Mr.doob 已提交
98 99 100
		<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 已提交
101
		<script src="js/ui/Viewport.js"></script>
102 103 104

		<script>

105 106 107
			window.URL = window.URL || window.webkitURL;
			window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

108
			var SIGNALS = signals;
109

110 111
			var signals = {

112 113
				// actions

M
Mr.doob 已提交
114
				cloneSelectedObject: new SIGNALS.Signal(),
115
				removeSelectedObject: new SIGNALS.Signal(),
M
Mr.doob 已提交
116
				exportGeometry: new SIGNALS.Signal(),
117
				exportScene: new SIGNALS.Signal(),
118
				toggleHelpers: new SIGNALS.Signal(),
119
				resetScene: new SIGNALS.Signal(),
120 121 122

				// notifications

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

			};

138 139
			//

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

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

			var sidebar = new Sidebar( signals );
153
			sidebar.setRight( '0px' );
154
			sidebar.setTop( '32px' );
155
			sidebar.setBottom( '0px' );
156
			document.body.appendChild( sidebar.dom );
157

158 159 160 161 162 163 164
			document.addEventListener( 'dragover', function ( event ) {

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

			}, false );

165 166 167 168 169 170
			document.addEventListener( 'drop', function ( event ) {

				event.preventDefault();

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

171 172 173 174 175
				var chunks = file.name.split( '.' );
				var extension = chunks.pop().toLowerCase();
				var filename = chunks.join( '.' );

				parseFile( file, filename, extension );
176

M
Mr.doob 已提交
177
			}, false );
178

179
			var parseFile = function ( file, filename, extension ) {
180

M
Mr.doob 已提交
181
				switch ( extension ) {
182

M
Mr.doob 已提交
183
					case 'ctm':
184

M
Mr.doob 已提交
185 186
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
187

M
Mr.doob 已提交
188
							var contents = event.target.result;
189

M
Mr.doob 已提交
190 191
							var stream = new CTM.Stream( contents );
							stream.offset = 0;
192

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

196 197 198
								geometry.sourceType = "ctm";
								geometry.sourceFile = file.name;

199
								var mesh = new THREE.Mesh( geometry, createDummyMaterial() );
200
								mesh.name = filename;
201

M
Mr.doob 已提交
202 203
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
204

M
Mr.doob 已提交
205
							} );
206

M
Mr.doob 已提交
207 208
						}, false );
						reader.readAsBinaryString( file );
209

M
Mr.doob 已提交
210
						break;
M
Mr.doob 已提交
211

M
Mr.doob 已提交
212
					case 'dae':
M
Mr.doob 已提交
213

M
Mr.doob 已提交
214 215
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
M
Mr.doob 已提交
216

M
Mr.doob 已提交
217
							var contents = event.target.result;
M
Mr.doob 已提交
218

M
Mr.doob 已提交
219 220
							var parser = new DOMParser();
							var xml = parser.parseFromString( contents, 'text/xml' );
221

M
Mr.doob 已提交
222 223
							var loader = new THREE.ColladaLoader();
							loader.parse( xml, function ( collada ) {
224

225
								collada.scene.name = filename;
226

M
Mr.doob 已提交
227 228 229 230
								signals.objectAdded.dispatch( collada.scene );
								signals.objectSelected.dispatch( collada.scene );

							} );
M
Mr.doob 已提交
231

M
Mr.doob 已提交
232 233
						}, false );
						reader.readAsText( file );
M
Mr.doob 已提交
234 235 236

						break;

M
Mr.doob 已提交
237
					case 'js':
M
Mr.doob 已提交
238
					case 'json':
239

240
						var handleJSON = function ( data ) {
241

242 243 244 245 246 247 248 249 250 251 252
							if ( data.metadata === undefined ) { // 2.0

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

							}

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

								data.metadata.type = 'geometry';

							}
253

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

256
								var loader = new THREE.JSONLoader();
257

258
								loader.createModel( data, function ( geometry ) {
259

260 261 262 263 264 265 266 267 268 269
									geometry.sourceType = "ascii";
									geometry.sourceFile = file.name;

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

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

								} );
M
Mr.doob 已提交
270

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

273
								new THREE.SceneLoader().parse( data, function ( result ) {
M
Mr.doob 已提交
274

275
									result.scene.name = filename;
276

277 278 279 280
									var resetScene = true;

									if ( resetScene ) {

281
										signals.sceneAdded.dispatch( result.scene, result.currentCamera );
282 283 284 285 286 287 288

									} else {

										signals.objectAdded.dispatch( result.scene );
										signals.objectSelected.dispatch( result.scene );

									}
M
Mr.doob 已提交
289

M
Mr.doob 已提交
290
								}, '' );
M
Mr.doob 已提交
291

M
Mr.doob 已提交
292
							}
M
Mr.doob 已提交
293

294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
						};

						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 已提交
312
									event.data.metadata = { format: 2 };
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
									handleJSON( event.data );

								};

								worker.postMessage( Date.now() );

								return;

							}

							// 3.0

							var data;

							try {

								data = JSON.parse( contents );

							} catch ( error ) {

								alert( error );
								return;

							}

							handleJSON( data );

M
Mr.doob 已提交
340 341
						}, false );
						reader.readAsText( file );
342

M
Mr.doob 已提交
343
						break;
M
Mr.doob 已提交
344

M
Mr.doob 已提交
345
					case 'obj':
M
Mr.doob 已提交
346

M
Mr.doob 已提交
347 348
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
349

M
Mr.doob 已提交
350
							var contents = event.target.result;
351

M
Mr.doob 已提交
352
							var object = new THREE.OBJLoader().parse( contents );
353
							object.name = filename;
354

M
Mr.doob 已提交
355 356
							signals.objectAdded.dispatch( object );
							signals.objectSelected.dispatch( object );
M
Mr.doob 已提交
357

M
Mr.doob 已提交
358 359
						}, false );
						reader.readAsText( file );
360

361
						break;
362

363
					case 'stl':
364

M
Mr.doob 已提交
365 366 367 368 369 370
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;

							var geometry = new THREE.STLLoader().parse( contents );
371 372 373
							geometry.sourceType = "stl";
							geometry.sourceFile = file.name;

374
							var mesh = new THREE.Mesh( geometry, createDummyMaterial() );
375
							mesh.name = filename;
376

M
Mr.doob 已提交
377 378
							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
379

M
Mr.doob 已提交
380 381
						}, false );
						reader.readAsText( file );
382

383 384
						break;

M
Mr.doob 已提交
385
					/*
386 387
					case 'utf8':

M
Mr.doob 已提交
388 389
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
390

M
Mr.doob 已提交
391
							var contents = event.target.result;
392

M
Mr.doob 已提交
393 394 395 396 397 398 399 400 401 402
							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 );
403 404

						break;
M
Mr.doob 已提交
405
					*/
406

407 408
					case 'vtk':

M
Mr.doob 已提交
409 410 411 412
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;
413

M
Mr.doob 已提交
414
							var geometry = new THREE.VTKLoader().parse( contents );
415 416 417
							geometry.sourceType = "vtk";
							geometry.sourceFile = file.name;

418
							var mesh = new THREE.Mesh( geometry, createDummyMaterial() );
419
							mesh.name = filename;
M
Mr.doob 已提交
420 421 422

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

M
Mr.doob 已提交
424 425
						}, false );
						reader.readAsText( file );
426 427 428 429 430 431

						break;

				}

			}
432

433
			// create default scene
434

435
			signals.resetScene.dispatch();
436

437
			//
438

M
Mr.doob 已提交
439
			var onWindowResize = function ( event ) {
440

441
				signals.windowResize.dispatch();
442

M
Mr.doob 已提交
443
			};
444

445
			var createDummyMaterial = function () {
446

447
				return new THREE.MeshPhongMaterial();
448 449 450

			};

451 452
			//

M
Mr.doob 已提交
453
			onWindowResize();
454

M
Mr.doob 已提交
455
			window.addEventListener( 'resize', onWindowResize, false );
456 457 458 459

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