index.html 9.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 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 44 45
		<script src="js/ui/Sidebar.js"></script>
		<script src="js/ui/Sidebar.Outliner.js"></script>
		<script src="js/ui/Sidebar.Properties.js"></script>
A
alteredq 已提交
46
		<script src="js/ui/Sidebar.Properties.World.js"></script>
M
Mr.doob 已提交
47 48 49
		<script src="js/ui/Sidebar.Properties.Object3D.js"></script>
		<script src="js/ui/Sidebar.Properties.Geometry.js"></script>
		<script src="js/ui/Sidebar.Properties.Material.js"></script>
M
Mr.doob 已提交
50
		<script src="js/ui/Viewport.js"></script>
51 52 53

		<script>

54 55 56
			window.URL = window.URL || window.webkitURL;
			window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

57
			var SIGNALS = signals;
58

59 60
			var signals = {

61 62 63
				// actions

				removeSelectedObject: new SIGNALS.Signal(),
64
				exportScene: new SIGNALS.Signal(),
65 66 67

				// notifications

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

			};

83 84
			//

M
Mr.doob 已提交
85 86 87 88 89 90
			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 );

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

			viewport.dom.focus();

96 97 98 99 100 101 102 103 104 105
			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 );
106

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

				event.preventDefault();

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

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

				parseFile( file, filename, extension );
118

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

167
								collada.scene.name = filename;
168

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

							} );
M
Mr.doob 已提交
173

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

						break;

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
200
								};
201

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

M
Mr.doob 已提交
204
								return;
205

M
Mr.doob 已提交
206
							}
207

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

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

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

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

							}

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

								data.metadata.type = 'geometry';

							}
223

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

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

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

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

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

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

240 241
									scene.name = filename;

M
Mr.doob 已提交
242 243
									signals.objectAdded.dispatch( scene );
									signals.objectSelected.dispatch( scene );
M
Mr.doob 已提交
244

M
Mr.doob 已提交
245
								}, '' );
M
Mr.doob 已提交
246

M
Mr.doob 已提交
247
							}
M
Mr.doob 已提交
248

M
Mr.doob 已提交
249 250
						}, false );
						reader.readAsText( file );
251

M
Mr.doob 已提交
252
						break;
M
Mr.doob 已提交
253

M
Mr.doob 已提交
254
					case 'obj':
M
Mr.doob 已提交
255

M
Mr.doob 已提交
256 257
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
258

M
Mr.doob 已提交
259
							var contents = event.target.result;
260

M
Mr.doob 已提交
261
							var object = new THREE.OBJLoader().parse( contents );
262
							object.name = filename;
263

M
Mr.doob 已提交
264 265
							signals.objectAdded.dispatch( object );
							signals.objectSelected.dispatch( object );
M
Mr.doob 已提交
266

M
Mr.doob 已提交
267 268
						}, false );
						reader.readAsText( file );
269

270
						break;
271

272
					case 'stl':
273

M
Mr.doob 已提交
274 275 276 277 278 279
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;

							var geometry = new THREE.STLLoader().parse( contents );
280 281 282
							geometry.sourceType = "stl";
							geometry.sourceFile = file.name;

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

M
Mr.doob 已提交
286 287
							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
288

M
Mr.doob 已提交
289 290
						}, false );
						reader.readAsText( file );
291

292 293
						break;

M
Mr.doob 已提交
294
					/*
295 296
					case 'utf8':

M
Mr.doob 已提交
297 298
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
299

M
Mr.doob 已提交
300
							var contents = event.target.result;
301

M
Mr.doob 已提交
302 303 304 305 306 307 308 309 310 311
							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 );
312 313

						break;
M
Mr.doob 已提交
314
					*/
315

316 317
					case 'vtk':

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

							var contents = event.target.result;
322

M
Mr.doob 已提交
323
							var geometry = new THREE.VTKLoader().parse( contents );
324 325 326
							geometry.sourceType = "vtk";
							geometry.sourceFile = file.name;

327
							var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
328
							mesh.name = filename;
M
Mr.doob 已提交
329 330 331

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

M
Mr.doob 已提交
333 334
						}, false );
						reader.readAsText( file );
335 336 337 338 339 340

						break;

				}

			}
341

342
			var geometry = new THREE.SphereGeometry( 75, 25, 15 );
343 344

			var color = Math.random() * 0xffffff;
A
alteredq 已提交
345
			var material = new THREE.MeshLambertMaterial( { color: color, ambient: color } );
346

347
			var mesh = new THREE.Mesh( geometry, material );
348
			mesh.name = "Sphere";
349 350

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

M
Mr.doob 已提交
353
			var onWindowResize = function ( event ) {
354

355
				signals.windowResize.dispatch();
356

M
Mr.doob 已提交
357
			};
358

359 360
			var createDummyMaterial = function ( geometry ) {

A
alteredq 已提交
361
				return new THREE.MeshLambertMaterial();
362 363 364

			};

M
Mr.doob 已提交
365
			onWindowResize();
366

M
Mr.doob 已提交
367
			window.addEventListener( 'resize', onWindowResize, false );
368 369 370 371

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