export default function(gltf, THREE) {
|
const clone = {
|
animations: gltf.animations,
|
scene: gltf.scene.clone(true)
|
}
|
|
const skinnedMeshes = {}
|
|
gltf.scene.traverse(node => {
|
if (node.isSkinnedMesh) {
|
skinnedMeshes[node.name] = node
|
}
|
})
|
|
const cloneBones = {}
|
const cloneSkinnedMeshes = {}
|
|
clone.scene.traverse(node => {
|
if (node.isBone) {
|
cloneBones[node.name] = node
|
}
|
|
if (node.isSkinnedMesh) {
|
cloneSkinnedMeshes[node.name] = node
|
}
|
})
|
|
for (let name in skinnedMeshes) {
|
const skinnedMesh = skinnedMeshes[name]
|
const skeleton = skinnedMesh.skeleton
|
const cloneSkinnedMesh = cloneSkinnedMeshes[name]
|
|
const orderedCloneBones = []
|
|
for (let i = 0; i < skeleton.bones.length; ++i) {
|
const cloneBone = cloneBones[skeleton.bones[i].name]
|
orderedCloneBones.push(cloneBone)
|
}
|
|
cloneSkinnedMesh.bind(new THREE.Skeleton(orderedCloneBones, skeleton.boneInverses), cloneSkinnedMesh.matrixWorld)
|
}
|
|
return clone
|
}
|