diff --git a/examples/js/loaders/ColladaLoader2.js b/examples/js/loaders/ColladaLoader2.js index d7aad94356a83868f7bc5e3f2ed7891aa4ff317a..e213fcf78e93215cb8b8a088400935321d3f73c4 100644 --- a/examples/js/loaders/ColladaLoader2.js +++ b/examples/js/loaders/ColladaLoader2.js @@ -33,7 +33,7 @@ THREE.ColladaLoader.prototype = { set convertUpAxis( value ) { - console.log( 'ColladaLoader.options.convertUpAxis: TODO' ); + console.log( 'THREE.ColladaLoader.options.convertUpAxis: TODO' ); } @@ -176,6 +176,268 @@ THREE.ColladaLoader.prototype = { } + // animation + + function parseAnimation( xml ) { + + var data = { + sources: {}, + samplers: {}, + channels: {} + }; + + for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + var child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + var id; + + switch ( child.nodeName ) { + + case 'source': + id = child.getAttribute( 'id' ); + data.sources[ id ] = parseSource( child ); + break; + + case 'sampler': + id = child.getAttribute( 'id' ); + data.samplers[ id ] = parseAnimationSampler( child ); + break; + + case 'channel': + id = child.getAttribute( 'target' ); + data.channels[ id ] = parseAnimationChannel( child ); + break; + + default: + console.log( child ); + + } + + } + + library.animations[ xml.getAttribute( 'id' ) ] = data; + + } + + function parseAnimationSampler( xml ) { + + var data = { + inputs: {}, + }; + + for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + var child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + var id = parseId( child.getAttribute( 'source' ) ); + var semantic = child.getAttribute( 'semantic' ); + data.inputs[ semantic ] = id; + break; + + } + + } + + return data; + + } + + function parseAnimationChannel( xml ) { + + var data = {}; + + var target = xml.getAttribute( 'target' ); + + // parsing SID Addressing Syntax + + var parts = target.split( '/' ); + + var id = parts.shift(); + var sid = parts.shift(); + + // check selection syntax + + var arraySyntax = ( sid.indexOf( '(' ) !== - 1 ); + var memberSyntax = ( sid.indexOf( '.' ) !== - 1 ); + + if ( memberSyntax ) { + + // member selection access + + parts = sid.split( '.' ); + sid = parts.shift(); + data.member = parts.shift(); + + } else if ( arraySyntax ) { + + // array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices. + + var indices = sid.split( '(' ); + sid = indices.shift(); + + for ( var i = 0; i < indices.length; i ++ ) { + + indices[ i ] = parseInt( indices[ i ].replace( /\)/, '' ) ); + + } + + data.indices = indices; + + } + + data.id = id; + data.sid = sid; + + data.arraySyntax = arraySyntax; + data.memberSyntax = memberSyntax; + + data.sampler = parseId( xml.getAttribute( 'source' ) ); + + return data; + + } + + // controller + + function parseController( xml ) { + + var data = { + skin: {} + }; + + for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + var child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'skin': + var id = parseId( child.getAttribute( 'source' ) ); + data.skin[ id ] = parseSkin( child ); + break; + + } + + } + + library.controllers[ xml.getAttribute( 'id' ) ] = data; + + } + + function parseSkin( xml ) { + + var data = { + sources: {} + } + + for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + var child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'bind_shape_matrix': + data.bindShapeMatrix = parseFloats( child.textContent ); + break; + + case 'source': + var id = child.getAttribute( 'id' ); + data.sources[ id ] = parseSource( child ); + break; + + case 'joints': + data.joints = parseJoints( child ); + break; + + case 'vertex_weights': + data.vertexWeights = parseVertexWeights( child ); + break; + + } + + } + + return data; + + } + + function parseJoints( xml ) { + + var data = { + inputs: {} + } + + for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + var child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + var semantic = child.getAttribute( 'semantic' ); + var id = parseId( child.getAttribute( 'source' ) ); + data.inputs[ semantic ] = id; + break; + + } + + } + + return data; + + } + + function parseVertexWeights( xml ) { + + var data = { + inputs: {} + } + + for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) { + + var child = xml.childNodes[ i ]; + + if ( child.nodeType !== 1 ) continue; + + switch ( child.nodeName ) { + + case 'input': + var semantic = child.getAttribute( 'semantic' ); + var id = parseId( child.getAttribute( 'source' ) ); + var offset = parseInt( child.getAttribute( 'offset' ) ); + data.inputs[ semantic ] = { id: id, offset: offset }; + break; + + case 'vcount': + data.vcount = parseInts( child.textContent ); + break; + + case 'v': + data.v = parseInts( child.textContent ); + break; + + } + + } + + return data; + + } + // image function parseImage( xml ) { @@ -601,7 +863,7 @@ THREE.ColladaLoader.prototype = { } - console.error( 'ColladaLoader: Undefined sampler', textureObject.id ); + console.error( 'THREE.ColladaLoader: Undefined sampler', textureObject.id ); return null; @@ -955,7 +1217,7 @@ THREE.ColladaLoader.prototype = { switch ( child.nodeName ) { case 'source': - data.sources[ id ] = parseGeometrySource( child ); + data.sources[ id ] = parseSource( child ); break; case 'vertices': @@ -964,7 +1226,7 @@ THREE.ColladaLoader.prototype = { break; case 'polygons': - console.warn( 'ColladaLoader: Unsupported primitive type: ', child.nodeName ); + console.warn( 'THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName ); break; case 'lines': @@ -985,7 +1247,7 @@ THREE.ColladaLoader.prototype = { } - function parseGeometrySource( xml ) { + function parseSource( xml ) { var data = { array: [], @@ -1227,7 +1489,7 @@ THREE.ColladaLoader.prototype = { if ( maxcount > 0 ) { - console.log( 'ColladaLoader: Geometry has faces with more than 4 vertices.' ); + console.log( 'THREE.ColladaLoader: Geometry has faces with more than 4 vertices.' ); } @@ -1521,7 +1783,7 @@ THREE.ColladaLoader.prototype = { } - console.time( 'ColladaLoader' ); + console.time( 'THREE.ColladaLoader' ); if ( text.length === 0 ) { @@ -1529,18 +1791,18 @@ THREE.ColladaLoader.prototype = { } - console.time( 'ColladaLoader: DOMParser' ); + console.time( 'THREE.ColladaLoader: DOMParser' ); var xml = new DOMParser().parseFromString( text, 'application/xml' ); - console.timeEnd( 'ColladaLoader: DOMParser' ); + console.timeEnd( 'THREE.ColladaLoader: DOMParser' ); var collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ]; // metadata var version = collada.getAttribute( 'version' ); - console.log( 'ColladaLoader: File version', version ); + console.log( 'THREE.ColladaLoader: File version', version ); var asset = parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] ); var textureLoader = new THREE.TextureLoader( this.manager ).setPath( resourceDirectory ); @@ -1548,6 +1810,8 @@ THREE.ColladaLoader.prototype = { // var library = { + animations: {}, + controllers: {}, images: {}, effects: {}, materials: {}, @@ -1558,8 +1822,10 @@ THREE.ColladaLoader.prototype = { visualScenes: {} }; - console.time( 'ColladaLoader: Parse' ); + console.time( 'THREE.ColladaLoader: Parse' ); + // parseLibrary( collada, 'library_animations', 'animation', parseAnimation ); + // parseLibrary( collada, 'library_controllers', 'controller', parseController ); parseLibrary( collada, 'library_images', 'image', parseImage ); parseLibrary( collada, 'library_effects', 'effect', parseEffect ); parseLibrary( collada, 'library_materials', 'material', parseMaterial ); @@ -1569,9 +1835,9 @@ THREE.ColladaLoader.prototype = { parseLibrary( collada, 'library_nodes', 'node', parseNode ); parseLibrary( collada, 'library_visual_scenes', 'visual_scene', parseVisualScene ); - console.timeEnd( 'ColladaLoader: Parse' ); + console.timeEnd( 'THREE.ColladaLoader: Parse' ); - console.time( 'ColladaLoader: Build' ); + console.time( 'THREE.ColladaLoader: Build' ); buildLibrary( library.images, buildImage ); buildLibrary( library.effects, buildEffect ); @@ -1582,7 +1848,7 @@ THREE.ColladaLoader.prototype = { // buildLibrary( library.nodes, buildNode ); buildLibrary( library.visualScenes, buildVisualScene ); - console.timeEnd( 'ColladaLoader: Build' ); + console.timeEnd( 'THREE.ColladaLoader: Build' ); // console.log( library ); @@ -1596,7 +1862,7 @@ THREE.ColladaLoader.prototype = { scene.scale.multiplyScalar( asset.unit ); - console.timeEnd( 'ColladaLoader' ); + console.timeEnd( 'THREE.ColladaLoader' ); // console.log( scene );