elation-engine 0.9.113 → 0.9.115

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/css/systems/render.css +5 -1
  2. package/package.json +1 -1
  3. package/scripts/assets.js +103 -20
  4. package/scripts/assetworker.js +18 -1
  5. package/scripts/external/holoplay.js +1494 -0
  6. package/scripts/external/octree.js +0 -0
  7. package/scripts/external/three/CSS3DRenderer.js +46 -43
  8. package/scripts/external/three/CubemapToEquirectangular.js +1 -1
  9. package/scripts/external/three/three-extras.js +1553 -392
  10. package/scripts/external/three/three-icosa.js +2575 -0
  11. package/scripts/external/three/three-loaders.js +925 -133
  12. package/scripts/external/three/three-postprocessing.js +3 -3
  13. package/scripts/external/three/three-r116dev.js +50930 -0
  14. package/scripts/external/three/three-spotlighttextures.js +50953 -0
  15. package/scripts/external/three/three-vrm.js +2 -2
  16. package/scripts/external/three/three-working.js +35968 -0
  17. package/scripts/external/three/three.js +38532 -24087
  18. package/scripts/external/three-mesh-bvh.js +5370 -0
  19. package/scripts/external/three-old/BVHLoader.js +406 -0
  20. package/scripts/external/three-old/ColladaLoader.js +5519 -0
  21. package/scripts/external/three-old/ColladaLoader2.js +1694 -0
  22. package/scripts/external/three-old/CubemapToEquirectangular.js +188 -0
  23. package/scripts/external/three-old/DDSLoader.js +269 -0
  24. package/scripts/external/three-old/FBXLoader-mine.js +5063 -0
  25. package/scripts/external/three-old/FBXLoader.js +5112 -0
  26. package/scripts/external/three-old/FlyControls.js +295 -0
  27. package/scripts/external/three-old/GLTF2Loader.js +2950 -0
  28. package/scripts/external/three-old/GLTFLoader.js +2213 -0
  29. package/scripts/external/three-old/JSONLoader.js +435 -0
  30. package/scripts/external/three-old/MTLLoader.js +533 -0
  31. package/scripts/external/three-old/OBJLoader-experimental.js +874 -0
  32. package/scripts/external/three-old/OBJLoader-working.js +727 -0
  33. package/scripts/external/three-old/OBJLoader.js +723 -0
  34. package/scripts/external/three-old/OBJMTLLoader.js +440 -0
  35. package/scripts/external/three-old/OrbitControls.js +592 -0
  36. package/scripts/external/three-old/PLYLoader.js +517 -0
  37. package/scripts/external/three-old/TransformControls.js +1100 -0
  38. package/scripts/external/three-old/VRMLLoader.js +1021 -0
  39. package/scripts/external/three-old/glTFLoader-combined.js +2513 -0
  40. package/scripts/external/three-old/nodethree.js +44018 -0
  41. package/scripts/external/three-old/render/BleachBypassShader.js +64 -0
  42. package/scripts/external/three-old/render/BloomPass.js +116 -0
  43. package/scripts/external/three-old/render/CSS3DRenderer.js +310 -0
  44. package/scripts/external/three-old/render/ClearPass.js +44 -0
  45. package/scripts/external/three-old/render/ConvolutionShader.js +101 -0
  46. package/scripts/external/three-old/render/CopyShader.js +46 -0
  47. package/scripts/external/three-old/render/EffectComposer.js +211 -0
  48. package/scripts/external/three-old/render/FXAAShader.js +88 -0
  49. package/scripts/external/three-old/render/FilmPass.js +60 -0
  50. package/scripts/external/three-old/render/FilmShader.js +104 -0
  51. package/scripts/external/three-old/render/ManualMSAARenderPass.js +168 -0
  52. package/scripts/external/three-old/render/MaskPass.js +97 -0
  53. package/scripts/external/three-old/render/OculusRenderPass.js +84 -0
  54. package/scripts/external/three-old/render/OculusRiftEffect.js +240 -0
  55. package/scripts/external/three-old/render/PortalRenderPass.js +166 -0
  56. package/scripts/external/three-old/render/RecordingPass.js +208 -0
  57. package/scripts/external/three-old/render/RenderPass.js +57 -0
  58. package/scripts/external/three-old/render/SSAOShader.js +259 -0
  59. package/scripts/external/three-old/render/SepiaShader.js +54 -0
  60. package/scripts/external/three-old/render/ShaderPass.js +66 -0
  61. package/scripts/external/three-old/render/VREffect.js +482 -0
  62. package/scripts/external/three-old/shimthree.js +23 -0
  63. package/scripts/external/three-old/stats.js +6 -0
  64. package/scripts/external/three-old/three-88dev.js +45004 -0
  65. package/scripts/external/three-old/three-backgroundoptimization.js +44432 -0
  66. package/scripts/external/three-old/three-updates.js +44735 -0
  67. package/scripts/external/three-old/three-working.js +44719 -0
  68. package/scripts/external/three-old/three.js +44431 -0
  69. package/scripts/external/three-old/threex.rendererstats.js +66 -0
  70. package/scripts/external/three-old/tween.js +13 -0
  71. package/scripts/external/webvr-polyfill-new.js +3497 -0
  72. package/scripts/external/webvr-polyfill-newest.js +3491 -0
  73. package/scripts/external/webvr-polyfill-old.js +6337 -0
  74. package/scripts/geometries.js +2 -2
  75. package/scripts/math.js +6 -6
  76. package/scripts/systems/admin.js +1 -1
  77. package/scripts/systems/controls.js +6 -4
  78. package/scripts/systems/physics.js +10 -10
  79. package/scripts/systems/render.js +58 -20
  80. package/scripts/systems/render2.js +38 -0
  81. package/scripts/things/camera.js +6 -1
  82. package/scripts/things/generic-trackedvectors.js +1875 -0
  83. package/scripts/things/generic.js +3 -4
  84. package/scripts/things/label2d.js +1 -1
  85. package/scripts/things/leapmotion.js +6 -6
  86. package/scripts/things/menu.js +1 -1
  87. package/scripts/things/player-bak.js +638 -0
  88. package/scripts/things/player.js +28 -10
  89. package/scripts/things/skysphere.js +1 -1
  90. package/scripts/things/terrain.js +1 -1
  91. package/scripts/things/text.js +1 -1
