index.html 10.0 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>
M
Mr.doob 已提交
73 74 75 76 77
		<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 已提交
78 79 80
		<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>
81
		<script src="../examples/js/exporters/GeometryExporter.js"></script>
82
		<script src="../examples/js/exporters/SceneExporter.js"></script>
M
Mr.doob 已提交
83 84 85 86

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

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

		<script>

102 103 104
			window.URL = window.URL || window.webkitURL;
			window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

105
			var SIGNALS = signals;
106

107 108
			var signals = {

109 110
				// actions

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

				// notifications

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

			};

135 136
			//

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

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

			var sidebar = new Sidebar( signals );
150
			sidebar.setRight( '0px' );
151
			sidebar.setTop( '32px' );
152
			sidebar.setBottom( '0px' );
153
			document.body.appendChild( sidebar.dom );
154

155 156 157 158 159 160
			document.addEventListener( 'drop', function ( event ) {

				event.preventDefault();

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

161 162 163 164 165
				var chunks = file.name.split( '.' );
				var extension = chunks.pop().toLowerCase();
				var filename = chunks.join( '.' );

				parseFile( file, filename, extension );
166

M
Mr.doob 已提交
167
			}, false );
168

169
			var parseFile = function ( file, filename, extension ) {
170

M
Mr.doob 已提交
171
				switch ( extension ) {
172

M
Mr.doob 已提交
173
					case 'ctm':
174

M
Mr.doob 已提交
175 176
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
177

M
Mr.doob 已提交
178
							var contents = event.target.result;
179

M
Mr.doob 已提交
180 181
							var stream = new CTM.Stream( contents );
							stream.offset = 0;
182

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

186 187 188
								geometry.sourceType = "ctm";
								geometry.sourceFile = file.name;

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

M
Mr.doob 已提交
192 193
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
194

M
Mr.doob 已提交
195
							} );
196

M
Mr.doob 已提交
197 198
						}, false );
						reader.readAsBinaryString( file );
199

M
Mr.doob 已提交
200
						break;
M
Mr.doob 已提交
201

M
Mr.doob 已提交
202
					case 'dae':
M
Mr.doob 已提交
203

M
Mr.doob 已提交
204 205
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
M
Mr.doob 已提交
206

M
Mr.doob 已提交
207
							var contents = event.target.result;
M
Mr.doob 已提交
208

M
Mr.doob 已提交
209 210
							var parser = new DOMParser();
							var xml = parser.parseFromString( contents, 'text/xml' );
211

M
Mr.doob 已提交
212 213
							var loader = new THREE.ColladaLoader();
							loader.parse( xml, function ( collada ) {
214

215
								collada.scene.name = filename;
216

M
Mr.doob 已提交
217 218 219 220
								signals.objectAdded.dispatch( collada.scene );
								signals.objectSelected.dispatch( collada.scene );

							} );
M
Mr.doob 已提交
221

M
Mr.doob 已提交
222 223
						}, false );
						reader.readAsText( file );
M
Mr.doob 已提交
224 225 226

						break;

M
Mr.doob 已提交
227
					case 'js':
M
Mr.doob 已提交
228
					case 'json':
229

M
Mr.doob 已提交
230 231
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
232

M
Mr.doob 已提交
233
							var contents = event.target.result;
234

M
Mr.doob 已提交
235
							// 2.0
236

M
Mr.doob 已提交
237
							if ( contents.indexOf( 'postMessage' ) !== -1 ) {
238

M
Mr.doob 已提交
239 240
								var blob = new Blob( [ contents ], { type: 'text/javascript' } );
								var url = URL.createObjectURL( blob );
241

M
Mr.doob 已提交
242
								var worker = new Worker( url );
243

M
Mr.doob 已提交
244
								worker.onmessage = function ( event ) {
245

M
Mr.doob 已提交
246 247
									event.data.metadata = { 'format': 2 };
									parseFile( JSON.stringify( event.data ), extension );
248

M
Mr.doob 已提交
249
								};
250

M
Mr.doob 已提交
251
								worker.postMessage( new Date().getTime() );
M
Mr.doob 已提交
252

M
Mr.doob 已提交
253
								return;
254

M
Mr.doob 已提交
255
							}
