diff --git a/examples/jsm/exporters/GLTFExporter.js b/examples/jsm/exporters/GLTFExporter.js index 72dccd3ca6d2d6..6492504fd2636a 100644 --- a/examples/jsm/exporters/GLTFExporter.js +++ b/examples/jsm/exporters/GLTFExporter.js @@ -1186,9 +1186,22 @@ GLTFExporter.prototype = { var modifiedAttribute = null; for ( var attributeName in geometry.attributes ) { + // Ignore morph target attributes, which are exported later. + if ( attributeName.substr( 0, 5 ) === 'morph' ) continue; + var attribute = geometry.attributes[ attributeName ]; attributeName = nameConversion[ attributeName ] || attributeName.toUpperCase(); + // Prefix all geometry attributes except the ones specifically + // listed in the spec; non-spec attributes are considered custom. + var validVertexAttributes = + /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/; + if ( ! validVertexAttributes.test( attributeName ) ) { + + attributeName = '_' + attributeName; + + } + if ( cachedData.attributes.has( attribute ) ) { attributes[ attributeName ] = cachedData.attributes.get( attribute ); @@ -1208,15 +1221,11 @@ GLTFExporter.prototype = { } - if ( attributeName.substr( 0, 5 ) !== 'MORPH' ) { + var accessor = processAccessor( modifiedAttribute || attribute, geometry ); + if ( accessor !== null ) { - var accessor = processAccessor( modifiedAttribute || attribute, geometry ); - if ( accessor !== null ) { - - attributes[ attributeName ] = accessor; - cachedData.attributes.set( attribute, accessor ); - - } + attributes[ attributeName ] = accessor; + cachedData.attributes.set( attribute, accessor ); } @@ -1384,6 +1393,8 @@ GLTFExporter.prototype = { } + if ( primitive.indices === null ) delete primitive.indices; + } var material = processMaterial( materials[ groups[ i ].materialIndex ] ); @@ -1778,7 +1789,7 @@ GLTFExporter.prototype = { } else if ( object.isLight ) { - console.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.' ); + console.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', object ); return null; } diff --git a/examples/jsm/utils/SkeletonUtils.js b/examples/jsm/utils/SkeletonUtils.js index a219ee110790ae..3c7ef754468eb0 100644 --- a/examples/jsm/utils/SkeletonUtils.js +++ b/examples/jsm/utils/SkeletonUtils.js @@ -541,8 +541,60 @@ var SkeletonUtils = { return bones; + }, + + clone: function ( source ) { + + var sourceLookup = new Map(); + var cloneLookup = new Map(); + + var clone = source.clone(); + + parallelTraverse( source, clone, function ( sourceNode, clonedNode ) { + + sourceLookup.set( clonedNode, sourceNode ); + cloneLookup.set( sourceNode, clonedNode ); + + } ); + + clone.traverse( function ( node ) { + + if ( ! node.isSkinnedMesh ) return; + + var clonedMesh = node; + var sourceMesh = sourceLookup.get( node ); + var sourceBones = sourceMesh.skeleton.bones; + + clonedMesh.skeleton = sourceMesh.skeleton.clone(); + clonedMesh.bindMatrix.copy( sourceMesh.bindMatrix ); + + clonedMesh.skeleton.bones = sourceBones.map( function ( bone ) { + + return cloneLookup.get( bone ); + + } ); + + clonedMesh.bind( clonedMesh.skeleton, clonedMesh.bindMatrix ); + + } ); + + return clone; + } }; + +function parallelTraverse ( a, b, callback ) { + + callback( a, b ); + + for ( var i = 0; i < a.children.length; i ++ ) { + + parallelTraverse( a.children[ i ], b.children[ i ], callback ); + + } + +} + export { SkeletonUtils }; diff --git a/examples/jsm/utils/UVsDebug.js b/examples/jsm/utils/UVsDebug.js index 0fcf8006e7ea29..d3d6c37d49d785 100644 --- a/examples/jsm/utils/UVsDebug.js +++ b/examples/jsm/utils/UVsDebug.js @@ -87,7 +87,7 @@ var UVsDebug = function ( geometry, size ) { uvs[ 1 ].fromBufferAttribute( uvAttribute, face[ 1 ] ); uvs[ 2 ].fromBufferAttribute( uvAttribute, face[ 2 ] ); - processFace( face, uvs, i ); + processFace( face, uvs, i / 3 ); } @@ -105,7 +105,7 @@ var UVsDebug = function ( geometry, size ) { uvs[ 1 ].fromBufferAttribute( uvAttribute, face[ 1 ] ); uvs[ 2 ].fromBufferAttribute( uvAttribute, face[ 2 ] ); - processFace( face, uvs, i ); + processFace( face, uvs, i / 3 ); }