index.html 9.1 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 21
			}

		</style>
	</head>
	<body>

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

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

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

		<script>

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

54
			var SIGNALS = signals;
55

56 57
			var signals = {

58
				sceneCreated: new SIGNALS.Signal(),
59
				sceneChanged: new SIGNALS.Signal(),
60
				objectAdded: new SIGNALS.Signal(),
61
				objectRemoved: new SIGNALS.Signal(),
62
				objectSelected: new SIGNALS.Signal(),
M
Mr.doob 已提交
63
				objectChanged: new SIGNALS.Signal(),
M
Mr.doob 已提交
64
				materialChanged: new SIGNALS.Signal(),
65
				windowResize: new SIGNALS.Signal()
66 67 68

			};

69 70
			//

M
Mr.doob 已提交
71 72 73 74 75 76
			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 );

M
Mr.doob 已提交
77
			var menubar = new Menubar( signals );
78 79 80 81
			menubar.setWidth( '100%' );
			menubar.setHeight( '32px' );
			document.body.appendChild( menubar.dom );

82
			var sidebar = new Sidebar( signals );
83 84 85 86
			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 );
87

88 89
			document.addEventListener( 'keydown', function ( event ) {

90
				switch ( event.keyCode ) {
91

92
					case 46: // delete
93

94
						signals.objectRemoved.dispatch();
95 96

						break;
97 98 99 100 101

				}

			} );

102 103 104 105 106 107
			document.addEventListener( 'drop', function ( event ) {

				event.preventDefault();

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

108 109 110 111 112
				var chunks = file.name.split( '.' );
				var extension = chunks.pop().toLowerCase();
				var filename = chunks.join( '.' );

				parseFile( file, filename, extension );
113

M
Mr.doob 已提交
114
			}, false );
115

116
			var parseFile = function ( file, filename, extension ) {
117

M
Mr.doob 已提交
118
				switch ( extension ) {
119

M
Mr.doob 已提交
120
					case 'ctm':
121

M
Mr.doob 已提交
122 123
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
124

M
Mr.doob 已提交
125
							var contents = event.target.result;
126

M
Mr.doob 已提交
127 128
							var stream = new CTM.Stream( contents );
							stream.offset = 0;
129

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

133 134 135
								geometry.sourceType = "ctm";
								geometry.sourceFile = file.name;

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

M
Mr.doob 已提交
139 140
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
141

M
Mr.doob 已提交
142
							} );
143

M
Mr.doob 已提交
144 145
						}, false );
						reader.readAsBinaryString( file );
146

M
Mr.doob 已提交
147
						break;
M
Mr.doob 已提交
148

M
Mr.doob 已提交
149
					case 'dae':
M
Mr.doob 已提交
150

M
Mr.doob 已提交
151 152
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
M
Mr.doob 已提交
153

M
Mr.doob 已提交
154
							var contents = event.target.result;
M
Mr.doob 已提交
155

M
Mr.doob 已提交
156 157
							var parser = new DOMParser();
							var xml = parser.parseFromString( contents, 'text/xml' );
158

M
Mr.doob 已提交
159 160
							var loader = new THREE.ColladaLoader();
							loader.parse( xml, function ( collada ) {
161

162
								collada.scene.name = filename;
163

M
Mr.doob 已提交
164 165 166 167
								signals.objectAdded.dispatch( collada.scene );
								signals.objectSelected.dispatch( collada.scene );

							} );
M
Mr.doob 已提交
168

M
Mr.doob 已提交
169 170
						}, false );
						reader.readAsText( file );
M
Mr.doob 已提交
171 172 173

						break;

M
Mr.doob 已提交
174
					case 'js':
175

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

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

M
Mr.doob 已提交
181
							// 2.0
182

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

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

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

M
Mr.doob 已提交
190
								worker.onmessage = function ( event ) {
191

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

M
Mr.doob 已提交
195
								};
196

