@@ -6,7 +6,7 @@ THREE.VRMLLoader = function () {};
6
6
7
7
THREE . VRMLLoader . prototype = {
8
8
9
- constructor : THREE . VTKLoader ,
9
+ constructor : THREE . VRMLLoader ,
10
10
11
11
load : function ( url , callback ) {
12
12
@@ -52,18 +52,33 @@ THREE.VRMLLoader.prototype = {
52
52
53
53
var tree = { 'string' : 'Scene' , children : [ ] } ;
54
54
var current = tree ;
55
+ var matches ;
55
56
56
57
for ( var i = 0 ; i < lines . length ; i ++ ) {
57
58
59
+ var comment = '' ;
60
+
58
61
var line = lines [ i ] ;
59
62
60
- if ( / ^ # / . exec ( line ) ) {
63
+ // omit whitespace only lines
64
+ if ( null !== ( result = / ^ \s + ?$ / g. exec ( line ) ) ) {
65
+ continue ;
66
+ }
67
+
68
+ if ( / # / . exec ( line ) ) {
69
+
70
+ var parts = line . split ( '#' ) ;
61
71
62
- continue ;
72
+ // discard everything after the #, it is a comment
73
+ line = parts [ 0 ] ;
63
74
64
- } else if ( / { / . exec ( line ) ) {
75
+ // well, let's also keep the comment
76
+ comment = parts [ 1 ] ;
77
+ }
78
+ // todo: add collection like coordIndex and colorIndex who are delimited by [ ]
79
+ if ( matches = / ( [ ^ \s ] * ) { 1 } \s ? { / . exec ( line ) ) { // first subpattern should match the Node name
65
80
66
- var block = { 'string' : line , 'parent' : current , 'children' : [ ] } ;
81
+ var block = { 'nodeType' : matches [ 1 ] , ' string' : line , 'parent' : current , 'children' : [ ] , 'comment' : comment } ;
67
82
current . children . push ( block ) ;
68
83
current = block ;
69
84
@@ -80,13 +95,13 @@ THREE.VRMLLoader.prototype = {
80
95
81
96
} else if ( line !== '' ) {
82
97
83
- current . children . push ( line ) ;
98
+ current . children . push ( line ) ;
84
99
85
100
}
86
101
87
102
}
88
103
89
- return tree ;
104
+ return tree ;
90
105
91
106
}
92
107
@@ -103,16 +118,29 @@ THREE.VRMLLoader.prototype = {
103
118
104
119
if ( / U S E / . exec ( data ) ) {
105
120
106
- if ( / a p p e a r a n c e / . exec ( data ) ) {
121
+ var defineKey = / U S E \s + ? ( \w + ) / . exec ( data ) [ 1 ] ;
107
122
108
- parent . material = defines [ / U S E ( \w + ) / . exec ( data ) [ 1 ] ] . clone ( ) ;
123
+ if ( undefined == defines [ defineKey ] ) {
124
+ debugger ;
125
+ console . warn ( defineKey + ' is not defined.' ) ;
109
126
110
- } else {
127
+ } else {
111
128
112
- var object = defines [ / U S E ( \w + ) / . exec ( data ) [ 1 ] ] . clone ( ) ;
113
- parent . add ( object ) ;
129
+ if ( / a p p e a r a n c e / . exec ( data ) && defineKey ) {
114
130
115
- }
131
+ parent . material = defines [ defineKey ] . clone ( ) ;
132
+
133
+ } else if ( / g e o m e t r y / . exec ( data ) && defineKey ) {
134
+
135
+ parent . geometry = defines [ defineKey ] . clone ( ) ;
136
+
137
+ } else if ( defineKey ) {
138
+ var object = defines [ defineKey ] . clone ( ) ;
139
+ parent . add ( object ) ;
140
+
141
+ }
142
+
143
+ }
116
144
117
145
}
118
146
@@ -123,12 +151,11 @@ THREE.VRMLLoader.prototype = {
123
151
var object = parent ;
124
152
125
153
if ( / T r a n s f o r m / . exec ( data . string ) || / G r o u p / . exec ( data . string ) ) {
126
-
127
154
object = new THREE . Object3D ( ) ;
128
155
129
156
if ( / D E F / . exec ( data . string ) ) {
130
157
131
- object . name = / D E F ( \w + ) / . exec ( data . string ) [ 1 ] ;
158
+ object . name = / D E F \s + ( \w + ) / . exec ( data . string ) [ 1 ] ;
132
159
defines [ object . name ] = object ;
133
160
134
161
}
@@ -151,13 +178,14 @@ THREE.VRMLLoader.prototype = {
151
178
152
179
var result = float4_pattern . exec ( child ) ;
153
180
154
- object . quaternion . set (
155
- parseFloat ( result [ 1 ] ) ,
156
- parseFloat ( result [ 2 ] ) ,
157
- parseFloat ( result [ 3 ] ) ,
158
- parseFloat ( result [ 4 ] )
159
- ) ;
181
+ var quaternion = new THREE . Quaternion ( ) ;
160
182
183
+ var x = parseFloat ( result [ 1 ] ) ;
184
+ var y = parseFloat ( result [ 2 ] ) ;
185
+ var z = parseFloat ( result [ 3 ] ) ;
186
+ var w = parseFloat ( result [ 4 ] ) ;
187
+
188
+ object . quaternion . setFromAxisAngle ( new THREE . Vector3 ( x , y , z ) , w ) ;
161
189
} else if ( / s c a l e / . exec ( child ) ) {
162
190
163
191
var result = float3_pattern . exec ( child ) ;
@@ -179,10 +207,8 @@ THREE.VRMLLoader.prototype = {
179
207
object = new THREE . Mesh ( ) ;
180
208
181
209
if ( / D E F / . exec ( data . string ) ) {
182
-
183
210
object . name = / D E F ( \w + ) / . exec ( data . string ) [ 1 ] ;
184
211
defines [ object . name ] = object ;
185
-
186
212
}
187
213
188
214
parent . add ( object ) ;
@@ -261,6 +287,96 @@ THREE.VRMLLoader.prototype = {
261
287
262
288
parent . geometry = new THREE . SphereGeometry ( parseFloat ( result [ 1 ] ) ) ;
263
289
290
+ } else if ( / I n d e x e d F a c e S e t / . exec ( data . string ) ) {
291
+
292
+ var geometry = new THREE . Geometry ( ) ;
293
+
294
+ var isRecordingCoordinates = false ;
295
+
296
+ for ( var i = 0 , j = data . children . length ; i < j ; i ++ ) {
297
+
298
+ var child = data . children [ i ] ;
299
+
300
+ var result ;
301
+ var vec ;
302
+
303
+ if ( / C o o r d i n a t e / . exec ( child . string ) ) {
304
+
305
+ for ( var k = 0 , l = child . children . length ; k < l ; k ++ ) {
306
+
307
+ var point = child . children [ k ] ;
308
+
309
+ if ( null != ( result = float3_pattern . exec ( point ) ) ) {
310
+
311
+ vec = new THREE . Vector3 (
312
+ parseFloat ( result [ 1 ] ) ,
313
+ parseFloat ( result [ 2 ] ) ,
314
+ parseFloat ( result [ 3 ] )
315
+ ) ;
316
+
317
+ geometry . vertices . push ( vec ) ;
318
+ }
319
+ }
320
+ }
321
+
322
+ if ( / c o o r d I n d e x / . exec ( child ) ) {
323
+ isRecordingCoordinates = true ;
324
+ }
325
+
326
+ var coordIndex = false ;
327
+ var points = [ ] ;
328
+ var skip = 0 ;
329
+ var regex = / ( - ? \d + ) / g;
330
+ // read this: http://math.hws.edu/eck/cs424/notes2013/16_Threejs_Advanced.html
331
+ while ( isRecordingCoordinates && null != ( coordIndex = regex . exec ( child ) ) ) {
332
+ // parse coordIndex lines
333
+ coordIndex = parseInt ( coordIndex , 10 ) ;
334
+
335
+ points . push ( coordIndex ) ;
336
+
337
+ // -1 indicates end of face points
338
+ if ( coordIndex === - 1 ) {
339
+ // reset the collection
340
+ points = [ ] ;
341
+ }
342
+
343
+ // vrml support multipoint indexed face sets (more then 3 vertices). You must calculate the composing triangles here
344
+
345
+ skip = points . length - 3 ;
346
+ skip = skip < 0 ? 0 : skip ;
347
+
348
+ // Face3 only works with triangles, but IndexedFaceSet allows shapes with more then three vertices, build them of triangles
349
+ if ( points . length >= 3 ) {
350
+ var face = new THREE . Face3 (
351
+ points [ 0 ] ,
352
+ points [ skip + 1 ] ,
353
+ points [ skip + 2 ] ,
354
+ null // normal, will be added later
355
+ // todo: pass in the color
356
+ ) ;
357
+
358
+ geometry . faces . push ( face ) ;
359
+
360
+ }
361
+
362
+ }
363
+
364
+ // stop recording if a ] is encountered after recording was turned on
365
+ isRecordingCoordinates = ( isRecordingCoordinates && null === ( / ] / . exec ( child ) ) ) ;
366
+
367
+ }
368
+
369
+ geometry . computeFaceNormals ( ) ;
370
+ //geometry.computeVertexNormals(); // does not show
371
+ geometry . computeBoundingSphere ( ) ;
372
+
373
+ // see if it's a define
374
+ if ( / D E F / . exec ( data . string ) ) {
375
+ geometry . name = / D E F ( \w + ) / . exec ( data . string ) [ 1 ] ;
376
+ defines [ geometry . name ] = geometry ;
377
+ }
378
+
379
+ parent . geometry = geometry ;
264
380
}
265
381
266
382
return ;
@@ -274,6 +390,7 @@ THREE.VRMLLoader.prototype = {
274
390
if ( / M a t e r i a l / . exec ( child . string ) ) {
275
391
276
392
var material = new THREE . MeshPhongMaterial ( ) ;
393
+ material . side = THREE . DoubleSide ;
277
394
278
395
for ( var j = 0 ; j < child . children . length ; j ++ ) {
279
396
@@ -312,8 +429,8 @@ THREE.VRMLLoader.prototype = {
312
429
} else if ( / t r a n s p a r e n c y / . exec ( parameter ) ) {
313
430
314
431
var result = / \s + ( [ \d | \. | \+ | \- | e ] + ) / . exec ( parameter ) ;
315
-
316
- material . opacity = parseFloat ( result [ 1 ] ) ;
432
+ // transparency is opposite of opacity
433
+ material . opacity = Math . abs ( 1 - parseFloat ( result [ 1 ] ) ) ;
317
434
material . transparent = true ;
318
435
319
436
}
@@ -323,6 +440,7 @@ THREE.VRMLLoader.prototype = {
323
440
if ( / D E F / . exec ( data . string ) ) {
324
441
325
442
material . name = / D E F ( \w + ) / . exec ( data . string ) [ 1 ] ;
443
+
326
444
defines [ material . name ] = material ;
327
445
328
446
}
0 commit comments