ColladaLoader2.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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 parseGeometries( xml ) {
  27. xml = xml.getElementsByTagName("geometry");
  28. var objects = [];
  29. for ( var i = 0; i < xml.length; i ++ ) {
  30. objects.push( parseMesh( xml[ i ].getElementsByTagName( 'mesh' )[ 0 ] ) );
  31. }
  32. return objects;
  33. }
  34. function parseMesh( xml ) {
  35. var geometry = new THREE.BufferGeometry();
  36. var sources = xml.getElementsByTagName( 'source' );
  37. for ( var i = 0; i < sources.length; i ++ ) {
  38. var source = sources[ i ];
  39. var floats = source.getElementsByTagName( 'float_array' )[ 0 ].textContent.split( ' ' );
  40. var array = [];
  41. for ( var j = 0; j < floats.length; j ++ ) {
  42. array.push( floats[ j ] );
  43. }
  44. geometry.addAttribute( 'position', new THREE.Float32Attribute( array, 3 ) );
  45. }
  46. var triangles = xml.getElementsByTagName( 'triangles' );
  47. if ( triangles === null ) return mesh;
  48. for ( var i = 0; i < triangles.length; i ++ ) {
  49. var triangle = triangles[ i ];
  50. var indices = triangle.getElementsByTagName( 'p' )[ 0 ].textContent.split( ' ' );
  51. var array = [];
  52. for ( var j = 0; j < indices.length; j ++ ) {
  53. array.push( parseInt( indices[ j ] ) );
  54. }
  55. geometry.setIndex( new THREE.Uint16Attribute( array, 1 ) );
  56. }
  57. return geometry;
  58. }
  59. console.time( 'ColladaLoader2' );
  60. var xml = new DOMParser().parseFromString( text, 'text/xml' );
  61. var geometries = xml.getElementsByTagName( 'library_geometries' )[ 0 ];
  62. var materials = xml.getElementsByTagName( 'library_materials' )[ 0 ];
  63. var images = xml.getElementsByTagName( 'library_images' )[ 0 ];
  64. var effects = xml.getElementsByTagName( 'library_effects' )[ 0 ];
  65. //console.log( geometries, materials, images, effects );
  66. var scene = new THREE.Scene();
  67. var geometries = parseGeometries( geometries );
  68. for ( var i = 0; i < geometries.length; i ++ ) {
  69. scene.add( new THREE.Mesh( geometries[ i ] ) );
  70. }
  71. console.timeEnd( 'ColladaLoader2' );
  72. console.log( scene );
  73. return {
  74. animations: [],
  75. kinematics: { joints: [] },
  76. scene: scene
  77. };
  78. }
  79. };