M
Mr.doob 已提交
197
								worker.postMessage( new Date().getTime() );
M
Mr.doob 已提交
198

M
Mr.doob 已提交
199
								return;
200

M
Mr.doob 已提交
201
							}
202

M
Mr.doob 已提交
203
							// 3.0
204

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

207 208 209 210 211 212 213 214 215 216 217
							if ( data.metadata === undefined ) { // 2.0

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

							}

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

								data.metadata.type = 'geometry';

							}
218

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

M
Mr.doob 已提交
221
								var geometry = new THREE.GeometryLoader().parse( data );
222 223 224
								geometry.sourceType = "ascii";
								geometry.sourceFile = file.name;

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

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

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

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

235 236
									scene.name = filename;

M
Mr.doob 已提交
237 238
									signals.objectAdded.dispatch( scene );
									signals.objectSelected.dispatch( scene );
M
Mr.doob 已提交
239

M
Mr.doob 已提交
240
								}, '' );
M
Mr.doob 已提交
241

M
Mr.doob 已提交
242
							}
M
Mr.doob 已提交
243

M
Mr.doob 已提交
244 245
						}, false );
						reader.readAsText( file );
246

M
Mr.doob 已提交
247
						break;
M
Mr.doob 已提交
248

M
Mr.doob 已提交
249
					case 'obj':
M
Mr.doob 已提交
250

M
Mr.doob 已提交
251 252
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
253

M
Mr.doob 已提交
254
							var contents = event.target.result;
255

M
Mr.doob 已提交
256
							var object = new THREE.OBJLoader().parse( contents );
257
							object.name = filename;
258

M
Mr.doob 已提交
259 260
							signals.objectAdded.dispatch( object );
							signals.objectSelected.dispatch( object );
M
Mr.doob 已提交
261

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

265
						break;
266

267
					case 'stl':
268

M
Mr.doob 已提交
269 270 271 272 273 274
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;

							var geometry = new THREE.STLLoader().parse( contents );
275 276 277
							geometry.sourceType = "stl";
							geometry.sourceFile = file.name;

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

M
Mr.doob 已提交
281 282
							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
283

M
Mr.doob 已提交
284 285
						}, false );
						reader.readAsText( file );
286

287 288
						break;

M
Mr.doob 已提交
289
					/*
290 291
					case 'utf8':

M
Mr.doob 已提交
292 293
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
294

M
Mr.doob 已提交
295
							var contents = event.target.result;
296

M
Mr.doob 已提交
297 298 299 300 301 302 303 304 305 306
							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 );
307 308

						break;
M
Mr.doob 已提交
309
					*/
310

311 312
					case 'vtk':

M
Mr.doob 已提交
313 314 315 316
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;
317

M
Mr.doob 已提交
318
							var geometry = new THREE.VTKLoader().parse( contents );
319 320 321
							geometry.sourceType = "vtk";
							geometry.sourceFile = file.name;

322
							var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
323
							mesh.name = filename;
M
Mr.doob 已提交
324 325 326

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

M
Mr.doob 已提交
328 329
						}, false );
						reader.readAsText( file );
330 331 332 333 334 335

						break;

				}

			}
336

337
			var geometry = new THREE.SphereGeometry( 75, 25, 15 );
338 339

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

342
			var mesh = new THREE.Mesh( geometry, material );
343
			mesh.name = "Sphere";
344 345

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

M
Mr.doob 已提交
348
			var onWindowResize = function ( event ) {
349

350
				signals.windowResize.dispatch();
351

M
Mr.doob 已提交
352
			};
353

354 355
			var createDummyMaterial = function ( geometry ) {

A
alteredq 已提交
356
				return new THREE.MeshLambertMaterial();
357 358 359

			};

M
Mr.doob 已提交
360
			onWindowResize();
361

M
Mr.doob 已提交
362
			window.addEventListener( 'resize', onWindowResize, false );
363 364 365 366

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