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 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
			.fancy_select {
				background: #fff;
				border: 1px solid #ccc;
				padding: 0;
				cursor: default;
				overflow: auto;
			}

			.option_item {
				padding: 0 0.25em;
			}

			.option_selected {
				background: #000;
				color: #fff;
			}

			.object_type { color: #aaa }
36 37 38 39
		</style>
	</head>
	<body>

M
Mr.doob 已提交
40
		<script src="../build/three.min.js"></script>
M
Mr.doob 已提交
41
		<script src="../examples/js/controls/TrackballControls.js"></script>
M
Mr.doob 已提交
42 43 44 45 46
		<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 已提交
47 48 49
		<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>
50
		<script src="../examples/js/exporters/GeometryExporter.js"></script>
51
		<script src="../examples/js/exporters/SceneExporter.js"></script>
M
Mr.doob 已提交
52 53 54 55

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

		<script src="js/UI.js"></script>
56
		<script src="js/UI.three.js"></script>
M
Mr.doob 已提交
57 58 59 60 61 62 63 64
		<script src="js/ui/Menubar.js"></script>
		<script src="js/ui/Viewport.js"></script>
		<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>
65 66 67

		<script>

68 69 70
			window.URL = window.URL || window.webkitURL;
			window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

71
			var SIGNALS = signals;
72

73 74
			var signals = {

75
				sceneCreated: new SIGNALS.Signal(),
76
				sceneChanged: new SIGNALS.Signal(),
77
				objectAdded: new SIGNALS.Signal(),
78
				objectRemoved: new SIGNALS.Signal(),
79
				objectSelected: new SIGNALS.Signal(),
M
Mr.doob 已提交
80
				objectChanged: new SIGNALS.Signal(),
M
Mr.doob 已提交
81
				materialChanged: new SIGNALS.Signal(),
82
				windowResize: new SIGNALS.Signal()
83 84 85

			};

86 87
			//

88 89 90 91 92 93 94
			var canvas = document.createElement( 'canvas' );
			var context = canvas.getContext( '2d' );
			context.fillStyle = 'rgb(255,255,255)';
			context.fillRect( 0, 0, canvas.width, canvas.height );

			var dummyTexture = new THREE.Texture( canvas );
			dummyTexture.needsUpdate = true;
95 96 97

			//

M
Mr.doob 已提交
98
			var menubar = new Menubar( signals );
99 100 101 102
			menubar.setWidth( '100%' );
			menubar.setHeight( '32px' );
			document.body.appendChild( menubar.dom );

103
			var sidebar = new Sidebar( signals );
104 105 106 107
			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 );
108

109 110 111 112 113 114
			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 );

115 116 117 118 119 120 121 122 123 124 125 126 127 128
			document.addEventListener( 'keydown', function ( event ) {

				// delete

				if ( event.which === 46 ) {

					// here should come confirmation pop-up modal dialog

					signals.objectRemoved.dispatch();

				}

			} );

129 130 131 132 133 134
			document.addEventListener( 'drop', function ( event ) {

				event.preventDefault();

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

135 136 137 138 139
				var chunks = file.name.split( '.' );
				var extension = chunks.pop().toLowerCase();
				var filename = chunks.join( '.' );

				parseFile( file, filename, extension );
140

M
Mr.doob 已提交
141
			}, false );
142

143
			var parseFile = function ( file, filename, extension ) {
144

M
Mr.doob 已提交
145
				switch ( extension ) {
146

M
Mr.doob 已提交
147
					case 'ctm':
148

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

M
Mr.doob 已提交
152
							var contents = event.target.result;
153

M
Mr.doob 已提交
154 155
							var stream = new CTM.Stream( contents );
							stream.offset = 0;
156

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

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

M
Mr.doob 已提交
163 164
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
165

M
Mr.doob 已提交
166
							} );
167

M
Mr.doob 已提交
168 169
						}, false );
						reader.readAsBinaryString( file );
170

M
Mr.doob 已提交
171
						break;
M
Mr.doob 已提交
172

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

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

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

M
Mr.doob 已提交
180 181
							var parser = new DOMParser();
							var xml = parser.parseFromString( contents, 'text/xml' );
182

M
Mr.doob 已提交
183 184
							var loader = new THREE.ColladaLoader();
							loader.parse( xml, function ( collada ) {
185

186
								collada.scene.name = filename;
187
								applyDummyTexture( collada.scene );
188

M
Mr.doob 已提交
189 190 191 192
								signals.objectAdded.dispatch( collada.scene );
								signals.objectSelected.dispatch( collada.scene );

							} );