@@ -0,0 +1,1694 @@
1
+ /**
2
+ * @author mrdoob / http://mrdoob.com/
3
+ */
4
+
5
+ THREE.ColladaLoader = function ( manager ) {
6
+
7
+ this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
8
+
9
+ };
10
+
11
+ THREE.ColladaLoader.prototype = {
12
+
13
+ constructor: THREE.ColladaLoader,
14
+
15
+ load: function ( url, onLoad, onProgress, onError ) {
16
+
17
+ var scope = this;
18
+
19
+ var loader = new THREE.FileLoader( scope.manager );
20
+ loader.load( url, function ( text ) {
21
+
22
+ onLoad( scope.parse( text ) );
23
+
24
+ }, onProgress, onError );
25
+
26
+ },
27
+
28
+ options: {
29
+
30
+ set convertUpAxis( value ) {
31
+
32
+ console.log( 'ColladaLoder.options.convertUpAxis: TODO' );
33
+
34
+ }
35
+
36
+ },
37
+
38
+ setCrossOrigin: function ( value ) {
39
+
40
+ this.crossOrigin = value;
41
+
42
+ },
43
+
44
+ parse: function ( text ) {
45
+
46
+ function getElementsByTagName( xml, name ) {
47
+
48
+ // Non recursive xml.getElementsByTagName() ...
49
+
50
+ var array = [];
51
+ var childNodes = xml.childNodes;
52
+
53
+ for ( var i = 0, l = childNodes.length; i < l; i ++ ) {
54
+
55
+ var child = childNodes[ i ];
56
+
57
+ if ( child.nodeName === name ) {
58
+
59
+ array.push( child );
60
+
61
+ }
62
+
63
+ }
64
+
65
+ return array;
66
+
67
+ }
68
+
69
+ function parseFloats( text ) {
70
+
71
+ if ( text.length === 0 ) return [];
72
+
73
+ var parts = text.trim().split( /\s+/ );
74
+ var array = new Array( parts.length );
75
+
76
+ for ( var i = 0, l = parts.length; i < l; i ++ ) {
77
+
78
+ array[ i ] = parseFloat( parts[ i ] );
79
+
80
+ }
81
+
82
+ return array;
83
+
84
+ }
85
+
86
+ function parseInts( text ) {
87
+
88
+ if ( text.length === 0 ) return [];
89
+
90
+ var parts = text.trim().split( /\s+/ );
91
+ var array = new Array( parts.length );
92
+
93
+ for ( var i = 0, l = parts.length; i < l; i ++ ) {
94
+
95
+ array[ i ] = parseInt( parts[ i ] );
96
+
97
+ }
98
+
99
+ return array;
100
+
101
+ }
102
+
103
+ function parseId( text ) {
104
+
105
+ return text.substring( 1 );
106
+
107
+ }
108
+
109
+ // asset
110
+
111
+ function parseAsset( xml ) {
112
+
113
+ return {
114
+ unit: parseAssetUnit( getElementsByTagName( xml, 'unit' )[ 0 ] ),
115
+ upAxis: parseAssetUpAxis( getElementsByTagName( xml, 'up_axis' )[ 0 ] )
116
+ };
117
+
118
+ }
119
+
120
+ function parseAssetUnit( xml ) {
121
+
122
+ return xml !== undefined ? parseFloat( xml.getAttribute( 'meter' ) ) : 1;
123
+
124
+ }
125
+
126
+ function parseAssetUpAxis( xml ) {
127
+
128
+ return xml !== undefined ? xml.textContent : 'Y_UP';
129
+
130
+ }
131
+
132
+ // library
133
+
134
+ function parseLibrary( xml, libraryName, nodeName, parser ) {
135
+
136
+ var library = getElementsByTagName( xml, libraryName )[ 0 ];
137
+
138
+ if ( library !== undefined ) {
139
+
140
+ var elements = getElementsByTagName( library, nodeName );
141
+
142
+ for ( var i = 0; i < elements.length; i ++ ) {
143
+
144
+ parser( elements[ i ] );
145
+
146
+ }
147
+
148
+ }
149
+
150
+ }
151
+
152
+ function buildLibrary( data, builder ) {
153
+
154
+ for ( var name in data ) {
155
+
156
+ var object = data[ name ];
157
+ object.build = builder( data[ name ] );
158
+
159
+ }
160
+
161
+ }
162
+
163
+ // get
164
+
165
+ function getBuild( data, builder ) {
166
+
167
+ if ( data.build !== undefined ) return data.build;
168
+
169
+ data.build = builder( data );
170
+
171
+ return data.build;
172
+
173
+ }
174
+
175
+ // image
176
+
177
+ function parseImage( xml ) {
178
+
179
+ var data = {
180
+ init_from: getElementsByTagName( xml, 'init_from' )[ 0 ].textContent
181
+ };
182
+
183
+ library.images[ xml.getAttribute( 'id' ) ] = data;
184
+
185
+ }
186
+
187
+ function buildImage( data ) {
188
+
189
+ if ( data.build !== undefined ) return data.build;
190
+
191
+ return new Image( data.init_from );
192
+
193
+ }
194
+
195
+ function getImage( id ) {
196
+
197
+ if ( !library.images[ id ] ) return;
198
+
199
+ return getBuild( library.images[ id ], buildImage );
200
+
201
+ }
202
+
203
+ // effect
204
+
205
+ function parseEffect( xml ) {
206
+
207
+ var data = {};
208
+
209
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
210
+
211
+ var child = xml.childNodes[ i ];
212
+
213
+ if ( child.nodeType !== 1 ) continue;
214
+
215
+ switch ( child.nodeName ) {
216
+
217
+ case 'profile_COMMON':
218
+ data.profile = parseEffectProfileCOMMON( child );
219
+ break;
220
+
221
+ }
222
+
223
+ }
224
+
225
+ library.effects[ xml.getAttribute( 'id' ) ] = data;
226
+
227
+ }
228
+
229
+ function parseEffectProfileCOMMON( xml ) {
230
+
231
+ var data = {
232
+ surfaces: {},
233
+ samplers: {}
234
+ };
235
+
236
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
237
+
238
+ var child = xml.childNodes[ i ];
239
+
240
+ if ( child.nodeType !== 1 ) continue;
241
+
242
+ switch ( child.nodeName ) {
243
+
244
+ case 'newparam':
245
+ parseEffectNewparam( child, data );
246
+ break;
247
+
248
+ case 'technique':
249
+ data.technique = parseEffectTechnique( child );
250
+ break;
251
+
252
+ }
253
+
254
+ }
255
+
256
+ return data;
257
+
258
+ }
259
+
260
+ function parseEffectNewparam( xml, data ) {
261
+
262
+ var sid = xml.getAttribute( 'sid' );
263
+
264
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
265
+
266
+ var child = xml.childNodes[ i ];
267
+
268
+ if ( child.nodeType !== 1 ) continue;
269
+
270
+ switch ( child.nodeName ) {
271
+
272
+ case 'surface':
273
+ data.surfaces[ sid ] = parseEffectSurface( child );
274
+ break;
275
+
276
+ case 'sampler2D':
277
+ data.samplers[ sid ] = parseEffectSampler( child );
278
+ break;
279
+
280
+ }
281
+
282
+ }
283
+
284
+ }
285
+
286
+ function parseEffectSurface( xml ) {
287
+
288
+ var data = {};
289
+
290
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
291
+
292
+ var child = xml.childNodes[ i ];
293
+
294
+ if ( child.nodeType !== 1 ) continue;
295
+
296
+ switch ( child.nodeName ) {
297
+
298
+ case 'init_from':
299
+ data.init_from = child.textContent;
300
+ break;
301
+
302
+ }
303
+
304
+ }
305
+
306
+ return data;
307
+
308
+ }
309
+
310
+ function parseEffectSampler( xml ) {
311
+
312
+ var data = {};
313
+
314
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
315
+
316
+ var child = xml.childNodes[ i ];
317
+
318
+ if ( child.nodeType !== 1 ) continue;
319
+
320
+ switch ( child.nodeName ) {
321
+
322
+ case 'source':
323
+ data.source = child.textContent;
324
+ break;
325
+
326
+ }
327
+
328
+ }
329
+
330
+ return data;
331
+
332
+ }
333
+
334
+ function parseEffectTechnique( xml ) {
335
+
336
+ var data = {};
337
+
338
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
339
+
340
+ var child = xml.childNodes[ i ];
341
+
342
+ if ( child.nodeType !== 1 ) continue;
343
+
344
+ switch ( child.nodeName ) {
345
+
346
+ case 'constant':
347
+ case 'lambert':
348
+ case 'blinn':
349
+ case 'phong':
350
+ data.type = child.nodeName;
351
+ data.parameters = parseEffectParameters( child );
352
+ break;
353
+
354
+ case 'extra':
355
+ data.extra = parseEffectExtra( child );
356
+ break;
357
+
358
+ }
359
+
360
+ }
361
+
362
+ return data;
363
+
364
+ }
365
+
366
+ function parseEffectParameters( xml ) {
367
+
368
+ var data = {};
369
+
370
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
371
+
372
+ var child = xml.childNodes[ i ];
373
+
374
+ if ( child.nodeType !== 1 ) continue;
375
+
376
+ switch ( child.nodeName ) {
377
+
378
+ case 'emission':
379
+ case 'diffuse':
380
+ case 'ambient':
381
+ case 'specular':
382
+ case 'shininess':
383
+ case 'transparent':
384
+ case 'transparency':
385
+ data[ child.nodeName ] = parseEffectParameter( child );
386
+ break;
387
+
388
+ }
389
+
390
+ }
391
+
392
+ return data;
393
+
394
+ }
395
+
396
+ function parseEffectParameter( xml ) {
397
+
398
+ var data = {};
399
+
400
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
401
+
402
+ var child = xml.childNodes[ i ];
403
+
404
+ if ( child.nodeType !== 1 ) continue;
405
+
406
+ switch ( child.nodeName ) {
407
+
408
+ case 'color':
409
+ data[ child.nodeName ] = parseFloats( child.textContent );
410
+ break;
411
+
412
+ case 'float':
413
+ data[ child.nodeName ] = parseFloat( child.textContent );
414
+ break;
415
+
416
+ case 'texture':
417
+ data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), texcoord: child.getAttribute( 'texcoord' ), extra: parseEffectParameterTexture( child ) };
418
+ break;
419
+
420
+ }
421
+
422
+ }
423
+
424
+ return data;
425
+
426
+ }
427
+
428
+ function parseEffectParameterTexture( xml ) {
429
+
430
+ var data = {};
431
+
432
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
433
+
434
+ var child = xml.childNodes[ i ];
435
+
436
+ if ( child.nodeType !== 1 ) continue;
437
+
438
+ switch ( child.nodeName ) {
439
+
440
+ case 'extra':
441
+ data = parseEffectParameterTextureExtra( child );
442
+ break;
443
+
444
+ }
445
+
446
+ }
447
+
448
+ return data;
449
+
450
+ }
451
+
452
+ function parseEffectParameterTextureExtra( xml ) {
453
+
454
+ var data = {};
455
+
456
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
457
+
458
+ var child = xml.childNodes[ i ];
459
+
460
+ if ( child.nodeType !== 1 ) continue;
461
+
462
+ switch ( child.nodeName ) {
463
+
464
+ case 'technique':
465
+ data[ child.nodeName ] = parseEffectParameterTextureExtraTechnique( child );
466
+ break;
467
+
468
+ }
469
+
470
+ }
471
+
472
+ return data;
473
+
474
+ }
475
+
476
+ function parseEffectParameterTextureExtraTechnique( xml ) {
477
+
478
+ var data = {};
479
+
480
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
481
+
482
+ var child = xml.childNodes[ i ];
483
+
484
+ if ( child.nodeType !== 1 ) continue;
485
+
486
+ switch ( child.nodeName ) {
487
+
488
+ case 'repeatU':
489
+ case 'repeatV':
490
+ case 'offsetU':
491
+ case 'offsetV':
492
+ data[ child.nodeName ] = parseFloat( child.textContent );
493
+ break;
494
+
495
+ case 'wrapU':
496
+ case 'wrapV':
497
+ data[ child.nodeName ] = parseInt( child.textContent );
498
+ break;
499
+
500
+ case 'bump':
501
+ data[ child.nodeName ] = parseEffectParameterTextureExtraTechniqueBump( child );
502
+ break;
503
+ }
504
+ }
505
+
506
+ return data;
507
+
508
+ }
509
+ function parseEffectExtra( xml ) {
510
+ var data = {};
511
+
512
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
513
+
514
+ var child = xml.childNodes[ i ];
515
+
516
+ if ( child.nodeType !== 1 ) continue;
517
+
518
+ switch ( child.nodeName ) {
519
+ case 'technique':
520
+ data[ child.nodeName ] = parseEffectExtraTechnique( child );
521
+ break;
522
+ }
523
+ }
524
+
525
+ return data;
526
+ }
527
+ function parseEffectExtraTechnique( xml ) {
528
+ var data = {};
529
+
530
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
531
+
532
+ var child = xml.childNodes[ i ];
533
+
534
+ if ( child.nodeType !== 1 ) continue;
535
+
536
+ switch ( child.nodeName ) {
537
+ case 'bump':
538
+ data[ child.nodeName ] = parseEffectExtraTechniqueBump( child );
539
+ break;
540
+ }
541
+ }
542
+
543
+ return data;
544
+ }
545
+ function parseEffectExtraTechniqueBump( xml ) {
546
+ var data = {};
547
+
548
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
549
+
550
+ var child = xml.childNodes[ i ];
551
+
552
+ if ( child.nodeType !== 1 ) continue;
553
+
554
+ switch ( child.nodeName ) {
555
+ case 'texture':
556
+ data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), texcoord: child.getAttribute( 'texcoord' ), extra: parseEffectParameterTexture( child ) };
557
+ break;
558
+ }
559
+ }
560
+
561
+ return data;
562
+ }
563
+
564
+ function buildEffect( data ) {
565
+
566
+ return data;
567
+
568
+ }
569
+
570
+ function getEffect( id ) {
571
+
572
+ return getBuild( library.effects[ id ], buildEffect );
573
+
574
+ }
575
+
576
+ // material
577
+
578
+ function parseMaterial( xml ) {
579
+
580
+ var data = {
581
+ name: xml.getAttribute( 'name' )
582
+ };
583
+
584
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
585
+
586
+ var child = xml.childNodes[ i ];
587
+
588
+ if ( child.nodeType !== 1 ) continue;
589
+
590
+ switch ( child.nodeName ) {
591
+
592
+ case 'instance_effect':
593
+ data.url = parseId( child.getAttribute( 'url' ) );
594
+ break;
595
+
596
+ }
597
+
598
+ }
599
+
600
+ library.materials[ xml.getAttribute( 'id' ) ] = data;
601
+
602
+ }
603
+
604
+ function buildMaterial( data ) {
605
+
606
+ var effect = getEffect( data.url );
607
+ var technique = effect.profile.technique;
608
+
609
+ var material;
610
+
611
+ switch ( technique.type ) {
612
+
613
+ case 'phong':
614
+ case 'blinn':
615
+ material = new THREE.MeshPhongMaterial();
616
+ break;
617
+
618
+ case 'lambert':
619
+ material = new THREE.MeshLambertMaterial();
620
+ break;
621
+
622
+ default:
623
+ material = new THREE.MeshBasicMaterial();
624
+ break;
625
+
626
+ }
627
+
628
+ material.name = data.name;
629
+
630
+ function getTexture( textureObject ) {
631
+
632
+ var sampler = effect.profile.samplers[ textureObject.id ];
633
+
634
+ if ( sampler !== undefined ) {
635
+
636
+ var surface = effect.profile.surfaces[ sampler.source ];
637
+
638
+ var image = getImage( surface.init_from );
639
+
640
+ if (!image) return null;
641
+
642
+ var texture = new THREE.Texture( image );
643
+
644
+ var extra = textureObject.extra;
645
+
646
+ if ( extra !== undefined && extra.technique !== undefined ) {
647
+
648
+ var technique = extra.technique;
649
+
650
+ texture.wrapS = technique.wrapU ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;
651
+ texture.wrapT = technique.wrapV ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;
652
+
653
+ texture.offset.set( technique.offsetU, technique.offsetV );
654
+ texture.repeat.set( technique.repeatU, technique.repeatV );
655
+
656
+ } else {
657
+
658
+ texture.wrapS = THREE.RepeatWrapping;
659
+ texture.wrapT = THREE.RepeatWrapping;
660
+
661
+ }
662
+
663
+ texture.needsUpdate = true;
664
+
665
+ return texture;
666
+
667
+ }
668
+
669
+ console.error( 'ColladaLoder: Undefined sampler', textureObject.id );
670
+
671
+ return null;
672
+
673
+ }
674
+
675
+ var parameters = technique.parameters;
676
+ var extra = technique.extra;
677
+
678
+ for ( var key in parameters ) {
679
+
680
+ var parameter = parameters[ key ];
681
+
682
+ switch ( key ) {
683
+
684
+ case 'diffuse':
685
+ if ( parameter.color ) material.color.fromArray( parameter.color );
686
+ if ( parameter.texture ) material.map = getTexture( parameter.texture );
687
+ break;
688
+ case 'ambient':
689
+ //if ( parameter.color ) material.color.fromArray( parameter.color );
690
+ if ( parameter.texture ) material.lightMap = getTexture( parameter.texture );
691
+ break;
692
+ case 'specular':
693
+ if ( parameter.color && material.specular ) material.specular.fromArray( parameter.color );
694
+ if ( parameter.texture ) material.specularMap = getTexture( parameter.texture );
695
+ break;
696
+ case 'shininess':
697
+ if ( parameter.float && material.shininess ) material.shininess = parameter.float;
698
+ break;
699
+ case 'emission':
700
+ if ( parameter.color && material.emissive ) material.emissive.fromArray( parameter.color );
701
+ if ( parameter.texture ) material.emissiveMap = getTexture( parameter.texture );
702
+ break;
703
+ case 'transparent':
704
+ // if ( parameter.texture ) material.alphaMap = getTexture( parameter.texture );
705
+ material.transparent = true;
706
+ break;
707
+ case 'transparency':
708
+ if ( parameter.float !== undefined ) material.opacity = parameter.float;
709
+ material.transparent = true;
710
+ break;
711
+
712
+ }
713
+
714
+ }
715
+
716
+ if (extra && extra.technique) {
717
+ if (extra.technique.bump) {
718
+ var parameter = extra.technique.bump;
719
+ if ( parameter.texture ) {
720
+ material.normalMap = getTexture( parameter.texture );
721
+ material.normalScale = new THREE.Vector2(1,1);
722
+ }
723
+ }
724
+ }
725
+
726
+ return material;
727
+
728
+ }
729
+
730
+ function getMaterial( id ) {
731
+
732
+ return getBuild( library.materials[ id ], buildMaterial );
733
+
734
+ }
735
+
736
+ // camera
737
+
738
+ function parseCamera( xml ) {
739
+
740
+ var data = {
741
+ name: xml.getAttribute( 'name' )
742
+ };
743
+
744
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
745
+
746
+ var child = xml.childNodes[ i ];
747
+
748
+ if ( child.nodeType !== 1 ) continue;
749
+
750
+ switch ( child.nodeName ) {
751
+
752
+ case 'optics':
753
+ data.optics = parseCameraOptics( child );
754
+ break;
755
+
756
+ }
757
+
758
+ }
759
+
760
+ library.cameras[ xml.getAttribute( 'id' ) ] = data;
761
+
762
+ }
763
+
764
+ function parseCameraOptics( xml ) {
765
+
766
+ for ( var i = 0; i < xml.childNodes.length; i ++ ) {
767
+
768
+ var child = xml.childNodes[ i ];
769
+
770
+ switch ( child.nodeName ) {
771
+
772
+ case 'technique_common':
773
+ return parseCameraTechnique( child );
774
+
775
+ }
776
+
777
+ }
778
+
779
+ return {};
780
+
781
+ }
782
+
783
+ function parseCameraTechnique( xml ) {
784
+
785
+ var data = {};
786
+
787
+ for ( var i = 0; i < xml.childNodes.length; i ++ ) {
788
+
789
+ var child = xml.childNodes[ i ];
790
+
791
+ switch ( child.nodeName ) {
792
+
793
+ case 'perspective':
794
+ case 'orthographic':
795
+
796
+ data.technique = child.nodeName;
797
+ data.parameters = parseCameraParameters( child );
798
+
799
+ break;
800
+
801
+ }
802
+
803
+ }
804
+
805
+ return data;
806
+
807
+ }
808
+
809
+ function parseCameraParameters( xml ) {
810
+
811
+ var data = {};
812
+
813
+ for ( var i = 0; i < xml.childNodes.length; i ++ ) {
814
+
815
+ var child = xml.childNodes[ i ];
816
+
817
+ switch ( child.nodeName ) {
818
+
819
+ case 'xfov':
820
+ case 'yfov':
821
+ case 'xmag':
822
+ case 'ymag':
823
+ case 'znear':
824
+ case 'zfar':
825
+ case 'aspect_ratio':
826
+ data[ child.nodeName ] = parseFloat( child.textContent );
827
+ break;
828
+
829
+ }
830
+
831
+ }
832
+
833
+ return data;
834
+
835
+ }
836
+
837
+ function buildCamera( data ) {
838
+
839
+ var camera;
840
+
841
+ switch ( data.optics.technique ) {
842
+
843
+ case 'perspective':
844
+ camera = new THREE.PerspectiveCamera(
845
+ data.optics.parameters.yfov,
846
+ data.optics.parameters.aspect_ratio,
847
+ data.optics.parameters.znear,
848
+ data.optics.parameters.zfar
849
+ );
850
+ break;
851
+
852
+ case 'orthographic':
853
+ camera = new THREE.OrthographicCamera( /* TODO */ );
854
+ break;
855
+
856
+ default:
857
+ camera = new THREE.PerspectiveCamera();
858
+ break;
859
+
860
+ }
861
+
862
+ camera.name = data.name;
863
+
864
+ return camera;
865
+
866
+ }
867
+
868
+ function getCamera( id ) {
869
+
870
+ return getBuild( library.cameras[ id ], buildCamera );
871
+
872
+ }
873
+
874
+ // light
875
+
876
+ function parseLight( xml ) {
877
+
878
+ var data = {};
879
+
880
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
881
+
882
+ var child = xml.childNodes[ i ];
883
+
884
+ if ( child.nodeType !== 1 ) continue;
885
+
886
+ switch ( child.nodeName ) {
887
+
888
+ case 'technique_common':
889
+ data = parseLightTechnique( child );
890
+ break;
891
+
892
+ }
893
+
894
+ }
895
+
896
+ library.lights[ xml.getAttribute( 'id' ) ] = data;
897
+
898
+ }
899
+
900
+ function parseLightTechnique( xml ) {
901
+
902
+ var data = {};
903
+
904
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
905
+
906
+ var child = xml.childNodes[ i ];
907
+
908
+ if ( child.nodeType !== 1 ) continue;
909
+
910
+ switch ( child.nodeName ) {
911
+
912
+ case 'directional':
913
+ case 'point':
914
+ case 'spot':
915
+ case 'ambient':
916
+
917
+ data.technique = child.nodeName;
918
+ data.parameters = parseLightParameters( child );
919
+
920
+ }
921
+
922
+ }
923
+
924
+ return data;
925
+
926
+ }
927
+
928
+ function parseLightParameters( xml ) {
929
+
930
+ var data = {};
931
+
932
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
933
+
934
+ var child = xml.childNodes[ i ];
935
+
936
+ if ( child.nodeType !== 1 ) continue;
937
+
938
+ switch ( child.nodeName ) {
939
+
940
+ case 'color':
941
+ var array = parseFloats( child.textContent );
942
+ data.color = new THREE.Color().fromArray( array );
943
+ break;
944
+
945
+ case 'falloff_angle':
946
+ data.falloffAngle = parseFloat( child.textContent );
947
+ break;
948
+
949
+ case 'quadratic_attenuation':
950
+ var f = parseFloat( child.textContent );
951
+ data.distance = f ? Math.sqrt( 1 / f ) : 0;
952
+ break;
953
+
954
+ }
955
+
956
+ }
957
+
958
+ return data;
959
+
960
+ }
961
+
962
+ function buildLight( data ) {
963
+
964
+ var light;
965
+
966
+ switch ( data.technique ) {
967
+
968
+ case 'directional':
969
+ light = new THREE.DirectionalLight();
970
+ break;
971
+
972
+ case 'point':
973
+ light = new THREE.PointLight();
974
+ break;
975
+
976
+ case 'spot':
977
+ light = new THREE.SpotLight();
978
+ break;
979
+
980
+ case 'ambient':
981
+ light = new THREE.AmbientLight();
982
+ break;
983
+
984
+ }
985
+
986
+ if ( data.parameters.color ) light.color.copy( data.parameters.color );
987
+ if ( data.parameters.distance ) light.distance = data.parameters.distance;
988
+
989
+ return light;
990
+
991
+ }
992
+
993
+ function getLight( id ) {
994
+
995
+ return getBuild( library.lights[ id ], buildLight );
996
+
997
+ }
998
+
999
+ // geometry
1000
+
1001
+ function parseGeometry( xml ) {
1002
+
1003
+ var data = {
1004
+ name: xml.getAttribute( 'name' ),
1005
+ sources: {},
1006
+ vertices: {},
1007
+ primitives: []
1008
+ };
1009
+
1010
+ var mesh = getElementsByTagName( xml, 'mesh' )[ 0 ];
1011
+
1012
+ if (mesh) {
1013
+
1014
+ for ( var i = 0; i < mesh.childNodes.length; i ++ ) {
1015
+
1016
+ var child = mesh.childNodes[ i ];
1017
+
1018
+ if ( child.nodeType !== 1 ) continue;
1019
+
1020
+ var id = child.getAttribute( 'id' );
1021
+
1022
+ switch ( child.nodeName ) {
1023
+
1024
+ case 'source':
1025
+ data.sources[ id ] = parseGeometrySource( child );
1026
+ break;
1027
+
1028
+ case 'vertices':
1029
+ // data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ];
1030
+ data.vertices = parseGeometryVertices( child );
1031
+ break;
1032
+
1033
+ case 'polygons':
1034
+ console.warn( 'ColladaLoader: Unsupported primitive type: ', child.nodeName );
1035
+ break;
1036
+
1037
+ case 'lines':
1038
+ case 'linestrips':
1039
+ case 'polylist':
1040
+ case 'triangles':
1041
+ data.primitives.push( parseGeometryPrimitive( child ) );
1042
+ break;
1043
+
1044
+ default:
1045
+ console.log( child );
1046
+
1047
+ }
1048
+
1049
+ }
1050
+
1051
+ }
1052
+
1053
+ library.geometries[ xml.getAttribute( 'id' ) ] = data;
1054
+
1055
+ }
1056
+
1057
+ function parseGeometrySource( xml ) {
1058
+
1059
+ var data = {
1060
+ array: [],
1061
+ stride: 3
1062
+ };
1063
+
1064
+ for ( var i = 0; i < xml.childNodes.length; i ++ ) {
1065
+
1066
+ var child = xml.childNodes[ i ];
1067
+
1068
+ if ( child.nodeType !== 1 ) continue;
1069
+
1070
+ switch ( child.nodeName ) {
1071
+
1072
+ case 'float_array':
1073
+ data.array = parseFloats( child.textContent );
1074
+ break;
1075
+
1076
+ case 'technique_common':
1077
+ var accessor = getElementsByTagName( child, 'accessor' )[ 0 ];
1078
+
1079
+ if ( accessor !== undefined ) {
1080
+
1081
+ data.stride = parseInt( accessor.getAttribute( 'stride' ) );
1082
+
1083
+ }
1084
+ break;
1085
+
1086
+ default:
1087
+ console.log( child );
1088
+
1089
+ }
1090
+
1091
+ }
1092
+
1093
+ return data;
1094
+
1095
+ }
1096
+
1097
+ function parseGeometryVertices( xml ) {
1098
+
1099
+ var data = {};
1100
+
1101
+ for ( var i = 0; i < xml.childNodes.length; i ++ ) {
1102
+
1103
+ var child = xml.childNodes[ i ];
1104
+
1105
+ if ( child.nodeType !== 1 ) continue;
1106
+
1107
+ data[ child.getAttribute( 'semantic' ) ] = parseId( child.getAttribute( 'source' ) );
1108
+
1109
+ }
1110
+
1111
+ return data;
1112
+
1113
+ }
1114
+
1115
+ function parseGeometryPrimitive( xml ) {
1116
+
1117
+ var primitive = {
1118
+ type: xml.nodeName,
1119
+ material: xml.getAttribute( 'material' ),
1120
+ inputs: {},
1121
+ stride: 0
1122
+ };
1123
+
1124
+ for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
1125
+
1126
+ var child = xml.childNodes[ i ];
1127
+
1128
+ if ( child.nodeType !== 1 ) continue;
1129
+
1130
+ switch ( child.nodeName ) {
1131
+
1132
+ case 'input':
1133
+ var id = parseId( child.getAttribute( 'source' ) );
1134
+ var set = child.getAttribute( 'set' );
1135
+ var semantic = child.getAttribute( 'semantic' ) + set;
1136
+ var offset = parseInt( child.getAttribute( 'offset' ) );
1137
+ primitive.inputs[ semantic ] = { id: id, offset: offset };
1138
+ primitive.stride = Math.max( primitive.stride, offset + 1 );
1139
+ break;
1140
+
1141
+ case 'vcount':
1142
+ primitive.vcount = parseInts( child.textContent );
1143
+ break;
1144
+
1145
+ case 'p':
1146
+ primitive.p = parseInts( child.textContent );
1147
+ break;
1148
+
1149
+ }
1150
+
1151
+ }
1152
+
1153
+ return primitive;
1154
+
1155
+ }
1156
+
1157
+ var DEFAULT_LINEMATERIAL = new THREE.LineBasicMaterial();
1158
+ var DEFAULT_MESHMATERIAL = new THREE.MeshPhongMaterial();
1159
+ var UNDEFINED_COUNTER = 0;
1160
+
1161
+ function buildGeometry( data ) {
1162
+
1163
+ var group = {};
1164
+ var sources = data.sources;
1165
+ var vertices = data.vertices;
1166
+ var primitives = data.primitives;
1167
+
1168
+ if ( primitives.length === 0 ) return group;
1169
+
1170
+ for ( var p = 0; p < primitives.length; p ++ ) {
1171
+
1172
+ var primitive = primitives[ p ];
1173
+ var inputs = primitive.inputs;
1174
+
1175
+ var geometry = new THREE.BufferGeometry();
1176
+
1177
+ if ( data.name ) geometry.name = data.name;
1178
+
1179
+ for ( var name in inputs ) {
1180
+
1181
+ var input = inputs[ name ];
1182
+
1183
+ switch ( name ) {
1184
+
1185
+ case 'VERTEX':
1186
+ for ( var key in vertices ) {
1187
+
1188
+ geometry.addAttribute( key.toLowerCase(), buildGeometryAttribute( primitive, sources[ vertices[ key ] ], input.offset ) );
1189
+
1190
+ }
1191
+ break;
1192
+
1193
+ case 'NORMAL':
1194
+ geometry.addAttribute( 'normal', buildGeometryAttribute( primitive, sources[ input.id ], input.offset ) );
1195
+ break;
1196
+
1197
+ case 'COLOR':
1198
+ geometry.addAttribute( 'color', buildGeometryAttribute( primitive, sources[ input.id ], input.offset ) );
1199
+ break;
1200
+
1201
+ case 'TEXCOORD':
1202
+ case 'TEXCOORD0':
1203
+ geometry.addAttribute( 'uv', buildGeometryAttribute( primitive, sources[ input.id ], input.offset ) );
1204
+ break;
1205
+
1206
+ case 'TEXCOORD1':
1207
+ geometry.addAttribute( 'uv2', buildGeometryAttribute( primitive, sources[ input.id ], input.offset ) );
1208
+ break;
1209
+
1210
+ }
1211
+
1212
+ }
1213
+
1214
+ var object;
1215
+
1216
+ switch ( primitive.type ) {
1217
+
1218
+ case 'lines':
1219
+ object = new THREE.LineSegments( geometry, DEFAULT_LINEMATERIAL );
1220
+ break;
1221
+
1222
+ case 'linestrips':
1223
+ object = new THREE.Line( geometry, DEFAULT_LINEMATERIAL );
1224
+ break;
1225
+
1226
+ case 'triangles':
1227
+ case 'polylist':
1228
+ object = new THREE.Mesh( geometry, DEFAULT_MESHMATERIAL );
1229
+ break;
1230
+
1231
+ }
1232
+
1233
+ group[ primitive.material ] = object;
1234
+
1235
+ }
1236
+
1237
+ return group;
1238
+
1239
+ }
1240
+
1241
+ function buildGeometryAttribute( primitive, source, offset ) {
1242
+
1243
+ var indices = primitive.p;
1244
+ var stride = primitive.stride;
1245
+ var vcount = primitive.vcount;
1246
+
1247
+ function pushVector( i ) {
1248
+
1249
+ var index = indices[ i + offset ] * sourceStride;
1250
+ var length = index + sourceStride;
1251
+
1252
+ for ( ; index < length; index ++ ) {
1253
+
1254
+ array.push( sourceArray[ index ] );
1255
+
1256
+ }
1257
+
1258
+ }
1259
+
1260
+ var maxcount = 0;
1261
+
1262
+ var sourceArray = source.array;
1263
+ var sourceStride = source.stride;
1264
+
1265
+ var array = [];
1266
+
1267
+ if ( primitive.vcount !== undefined ) {
1268
+
1269
+ var index = 0;
1270
+
1271
+ for ( var i = 0, l = vcount.length; i < l; i ++ ) {
1272
+
1273
+ var count = vcount[ i ];
1274
+
1275
+ if ( count === 4 ) {
1276
+
1277
+ var a = index + stride * 0;
1278
+ var b = index + stride * 1;
1279
+ var c = index + stride * 2;
1280
+ var d = index + stride * 3;
1281
+
1282
+ pushVector( a ); pushVector( b ); pushVector( d );
1283
+ pushVector( b ); pushVector( c ); pushVector( d );
1284
+
1285
+ } else if ( count === 3 ) {
1286
+
1287
+ var a = index + stride * 0;
1288
+ var b = index + stride * 1;
1289
+ var c = index + stride * 2;
1290
+
1291
+ pushVector( a ); pushVector( b ); pushVector( c );
1292
+
1293
+ } else {
1294
+
1295
+ maxcount = Math.max( maxcount, count );
1296
+
1297
+ }
1298
+
1299
+ index += stride * count;
1300
+
1301
+ }
1302
+
1303
+ if ( maxcount > 0 ) {
1304
+
1305
+ console.log( 'ColladaLoader: Geometry has faces with more than 4 vertices.' );
1306
+
1307
+ }
1308
+
1309
+ } else {
1310
+
1311
+ for ( var i = 0, l = indices.length; i < l; i += stride ) {
1312
+
1313
+ pushVector( i );
1314
+
1315
+ }
1316
+
1317
+ }
1318
+
1319
+ return new THREE.Float32BufferAttribute( array, sourceStride );
1320
+
1321
+ }
1322
+
1323
+ function getGeometry( id ) {
1324
+
1325
+ return getBuild( library.geometries[ id ], buildGeometry );
1326
+
1327
+ }
1328
+
1329
+ // nodes
1330
+
1331
+ var matrix = new THREE.Matrix4();
1332
+ var vector = new THREE.Vector3();
1333
+
1334
+ function parseNode( xml ) {
1335
+
1336
+ var data = {
1337
+ name: xml.getAttribute( 'name' ),
1338
+ matrix: new THREE.Matrix4(),
1339
+ nodes: [],
1340
+ instanceCameras: [],
1341
+ instanceLights: [],
1342
+ instanceGeometries: [],
1343
+ instanceNodes: []
1344
+ };
1345
+
1346
+ for ( var i = 0; i < xml.childNodes.length; i ++ ) {
1347
+
1348
+ var child = xml.childNodes[ i ];
1349
+
1350
+ if ( child.nodeType !== 1 ) continue;
1351
+
1352
+ switch ( child.nodeName ) {
1353
+
1354
+ case 'node':
1355
+
1356
+ var id;
1357
+
1358
+ if ( child.hasAttribute( 'id' ) ) {
1359
+
1360
+ id = child.getAttribute( 'id' );
1361
+
1362
+ } else {
1363
+
1364
+ id = 'Undefined-' + UNDEFINED_COUNTER++;
1365
+ child.setAttribute( 'id', id );
1366
+
1367
+ }
1368
+
1369
+ data.nodes.push( id );
1370
+ parseNode( child );
1371
+ break;
1372
+
1373
+ case 'instance_camera':
1374
+ data.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );
1375
+ break;
1376
+
1377
+ case 'instance_light':
1378
+ data.instanceLights.push( parseId( child.getAttribute( 'url' ) ) );
1379
+ break;
1380
+
1381
+ case 'instance_geometry':
1382
+ data.instanceGeometries.push( parseNodeInstanceGeometry( child ) );
1383
+ break;
1384
+
1385
+ case 'instance_node':
1386
+ data.instanceNodes.push( parseId( child.getAttribute( 'url' ) ) );
1387
+ break;
1388
+
1389
+ case 'matrix':
1390
+ var array = parseFloats( child.textContent );
1391
+ data.matrix.multiply( matrix.fromArray( array ).transpose() ); // .transpose() when Z_UP?
1392
+ break;
1393
+
1394
+ case 'translate':
1395
+ var array = parseFloats( child.textContent );
1396
+ vector.fromArray( array );
1397
+ data.matrix.multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) );
1398
+ break;
1399
+
1400
+ case 'rotate':
1401
+ var array = parseFloats( child.textContent );
1402
+ var angle = THREE.Math.degToRad( array[ 3 ] );
1403
+ data.matrix.multiply( matrix.makeRotationAxis( vector.fromArray( array ), angle ) );
1404
+ break;
1405
+
1406
+ case 'scale':
1407
+ var array = parseFloats( child.textContent );
1408
+ data.matrix.scale( vector.fromArray( array ) );
1409
+ break;
1410
+
1411
+ case 'extra':
1412
+ break;
1413
+
1414
+ default:
1415
+ console.log( child );
1416
+
1417
+ }
1418
+
1419
+ }
1420
+
1421
+ if ( xml.hasAttribute( 'id' ) ) {
1422
+
1423
+ library.nodes[ xml.getAttribute( 'id' ) ] = data;
1424
+
1425
+ }
1426
+
1427
+ return data;
1428
+
1429
+ }
1430
+
1431
+ function parseNodeInstanceGeometry( xml ) {
1432
+
1433
+ var data = {
1434
+ id: parseId( xml.getAttribute( 'url' ) ),
1435
+ materials: {}
1436
+ };
1437
+
1438
+ for ( var i = 0; i < xml.childNodes.length; i ++ ) {
1439
+
1440
+ var child = xml.childNodes[ i ];
1441
+
1442
+ if ( child.nodeName === 'bind_material' ) {
1443
+
1444
+ var instances = child.getElementsByTagName( 'instance_material' );
1445
+
1446
+ for ( var j = 0; j < instances.length; j ++ ) {
1447
+
1448
+ var instance = instances[ j ];
1449
+ var symbol = instance.getAttribute( 'symbol' );
1450
+ var target = instance.getAttribute( 'target' );
1451
+
1452
+ data.materials[ symbol ] = parseId( target );
1453
+
1454
+ }
1455
+
1456
+ break;
1457
+
1458
+ }
1459
+
1460
+ }
1461
+
1462
+ return data;
1463
+
1464
+ }
1465
+
1466
+ function buildNode( data ) {
1467
+
1468
+ var objects = [];
1469
+
1470
+ var matrix = data.matrix;
1471
+ var nodes = data.nodes;
1472
+ var instanceCameras = data.instanceCameras;
1473
+ var instanceLights = data.instanceLights;
1474
+ var instanceGeometries = data.instanceGeometries;
1475
+ var instanceNodes = data.instanceNodes;
1476
+
1477
+ for ( var i = 0, l = nodes.length; i < l; i ++ ) {
1478
+
1479
+ objects.push( getNode( nodes[ i ] ).clone() );
1480
+
1481
+ }
1482
+
1483
+ for ( var i = 0, l = instanceCameras.length; i < l; i ++ ) {
1484
+
1485
+ objects.push( getCamera( instanceCameras[ i ] ).clone() );
1486
+
1487
+ }
1488
+
1489
+ for ( var i = 0, l = instanceLights.length; i < l; i ++ ) {
1490
+
1491
+ objects.push( getLight( instanceLights[ i ] ).clone() );
1492
+
1493
+ }
1494
+
1495
+ for ( var i = 0, l = instanceGeometries.length; i < l; i ++ ) {
1496
+
1497
+ var instance = instanceGeometries[ i ];
1498
+ var geometries = getGeometry( instance.id );
1499
+
1500
+ for ( var key in geometries ) {
1501
+
1502
+ var object = geometries[ key ].clone();
1503
+
1504
+ if ( instance.materials[ key ] !== undefined ) {
1505
+
1506
+ object.material = getMaterial( instance.materials[ key ] );
1507
+
1508
+ }
1509
+
1510
+ objects.push( object );
1511
+
1512
+ }
1513
+
1514
+ }
1515
+
1516
+ for ( var i = 0, l = instanceNodes.length; i < l; i ++ ) {
1517
+
1518
+ objects.push( getNode( instanceNodes[ i ] ).clone() );
1519
+
1520
+ }
1521
+
1522
+ var object;
1523
+
1524
+ if ( nodes.length === 0 && objects.length === 1 ) {
1525
+
1526
+ object = objects[ 0 ];
1527
+
1528
+ } else {
1529
+
1530
+ object = new THREE.Group();
1531
+
1532
+ for ( var i = 0; i < objects.length; i ++ ) {
1533
+
1534
+ object.add( objects[ i ] );
1535
+
1536
+ }
1537
+
1538
+ }
1539
+
1540
+ object.name = data.name;
1541
+ object.matrix.copy( matrix );
1542
+ matrix.decompose( object.position, object.quaternion, object.scale );
1543
+
1544
+ return object;
1545
+
1546
+ }
1547
+
1548
+ function getNode( id ) {
1549
+
1550
+ return getBuild( library.nodes[ id ], buildNode );
1551
+
1552
+ }
1553
+
1554
+ // visual scenes
1555
+
1556
+ function parseVisualScene( xml ) {
1557
+
1558
+ var data = {
1559
+ name: xml.getAttribute( 'name' ),
1560
+ children: []
1561
+ };
1562
+
1563
+ var elements = getElementsByTagName( xml, 'node' );
1564
+
1565
+ for ( var i = 0; i < elements.length; i ++ ) {
1566
+
1567
+ data.children.push( parseNode( elements[ i ] ) );
1568
+
1569
+ }
1570
+
1571
+ library.visualScenes[ xml.getAttribute( 'id' ) ] = data;
1572
+
1573
+ }
1574
+
1575
+ function buildVisualScene( data ) {
1576
+
1577
+ var group = new THREE.Group();
1578
+ group.name = data.name;
1579
+
1580
+ var children = data.children;
1581
+
1582
+ for ( var i = 0; i < children.length; i ++ ) {
1583
+
1584
+ group.add( buildNode( children[ i ] ) );
1585
+
1586
+ }
1587
+
1588
+ return group;
1589
+
1590
+ }
1591
+
1592
+ function getVisualScene( id ) {
1593
+
1594
+ return getBuild( library.visualScenes[ id ], buildVisualScene );
1595
+
1596
+ }
1597
+
1598
+ // scenes
1599
+
1600
+ function parseScene( xml ) {
1601
+
1602
+ var instance = getElementsByTagName( xml, 'instance_visual_scene' )[ 0 ];
1603
+ return getVisualScene( parseId( instance.getAttribute( 'url' ) ) );
1604
+
1605
+ }
1606
+
1607
+ console.time( 'ColladaLoader' );
1608
+
1609
+ if ( text.length === 0 ) {
1610
+
1611
+ return { scene: new THREE.Scene() };
1612
+
1613
+ }
1614
+
1615
+ console.time( 'ColladaLoader: DOMParser' );
1616
+
1617
+ var xml = new DOMParser().parseFromString( text, 'application/xml' );
1618
+
1619
+ console.timeEnd( 'ColladaLoader: DOMParser' );
1620
+
1621
+ var collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ];
1622
+
1623
+ // metadata
1624
+
1625
+ var version = collada.getAttribute( 'version' );
1626
+ console.log( 'ColladaLoader: File version', version );
1627
+
1628
+ var asset = parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] );
1629
+
1630
+ //
1631
+
1632
+ var library = {
1633
+ images: {},
1634
+ effects: {},
1635
+ materials: {},
1636
+ cameras: {},
1637
+ lights: {},
1638
+ geometries: {},
1639
+ nodes: {},
1640
+ visualScenes: {}
1641
+ };
1642
+
1643
+ console.time( 'ColladaLoader: Parse' );
1644
+
1645
+ parseLibrary( collada, 'library_images', 'image', parseImage );
1646
+ parseLibrary( collada, 'library_effects', 'effect', parseEffect );
1647
+ parseLibrary( collada, 'library_materials', 'material', parseMaterial );
1648
+ parseLibrary( collada, 'library_cameras', 'camera', parseCamera );
1649
+ parseLibrary( collada, 'library_lights', 'light', parseLight );
1650
+ parseLibrary( collada, 'library_geometries', 'geometry', parseGeometry );
1651
+ parseLibrary( collada, 'library_nodes', 'node', parseNode );
1652
+ parseLibrary( collada, 'library_visual_scenes', 'visual_scene', parseVisualScene );
1653
+
1654
+ console.timeEnd( 'ColladaLoader: Parse' );
1655
+
1656
+ console.time( 'ColladaLoader: Build' );
1657
+
1658
+ buildLibrary( library.images, buildImage );
1659
+ buildLibrary( library.effects, buildEffect );
1660
+ buildLibrary( library.materials, buildMaterial );
1661
+ buildLibrary( library.cameras, buildCamera );
1662
+ buildLibrary( library.lights, buildLight );
1663
+ buildLibrary( library.geometries, buildGeometry );
1664
+ // buildLibrary( library.nodes, buildNode );
1665
+ buildLibrary( library.visualScenes, buildVisualScene );
1666
+
1667
+ console.timeEnd( 'ColladaLoader: Build' );
1668
+
1669
+ // console.log( library );
1670
+
1671
+ var scene = parseScene( getElementsByTagName( collada, 'scene' )[ 0 ] );
1672
+
1673
+ if ( asset.upAxis === 'Z_UP' ) {
1674
+
1675
+ scene.rotation.x = - Math.PI / 2;
1676
+
1677
+ }
1678
+
1679
+ scene.scale.multiplyScalar( asset.unit );
1680
+
1681
+ console.timeEnd( 'ColladaLoader' );
1682
+
1683
+ // console.log( scene );
1684
+
1685
+ return {
1686
+ animations: [],
1687
+ kinematics: { joints: [] },
1688
+ library: library,
1689
+ scene: scene
1690
+ };
1691
+
1692
+ }
1693
+
1694
+ };