256

M
Mr.doob 已提交
257
							// 3.0
258

M
Mr.doob 已提交
259
							var data = JSON.parse( contents );
260

261 262 263 264 265 266 267 268 269 270 271
							if ( data.metadata === undefined ) { // 2.0

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

							}

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

								data.metadata.type = 'geometry';

							}
272

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

275
								var loader = new THREE.JSONLoader();
276

277
								loader.createModel( data, function ( geometry ) {
278

279 280 281 282 283 284 285 286 287 288
									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 已提交
289

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

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

294
									result.scene.name = filename;
295

296 297 298 299
									var resetScene = true;

									if ( resetScene ) {

300
										signals.sceneAdded.dispatch( result.scene, result.currentCamera, result.bgColor );
301 302 303 304 305 306 307

									} else {

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

									}
M
Mr.doob 已提交
308

M
Mr.doob 已提交
309
								}, '' );
M
Mr.doob 已提交
310

M
Mr.doob 已提交
311
							}
M
Mr.doob 已提交
312

M
Mr.doob 已提交
313 314
						}, false );
						reader.readAsText( file );
315

M
Mr.doob 已提交
316
						break;
M
Mr.doob 已提交
317

M
Mr.doob 已提交
318
					case 'obj':
M
Mr.doob 已提交
319

M
Mr.doob 已提交
320 321
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
322

M
Mr.doob 已提交
323
							var contents = event.target.result;
324

M
Mr.doob 已提交
325
							var object = new THREE.OBJLoader().parse( contents );
326
							object.name = filename;
327

M
Mr.doob 已提交
328 329
							signals.objectAdded.dispatch( object );
							signals.objectSelected.dispatch( object );
M
Mr.doob 已提交
330

M
Mr.doob 已提交
331 332
						}, false );
						reader.readAsText( file );
333

334
						break;
335

336
					case 'stl':
337

M
Mr.doob 已提交
338 339 340 341 342 343
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;

							var geometry = new THREE.STLLoader().parse( contents );
344 345 346
							geometry.sourceType = "stl";
							geometry.sourceFile = file.name;

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

M
Mr.doob 已提交
350 351
							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
352

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

356 357
						break;

M
Mr.doob 已提交
358
					/*
359 360
					case 'utf8':

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

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

M
Mr.doob 已提交
366 367 368 369 370 371 372 373 374 375
							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 );
376 377

						break;
M
Mr.doob 已提交
378
					*/
379

380 381
					case 'vtk':

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

							var contents = event.target.result;
386

M
Mr.doob 已提交
387
							var geometry = new THREE.VTKLoader().parse( contents );
388 389 390
							geometry.sourceType = "vtk";
							geometry.sourceFile = file.name;

391
							var mesh = new THREE.Mesh( geometry, createDummyMaterial() );
392
							mesh.name = filename;
M
Mr.doob 已提交
393 394 395

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

M
Mr.doob 已提交
397 398
						}, false );
						reader.readAsText( file );
399 400 401 402 403 404

						break;

				}

			}
405

406
			// create default scene
407

408
			signals.resetScene.dispatch();
409

410
			//
411

M
Mr.doob 已提交
412
			var onWindowResize = function ( event ) {
413

414
				signals.windowResize.dispatch();
415

M
Mr.doob 已提交
416
			};
417

418
			var createDummyMaterial = function () {
419

420
				return new THREE.MeshPhongMaterial();
421 422 423

			};

424 425
			//

M
Mr.doob 已提交
426
			onWindowResize();
427

M
Mr.doob 已提交
428
			window.addEventListener( 'resize', onWindowResize, false );
429 430 431 432

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