ColladaLoader2.js 20 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.ColladaLoader = function ( manager ) {
  5. this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
  6. };
  7. THREE.ColladaLoader.prototype = {
  8. constructor: THREE.ColladaLoader,
  9. load: function ( url, onLoad, onProgress, onError ) {
  10. function getBaseUrl( url ) {
  11. var parts = url.split( '/' );
  12. parts.pop();
  13. return ( parts.length < 1 ? '.' : parts.join( '/' ) ) + '/';
  14. }
  15. var scope = this;
  16. var loader = new THREE.XHRLoader( scope.manager );
  17. loader.load( url, function ( text ) {
  18. onLoad( scope.parse( text, getBaseUrl( url ) ) );
  19. }, onProgress, onError );
  20. },
  21. options: {
  22. set convertUpAxis ( value ) {
  23. console.log( 'ColladaLoder.options.convertUpAxis: TODO' );
  24. }
  25. },
  26. setCrossOrigin: function ( value ) {
  27. this.crossOrigin = value;
  28. },
  29. parse: function ( text, baseUrl ) {
  30. function getElementsByTagName( xml, name ) {
  31. // Non recursive xml.getElementsByTagName() ...
  32. var array = [];
  33. var childNodes = xml.childNodes;
  34. for ( var i = 0, l = childNodes.length; i < l; i ++ ) {
  35. var child = childNodes[ i ];
  36. if ( child.nodeName === name ) {
  37. array.push( child );
  38. }
  39. }
  40. return array;
  41. }
  42. function parseFloats( text ) {
  43. var parts = text.trim().split( /\s+/ );
  44. var array = new Array( parts.length );
  45. for ( var i = 0, l = parts.length; i < l; i ++ ) {
  46. array[ i ] = parseFloat( parts[ i ] );
  47. }
  48. return array;
  49. }
  50. function parseInts( text ) {
  51. var parts = text.trim().split( /\s+/ );
  52. var array = new Array( parts.length );
  53. for ( var i = 0, l = parts.length; i < l; i ++ ) {
  54. array[ i ] = parseInt( parts[ i ] );
  55. }
  56. return array;
  57. }
  58. function parseId( text ) {
  59. return text.substring( 1 );
  60. }
  61. // asset
  62. function parseAsset( xml ) {
  63. return {
  64. upAxis: parseAssetUpAxis( getElementsByTagName( xml, 'up_axis' )[ 0 ] )
  65. };
  66. }
  67. function parseAssetUpAxis( xml ) {
  68. return xml !== undefined ? xml.textContent : 'Y_UP';
  69. }
  70. // library
  71. function parseLibrary( xml, data, libraryName, nodeName, parser ) {
  72. var library = getElementsByTagName( xml, libraryName )[ 0 ];
  73. if ( library !== undefined ) {
  74. var elements = getElementsByTagName( library, nodeName );
  75. for ( var i = 0; i < elements.length; i ++ ) {
  76. parser( elements[ i ] );
  77. }
  78. }
  79. }
  80. function buildLibrary( data, builder ) {
  81. for ( var name in data ) {
  82. var object = data[ name ];
  83. object.build = builder( data[ name ] );
  84. }
  85. }
  86. // get
  87. function getBuild( data, builder ) {
  88. if ( data.build !== undefined ) return data.build;
  89. data.build = builder( data );
  90. return data.build;
  91. }
  92. // image
  93. var imageLoader = new THREE.ImageLoader();
  94. function parseImage( xml ) {
  95. var data = {
  96. url: getElementsByTagName( xml, 'init_from' )[ 0 ].textContent
  97. };
  98. library.images[ xml.getAttribute( 'id' ) ] = data;
  99. }
  100. function buildImage( data ) {
  101. if ( data.build !== undefined ) return data.build;
  102. var url = data.url;
  103. if ( baseUrl !== undefined ) url = baseUrl + url;
  104. return imageLoader.load( url );
  105. }
  106. function getImage( id ) {
  107. return getBuild( library.images[ id ], buildImage );
  108. }
  109. // effect
  110. function parseEffect( xml ) {
  111. }
  112. function buildEffect( data ) {
  113. }
  114. function getEffect( id ) {
  115. return getBuild( library.effects[ id ], buildEffect );
  116. }
  117. // camera
  118. function parseCamera( xml ) {
  119. var data = {
  120. name: xml.getAttribute( 'name' )
  121. };
  122. for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
  123. var child = xml.childNodes[ i ];
  124. if ( child.nodeType !== 1 ) continue;
  125. switch ( child.nodeName ) {
  126. case 'optics':
  127. data.optics = parseCameraOptics( child );
  128. break;
  129. }
  130. }
  131. library.cameras[ xml.getAttribute( 'id' ) ] = data;
  132. }
  133. function parseCameraOptics( xml ) {
  134. for ( var i = 0; i < xml.childNodes.length; i ++ ) {
  135. var child = xml.childNodes[ i ];
  136. switch ( child.nodeName ) {
  137. case 'technique_common':
  138. return parseCameraTechnique( child );
  139. }
  140. }
  141. return {};
  142. }
  143. function parseCameraTechnique( xml ) {
  144. var data = {};
  145. for ( var i = 0; i < xml.childNodes.length; i ++ ) {
  146. var child = xml.childNodes[ i ];
  147. switch ( child.nodeName ) {
  148. case 'perspective':
  149. case 'orthographic':
  150. data.technique = child.nodeName;
  151. data.parameters = parseCameraParameters( child );
  152. break;
  153. }
  154. }
  155. return data;
  156. }
  157. function parseCameraParameters( xml ) {
  158. var data = {};
  159. for ( var i = 0; i < xml.childNodes.length; i ++ ) {
  160. var child = xml.childNodes[ i ];
  161. switch ( child.nodeName ) {
  162. case 'xfov':
  163. case 'yfov':
  164. case 'xmag':
  165. case 'ymag':
  166. case 'znear':
  167. case 'zfar':
  168. case 'aspect_ratio':
  169. data[ child.nodeName ] = parseFloat( child.textContent );
  170. break;
  171. }
  172. }
  173. return data;
  174. }
  175. function buildCamera( data ) {
  176. var camera;
  177. switch ( data.optics.technique ) {
  178. case 'perspective':
  179. camera = new THREE.PerspectiveCamera(
  180. data.optics.parameters.yfov,
  181. data.optics.parameters.aspect_ratio,
  182. data.optics.parameters.znear,
  183. data.optics.parameters.zfar
  184. );
  185. break;
  186. case 'orthographic':
  187. camera = new THREE.OrthographicCamera( /* TODO */ );
  188. break;
  189. default:
  190. camera = new THREE.PerspectiveCamera();
  191. break;
  192. }
  193. camera.name = data.name;
  194. return camera;
  195. }
  196. function getCamera( id ) {
  197. return getBuild( library.cameras[ id ], buildCamera );
  198. }
  199. // light
  200. function parseLight( xml ) {
  201. var data = {};
  202. for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
  203. var child = xml.childNodes[ i ];
  204. if ( child.nodeType !== 1 ) continue;
  205. switch ( child.nodeName ) {
  206. case 'technique_common':
  207. data = parseLightTechnique( child );
  208. break;
  209. }
  210. }
  211. library.lights[ xml.getAttribute( 'id' ) ] = data;
  212. }
  213. function parseLightTechnique( xml ) {
  214. var data = {};
  215. for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
  216. var child = xml.childNodes[ i ];
  217. if ( child.nodeType !== 1 ) continue;
  218. switch ( child.nodeName ) {
  219. case 'directional':
  220. case 'point':
  221. case 'spot':
  222. case 'ambient':
  223. data.technique = child.nodeName;
  224. data.parameters = parseLightParameters( child );
  225. }
  226. }
  227. return data;
  228. }
  229. function parseLightParameters( xml ) {
  230. var data = {};
  231. for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
  232. var child = xml.childNodes[ i ];
  233. if ( child.nodeType !== 1 ) continue;
  234. switch ( child.nodeName ) {
  235. case 'color':
  236. var array = parseFloats( child.textContent );
  237. data.color = new THREE.Color().fromArray( array );
  238. break;
  239. case 'falloff_angle':
  240. data.falloffAngle = parseFloat( child.textContent );
  241. break;
  242. case 'quadratic_attenuation':
  243. var f = parseFloat( child.textContent );
  244. data.distance = f ? Math.sqrt( 1 / f ) : 0;
  245. break;
  246. }
  247. }
  248. return data;
  249. }
  250. function buildLight( data ) {
  251. var light;
  252. switch ( data.technique ) {
  253. case 'directional':
  254. light = new THREE.DirectionalLight();
  255. break;
  256. case 'point':
  257. light = new THREE.PointLight();
  258. break;
  259. case 'spot':
  260. light = new THREE.SpotLight();
  261. break;
  262. case 'ambient':
  263. light = new THREE.AmbientLight();
  264. break;
  265. }
  266. if ( data.parameters.color ) light.color.copy( data.parameters.color );
  267. if ( data.parameters.distance ) light.distance = data.parameters.distance;
  268. return light;
  269. }
  270. function getLight( id ) {
  271. return getBuild( library.lights[ id ], buildLight );
  272. }
  273. // geometry
  274. function parseSource( xml ) {
  275. var data = {
  276. array: [],
  277. stride: 3
  278. };
  279. for ( var i = 0; i < xml.childNodes.length; i ++ ) {
  280. var child = xml.childNodes[ i ];
  281. if ( child.nodeType !== 1 ) continue;
  282. switch ( child.nodeName ) {
  283. case 'float_array':
  284. data.array = parseFloats( child.textContent );
  285. break;
  286. case 'technique_common':
  287. var accessor = getElementsByTagName( child, 'accessor' )[ 0 ];
  288. if ( accessor !== undefined ) {
  289. data.stride = parseInt( accessor.getAttribute( 'stride' ) );
  290. }
  291. break;
  292. default:
  293. console.log( child );
  294. }
  295. }
  296. return data;
  297. }
  298. function parseGeometry( xml ) {
  299. var data = {
  300. name: xml.getAttribute( 'name' ),
  301. sources: {},
  302. primitives: []
  303. };
  304. var mesh = getElementsByTagName( xml, 'mesh' )[ 0 ];
  305. for ( var i = 0; i < mesh.childNodes.length; i ++ ) {
  306. var child = mesh.childNodes[ i ];
  307. if ( child.nodeType !== 1 ) continue;
  308. var id = child.getAttribute( 'id' );
  309. switch ( child.nodeName ) {
  310. case 'source':
  311. data.sources[ id ] = parseSource( child );
  312. break;
  313. case 'vertices':
  314. data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ];
  315. break;
  316. case 'polygons':
  317. console.log( 'ColladaLoader: Unsupported primitive type: ', child.nodeName );
  318. break;
  319. case 'lines':
  320. case 'linestrips':
  321. case 'polylist':
  322. case 'triangles':
  323. data.primitives.push( parseGeometryPrimitive( child ) );
  324. break;
  325. default:
  326. console.log( child );
  327. }
  328. }
  329. library.geometries[ xml.getAttribute( 'id' ) ] = data;
  330. }
  331. function parseGeometryPrimitive( xml ) {
  332. var primitive = {
  333. type: xml.nodeName,
  334. inputs: {},
  335. stride: 0
  336. };
  337. for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
  338. var child = xml.childNodes[ i ];
  339. if ( child.nodeType !== 1 ) continue;
  340. switch ( child.nodeName ) {
  341. case 'input':
  342. var id = parseId( child.getAttribute( 'source' ) );
  343. var semantic = child.getAttribute( 'semantic' );
  344. var offset = parseInt( child.getAttribute( 'offset' ) );
  345. primitive.inputs[ semantic ] = { id: id, offset: offset };
  346. primitive.stride = Math.max( primitive.stride, offset + 1 );
  347. break;
  348. case 'vcount':
  349. primitive.vcount = parseInts( child.textContent );
  350. break;
  351. case 'p':
  352. primitive.p = parseInts( child.textContent );
  353. break;
  354. }
  355. }
  356. return primitive;
  357. }
  358. var DEFAULT_MATERIAL = new THREE.MeshPhongMaterial();
  359. function buildGeometry( data ) {
  360. var group = new THREE.Group();
  361. var sources = data.sources;
  362. var primitives = data.primitives;
  363. if ( primitives.length === 0 ) return group;
  364. for ( var p = 0; p < primitives.length; p ++ ) {
  365. var primitive = primitives[ p ];
  366. var inputs = primitive.inputs;
  367. var stride = primitive.stride;
  368. var vcount = primitive.vcount;
  369. var indices = primitive.p;
  370. var vcount = primitive.vcount;
  371. var maxcount = 0;
  372. var geometry = new THREE.BufferGeometry();
  373. if ( data.name ) geometry.name = data.name;
  374. for ( var name in inputs ) {
  375. var input = inputs[ name ];
  376. var source = sources[ input.id ];
  377. var sourceArray = source.array;
  378. var sourceStride = source.stride;
  379. var offset = input.offset;
  380. var array = [];
  381. function pushVector( i ) {
  382. var index = indices[ i + offset ] * sourceStride;
  383. if ( asset.upAxis === 'Z_UP' ) {
  384. array.push( sourceArray[ index + 0 ], sourceArray[ index + 2 ], - sourceArray[ index + 1 ] );
  385. } else {
  386. array.push( sourceArray[ index + 0 ], sourceArray[ index + 1 ], sourceArray[ index + 2 ] );
  387. }
  388. }
  389. if ( primitive.vcount !== undefined ) {
  390. var index = 0;
  391. for ( var i = 0, l = vcount.length; i < l; i ++ ) {
  392. var count = vcount[ i ];
  393. if ( count === 4 ) {
  394. var a = index + stride * 0;
  395. var b = index + stride * 1;
  396. var c = index + stride * 2;
  397. var d = index + stride * 3;
  398. pushVector( a ); pushVector( b ); pushVector( d );
  399. pushVector( b ); pushVector( c ); pushVector( d );
  400. } else if ( count === 3 ) {
  401. var a = index + stride * 0;
  402. var b = index + stride * 1;
  403. var c = index + stride * 2;
  404. pushVector( a ); pushVector( b ); pushVector( c );
  405. } else {
  406. maxcount = Math.max( maxcount, count );
  407. }
  408. index += stride * count;
  409. }
  410. } else {
  411. for ( var i = 0, l = indices.length; i < l; i += stride ) {
  412. pushVector( i );
  413. }
  414. }
  415. switch ( name ) {
  416. case 'VERTEX':
  417. geometry.addAttribute( 'position', new THREE.Float32Attribute( array, 3 ) );
  418. break;
  419. case 'COLOR':
  420. geometry.addAttribute( 'color', new THREE.Float32Attribute( array, 3 ) );
  421. break;
  422. case 'NORMAL':
  423. geometry.addAttribute( 'normal', new THREE.Float32Attribute( array, 3 ) );
  424. break;
  425. }
  426. }
  427. if ( maxcount > 0 ) {
  428. console.log( 'ColladaLoader: Geometry', data.id, 'has faces with more than 4 vertices.' );
  429. }
  430. switch ( primitive.type ) {
  431. case 'lines':
  432. group.add( new THREE.LineSegments( geometry ) );
  433. break;
  434. case 'linestrips':
  435. group.add( new THREE.Line( geometry ) );
  436. break;
  437. case 'triangles':
  438. case 'polylist':
  439. var material = DEFAULT_MATERIAL;
  440. if ( geometry.attributes.color !== undefined ) {
  441. // Temporal Workaround for EXTW models
  442. material = new THREE.MeshBasicMaterial( {
  443. vertexColors: THREE.VertexColors
  444. } );
  445. }
  446. group.add( new THREE.Mesh( geometry, material ) );
  447. break;
  448. }
  449. }
  450. // flatten
  451. if ( group.children.length === 1 ) {
  452. return group.children[ 0 ];
  453. }
  454. return group;
  455. }
  456. function getGeometry( id ) {
  457. return getBuild( library.geometries[ id ], buildGeometry );
  458. }
  459. // nodes
  460. var matrix = new THREE.Matrix4();
  461. var vector = new THREE.Vector3();
  462. function parseNode( xml ) {
  463. var data = {
  464. name: xml.getAttribute( 'name' ),
  465. matrix: new THREE.Matrix4(),
  466. nodes: [],
  467. instanceCameras: [],
  468. instanceLights: [],
  469. instanceGeometries: [],
  470. instanceNodes: []
  471. };
  472. for ( var i = 0; i < xml.childNodes.length; i ++ ) {
  473. var child = xml.childNodes[ i ];
  474. if ( child.nodeType !== 1 ) continue;
  475. switch ( child.nodeName ) {
  476. case 'node':
  477. parseNode( child );
  478. data.nodes.push( child.getAttribute( 'id' ) );
  479. break;
  480. case 'instance_camera':
  481. data.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );
  482. break;
  483. case 'instance_light':
  484. data.instanceLights.push( parseId( child.getAttribute( 'url' ) ) );
  485. break;
  486. case 'instance_geometry':
  487. data.instanceGeometries.push( parseId( child.getAttribute( 'url' ) ) );
  488. break;
  489. case 'instance_node':
  490. data.instanceNodes.push( parseId( child.getAttribute( 'url' ) ) );
  491. break;
  492. case 'matrix':
  493. var array = parseFloats( child.textContent );
  494. data.matrix.multiply( matrix.fromArray( array ).transpose() ); // .transpose() when Z_UP?
  495. break;
  496. case 'translate':
  497. var array = parseFloats( child.textContent );
  498. vector.fromArray( array );
  499. data.matrix.multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) );
  500. break;
  501. case 'rotate':
  502. var array = parseFloats( child.textContent );
  503. var angle = THREE.Math.degToRad( array[ 3 ] );
  504. data.matrix.multiply( matrix.makeRotationAxis( vector.fromArray( array ), angle ) );
  505. break;
  506. case 'scale':
  507. var array = parseFloats( child.textContent );
  508. data.matrix.scale( vector.fromArray( array ) );
  509. break;
  510. case 'extra':
  511. break;
  512. default:
  513. console.log( child );
  514. }
  515. }
  516. if ( xml.getAttribute( 'id' ) !== null ) {
  517. library.nodes[ xml.getAttribute( 'id' ) ] = data;
  518. }
  519. return data;
  520. }
  521. function buildNode( data ) {
  522. var objects = [];
  523. var matrix = data.matrix;
  524. var nodes = data.nodes;
  525. var instanceCameras = data.instanceCameras;
  526. var instanceLights = data.instanceLights;
  527. var instanceGeometries = data.instanceGeometries;
  528. var instanceNodes = data.instanceNodes;
  529. for ( var i = 0, l = nodes.length; i < l; i ++ ) {
  530. objects.push( getNode( nodes[ i ] ).clone() );
  531. }
  532. for ( var i = 0, l = instanceCameras.length; i < l; i ++ ) {
  533. objects.push( getCamera( instanceCameras[ i ] ).clone() );
  534. }
  535. for ( var i = 0, l = instanceLights.length; i < l; i ++ ) {
  536. objects.push( getLight( instanceLights[ i ] ).clone() );
  537. }
  538. for ( var i = 0, l = instanceGeometries.length; i < l; i ++ ) {
  539. objects.push( getGeometry( instanceGeometries[ i ] ).clone() );
  540. }
  541. for ( var i = 0, l = instanceNodes.length; i < l; i ++ ) {
  542. objects.push( getNode( instanceNodes[ i ] ).clone() );
  543. }
  544. var object;
  545. if ( objects.length === 1 ) {
  546. object = objects[ 0 ];
  547. } else {
  548. object = new THREE.Group();
  549. for ( var i = 0; i < objects.length; i ++ ) {
  550. object.add( objects[ i ] );
  551. }
  552. }
  553. object.name = data.name;
  554. matrix.decompose( object.position, object.quaternion, object.scale );
  555. return object;
  556. }
  557. function getNode( id ) {
  558. return getBuild( library.nodes[ id ], buildNode );
  559. }
  560. // visual scenes
  561. function parseVisualScene( xml ) {
  562. var data = {
  563. name: xml.getAttribute( 'name' ),
  564. children: []
  565. };
  566. var elements = getElementsByTagName( xml, 'node' );
  567. for ( var i = 0; i < elements.length; i ++ ) {
  568. data.children.push( parseNode( elements[ i ] ) );
  569. }
  570. library.visualScenes[ xml.getAttribute( 'id' ) ] = data;
  571. }
  572. function buildVisualScene( data ) {
  573. var group = new THREE.Group();
  574. group.name = data.name;
  575. var children = data.children;
  576. for ( var i = 0; i < children.length; i ++ ) {
  577. group.add( buildNode( children[ i ] ) );
  578. }
  579. return group;
  580. }
  581. function getVisualScene( id ) {
  582. return getBuild( library.visualScenes[ id ], buildVisualScene );
  583. }
  584. // scenes
  585. function parseScene( xml ) {
  586. var instance = getElementsByTagName( xml, 'instance_visual_scene' )[ 0 ];
  587. return getVisualScene( parseId( instance.getAttribute( 'url' ) ) );
  588. }
  589. console.time( 'ColladaLoader' );
  590. console.time( 'ColladaLoader: DOMParser' );
  591. var xml = new DOMParser().parseFromString( text, 'application/xml' );
  592. console.timeEnd( 'ColladaLoader: DOMParser' );
  593. var collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ];
  594. // metadata
  595. var version = collada.getAttribute( 'version' );
  596. console.log( 'ColladaLoader: File version', version );
  597. var asset = parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] );
  598. //
  599. var library = {
  600. images: {},
  601. // effects: {},
  602. cameras: {},
  603. lights: {},
  604. geometries: {},
  605. nodes: {},
  606. visualScenes: {}
  607. };
  608. console.time( 'ColladaLoader: Parse' );
  609. parseLibrary( collada, library.images, 'library_images', 'image', parseImage );
  610. // parseLibrary( collada, library.effects, 'library_effects', 'effect', parseEffect );
  611. parseLibrary( collada, library.cameras, 'library_cameras', 'camera', parseCamera );
  612. parseLibrary( collada, library.lights, 'library_lights', 'light', parseLight );
  613. parseLibrary( collada, library.geometries, 'library_geometries', 'geometry', parseGeometry );
  614. parseLibrary( collada, library.nodes, 'library_nodes', 'node', parseNode );
  615. parseLibrary( collada, library.visualScenes, 'library_visual_scenes', 'visual_scene', parseVisualScene );
  616. console.timeEnd( 'ColladaLoader: Parse' );
  617. console.time( 'ColladaLoader: Build' );
  618. // buildLibrary( library.images, buildImage );
  619. // buildLibrary( library.effects, buildEffect );
  620. buildLibrary( library.cameras, buildCamera );
  621. buildLibrary( library.lights, buildLight );
  622. buildLibrary( library.geometries, buildGeometry );
  623. buildLibrary( library.nodes, buildNode );
  624. buildLibrary( library.visualScenes, buildVisualScene );
  625. console.timeEnd( 'ColladaLoader: Build' );
  626. // console.log( library );
  627. var scene = parseScene( getElementsByTagName( collada, 'scene' )[ 0 ] );
  628. console.timeEnd( 'ColladaLoader' );
  629. // console.log( scene );
  630. return {
  631. animations: [],
  632. kinematics: { joints: [] },
  633. scene: scene
  634. };
  635. }
  636. };