VRMLLoader.js 24.2 KB
Newer Older
M
r59  
Mr.doob 已提交
1 2 3 4
/**
 * @author mrdoob / http://mrdoob.com/
 */

M
r72  
Mr.doob 已提交
5 6 7 8 9
THREE.VRMLLoader = function ( manager ) {

	this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;

};
M
r59  
Mr.doob 已提交
10 11 12

THREE.VRMLLoader.prototype = {

M
r62  
Mr.doob 已提交
13
	constructor: THREE.VRMLLoader,
M
r59  
Mr.doob 已提交
14

M
r66  
Mr.doob 已提交
15 16 17 18 19
	// for IndexedFaceSet support
	isRecordingPoints: false,
	isRecordingFaces: false,
	points: [],
	indexes : [],
M
r63  
Mr.doob 已提交
20

M
r66  
Mr.doob 已提交
21 22 23 24 25
	// for Background support
	isRecordingAngles: false,
	isRecordingColors: false,
	angles: [],
	colors: [],
M
r63  
Mr.doob 已提交
26

M
r66  
Mr.doob 已提交
27
	recordingFieldname: null,
M
r63  
Mr.doob 已提交
28

M
r72  
Mr.doob 已提交
29
	load: function ( url, onLoad, onProgress, onError ) {
M
r59  
Mr.doob 已提交
30 31 32

		var scope = this;

M
r83  
Mr.doob 已提交
33
		var loader = new THREE.FileLoader( this.manager );
M
r72  
Mr.doob 已提交
34
		loader.load( url, function ( text ) {
M
r66  
Mr.doob 已提交
35

M
r72  
Mr.doob 已提交
36
			onLoad( scope.parse( text ) );
M
r59  
Mr.doob 已提交
37

M
r72  
Mr.doob 已提交
38
		}, onProgress, onError );
M
r59  
Mr.doob 已提交
39

M
r72  
Mr.doob 已提交
40
	},
M
r59  
Mr.doob 已提交
41

M
r72  
Mr.doob 已提交
42
	setCrossOrigin: function ( value ) {
M
r59  
Mr.doob 已提交
43

M
r72  
Mr.doob 已提交
44
		this.crossOrigin = value;
M
r59  
Mr.doob 已提交
45 46 47 48 49

	},

	parse: function ( data ) {

M
r73  
Mr.doob 已提交
50 51
		var texturePath = this.texturePath || '';

M
r74  
Mr.doob 已提交
52 53 54
		var textureLoader = new THREE.TextureLoader( this.manager );
		textureLoader.setCrossOrigin( this.crossOrigin );

M
r59  
Mr.doob 已提交
55 56 57 58 59 60 61
		var parseV1 = function ( lines, scene ) {

			console.warn( 'VRML V1.0 not supported yet' );

		};

		var parseV2 = function ( lines, scene ) {
M
r69  
Mr.doob 已提交
62

M
r66  
Mr.doob 已提交
63 64
			var defines = {};
			var float_pattern = /(\b|\-|\+)([\d\.e]+)/;
M
r73  
Mr.doob 已提交
65
			var float2_pattern = /([\d\.\+\-e]+)\s+([\d\.\+\-e]+)/g;
M
r69  
Mr.doob 已提交
66
			var float3_pattern = /([\d\.\+\-e]+)\s+([\d\.\+\-e]+)\s+([\d\.\+\-e]+)/g;
M
r66  
Mr.doob 已提交
67 68 69 70 71 72 73 74 75 76

			/**
			* Interpolates colors a and b following their relative distance
			* expressed by t.
			*
			* @param float a
			* @param float b
			* @param float t
			* @returns {Color}
			*/
M
r72  
Mr.doob 已提交
77 78
			var interpolateColors = function( a, b, t ) {

M
r69  
Mr.doob 已提交
79 80 81
				var deltaR = a.r - b.r;
				var deltaG = a.g - b.g;
				var deltaB = a.b - b.b;
M
r66  
Mr.doob 已提交
82

M
r69  
Mr.doob 已提交
83
				var c = new THREE.Color();
M
r66  
Mr.doob 已提交
84

M
r69  
Mr.doob 已提交
85 86 87
				c.r = a.r - t * deltaR;
				c.g = a.g - t * deltaG;
				c.b = a.b - t * deltaB;
M
r66  
Mr.doob 已提交
88

M
r69  
Mr.doob 已提交
89
				return c;
M
r72  
Mr.doob 已提交
90

M
r66  
Mr.doob 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
			};

			/**
			 * Vertically paints the faces interpolating between the
			 * specified colors at the specified angels. This is used for the Background
			 * node, but could be applied to other nodes with multiple faces as well.
			 *
			 * When used with the Background node, default is directionIsDown is true if
			 * interpolating the skyColor down from the Zenith. When interpolationg up from
			 * the Nadir i.e. interpolating the groundColor, the directionIsDown is false.
			 *
			 * The first angle is never specified, it is the Zenith (0 rad). Angles are specified
			 * in radians. The geometry is thought a sphere, but could be anything. The color interpolation
			 * is linear along the Y axis in any case.
			 *
			 * You must specify one more color than you have angles at the beginning of the colors array.
			 * This is the color of the Zenith (the top of the shape).
			 *
			 * @param geometry
			 * @param radius
			 * @param angles
			 * @param colors
			 * @param boolean directionIsDown Whether to work bottom up or top down.
			 */
M
r72  
Mr.doob 已提交
115
			var paintFaces = function ( geometry, radius, angles, colors, directionIsDown ) {
M
r66  
Mr.doob 已提交
116 117 118

				var f, n, p, vertexIndex, color;

M
r72  
Mr.doob 已提交
119
				var direction = directionIsDown ? 1 : - 1;
M
r66  
Mr.doob 已提交
120 121 122 123 124

				var faceIndices = [ 'a', 'b', 'c', 'd' ];

				var coord = [ ], aColor, bColor, t = 1, A = {}, B = {}, applyColor = false, colorIndex;

M
r71  
Mr.doob 已提交
125
				for ( var k = 0; k < angles.length; k ++ ) {
M
r66  
Mr.doob 已提交
126 127 128 129

					var vec = { };

					// push the vector at which the color changes
M
r72  
Mr.doob 已提交
130
					vec.y = direction * ( Math.cos( angles[ k ] ) * radius );
M
r66  
Mr.doob 已提交
131

M
r72  
Mr.doob 已提交
132
					vec.x = direction * ( Math.sin( angles[ k ] ) * radius );
M
r66  
Mr.doob 已提交
133 134 135 136 137 138

					coord.push( vec );

				}

				// painting the colors on the faces
M
r71  
Mr.doob 已提交
139
				for ( var i = 0; i < geometry.faces.length ; i ++ ) {
M
r66  
Mr.doob 已提交
140 141 142 143 144

					f  = geometry.faces[ i ];

					n = ( f instanceof THREE.Face3 ) ? 3 : 4;

M
r71  
Mr.doob 已提交
145
					for ( var j = 0; j < n; j ++ ) {
M
r66  
Mr.doob 已提交
146 147 148 149 150

						vertexIndex = f[ faceIndices[ j ] ];

						p = geometry.vertices[ vertexIndex ];

M
r71  
Mr.doob 已提交
151
						for ( var index = 0; index < colors.length; index ++ ) {
M
r66  
Mr.doob 已提交
152 153 154 155 156 157

							// linear interpolation between aColor and bColor, calculate proportion
							// A is previous point (angle)
							if ( index === 0 ) {

								A.x = 0;
M
r72  
Mr.doob 已提交
158
								A.y = directionIsDown ? radius : - 1 * radius;
M
r66  
Mr.doob 已提交
159 160 161

							} else {

M
r71  
Mr.doob 已提交
162 163
								A.x = coord[ index - 1 ].x;
								A.y = coord[ index - 1 ].y;
M
r66  
Mr.doob 已提交
164 165

							}
M
r63  
Mr.doob 已提交
166

M
r66  
Mr.doob 已提交
167
							// B is current point (angle)
M
r72  
Mr.doob 已提交
168
							B = coord[ index ];
M
r63  
Mr.doob 已提交
169

M
r66  
Mr.doob 已提交
170
							if ( undefined !== B ) {
M
r72  
Mr.doob 已提交
171

M
r66  
Mr.doob 已提交
172 173
								// p has to be between the points A and B which we interpolate
								applyColor = directionIsDown ? p.y <= A.y && p.y > B.y : p.y >= A.y && p.y < B.y;
M
r63  
Mr.doob 已提交
174

M
r72  
Mr.doob 已提交
175
								if ( applyColor ) {
M
r63  
Mr.doob 已提交
176

M
r66  
Mr.doob 已提交
177
									bColor = colors[ index + 1 ];
M
r63  
Mr.doob 已提交
178

M
r66  
Mr.doob 已提交
179
									aColor = colors[ index ];
M
r63  
Mr.doob 已提交
180

M
r66  
Mr.doob 已提交
181 182
									// below is simple linear interpolation
									t = Math.abs( p.y - A.y ) / ( A.y - B.y );
M
r63  
Mr.doob 已提交
183

M
r66  
Mr.doob 已提交
184 185
									// to make it faster, you can only calculate this if the y coord changes, the color is the same for points with the same y
									color = interpolateColors( aColor, bColor, t );
M
r63  
Mr.doob 已提交
186

M
r66  
Mr.doob 已提交
187
									f.vertexColors[ j ] = color;
M
r72  
Mr.doob 已提交
188

M
r66  
Mr.doob 已提交
189
								}
M
r63  
Mr.doob 已提交
190

M
r66  
Mr.doob 已提交
191
							} else if ( undefined === f.vertexColors[ j ] ) {
M
r72  
Mr.doob 已提交
192

M
r71  
Mr.doob 已提交
193
								colorIndex = directionIsDown ? colors.length - 1 : 0;
M
r66  
Mr.doob 已提交
194
								f.vertexColors[ j ] = colors[ colorIndex ];
M
r63  
Mr.doob 已提交
195

M
r66  
Mr.doob 已提交
196
							}
M
r72  
Mr.doob 已提交
197

M
r66  
Mr.doob 已提交
198 199 200
						}

					}
M
r63  
Mr.doob 已提交
201

M
r66  
Mr.doob 已提交
202
				}
M
r72  
Mr.doob 已提交
203

M
r66  
Mr.doob 已提交
204 205
			};

M
Mr.doob 已提交
206 207
			var index = [];

M
r72  
Mr.doob 已提交
208
			var parseProperty = function ( node, line ) {
M
r63  
Mr.doob 已提交
209

M
r66  
Mr.doob 已提交
210
				var parts = [], part, property = {}, fieldName;
M
r63  
Mr.doob 已提交
211

M
r66  
Mr.doob 已提交
212 213 214 215 216
				/**
				 * Expression for matching relevant information, such as a name or value, but not the separators
				 * @type {RegExp}
				 */
				var regex = /[^\s,\[\]]+/g;
M
r63  
Mr.doob 已提交
217

M
Mr.doob 已提交
218
				var point, angles, colors;
M
r63  
Mr.doob 已提交
219

M
r72  
Mr.doob 已提交
220 221 222 223
				while ( null != ( part = regex.exec( line ) ) ) {

					parts.push( part[ 0 ] );

M
r66  
Mr.doob 已提交
224
				}
M
r63  
Mr.doob 已提交
225

M
r72  
Mr.doob 已提交
226
				fieldName = parts[ 0 ];
M
r66  
Mr.doob 已提交
227 228 229


				// trigger several recorders
M
r72  
Mr.doob 已提交
230
				switch ( fieldName ) {
M
r66  
Mr.doob 已提交
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
					case 'skyAngle':
					case 'groundAngle':
						this.recordingFieldname = fieldName;
						this.isRecordingAngles = true;
						this.angles = [];
						break;
					case 'skyColor':
					case 'groundColor':
						this.recordingFieldname = fieldName;
						this.isRecordingColors = true;
						this.colors = [];
						break;
					case 'point':
						this.recordingFieldname = fieldName;
						this.isRecordingPoints = true;
						this.points = [];
						break;
					case 'coordIndex':
M
r73  
Mr.doob 已提交
249
					case 'texCoordIndex':
M
r66  
Mr.doob 已提交
250 251 252 253
						this.recordingFieldname = fieldName;
						this.isRecordingFaces = true;
						this.indexes = [];
				}
M
r63  
Mr.doob 已提交
254

M
r72  
Mr.doob 已提交
255
				if ( this.isRecordingFaces ) {
M
r63  
Mr.doob 已提交
256

M
r66  
Mr.doob 已提交
257
					// the parts hold the indexes as strings
M
r72  
Mr.doob 已提交
258 259 260
					if ( parts.length > 0 ) {

						for ( var ind = 0; ind < parts.length; ind ++ ) {
M
r63  
Mr.doob 已提交
261

M
r66  
Mr.doob 已提交
262
							// the part should either be positive integer or -1
M
r72  
Mr.doob 已提交
263 264
							if ( ! /(-?\d+)/.test( parts[ ind ] ) ) {

M
r66  
Mr.doob 已提交
265
								continue;
M
r72  
Mr.doob 已提交
266

M
r66  
Mr.doob 已提交
267
							}
M
r63  
Mr.doob 已提交
268

M
r66  
Mr.doob 已提交
269
							// end of current face
M
r72  
Mr.doob 已提交
270 271 272 273 274 275
							if ( parts[ ind ] === "-1" ) {

								if ( index.length > 0 ) {

									this.indexes.push( index );

M
r66  
Mr.doob 已提交
276
								}
M
r63  
Mr.doob 已提交
277

M
r66  
Mr.doob 已提交
278 279
								// start new one
								index = [];
M
r72  
Mr.doob 已提交
280

M
r66  
Mr.doob 已提交
281
							} else {
M
r72  
Mr.doob 已提交
282 283 284

								index.push( parseInt( parts[ ind ] ) );

M
r66  
Mr.doob 已提交
285
							}
M
r72  
Mr.doob 已提交
286

M
r66  
Mr.doob 已提交
287
						}
M
r63  
Mr.doob 已提交
288

M
r66  
Mr.doob 已提交
289
					}
M
r63  
Mr.doob 已提交
290

M
r66  
Mr.doob 已提交
291
					// end
M
r72  
Mr.doob 已提交
292 293
					if ( /]/.exec( line ) ) {

M
Mr.doob 已提交
294 295 296 297 298 299 300 301 302
						if ( index.length > 0 ) {

							this.indexes.push( index );

						}

						// start new one
						index = [];

M
r66  
Mr.doob 已提交
303
						this.isRecordingFaces = false;
M
r73  
Mr.doob 已提交
304
						node[this.recordingFieldname] = this.indexes;
M
r72  
Mr.doob 已提交
305

M
r66  
Mr.doob 已提交
306
					}
M
r63  
Mr.doob 已提交
307

M
r72  
Mr.doob 已提交
308 309
				} else if ( this.isRecordingPoints ) {

M
r73  
Mr.doob 已提交
310 311
					if ( node.nodeType == 'Coordinate' )

M
r72  
Mr.doob 已提交
312
					while ( null !== ( parts = float3_pattern.exec( line ) ) ) {
M
r63  
Mr.doob 已提交
313

M
r66  
Mr.doob 已提交
314
						point = {
M
r72  
Mr.doob 已提交
315 316 317
							x: parseFloat( parts[ 1 ] ),
							y: parseFloat( parts[ 2 ] ),
							z: parseFloat( parts[ 3 ] )
M
r66  
Mr.doob 已提交
318
						};
M
r63  
Mr.doob 已提交
319

M
r72  
Mr.doob 已提交
320 321
						this.points.push( point );

M
r66  
Mr.doob 已提交
322
					}
M
r63  
Mr.doob 已提交
323

M
r73  
Mr.doob 已提交
324 325 326 327 328 329 330 331 332 333 334 335 336
					if ( node.nodeType == 'TextureCoordinate' )

					while ( null !== ( parts = float2_pattern.exec( line ) ) ) {

						point = {
							x: parseFloat( parts[ 1 ] ),
							y: parseFloat( parts[ 2 ] )
						};

						this.points.push( point );

					}

M
r66  
Mr.doob 已提交
337
					// end
M
r72  
Mr.doob 已提交
338 339
					if ( /]/.exec( line ) ) {

M
r66  
Mr.doob 已提交
340 341
						this.isRecordingPoints = false;
						node.points = this.points;
M
r72  
Mr.doob 已提交
342

M
r66  
Mr.doob 已提交
343
					}
M
r63  
Mr.doob 已提交
344

M
r66  
Mr.doob 已提交
345
				} else if ( this.isRecordingAngles ) {
M
r63  
Mr.doob 已提交
346

M
r66  
Mr.doob 已提交
347 348
					// the parts hold the angles as strings
					if ( parts.length > 0 ) {
M
r63  
Mr.doob 已提交
349

M
r71  
Mr.doob 已提交
350
						for ( var ind = 0; ind < parts.length; ind ++ ) {
M
r63  
Mr.doob 已提交
351

M
r66  
Mr.doob 已提交
352
							// the part should be a float
M
r72  
Mr.doob 已提交
353 354
							if ( ! float_pattern.test( parts[ ind ] ) ) {

M
r66  
Mr.doob 已提交
355
								continue;
M
r72  
Mr.doob 已提交
356

M
r66  
Mr.doob 已提交
357
							}
M
r63  
Mr.doob 已提交
358

M
r72  
Mr.doob 已提交
359 360
							this.angles.push( parseFloat( parts[ ind ] ) );

M
r66  
Mr.doob 已提交
361
						}
M
r63  
Mr.doob 已提交
362

M
r66  
Mr.doob 已提交
363
					}
M
r63  
Mr.doob 已提交
364

M
r66  
Mr.doob 已提交
365
					// end
M
r72  
Mr.doob 已提交
366 367
					if ( /]/.exec( line ) ) {

M
r66  
Mr.doob 已提交
368
						this.isRecordingAngles = false;
M
r72  
Mr.doob 已提交
369 370
						node[ this.recordingFieldname ] = this.angles;

M
r66  
Mr.doob 已提交
371
					}
M
r63  
Mr.doob 已提交
372

M
r72  
Mr.doob 已提交
373
				} else if ( this.isRecordingColors ) {
M
r63  
Mr.doob 已提交
374

M
r72  
Mr.doob 已提交
375
					while ( null !== ( parts = float3_pattern.exec( line ) ) ) {
M
r63  
Mr.doob 已提交
376

M
r66  
Mr.doob 已提交
377
						color = {
M
r72  
Mr.doob 已提交
378 379 380
							r: parseFloat( parts[ 1 ] ),
							g: parseFloat( parts[ 2 ] ),
							b: parseFloat( parts[ 3 ] )
M
r66  
Mr.doob 已提交
381
						};
M
r63  
Mr.doob 已提交
382

M
r72  
Mr.doob 已提交
383
						this.colors.push( color );
M
r63  
Mr.doob 已提交
384

M
r66  
Mr.doob 已提交
385
					}
M
r63  
Mr.doob 已提交
386

M
r66  
Mr.doob 已提交
387
					// end
M
r72  
Mr.doob 已提交
388 389
					if ( /]/.exec( line ) ) {

M
r66  
Mr.doob 已提交
390
						this.isRecordingColors = false;
M
r72  
Mr.doob 已提交
391 392
						node[ this.recordingFieldname ] = this.colors;

M
r66  
Mr.doob 已提交
393
					}
M
r63  
Mr.doob 已提交
394

M
r72  
Mr.doob 已提交
395
				} else if ( parts[ parts.length - 1 ] !== 'NULL' && fieldName !== 'children' ) {
M
r63  
Mr.doob 已提交
396

M
r72  
Mr.doob 已提交
397
					switch ( fieldName ) {
M
r63  
Mr.doob 已提交
398

M
r66  
Mr.doob 已提交
399 400 401 402
						case 'diffuseColor':
						case 'emissiveColor':
						case 'specularColor':
						case 'color':
M
r63  
Mr.doob 已提交
403

M
r72  
Mr.doob 已提交
404 405 406
							if ( parts.length != 4 ) {

								console.warn( 'Invalid color format detected for ' + fieldName );
M
r66  
Mr.doob 已提交
407
								break;
M
r72  
Mr.doob 已提交
408

M
r66  
Mr.doob 已提交
409
							}
M
r63  
Mr.doob 已提交
410

M
r66  
Mr.doob 已提交
411
							property = {
M
r72  
Mr.doob 已提交
412 413 414 415
								r: parseFloat( parts[ 1 ] ),
								g: parseFloat( parts[ 2 ] ),
								b: parseFloat( parts[ 3 ] )
							};
M
r63  
Mr.doob 已提交
416

M
r66  
Mr.doob 已提交
417
							break;
M
r83  
Mr.doob 已提交
418 419 420
							
						case 'location':
						case 'direction':
M
r66  
Mr.doob 已提交
421 422 423
						case 'translation':
						case 'scale':
						case 'size':
M
r72  
Mr.doob 已提交
424 425 426
							if ( parts.length != 4 ) {

								console.warn( 'Invalid vector format detected for ' + fieldName );
M
r66  
Mr.doob 已提交
427
								break;
M
r72  
Mr.doob 已提交
428

M
r66  
Mr.doob 已提交
429
							}
M
r63  
Mr.doob 已提交
430

M
r66  
Mr.doob 已提交
431
							property = {
M
r72  
Mr.doob 已提交
432 433 434 435
								x: parseFloat( parts[ 1 ] ),
								y: parseFloat( parts[ 2 ] ),
								z: parseFloat( parts[ 3 ] )
							};
M
r63  
Mr.doob 已提交
436

M
r66  
Mr.doob 已提交
437 438
							break;

M
r83  
Mr.doob 已提交
439 440
						case 'intensity':				
						case 'cutOffAngle':
M
r66  
Mr.doob 已提交
441 442 443 444 445 446 447
						case 'radius':
						case 'topRadius':
						case 'bottomRadius':
						case 'height':
						case 'transparency':
						case 'shininess':
						case 'ambientIntensity':
M
r72  
Mr.doob 已提交
448 449 450
							if ( parts.length != 2 ) {

								console.warn( 'Invalid single float value specification detected for ' + fieldName );
M
r66  
Mr.doob 已提交
451
								break;
M
r72  
Mr.doob 已提交
452

M
r66  
Mr.doob 已提交
453
							}
M
r63  
Mr.doob 已提交
454

M
r72  
Mr.doob 已提交
455
							property = parseFloat( parts[ 1 ] );
M
r63  
Mr.doob 已提交
456

M
r66  
Mr.doob 已提交
457
							break;
M
r63  
Mr.doob 已提交
458

M
r66  
Mr.doob 已提交
459
						case 'rotation':
M
r72  
Mr.doob 已提交
460 461 462
							if ( parts.length != 5 ) {

								console.warn( 'Invalid quaternion format detected for ' + fieldName );
M
r66  
Mr.doob 已提交
463
								break;
M
r72  
Mr.doob 已提交
464

M
r66  
Mr.doob 已提交
465
							}
M
r63  
Mr.doob 已提交
466

M
r66  
Mr.doob 已提交
467
							property = {
M
r72  
Mr.doob 已提交
468 469 470 471 472
								x: parseFloat( parts[ 1 ] ),
								y: parseFloat( parts[ 2 ] ),
								z: parseFloat( parts[ 3 ] ),
								w: parseFloat( parts[ 4 ] )
							};
M
r63  
Mr.doob 已提交
473

M
r66  
Mr.doob 已提交
474
							break;
M
r83  
Mr.doob 已提交
475 476
							
						case 'on':
M
r66  
Mr.doob 已提交
477 478 479 480
						case 'ccw':
						case 'solid':
						case 'colorPerVertex':
						case 'convex':
M
r72  
Mr.doob 已提交
481 482 483
							if ( parts.length != 2 ) {

								console.warn( 'Invalid format detected for ' + fieldName );
M
r66  
Mr.doob 已提交
484
								break;
M
r72  
Mr.doob 已提交
485

M
r66  
Mr.doob 已提交
486
							}
M
r63  
Mr.doob 已提交
487

M
r72  
Mr.doob 已提交
488
							property = parts[ 1 ] === 'TRUE' ? true : false;
M
r63  
Mr.doob 已提交
489

M
r66  
Mr.doob 已提交
490 491
							break;
					}
M
r63  
Mr.doob 已提交
492

M
r72  
Mr.doob 已提交
493 494
					node[ fieldName ] = property;

M
r66  
Mr.doob 已提交
495
				}
