|
@@ -1137,6 +1137,9 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
/**
|
|
|
* Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets
|
|
|
+ *
|
|
|
+ * TODO: Implement support for morph targets on TANGENT attribute.
|
|
|
+ *
|
|
|
* @param {THREE.Mesh} mesh
|
|
|
* @param {GLTF.Mesh} meshDef
|
|
|
* @param {GLTF.Primitive} primitiveDef
|
|
@@ -1192,7 +1195,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- } else {
|
|
|
+ } else if ( geometry.attributes.position ) {
|
|
|
|
|
|
// Copying the original position not to affect the final position.
|
|
|
// See the formula above.
|
|
@@ -1200,6 +1203,13 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( positionAttribute !== undefined ) {
|
|
|
+
|
|
|
+ positionAttribute.name = attributeName;
|
|
|
+ morphAttributes.position.push( positionAttribute );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( target.NORMAL !== undefined ) {
|
|
|
|
|
|
material.morphNormals = true;
|
|
@@ -1220,24 +1230,19 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- } else {
|
|
|
+ } else if ( geometry.attributes.normal !== undefined ) {
|
|
|
|
|
|
normalAttribute = geometry.attributes.normal.clone();
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( target.TANGENT !== undefined ) {
|
|
|
+ if ( normalAttribute !== undefined ) {
|
|
|
|
|
|
- // TODO: implement
|
|
|
+ normalAttribute.name = attributeName;
|
|
|
+ morphAttributes.normal.push( normalAttribute );
|
|
|
|
|
|
}
|
|
|
|
|
|
- positionAttribute.name = attributeName;
|
|
|
- normalAttribute.name = attributeName;
|
|
|
-
|
|
|
- morphAttributes.position.push( positionAttribute );
|
|
|
- morphAttributes.normal.push( normalAttribute );
|
|
|
-
|
|
|
}
|
|
|
|
|
|
mesh.updateMorphTargets();
|
|
@@ -1671,7 +1676,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
if ( alphaMode === ALPHA_MODES.MASK ) {
|
|
|
|
|
|
- materialParams.alphaTest = material.alphaCutoff || 0.5;
|
|
|
+ materialParams.alphaTest = material.alphaCutoff || 0.5;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -1968,7 +1973,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
}
|
|
|
|
|
|
mesh.name = meshDef.name || ( 'mesh_' + meshIndex );
|
|
|
- mesh.name += i > 0 ? ( '_' + i ) : '';
|
|
|
|
|
|
if ( primitive.targets !== undefined ) {
|
|
|
|
|
@@ -1978,7 +1982,17 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
if ( primitive.extras ) mesh.userData = primitive.extras;
|
|
|
|
|
|
- group.add( mesh );
|
|
|
+ if ( primitives.length > 1 ) {
|
|
|
+
|
|
|
+ mesh.name += '_' + i;
|
|
|
+
|
|
|
+ group.add( mesh );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ return mesh;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -2286,19 +2300,22 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
var skinnedMeshes = [];
|
|
|
|
|
|
- for ( var i = 0; i < node.children.length; i ++ ) {
|
|
|
+ var meshes = node.children.length > 0 ? node.children : [ node ];
|
|
|
+
|
|
|
+ for ( var i = 0; i < meshes.length; i ++ ) {
|
|
|
|
|
|
+ var mesh = meshes[ i ];
|
|
|
var skinEntry = dependencies.skins[ nodeDef.skin ];
|
|
|
|
|
|
// Replace Mesh with SkinnedMesh.
|
|
|
- var geometry = node.children[ i ].geometry;
|
|
|
- var material = node.children[ i ].material;
|
|
|
+ var geometry = mesh.geometry;
|
|
|
+ var material = mesh.material;
|
|
|
material.skinning = true;
|
|
|
|
|
|
- var child = new THREE.SkinnedMesh( geometry, material );
|
|
|
- child.morphTargetInfluences = node.children[ i ].morphTargetInfluences;
|
|
|
- child.userData = node.children[ i ].userData;
|
|
|
- child.name = node.children[ i ].name;
|
|
|
+ var skinnedMesh = new THREE.SkinnedMesh( geometry, material );
|
|
|
+ skinnedMesh.morphTargetInfluences = mesh.morphTargetInfluences;
|
|
|
+ skinnedMesh.userData = mesh.userData;
|
|
|
+ skinnedMesh.name = mesh.name;
|
|
|
|
|
|
var bones = [];
|
|
|
var boneInverses = [];
|
|
@@ -2324,14 +2341,22 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- child.bind( new THREE.Skeleton( bones, boneInverses ), child.matrixWorld );
|
|
|
+ skinnedMesh.bind( new THREE.Skeleton( bones, boneInverses ), skinnedMesh.matrixWorld );
|
|
|
|
|
|
- skinnedMeshes.push( child );
|
|
|
+ skinnedMeshes.push( skinnedMesh );
|
|
|
|
|
|
}
|
|
|
|
|
|
- node.remove.apply( node, node.children );
|
|
|
- node.add.apply( node, skinnedMeshes );
|
|
|
+ if ( node.children.length > 0 ) {
|
|
|
+
|
|
|
+ node.remove.apply( node, node.children );
|
|
|
+ node.add.apply( node, skinnedMeshes );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ node = skinnedMeshes[ 0 ];
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|