M
Mr.doob 已提交
193

M
Mr.doob 已提交
194 195
						}, false );
						reader.readAsText( file );
M
Mr.doob 已提交
196 197 198

						break;

M
Mr.doob 已提交
199
					case 'js':
200

M
Mr.doob 已提交
201 202
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
203

M
Mr.doob 已提交
204
							var contents = event.target.result;
205

M
Mr.doob 已提交
206
							// 2.0
207

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

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

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

M
Mr.doob 已提交
215
								worker.onmessage = function ( event ) {
216

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

M
Mr.doob 已提交
220
								};
221

M
Mr.doob 已提交
222
								worker.postMessage( new Date().getTime() );
M
Mr.doob 已提交
223

M
Mr.doob 已提交
224
								return;
225

M
Mr.doob 已提交
226
							}
227

M
Mr.doob 已提交
228
							// 3.0
229

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

M
Mr.doob 已提交
232 233
							if ( data.metadata === undefined ) data.metadata = { type: 'geometry' }; // 2.0
							if ( data.metadata.type === undefined ) data.metadata.type = 'geometry'; // 3.0
234

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

M
Mr.doob 已提交
237
								var geometry = new THREE.GeometryLoader().parse( data );
238
								var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
239
								mesh.name = filename;
240

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

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

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

248 249
									scene.name = filename;

M
Mr.doob 已提交
250 251
									signals.objectAdded.dispatch( scene );
									signals.objectSelected.dispatch( scene );
M
Mr.doob 已提交
252

M
Mr.doob 已提交
253
								}, '' );
M
Mr.doob 已提交
254

M
Mr.doob 已提交
255
							}
M
Mr.doob 已提交
256

M
Mr.doob 已提交
257 258
						}, false );
						reader.readAsText( file );
259

M
Mr.doob 已提交
260
						break;
M
Mr.doob 已提交
261

M
Mr.doob 已提交
262
					case 'obj':
M
Mr.doob 已提交
263

M
Mr.doob 已提交
264 265
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
266

M
Mr.doob 已提交
267
							var contents = event.target.result;
268

M
Mr.doob 已提交
269
							var object = new THREE.OBJLoader().parse( contents );
270
							object.name = filename;
271
							applyDummyTexture( object );
272

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

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

279
						break;
280

281
					case 'stl':
282

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

							var contents = event.target.result;

							var geometry = new THREE.STLLoader().parse( contents );
289
							var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
290
							mesh.name = filename;
291

M
Mr.doob 已提交
292 293
							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
294

M
Mr.doob 已提交
295 296
						}, false );
						reader.readAsText( file );
297

298 299
						break;

M
Mr.doob 已提交
300
					/*
301 302
					case 'utf8':

M
Mr.doob 已提交
303 304
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
305

M
Mr.doob 已提交
306
							var contents = event.target.result;
307

M
Mr.doob 已提交
308 309 310 311 312 313 314 315 316 317
							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 );
318 319

						break;
M
Mr.doob 已提交
320
					*/
321

322 323
					case 'vtk':

M
Mr.doob 已提交
324 325 326 327
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;
328

M
Mr.doob 已提交
329
							var geometry = new THREE.VTKLoader().parse( contents );
330
							var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
331
							mesh.name = filename;
M
Mr.doob 已提交
332 333 334

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

M
Mr.doob 已提交
336 337
						}, false );
						reader.readAsText( file );
338 339 340 341 342 343

						break;

				}

			}
344

345
			var geometry = new THREE.SphereGeometry( 75, 25, 15 );
346
			var material = new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff, map: dummyTexture } );
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 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
			var createDummyMaterial = function ( geometry ) {

				var material = new THREE.MeshLambertMaterial();

				if ( geometry.faceVertexUvs[ 0 ].length > 0 )
					material.map = dummyTexture;

				return material;

			};

			var applyDummyTexture = function ( root ) {

				root.traverse( function ( node ) {

					if ( node.material && node.geometry.faceVertexUvs[ 0 ].length > 0 ) {

						node.material.map = dummyTexture;

					}

				} );

			};

M
Mr.doob 已提交
384
			onWindowResize();
385

M
Mr.doob 已提交
386
			window.addEventListener( 'resize', onWindowResize, false );
387 388 389 390

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