index.html 9.7 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 17 18 19 20
			}
		</style>
	</head>
	<body>

M
Mr.doob 已提交
21
		<script src="../build/three.min.js"></script>
M
Mr.doob 已提交
22
		<script src="../examples/js/controls/TrackballControls.js"></script>
M
Mr.doob 已提交
23 24 25 26 27
		<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 已提交
28 29 30
		<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>
31
		<script src="../examples/js/exporters/GeometryExporter.js"></script>
32
		<script src="../examples/js/exporters/SceneExporter.js"></script>
M
Mr.doob 已提交
33 34 35 36

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

		<script src="js/UI.js"></script>
37
		<script src="js/UI.three.js"></script>
M
Mr.doob 已提交
38
		<script src="js/ui/Menubar.js"></script>
M
Mr.doob 已提交
39
		<script src="js/ui/Menubar.File.js"></script>
40 41 42
		<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 已提交
43
		<script src="js/ui/Sidebar.js"></script>
44
		<script src="js/ui/Sidebar.Scene.js"></script>
M
Mr.doob 已提交
45 46 47
		<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 已提交
48
		<script src="js/ui/Viewport.js"></script>
49 50 51

		<script>

52 53 54
			window.URL = window.URL || window.webkitURL;
			window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

55
			var SIGNALS = signals;
56

57 58
			var signals = {

59 60 61
				// actions

				removeSelectedObject: new SIGNALS.Signal(),
M
Mr.doob 已提交
62
				exportGeometry: new SIGNALS.Signal(),
63
				exportScene: new SIGNALS.Signal(),
64
				toggleHelpers: new SIGNALS.Signal(),
65
				resetScene: new SIGNALS.Signal(),
66 67 68

				// notifications

69
				sceneCreated: new SIGNALS.Signal(),
70
				sceneChanged: new SIGNALS.Signal(),
71 72
				objectAdded: new SIGNALS.Signal(),
				objectSelected: new SIGNALS.Signal(),
M
Mr.doob 已提交
73
				objectChanged: new SIGNALS.Signal(),
M
Mr.doob 已提交
74
				materialChanged: new SIGNALS.Signal(),
A
alteredq 已提交
75
				clearColorChanged: new SIGNALS.Signal(),
76
				cameraChanged: new SIGNALS.Signal(),
77 78 79
				fogTypeChanged: new SIGNALS.Signal(),
				fogColorChanged: new SIGNALS.Signal(),
				fogParametersChanged: new SIGNALS.Signal(),
80
				windowResize: new SIGNALS.Signal()
81 82 83

			};

84 85
			//

M
Mr.doob 已提交
86 87 88 89 90 91
			var viewport = new Viewport( signals );
			viewport.setTop( '32px' );
			viewport.setWidth( '-webkit-calc(100% - 300px)', '-moz-calc(100% - 300px)', 'calc(100% - 300px)' );
			viewport.setHeight( '-webkit-calc(100% - 32px)', '-moz-calc(100% - 32px)', 'calc(100% - 32px)' );
			document.body.appendChild( viewport.dom );

92 93 94 95 96
			// set focus on Viewport to get hotkeys working
			// right from the initial page load

			viewport.dom.focus();

97 98 99 100 101 102 103 104 105 106
			var menubar = new Menubar( signals );
			menubar.setWidth( '100%' );
			menubar.setHeight( '32px' );
			document.body.appendChild( menubar.dom );

			var sidebar = new Sidebar( signals );
			sidebar.setLeft( '-webkit-calc(100% - 300px)', '-moz-calc(100% - 300px)', 'calc(100% - 300px)' );
			sidebar.setTop( '32px' );
			sidebar.setHeight( '-webkit-calc(100% - 32px)', '-moz-calc(100% - 32px)', 'calc(100% - 32px)' );
			document.body.appendChild( sidebar.dom );
107

108 109 110 111 112 113
			document.addEventListener( 'drop', function ( event ) {

				event.preventDefault();

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

114 115 116 117 118
				var chunks = file.name.split( '.' );
				var extension = chunks.pop().toLowerCase();
				var filename = chunks.join( '.' );

				parseFile( file, filename, extension );
119

M
Mr.doob 已提交
120
			}, false );
121

122
			var parseFile = function ( file, filename, extension ) {
123

M
Mr.doob 已提交
124
				switch ( extension ) {
125

M
Mr.doob 已提交
126
					case 'ctm':
127

M
Mr.doob 已提交
128 129
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
130

M
Mr.doob 已提交
131
							var contents = event.target.result;
132

M
Mr.doob 已提交
133 134
							var stream = new CTM.Stream( contents );
							stream.offset = 0;
135

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

139 140 141
								geometry.sourceType = "ctm";
								geometry.sourceFile = file.name;

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

M
Mr.doob 已提交
145 146
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
147

M
Mr.doob 已提交
148
							} );
149

M
Mr.doob 已提交
150 151
						}, false );
						reader.readAsBinaryString( file );
152

M
Mr.doob 已提交
153
						break;
M
Mr.doob 已提交
154

M
Mr.doob 已提交
155
					case 'dae':
M
Mr.doob 已提交
156

M
Mr.doob 已提交
157 158
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
M
Mr.doob 已提交
159

M
Mr.doob 已提交
160
							var contents = event.target.result;
M
Mr.doob 已提交
161

