ColladaLoader2.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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. var scope = this;
  11. var loader = new THREE.XHRLoader( scope.manager );
  12. loader.setCrossOrigin( this.crossOrigin );
  13. loader.load( url, function ( text ) {
  14. onLoad( scope.parse( text ) );
  15. }, onProgress, onError );
  16. },
  17. options: {
  18. set convertUpAxis ( value ) {
  19. console.log( 'ColladaLoder2: TODO' );
  20. }
  21. },
  22. setCrossOrigin: function ( value ) {
  23. this.crossOrigin = value;
  24. },
  25. parse: function ( text ) {
  26. function parseFloats( text ) {
  27. var array = [];
  28. var parts = text.split( ' ' );
  29. for ( var i = 0, l = parts.length; i < l; i ++ ) {
  30. array.push( parseFloat( parts[ i ] ) );
  31. }
  32. return array;
  33. }
  34. function parseInts( text ) {
  35. var array = [];
  36. var parts = text.split( ' ' );
  37. for ( var i = 0, l = parts.length; i < l; i ++ ) {
  38. array.push( parseInt( parts[ i ] ) );
  39. }
  40. return array;
  41. }
  42. function parseGeometries( xml ) {
  43. xml = xml.getElementsByTagName( 'geometry' );
  44. var geometries = [];
  45. for ( var i = 0; i < xml.length; i ++ ) {
  46. geometries.push( parseGeometry( xml[ i ].getElementsByTagName( 'mesh' )[ 0 ] ) );
  47. }
  48. return geometries;
  49. }
  50. function parseGeometry( xml ) {
  51. var geometry = new THREE.BufferGeometry();
  52. // sources
  53. var sources = {};
  54. var sourceNodes = xml.getElementsByTagName( 'source' );
  55. for ( var i = 0; i < sourceNodes.length; i ++ ) {
  56. var sourceNode = sourceNodes[ i ];
  57. var array = parseFloats( sourceNode.getElementsByTagName( 'float_array' )[ 0 ].textContent );
  58. sources[ sourceNode.getAttribute( 'id' ) ] = array;
  59. }
  60. // vertices
  61. var verticesNode = xml.getElementsByTagName( 'vertices' )[ 0 ];
  62. sources[ verticesNode.getAttribute( 'id' ) ] = sources[ verticesNode.getElementsByTagName( 'input' )[ 0 ].getAttribute( 'source' ).substring( 1 ) ];
  63. // triangles
  64. var triangleNodes = xml.getElementsByTagName( 'triangles' );
  65. if ( triangleNodes === null ) return geometry;
  66. for ( var i = 0; i < triangleNodes.length; i ++ ) {
  67. var triangleNode = triangleNodes[ i ];
  68. // indices
  69. var indices = parseInts( triangleNode.getElementsByTagName( 'p' )[ 0 ].textContent );
  70. // inputs
  71. var inputNodes = triangleNode.getElementsByTagName( 'input' );
  72. var maxOffset = 0;
  73. for ( var j = 0; j < inputNodes.length; j ++ ) {
  74. var inputNode = inputNodes[ j ];
  75. maxOffset = Math.max( maxOffset, parseInt( inputNode.getAttribute( 'offset' ) ) + 1 );
  76. }
  77. for ( var j = 0; j < inputNodes.length; j ++ ) {
  78. var inputNode = inputNodes[ j ];
  79. var source = sources[ inputNode.getAttribute( 'source' ).substring( 1 ) ];
  80. var offset = parseInt( inputNode.getAttribute( 'offset' ) );
  81. var array = [];
  82. for ( var k = offset; k < indices.length; k += maxOffset ) {
  83. var index = indices[ k ] * 3;
  84. array.push( source[ index + 0 ], source[ index + 1 ], source[ index + 2 ] );
  85. }
  86. switch ( inputNode.getAttribute( 'semantic' ) ) {
  87. case 'VERTEX':
  88. geometry.addAttribute( 'position', new THREE.Float32Attribute( array, 3 ) );
  89. break;
  90. case 'NORMAL':
  91. geometry.addAttribute( 'normal', new THREE.Float32Attribute( array, 3 ) );
  92. break;
  93. }
  94. }
  95. }
  96. return geometry;
  97. }
  98. console.time( 'ColladaLoader2' );
  99. var xml = new DOMParser().parseFromString( text, 'text/xml' );
  100. var geometries = xml.getElementsByTagName( 'library_geometries' )[ 0 ];
  101. var materials = xml.getElementsByTagName( 'library_materials' )[ 0 ];
  102. var images = xml.getElementsByTagName( 'library_images' )[ 0 ];
  103. var effects = xml.getElementsByTagName( 'library_effects' )[ 0 ];
  104. //console.log( geometries, materials, images, effects );
  105. var scene = new THREE.Scene();
  106. var geometries = parseGeometries( geometries );
  107. for ( var i = 0; i < geometries.length; i ++ ) {
  108. scene.add( new THREE.Mesh( geometries[ i ], new THREE.MeshPhongMaterial() ) );
  109. }
  110. console.timeEnd( 'ColladaLoader2' );
  111. console.log( scene );
  112. return {
  113. animations: [],
  114. kinematics: { joints: [] },
  115. scene: scene
  116. };
  117. }
  118. };