index.html 8.8 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>
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 39 40 41 42 43 44 45
		<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>
46 47 48

		<script>

49 50 51
			window.URL = window.URL || window.webkitURL;
			window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

52
			var SIGNALS = signals;
53

54 55
			var signals = {

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

			};

66 67
			//

68 69 70 71 72 73 74
			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;
75 76 77

			//

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

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

89 90 91 92 93 94
			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 );

95 96 97 98 99
			document.addEventListener( 'drop', function ( event ) {

				event.preventDefault();

				var file = event.dataTransfer.files[ 0 ];
100
				var extension = file.name.split( '.' ).pop().toLowerCase();
101

M
Mr.doob 已提交
102
				parseFile( file, extension );
103

M
Mr.doob 已提交
104
			}, false );
105

M
Mr.doob 已提交
106
			var parseFile = function ( file, extension ) {
107

M
Mr.doob 已提交
108
				switch ( extension ) {
109

M
Mr.doob 已提交
110
					case 'ctm':
111

M
Mr.doob 已提交
112 113
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
114

M
Mr.doob 已提交
115
							var contents = event.target.result;
116

M
Mr.doob 已提交
117 118
							var stream = new CTM.Stream( contents );
							stream.offset = 0;
119

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

123
								var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
124

M
Mr.doob 已提交
125 126
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
127

M
Mr.doob 已提交
128
							} );
129

M
Mr.doob 已提交
130 131
						}, false );
						reader.readAsBinaryString( file );
132

M
Mr.doob 已提交
133
						break;
M
Mr.doob 已提交
134

M
Mr.doob 已提交
135
					case 'dae':
M
Mr.doob 已提交
136

M
Mr.doob 已提交
137 138
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
M
Mr.doob 已提交
139

M
Mr.doob 已提交
140
							var contents = event.target.result;
M
Mr.doob 已提交
141

M
Mr.doob 已提交
142 143
							var parser = new DOMParser();
							var xml = parser.parseFromString( contents, 'text/xml' );
144

M
Mr.doob 已提交
145 146
							var loader = new THREE.ColladaLoader();
							loader.parse( xml, function ( collada ) {
147

148
								applyDummyTexture( collada.scene );
149

M
Mr.doob 已提交
150 151 152 153
								signals.objectAdded.dispatch( collada.scene );
								signals.objectSelected.dispatch( collada.scene );

							} );
M
Mr.doob 已提交
154

M
Mr.doob 已提交
155 156
						}, false );
						reader.readAsText( file );
M
Mr.doob 已提交
157 158 159

						break;

M
Mr.doob 已提交
160
					case 'js':
161

M
Mr.doob 已提交
162 163
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
164

M
Mr.doob 已提交
165
							var contents = event.target.result;
166

M
Mr.doob 已提交
167
							// 2.0
168

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

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

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

M
Mr.doob 已提交
176
								worker.onmessage = function ( event ) {
177

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

M
Mr.doob 已提交
181
								};
182

M
Mr.doob 已提交
183
								worker.postMessage( new Date().getTime() );
M
Mr.doob 已提交
184

M
Mr.doob 已提交
185
								return;
186

M
Mr.doob 已提交
187
							}
188

M
Mr.doob 已提交
189
							// 3.0
190

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

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

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

M
Mr.doob 已提交
198
								var geometry = new THREE.GeometryLoader().parse( data );
199
								var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
200

M
Mr.doob 已提交
201 202
								signals.objectAdded.dispatch( mesh );
								signals.objectSelected.dispatch( mesh );
M
Mr.doob 已提交
203

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

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

M
Mr.doob 已提交
208 209
									signals.objectAdded.dispatch( scene );
									signals.objectSelected.dispatch( scene );
M
Mr.doob 已提交
210

M
Mr.doob 已提交
211
								}, '' );
M
Mr.doob 已提交
212

M
Mr.doob 已提交
213
							}
M
Mr.doob 已提交
214

M
Mr.doob 已提交
215 216
						}, false );
						reader.readAsText( file );
217

M
Mr.doob 已提交
218
						break;
M
Mr.doob 已提交
219

M
Mr.doob 已提交
220
					case 'obj':
M
Mr.doob 已提交
221

M
Mr.doob 已提交
222 223
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
224

M
Mr.doob 已提交
225
							var contents = event.target.result;
226

M
Mr.doob 已提交
227
							var object = new THREE.OBJLoader().parse( contents );
228
							applyDummyTexture( object );
229

M
Mr.doob 已提交
230 231
							signals.objectAdded.dispatch( object );
							signals.objectSelected.dispatch( object );
M
Mr.doob 已提交
232

M
Mr.doob 已提交
233 234
						}, false );
						reader.readAsText( file );
235

236
						break;
237

238
					case 'stl':
239

M
Mr.doob 已提交
240 241 242 243 244 245
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;

							var geometry = new THREE.STLLoader().parse( contents );
246
							var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
247

M
Mr.doob 已提交
248 249
							signals.objectAdded.dispatch( mesh );
							signals.objectSelected.dispatch( mesh );
250

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

254 255
						break;

M
Mr.doob 已提交
256
					/*
257 258
					case 'utf8':

M
Mr.doob 已提交
259 260
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {
261

M
Mr.doob 已提交
262
							var contents = event.target.result;
263

M
Mr.doob 已提交
264 265 266 267 268 269 270 271 272 273
							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 );
274 275

						break;
M
Mr.doob 已提交
276
					*/
277

278 279
					case 'vtk':

M
Mr.doob 已提交
280 281 282 283
						var reader = new FileReader();
						reader.addEventListener( 'load', function ( event ) {

							var contents = event.target.result;
284

M
Mr.doob 已提交
285
							var geometry = new THREE.VTKLoader().parse( contents );
286
							var mesh = new THREE.Mesh( geometry, createDummyMaterial( geometry ) );
M
Mr.doob 已提交
287 288 289

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

M
Mr.doob 已提交
291 292
						}, false );
						reader.readAsText( file );
293 294 295 296 297 298

						break;

				}

			}
299

300
			var geometry = new THREE.SphereGeometry( 75, 25, 15 );
301
			var material = new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff, map: dummyTexture } );
302 303 304
			var mesh = new THREE.Mesh( geometry, material );

			signals.objectAdded.dispatch( mesh );
305
			signals.objectSelected.dispatch( mesh );
306

M
Mr.doob 已提交
307
			var onWindowResize = function ( event ) {
308

309
				signals.windowResize.dispatch();
310

M
Mr.doob 已提交
311
			};
312

313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
			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 已提交
338
			onWindowResize();
339

M
Mr.doob 已提交
340
			window.addEventListener( 'resize', onWindowResize, false );
341 342 343 344

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