M
r63  
Mr.doob 已提交
496

M
r66  
Mr.doob 已提交
497
				return property;
M
r72  
Mr.doob 已提交
498

M
r66  
Mr.doob 已提交
499
			};
M
r59  
Mr.doob 已提交
500 501 502 503 504

			var getTree = function ( lines ) {

				var tree = { 'string': 'Scene', children: [] };
				var current = tree;
M
r66  
Mr.doob 已提交
505 506
				var matches;
				var specification;
M
r59  
Mr.doob 已提交
507 508 509

				for ( var i = 0; i < lines.length; i ++ ) {

M
r66  
Mr.doob 已提交
510
					var comment = '';
M
r62  
Mr.doob 已提交
511

M
r59  
Mr.doob 已提交
512 513
					var line = lines[ i ];

M
r66  
Mr.doob 已提交
514 515
					// omit whitespace only lines
					if ( null !== ( result = /^\s+?$/g.exec( line ) ) ) {
M
r72  
Mr.doob 已提交
516

M
r66  
Mr.doob 已提交
517
						continue;
M
r72  
Mr.doob 已提交
518

M
r66  
Mr.doob 已提交
519
					}
M
r62  
Mr.doob 已提交
520

M
r66  
Mr.doob 已提交
521
					line = line.trim();
M
r63  
Mr.doob 已提交
522

M
r66  
Mr.doob 已提交
523
					// skip empty lines
M
r72  
Mr.doob 已提交
524 525
					if ( line === '' ) {

M
r66  
Mr.doob 已提交
526
						continue;
M
r72  
Mr.doob 已提交
527

M
r66  
Mr.doob 已提交
528
					}
M
r63  
Mr.doob 已提交
529

M
r62  
Mr.doob 已提交
530 531
					if ( /#/.exec( line ) ) {

M
r72  
Mr.doob 已提交
532
						var parts = line.split( '#' );
M
r59  
Mr.doob 已提交
533

M
r66  
Mr.doob 已提交
534
						// discard everything after the #, it is a comment
M
r72  
Mr.doob 已提交
535
						line = parts[ 0 ];
M
r59  
Mr.doob 已提交
536

M
r66  
Mr.doob 已提交
537
						// well, let's also keep the comment
M
r72  
Mr.doob 已提交
538 539
						comment = parts[ 1 ];

M
r62  
Mr.doob 已提交
540
					}
M
r63  
Mr.doob 已提交
541

M
r73  
Mr.doob 已提交
542
					if ( matches = /([^\s]*){1}(?:\s+)?{/.exec( line ) ) {
M
r59  
Mr.doob 已提交
543

M
r72  
Mr.doob 已提交
544 545 546
						// first subpattern should match the Node name

						var block = { 'nodeType' : matches[ 1 ], 'string': line, 'parent': current, 'children': [], 'comment' : comment };
M
r59  
Mr.doob 已提交
547 548 549 550
						current.children.push( block );
						current = block;

						if ( /}/.exec( line ) ) {
M
r72  
Mr.doob 已提交
551

M
r66  
Mr.doob 已提交
552 553
							// example: geometry Box { size 1 1 1 } # all on the same line
							specification = /{(.*)}/.exec( line )[ 1 ];
M
r63  
Mr.doob 已提交
554

M
r66  
Mr.doob 已提交
555
							// todo: remove once new parsing is complete?
M
r63  
Mr.doob 已提交
556 557
							block.children.push( specification );

M
r72  
Mr.doob 已提交
558
							parseProperty( current, specification );
M
r59  
Mr.doob 已提交
559 560 561 562 563 564 565 566 567 568 569

							current = current.parent;

						}

					} else if ( /}/.exec( line ) ) {

						current = current.parent;

					} else if ( line !== '' ) {

M
r72  
Mr.doob 已提交
570
						parseProperty( current, line );
M
r66  
Mr.doob 已提交
571 572
						// todo: remove once new parsing is complete? we still do not parse geometry and appearance the new way
						current.children.push( line );
M
r59  
Mr.doob 已提交
573 574 575 576 577

					}

				}

