提交 408503ec 编写于 作者: M Mr.doob 提交者: GitHub

Merge pull request #11430 from Mugen87/animation

ColladaLoader2: Parse animation data
......@@ -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 );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册