123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /**
- * @author mrdoob / http://mrdoob.com/
- */
- THREE.ColladaLoader = function ( manager ) {
- this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
- };
- THREE.ColladaLoader.prototype = {
- constructor: THREE.ColladaLoader,
- load: function ( url, onLoad, onProgress, onError ) {
- var scope = this;
- var loader = new THREE.XHRLoader( scope.manager );
- loader.setCrossOrigin( this.crossOrigin );
- loader.load( url, function ( text ) {
- onLoad( scope.parse( text ) );
- }, onProgress, onError );
- },
- options: {
- set convertUpAxis ( value ) {
- console.log( 'ColladaLoder2: TODO' );
- }
- },
- setCrossOrigin: function ( value ) {
- this.crossOrigin = value;
- },
- parse: function ( text ) {
- function parseFloats( text ) {
- var array = [];
- var parts = text.split( ' ' );
- for ( var i = 0, l = parts.length; i < l; i ++ ) {
- array.push( parseFloat( parts[ i ] ) );
- }
- return array;
- }
- function parseInts( text ) {
- var array = [];
- var parts = text.split( ' ' );
- for ( var i = 0, l = parts.length; i < l; i ++ ) {
- array.push( parseInt( parts[ i ] ) );
- }
- return array;
- }
- function parseGeometries( xml ) {
- xml = xml.getElementsByTagName( 'geometry' );
- var geometries = [];
- for ( var i = 0; i < xml.length; i ++ ) {
- geometries.push( parseGeometry( xml[ i ].getElementsByTagName( 'mesh' )[ 0 ] ) );
- }
- return geometries;
- }
- function parseGeometry( xml ) {
- var geometry = new THREE.BufferGeometry();
- // sources
- var sources = {};
- var sourceNodes = xml.getElementsByTagName( 'source' );
- for ( var i = 0; i < sourceNodes.length; i ++ ) {
- var sourceNode = sourceNodes[ i ];
- var array = parseFloats( sourceNode.getElementsByTagName( 'float_array' )[ 0 ].textContent );
- sources[ sourceNode.getAttribute( 'id' ) ] = array;
- }
- // vertices
- var verticesNode = xml.getElementsByTagName( 'vertices' )[ 0 ];
- sources[ verticesNode.getAttribute( 'id' ) ] = sources[ verticesNode.getElementsByTagName( 'input' )[ 0 ].getAttribute( 'source' ).substring( 1 ) ];
- // triangles
- var triangleNodes = xml.getElementsByTagName( 'triangles' );
- if ( triangleNodes === null ) return geometry;
- for ( var i = 0; i < triangleNodes.length; i ++ ) {
- var triangleNode = triangleNodes[ i ];
- // indices
- var indices = parseInts( triangleNode.getElementsByTagName( 'p' )[ 0 ].textContent );
- // inputs
- var inputNodes = triangleNode.getElementsByTagName( 'input' );
- var maxOffset = 0;
- for ( var j = 0; j < inputNodes.length; j ++ ) {
- var inputNode = inputNodes[ j ];
- maxOffset = Math.max( maxOffset, parseInt( inputNode.getAttribute( 'offset' ) ) + 1 );
- }
- for ( var j = 0; j < inputNodes.length; j ++ ) {
- var inputNode = inputNodes[ j ];
- var source = sources[ inputNode.getAttribute( 'source' ).substring( 1 ) ];
- var offset = parseInt( inputNode.getAttribute( 'offset' ) );
- var array = [];
- for ( var k = offset; k < indices.length; k += maxOffset ) {
- var index = indices[ k ] * 3;
- array.push( source[ index + 0 ], source[ index + 1 ], source[ index + 2 ] );
- }
- switch ( inputNode.getAttribute( 'semantic' ) ) {
- case 'VERTEX':
- geometry.addAttribute( 'position', new THREE.Float32Attribute( array, 3 ) );
- break;
- case 'NORMAL':
- geometry.addAttribute( 'normal', new THREE.Float32Attribute( array, 3 ) );
- break;
- }
- }
- }
- return geometry;
- }
- console.time( 'ColladaLoader2' );
- var xml = new DOMParser().parseFromString( text, 'text/xml' );
- var geometries = xml.getElementsByTagName( 'library_geometries' )[ 0 ];
- var materials = xml.getElementsByTagName( 'library_materials' )[ 0 ];
- var images = xml.getElementsByTagName( 'library_images' )[ 0 ];
- var effects = xml.getElementsByTagName( 'library_effects' )[ 0 ];
- //console.log( geometries, materials, images, effects );
- var scene = new THREE.Scene();
- var geometries = parseGeometries( geometries );
- for ( var i = 0; i < geometries.length; i ++ ) {
- scene.add( new THREE.Mesh( geometries[ i ], new THREE.MeshPhongMaterial() ) );
- }
- console.timeEnd( 'ColladaLoader2' );
- console.log( scene );
- return {
- animations: [],
- kinematics: { joints: [] },
- scene: scene
- };
- }
- };
|