M
r66  
Mr.doob 已提交
578
				return tree;
M
r72  
Mr.doob 已提交
579 580

			};
M
r59  
Mr.doob 已提交
581 582 583 584 585 586 587 588 589

			var parseNode = function ( data, parent ) {

				// console.log( data );

				if ( typeof data === 'string' ) {

					if ( /USE/.exec( data ) ) {

M
r75  
Mr.doob 已提交
590
						var defineKey = /USE\s+?([^\s]+)/.exec( data )[ 1 ];
M
r59  
Mr.doob 已提交
591

M
r72  
Mr.doob 已提交
592 593 594 595
						if ( undefined == defines[ defineKey ] ) {

							console.warn( defineKey + ' is not defined.' );

M
r66  
Mr.doob 已提交
596
						} else {
M
r59  
Mr.doob 已提交
597

M
r66  
Mr.doob 已提交
598
							if ( /appearance/.exec( data ) && defineKey ) {
M
r59  
Mr.doob 已提交
599

M
r66  
Mr.doob 已提交
600
								parent.material = defines[ defineKey ].clone();
M
r62  
Mr.doob 已提交
601

M
r66  
Mr.doob 已提交
602
							} else if ( /geometry/.exec( data ) && defineKey ) {
M
r62  
Mr.doob 已提交
603

M
r66  
Mr.doob 已提交
604
								parent.geometry = defines[ defineKey ].clone();
M
r63  
Mr.doob 已提交
605

M
r66  
Mr.doob 已提交
606
								// the solid property is not cloned with clone(), is only needed for VRML loading, so we need to transfer it
M
r72  
Mr.doob 已提交
607 608
								if ( undefined !== defines[ defineKey ].solid && defines[ defineKey ].solid === false ) {

M
r66  
Mr.doob 已提交
609 610
									parent.geometry.solid = false;
									parent.material.side = THREE.DoubleSide;
M
r72  
Mr.doob 已提交
611

M
r66  
Mr.doob 已提交
612
								}
M
r62  
Mr.doob 已提交
613

M
r72  
Mr.doob 已提交
614
							} else if ( defineKey ) {
M
r63  
Mr.doob 已提交
615

M
r66  
Mr.doob 已提交
616 617
								var object = defines[ defineKey ].clone();
								parent.add( object );
M
r62  
Mr.doob 已提交
618

M
r66  
Mr.doob 已提交
619
							}
M
r62  
Mr.doob 已提交
620

M
r66  
Mr.doob 已提交
621
						}
M
r59  
Mr.doob 已提交
622 623 624 625 626 627 628 629 630

					}

					return;

				}

				var object = parent;

M
r83  
Mr.doob 已提交
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
				if(data.string.indexOf("AmbientLight")>-1 && data.nodeType=='PointLight'){
					//wenn im Namen "AmbientLight" vorkommt und es ein PointLight ist, 
					//diesen Typ in 'AmbientLight' ändern
					data.nodeType='AmbientLight';	
				}
				
				l_visible=data.on;
				if(l_visible==undefined)l_visible=true;
				l_intensity=data.intensity;
				if(l_intensity==undefined)l_intensity=true;
				if(data.color!=undefined)
					l_color= new THREE.Color(data.color.r, data.color.g,data.color.b );
					else
					l_color= new THREE.Color(0, 0,0);
				
				
				
				if('AmbientLight' === data.nodeType){
					object=new THREE.AmbientLight( 
								l_color.getHex(), 
								l_intensity
								);
					object.visible=l_visible;
					
					parent.add( object );
					
				}
				else
				if('PointLight' === data.nodeType){
						l_distance =0;	//0="unendlich" ...1000
						l_decay=0;		//-1.. ?
						
						if(data.radius!=undefined && data.radius<1000){
							//l_radius=data.radius;
							l_distance=data.radius;
							l_decay=1;
						}
						object=new THREE.PointLight( 
								l_color.getHex(), 
								l_intensity, 
								l_distance);
						object.visible=l_visible;
						
						parent.add( object );
				}
				else
				if('SpotLight' === data.nodeType){						
						l_intensity=1;
						l_distance =0;//0="unendlich"=1000
						l_angle=Math.PI/3;
						l_penumbra=0.0;//0..1
						l_decay=0;//-1.. ?
						l_visible=true;
						
						if(data.radius!=undefined && data.radius<1000){
							//l_radius=data.radius;
							l_distance=data.radius;
							l_decay=1;
						}
						if(data.cutOffAngle!=undefined)l_angle=data.cutOffAngle;
						
						object = new THREE.SpotLight(
									l_color.getHex(),
									l_intensity,
									l_distance,
									l_angle,
									l_penumbra,
									l_decay
									);
						object.visible=l_visible;						
						parent.add( object );
						/*
						var lightHelper = new THREE.SpotLightHelper( object );
						parent.parent.add( lightHelper );
						lightHelper.update();
						*/
				}
				else				
				
M
r63  
Mr.doob 已提交
710 711
				if ( 'Transform' === data.nodeType || 'Group' === data.nodeType ) {

M
r59  
Mr.doob 已提交
712 713 714
					object = new THREE.Object3D();

					if ( /DEF/.exec( data.string ) ) {
M
r72  
Mr.doob 已提交
715

M
r75  
Mr.doob 已提交
716
						object.name = /DEF\s+([^\s]+)/.exec( data.string )[ 1 ];
M
r59  
Mr.doob 已提交
717
						defines[ object.name ] = object;
M
r72  
Mr.doob 已提交
718

M
r59  
Mr.doob 已提交
719 720
					}

M
r72  
Mr.doob 已提交
721
					if ( undefined !== data[ 'translation' ] ) {
M
r59  
Mr.doob 已提交
722

M
r66  
Mr.doob 已提交
723
						var t = data.translation;
M
r59  
Mr.doob 已提交
724

M
r72  
Mr.doob 已提交
725
						object.position.set( t.x, t.y, t.z );
M
r59  
Mr.doob 已提交
726

M
r66  
Mr.doob 已提交
727
					}
M
r59  
Mr.doob 已提交
728

M
r66  
Mr.doob 已提交
729
					if ( undefined !== data.rotation ) {
M
r59  
Mr.doob 已提交
730

M
r66  
Mr.doob 已提交
731
						var r = data.rotation;
M
r59  
Mr.doob 已提交
732

M
r66  
Mr.doob 已提交
733
						object.quaternion.setFromAxisAngle( new THREE.Vector3( r.x, r.y, r.z ), r.w );
M
r62  
Mr.doob 已提交
734

M
r66  
Mr.doob 已提交
735
					}
M
r59  
Mr.doob 已提交
736

M
r66  
Mr.doob 已提交
737
					if ( undefined !== data.scale ) {
M
r59  
Mr.doob 已提交
738

M
r66  
Mr.doob 已提交
739
						var s = data.scale;
M
r59  
Mr.doob 已提交
740

M
r66  
Mr.doob 已提交
741
						object.scale.set( s.x, s.y, s.z );
M
r59  
Mr.doob 已提交
742

M
r66  
Mr.doob 已提交
743
					}
M
r59  
Mr.doob 已提交
744 745 746

					parent.add( object );

M
r63  
Mr.doob 已提交
747
				} else if ( 'Shape' === data.nodeType ) {
M
r59  
Mr.doob 已提交
748 749 750 751

					object = new THREE.Mesh();

					if ( /DEF/.exec( data.string ) ) {
M
r63  
Mr.doob 已提交
752

M
r75  
Mr.doob 已提交
753
						object.name = /DEF\s+([^\s]+)/.exec( data.string )[ 1 ];
M
r63  
Mr.doob 已提交
754

M
r59  
Mr.doob 已提交
755
						defines[ object.name ] = object;
M
r72  
Mr.doob 已提交
756

M
r59  
Mr.doob 已提交
757 758 759 760
					}

					parent.add( object );

M
r63  
Mr.doob 已提交
761
				} else if ( 'Background' === data.nodeType ) {
M
r59  
Mr.doob 已提交
762

M
r66  
Mr.doob 已提交
763
					var segments = 20;
M
r59  
Mr.doob 已提交
764

M
r66  
Mr.doob 已提交
765
					// sky (full sphere):
M
r69  
Mr.doob 已提交
766

M
r66  
Mr.doob 已提交
767
					var radius = 2e4;
M
r59  
Mr.doob 已提交
768

M
r66  
Mr.doob 已提交
769
					var skyGeometry = new THREE.SphereGeometry( radius, segments, segments );
M
r69  
Mr.doob 已提交
770
					var skyMaterial = new THREE.MeshBasicMaterial( { fog: false, side: THREE.BackSide } );
M
r59  
Mr.doob 已提交
771

M
r69  
Mr.doob 已提交
772
					if ( data.skyColor.length > 1 ) {
M
r59  
Mr.doob 已提交
773

M
r69  
Mr.doob 已提交
774
						paintFaces( skyGeometry, radius, data.skyAngle, data.skyColor, true );
M
r59  
Mr.doob 已提交
775

M
r69  
Mr.doob 已提交
776
						skyMaterial.vertexColors = THREE.VertexColors
M
r59  
Mr.doob 已提交
777

M
r69  
Mr.doob 已提交
778
					} else {
M
r59  
Mr.doob 已提交
779

M
r69  
Mr.doob 已提交
780 781
						var color = data.skyColor[ 0 ];
						skyMaterial.color.setRGB( color.r, color.b, color.g );
M
r59  
Mr.doob 已提交
782

M
r69  
Mr.doob 已提交
783
					}
M
r59  
Mr.doob 已提交
784

M
r69  
Mr.doob 已提交
785
					scene.add( new THREE.Mesh( skyGeometry, skyMaterial ) );
M
r59  
Mr.doob 已提交
786

M
r66  
Mr.doob 已提交
787
					// ground (half sphere):
M
r59  
Mr.doob 已提交
788

M
r69  
Mr.doob 已提交
789
					if ( data.groundColor !== undefined ) {
M
r59  
Mr.doob 已提交
790

M
r69  
Mr.doob 已提交
791
						radius = 1.2e4;
M
r59  
Mr.doob 已提交
792

M
r69  
Mr.doob 已提交
793 794
						var groundGeometry = new THREE.SphereGeometry( radius, segments, segments, 0, 2 * Math.PI, 0.5 * Math.PI, 1.5 * Math.PI );
						var groundMaterial = new THREE.MeshBasicMaterial( { fog: false, side: THREE.BackSide, vertexColors: THREE.VertexColors } );
M
r59  
Mr.doob 已提交
795

M
r69  
Mr.doob 已提交
796
						paintFaces( groundGeometry, radius, data.groundAngle, data.groundColor, false );
M
r59  
Mr.doob 已提交
797

M
r69  
Mr.doob 已提交
798
						scene.add( new THREE.Mesh( groundGeometry, groundMaterial ) );
M
r59  
Mr.doob 已提交
799

M
r69  
Mr.doob 已提交
800
					}
M
r59  
Mr.doob 已提交
801

M
r63  
Mr.doob 已提交
802
				} else if ( /geometry/.exec( data.string ) ) {
M
r59  
Mr.doob 已提交
803

M
r63  
Mr.doob 已提交
804
					if ( 'Box' === data.nodeType ) {
M
r59  
Mr.doob 已提交
805

M
r66  
Mr.doob 已提交
806
						var s = data.size;
M
r59  
Mr.doob 已提交
807

M
r66  
Mr.doob 已提交
808
						parent.geometry = new THREE.BoxGeometry( s.x, s.y, s.z );
M
r59  
Mr.doob 已提交
809

M
r63  
Mr.doob 已提交
810
					} else if ( 'Cylinder' === data.nodeType ) {
M
r59  
Mr.doob 已提交
811

M
r63  
Mr.doob 已提交
812
						parent.geometry = new THREE.CylinderGeometry( data.radius, data.radius, data.height );
M
r59  
Mr.doob 已提交
813

M
r63  
Mr.doob 已提交
814
					} else if ( 'Cone' === data.nodeType ) {
M
r59  
Mr.doob 已提交
815

M
r63  
Mr.doob 已提交
816
						parent.geometry = new THREE.CylinderGeometry( data.topRadius, data.bottomRadius, data.height );
M
r59  
Mr.doob 已提交
817

M
r63  
Mr.doob 已提交
818
					} else if ( 'Sphere' === data.nodeType ) {
M
r59  
Mr.doob 已提交
819

M
r63  
Mr.doob 已提交
820
						parent.geometry = new THREE.SphereGeometry( data.radius );
M
r59  
Mr.doob 已提交
821

M
r63  
Mr.doob 已提交
822
					} else if ( 'IndexedFaceSet' === data.nodeType ) {
M
r62  
Mr.doob 已提交
823

M
r66  
Mr.doob 已提交
824
						var geometry = new THREE.Geometry();
M
r62  
Mr.doob 已提交
825

M
r73  
Mr.doob 已提交
826
						var indexes, uvIndexes, uvs;
M
r62  
Mr.doob 已提交
827

M
r71  
Mr.doob 已提交
828
						for ( var i = 0, j = data.children.length; i < j; i ++ ) {
M
r62  
Mr.doob 已提交
829

M
r66  
Mr.doob 已提交
830
							var child = data.children[ i ];
M
r62  
Mr.doob 已提交
831

M
r66  
Mr.doob 已提交
832
							var vec;
M
r62  
Mr.doob 已提交
833

M
r73  
Mr.doob 已提交
834 835 836 837 838 839 840
							if ( 'TextureCoordinate' === child.nodeType ) {

								uvs = child.points;

							}


M
r66  
Mr.doob 已提交
841
							if ( 'Coordinate' === child.nodeType ) {
M
r62  
Mr.doob 已提交
842

M
r73  
Mr.doob 已提交
843 844 845
								if ( child.points ) {

									for ( var k = 0, l = child.points.length; k < l; k ++ ) {
M
r62  
Mr.doob 已提交
846

M
r73  
Mr.doob 已提交
847
										var point = child.points[ k ];
M
r62  
Mr.doob 已提交
848

M
r73  
Mr.doob 已提交
849
										vec = new THREE.Vector3( point.x, point.y, point.z );
M
r62  
Mr.doob 已提交
850

M
r73  
Mr.doob 已提交
851 852 853
										geometry.vertices.push( vec );

									}
M
r72  
Mr.doob 已提交
854

M
r66  
Mr.doob 已提交
855
								}
M
r62  
Mr.doob 已提交
856

M
r73  
Mr.doob 已提交
857
								if ( child.string.indexOf ( 'DEF' ) > -1 ) {
M
r72  
Mr.doob 已提交
858

M
r75  
Mr.doob 已提交
859
									var name = /DEF\s+([^\s]+)/.exec( child.string )[ 1 ];
M
r72  
Mr.doob 已提交
860

M
r73  
Mr.doob 已提交
861
									defines[ name ] = geometry.vertices;
M
r62  
Mr.doob 已提交
862

M
r73  
Mr.doob 已提交
863 864 865
								}

								if ( child.string.indexOf ( 'USE' ) > -1 ) {
M
r63  
Mr.doob 已提交
866

M
r75  
Mr.doob 已提交
867
									var defineKey = /USE\s+([^\s]+)/.exec( child.string )[ 1 ];
M
r62  
Mr.doob 已提交
868

M
r73  
Mr.doob 已提交
869 870
									geometry.vertices = defines[ defineKey ];
								}
M
r62  
Mr.doob 已提交
871

M
r73  
Mr.doob 已提交
872
							}
M
r62  
Mr.doob 已提交
873

M
r73  
Mr.doob 已提交
874
						}
M
r62  
Mr.doob 已提交
875

M
r73  
Mr.doob 已提交
876
						var skip = 0;
M
r62  
Mr.doob 已提交
877

M
r73  
Mr.doob 已提交
878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919
						// some shapes only have vertices for use in other shapes
						if ( data.coordIndex ) {

							// read this: http://math.hws.edu/eck/cs424/notes2013/16_Threejs_Advanced.html
							for ( var i = 0, j = data.coordIndex.length; i < j; i ++ ) {

								indexes = data.coordIndex[ i ]; if ( data.texCoordIndex ) uvIndexes = data.texCoordIndex[ i ];

								// vrml support multipoint indexed face sets (more then 3 vertices). You must calculate the composing triangles here
								skip = 0;

								// Face3 only works with triangles, but IndexedFaceSet allows shapes with more then three vertices, build them of triangles
								while ( indexes.length >= 3 && skip < ( indexes.length - 2 ) ) {

									var face = new THREE.Face3(
										indexes[ 0 ],
										indexes[ skip + (data.ccw ? 1 : 2) ],
										indexes[ skip + (data.ccw ? 2 : 1) ],
										null // normal, will be added later
										// todo: pass in the color, if a color index is present
									);

									if ( uvs && uvIndexes ) {
										geometry.faceVertexUvs [0].push( [
											new THREE.Vector2 (
												uvs[ uvIndexes[ 0 ] ].x ,
												uvs[ uvIndexes[ 0 ] ].y
											) ,
											new THREE.Vector2 (
												uvs[ uvIndexes[ skip + (data.ccw ? 1 : 2) ] ].x ,
												uvs[ uvIndexes[ skip + (data.ccw ? 1 : 2) ] ].y
											) ,
											new THREE.Vector2 (
												uvs[ uvIndexes[ skip + (data.ccw ? 2 : 1) ] ].x ,
												uvs[ uvIndexes[ skip + (data.ccw ? 2 : 1) ] ].y
											)
										] );
									}

									skip ++;

									geometry.faces.push( face );
M
r63  
Mr.doob 已提交
920

M
r73  
Mr.doob 已提交
921
								}
M
r63  
Mr.doob 已提交
922

M
r62  
Mr.doob 已提交
923

M
r66  
Mr.doob 已提交
924
							}
M
r62  
Mr.doob 已提交
925

M
r73  
Mr.doob 已提交
926 927 928 929
						} else {

							// do not add dummy mesh to the scene
							parent.parent.remove( parent );
M
r62  
Mr.doob 已提交
930

M
r66  
Mr.doob 已提交
931
						}
M
r62  
Mr.doob 已提交
932

M
r66  
Mr.doob 已提交
933
						if ( false === data.solid ) {
M
r72  
Mr.doob 已提交
934

M
r66  
Mr.doob 已提交
935
							parent.material.side = THREE.DoubleSide;
M
r72  
Mr.doob 已提交
936

M
r66  
Mr.doob 已提交
937
						}
M
r63  
Mr.doob 已提交
938

M
r66  
Mr.doob 已提交
939 940
						// we need to store it on the geometry for use with defines
						geometry.solid = data.solid;
M
r63  
Mr.doob 已提交
941

M
r66  
Mr.doob 已提交
942 943 944
						geometry.computeFaceNormals();
						//geometry.computeVertexNormals(); // does not show
						geometry.computeBoundingSphere();
M
r62  
Mr.doob 已提交
945

M
r66  
Mr.doob 已提交
946 947
						// see if it's a define
						if ( /DEF/.exec( data.string ) ) {
M
r72  
Mr.doob 已提交
948

M
r75  
Mr.doob 已提交
949
							geometry.name = /DEF ([^\s]+)/.exec( data.string )[ 1 ];
M
r66  
Mr.doob 已提交
950
							defines[ geometry.name ] = geometry;
M
r72  
Mr.doob 已提交
951

M
r66  
Mr.doob 已提交
952
						}
M
r62  
Mr.doob 已提交
953

M
r66  
Mr.doob 已提交
954
						parent.geometry = geometry;
M
r72  
Mr.doob 已提交
955

M
r59  
Mr.doob 已提交
956 957 958 959 960 961 962 963 964 965
					}

					return;

				} else if ( /appearance/.exec( data.string ) ) {

					for ( var i = 0; i < data.children.length; i ++ ) {

						var child = data.children[ i ];

M
r63  
Mr.doob 已提交
966
						if ( 'Material' === child.nodeType ) {
M
r72  
Mr.doob 已提交
967

M
r59  
Mr.doob 已提交
968 969
							var material = new THREE.MeshPhongMaterial();

M
r66  
Mr.doob 已提交
970
							if ( undefined !== child.diffuseColor ) {
M
r59  
Mr.doob 已提交
971

M
r66  
Mr.doob 已提交
972
								var d = child.diffuseColor;
M
r59  
Mr.doob 已提交
973

M
r66  
Mr.doob 已提交
974
								material.color.setRGB( d.r, d.g, d.b );
M
r59  
Mr.doob 已提交
975

M
r66  
Mr.doob 已提交
976
							}
M
r59  
Mr.doob 已提交
977

M
r66  
Mr.doob 已提交
978
							if ( undefined !== child.emissiveColor ) {
M
r59  
Mr.doob 已提交
979

M
r66  
Mr.doob 已提交
980
								var e = child.emissiveColor;
M
r59  
Mr.doob 已提交
981

M
r66  
Mr.doob 已提交
982
								material.emissive.setRGB( e.r, e.g, e.b );
M
r59  
Mr.doob 已提交
983

M
r66  
Mr.doob 已提交
984
							}
M
r59  
Mr.doob 已提交
985

M
r66  
Mr.doob 已提交
986
							if ( undefined !== child.specularColor ) {
M
r59  
Mr.doob 已提交
987

M
r66  
Mr.doob 已提交
988
								var s = child.specularColor;
M
r59  
Mr.doob 已提交
989

M
r66  
Mr.doob 已提交
990
								material.specular.setRGB( s.r, s.g, s.b );
M
r59  
Mr.doob 已提交
991

M
r66  
Mr.doob 已提交
992
							}
M
r59  
Mr.doob 已提交
993

M
r66  
Mr.doob 已提交
994
							if ( undefined !== child.transparency ) {
M
r59  
Mr.doob 已提交
995

M
r66  
Mr.doob 已提交
996
								var t = child.transparency;
M
r59  
Mr.doob 已提交
997

M
r66  
Mr.doob 已提交
998 999
								// transparency is opposite of opacity
								material.opacity = Math.abs( 1 - t );
M
r63  
Mr.doob 已提交
1000

M
r66  
Mr.doob 已提交
1001
								material.transparent = true;
M
r63  
Mr.doob 已提交
1002

M
r66  
Mr.doob 已提交
1003
							}
M
r59  
Mr.doob 已提交
1004 1005 1006

							if ( /DEF/.exec( data.string ) ) {

M
r75  
Mr.doob 已提交
1007
								material.name = /DEF ([^\s]+)/.exec( data.string )[ 1 ];
M
r62  
Mr.doob 已提交
1008

M
r59  
Mr.doob 已提交
1009 1010 1011 1012 1013 1014
								defines[ material.name ] = material;

							}

							parent.material = material;

M
r73  
Mr.doob 已提交
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
						}

						if ( 'ImageTexture' === child.nodeType ) {

							var textureName = /"([^"]+)"/.exec(child.children[ 0 ]);

							if (textureName) {

								parent.material.name = textureName[ 1 ];

M
r74  
Mr.doob 已提交
1025
								parent.material.map = textureLoader.load( texturePath + textureName[ 1 ] );
M
r73  
Mr.doob 已提交
1026 1027

							}
M
r72  
Mr.doob 已提交
1028

M
r59  
Mr.doob 已提交
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
						}

					}

					return;

				}

				for ( var i = 0, l = data.children.length; i < l; i ++ ) {

					var child = data.children[ i ];

					parseNode( data.children[ i ], object );

				}