M
Mr.doob 已提交
162 163
							var parser = new DOMParser();
							var xml = parser.parseFromString( contents, 'text/xml' );
164

M
Mr.doob 已提交
165 166
							var loader = new THREE.ColladaLoader();
							loader.parse( xml, function ( collada ) {
167

168
								collada.scene.name = filename;
169

M
Mr.doob 已提交
170 171 172 173
								signals.objectAdded.dispatch( collada.scene );
								signals.objectSelected.dispatch( collada.scene );

							} );
M
Mr.doob 已提交
174

M
Mr.doob 已提交
175 176
						}, false );
						reader.readAsText( file );
M
Mr.doob 已提交
177 178 179

						break;

M
Mr.doob 已提交
180
					case 'js':
181

M
Mr.doob 已提交
182 183
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
184

M
Mr.doob 已提交
185
							var contents = event.target.result;
186

M
Mr.doob 已提交
187
							// 2.0
188

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

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

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

M
Mr.doob 已提交
196
								worker.onmessage = function ( event ) {
197

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

M
Mr.doob 已提交
201
								};
202

M
Mr.doob 已提交
203
								worker.postMessage( new Date().getTime() );
M
Mr.doob 已提交
204

M
Mr.doob 已提交
205
								return;
206

M
Mr.doob 已提交
207
							}
208

M
Mr.doob 已提交
209
							// 3.0
210

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

213 214 215 216 217 218 219 220 221 222 223
							if ( data.metadata === undefined ) { // 2.0

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

							}

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

								data.metadata.type = 'geometry';

							}
224

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

M
Mr.doob 已提交
227
								var geometry = new THREE.GeometryLoader().parse( data );
228 229 230
								geometry.sourceType = "ascii";
								geometry.sourceFile = file.name;

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

M
Mr.doob 已提交
234 235
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
M
Mr.doob 已提交
236

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

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

241
									result.scene.name = filename;
242

243 244 245 246 247 248 249 250 251 252 253 254
									var resetScene = true;

									if ( resetScene ) {

										signals.resetScene.dispatch( result.scene, result.currentCamera, result.bgColor );

									} else {

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

									}
M
Mr.doob 已提交
255

M
Mr.doob 已提交
256
								}, '' );
M
Mr.doob 已提交
257

M
Mr.doob 已提交
258
							}
M
Mr.doob 已提交
259

M
Mr.doob 已提交
260 261
						}, false );
						reader.readAsText( file );
262

M
Mr.doob 已提交
263
						break;
M
Mr.doob 已提交
264

M
Mr.doob 已提交
265
					case 'obj':
M
Mr.doob 已提交
266

M
Mr.doob 已提交
267 268
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
269

M
Mr.doob 已提交
270
							var contents = event.target.result;
271

M
Mr.doob 已提交
272
							var object = new THREE.OBJLoader().parse( contents );
273
							object.name = filename;
274

M
Mr.doob 已提交
275 276
							signals.objectAdded.dispatch( object );
							signals.objectSelected.dispatch( object );
M
Mr.doob 已提交
277

M
Mr.doob 已提交
278 279
						}, false );
						reader.readAsText( file );
280

281
						break;
282

283
					case 'stl':
284

M
Mr.doob 已提交
285 286 287 288 289 290
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;

							var geometry = new THREE.STLLoader().parse( contents );
291 292 293
							geometry.sourceType = "stl";
							geometry.sourceFile = file.name;

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

M
Mr.doob 已提交
297 298
							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
299

M
Mr.doob 已提交
300 301
						}, false );
						reader.readAsText( file );
302

303 304
						break;

M
Mr.doob 已提交
305
					/*
306 307
					case 'utf8':

M
Mr.doob 已提交
308 309
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
310

M
Mr.doob 已提交
311
							var contents = event.target.result;
312

M
Mr.doob 已提交
313 314 315 316 317 318 319 320 321 322
							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 );
323 324

						break;
M
Mr.doob 已提交
325
					*/
326

327 328
					case 'vtk':

M
Mr.doob 已提交
329 330 331 332
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;
333

M
Mr.doob 已提交
334
							var geometry = new THREE.VTKLoader().parse( contents );
335 336 337
							geometry.sourceType = "vtk";
							geometry.sourceFile = file.name;

338
							var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
339
							mesh.name = filename;
M
Mr.doob 已提交
340 341 342

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

M
Mr.doob 已提交
344 345
						}, false );
						reader.readAsText( file );
346 347 348 349 350 351

						break;

				}

			}
352

353
			var geometry = new THREE.SphereGeometry( 75, 25, 15 );
354

A
alteredq 已提交
355 356
			var material = new THREE.MeshPhongMaterial();
			material.color.setHSV( Math.random(), Math.random(), 1 );
357

358
			var mesh = new THREE.Mesh( geometry, material );
359
			mesh.name = "Sphere";
360 361

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

M
Mr.doob 已提交
364
			var onWindowResize = function ( event ) {
365

366
				signals.windowResize.dispatch();
367

M
Mr.doob 已提交
368
			};
369

370 371
			var createDummyMaterial = function ( geometry ) {

A
alteredq 已提交
372
				return new THREE.MeshLambertMaterial();
373 374 375

			};

M
Mr.doob 已提交
376
			onWindowResize();
377

M
Mr.doob 已提交
378
			window.addEventListener( 'resize', onWindowResize, false );
379 380 381 382

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