M
r72  
Mr.doob 已提交
1045
			};
M
r59  
Mr.doob 已提交
1046 1047 1048 1049 1050 1051 1052 1053

			parseNode( getTree( lines ), scene );

		};

		var scene = new THREE.Scene();

		var lines = data.split( '\n' );
M
r63  
Mr.doob 已提交
1054

M
r73  
Mr.doob 已提交
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
		// some lines do not have breaks
		for (var i = lines.length -1; i > -1; i--) {

			// split lines with {..{ or {..[ - some have both
			if (/{.*[{\[]/.test (lines[i])) {
				var parts = lines[i].split ('{').join ('{\n').split ('\n');
				parts.unshift(1);
				parts.unshift(i);
				lines.splice.apply(lines, parts);
			} else

			// split lines with ]..}
			if (/\].*}/.test (lines[i])) {
				var parts = lines[i].split (']').join (']\n').split ('\n');
				parts.unshift(1);
				parts.unshift(i);
				lines.splice.apply(lines, parts);
			}

			// split lines with }..}
			if (/}.*}/.test (lines[i])) {
				var parts = lines[i].split ('}').join ('}\n').split ('\n');
				parts.unshift(1);
				parts.unshift(i);
				lines.splice.apply(lines, parts);
			}

			// force the parser to create Coordinate node for empty coords
			// coord USE something -> coord USE something Coordinate {}
			if((lines[i].indexOf ('coord') > -1) && (lines[i].indexOf ('[') < 0) && (lines[i].indexOf ('{') < 0)) {
				lines[i] += ' Coordinate {}';
			}
		}

M
r59  
Mr.doob 已提交
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
		var header = lines.shift();

		if ( /V1.0/.exec( header ) ) {

			parseV1( lines, scene );

		} else if ( /V2.0/.exec( header ) ) {

			parseV2( lines, scene );

		}

		return scene;

	}

};