2019-10-17 11:33:48 +02:00
|
|
|
import { Matrix4, Vector3, Vector4 } from "three";
|
|
|
|
|
2020-03-26 07:28:47 +01:00
|
|
|
let matrixRotation = new Matrix4().makeRotationX(90 * Math.PI / 180);
|
|
|
|
let matrixScale = new Matrix4().makeScale(10, 10, 10);
|
|
|
|
let vertex = new Vector3();
|
2020-03-26 18:13:32 +01:00
|
|
|
let geometry;
|
2020-03-26 07:28:47 +01:00
|
|
|
|
|
|
|
export function parse(mesh) {
|
|
|
|
if (!mesh.isMesh) {
|
|
|
|
console.warn('Mesh type unsupported', mesh);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-03-27 21:57:17 +01:00
|
|
|
debugger;
|
2020-03-26 18:13:32 +01:00
|
|
|
geometry = mesh.geometry;
|
2020-03-26 07:28:47 +01:00
|
|
|
|
|
|
|
if (geometry.isBufferGeometry) {
|
|
|
|
var newGeometry = geometry.clone(geometry);
|
|
|
|
var vertices = geometry.getAttribute('position');
|
|
|
|
|
|
|
|
// vertices
|
|
|
|
if (vertices !== undefined) {
|
|
|
|
let verticesCount = vertices.count;
|
2020-03-27 22:22:47 +01:00
|
|
|
if (geometry.morphTargetInfluences !== undefined && geometry.morphTargetInfluences.reduce((p, c) => p + c) > 0) {
|
|
|
|
console.log(`morphed: ${geometry.name}`);
|
|
|
|
} else {
|
|
|
|
console.log(`not morphed: ${geometry.name}`);
|
|
|
|
}
|
2020-03-26 07:28:47 +01:00
|
|
|
for (let i = 0; i < verticesCount; i++) {
|
|
|
|
vertex.x = vertices.getX(i);
|
|
|
|
vertex.y = vertices.getY(i);
|
|
|
|
vertex.z = vertices.getZ(i);
|
|
|
|
|
|
|
|
if (geometry.skinIndexNames == undefined || geometry.skinIndexNames == 0) {
|
|
|
|
vertex
|
|
|
|
.applyMatrix4(mesh.matrixWorld)
|
|
|
|
.applyMatrix4(matrixRotation)
|
|
|
|
.applyMatrix4(matrixScale);
|
|
|
|
newGeometry.attributes.position.setXYZ(i, vertex.x, vertex.y, vertex.z);
|
|
|
|
} else {
|
2020-03-27 23:37:41 +01:00
|
|
|
// TODO: does this line need the same condition as the ternary below?
|
2020-03-26 07:28:47 +01:00
|
|
|
if (geometry.morphTargetInfluences !== undefined) {
|
|
|
|
var morphVector = new Vector4(vertex.x, vertex.y, vertex.z);
|
|
|
|
var tempMorph = new Vector4();
|
2019-10-17 11:33:48 +02:00
|
|
|
|
2020-03-26 07:28:47 +01:00
|
|
|
for (var mt = 0; mt < geometry.morphAttributes.position.length; mt++) {
|
|
|
|
if (geometry.morphTargetInfluences[mt] == 0) continue;
|
|
|
|
if (geometry.morphTargetDictionary.hide == mt) continue;
|
2019-10-17 11:33:48 +02:00
|
|
|
|
2020-03-26 07:28:47 +01:00
|
|
|
var morph = new Vector4(
|
|
|
|
geometry.morphAttributes.position[mt].getX(i),
|
|
|
|
geometry.morphAttributes.position[mt].getY(i),
|
|
|
|
geometry.morphAttributes.position[mt].getZ(i));
|
2019-10-17 11:33:48 +02:00
|
|
|
|
2020-03-26 07:28:47 +01:00
|
|
|
tempMorph.addScaledVector(morph.sub(morphVector), geometry.morphTargetInfluences[mt]);
|
2019-10-17 11:33:48 +02:00
|
|
|
}
|
2020-03-26 07:28:47 +01:00
|
|
|
morphVector.add(tempMorph);
|
|
|
|
}
|
2019-10-17 11:33:48 +02:00
|
|
|
|
2020-03-27 21:57:17 +01:00
|
|
|
let finalVector = new Vector4();
|
2020-03-26 07:28:47 +01:00
|
|
|
for (let j = 0; j < geometry.skinIndexNames.length; j++) {
|
2020-03-27 21:57:17 +01:00
|
|
|
//console.log(geometry.skinIndexNames)
|
2020-03-26 18:13:32 +01:00
|
|
|
newFunction_1(i, j, mesh, morphVector, finalVector);
|
2020-03-26 07:28:47 +01:00
|
|
|
}
|
|
|
|
newGeometry.attributes.position.setXYZ(i, finalVector.x, finalVector.y, finalVector.z);
|
|
|
|
}
|
|
|
|
}
|
2019-10-17 11:33:48 +02:00
|
|
|
}
|
2020-03-26 07:28:47 +01:00
|
|
|
} else {
|
|
|
|
console.warn('Geometry type unsupported', geometry);
|
|
|
|
}
|
|
|
|
|
|
|
|
return newGeometry;
|
|
|
|
}
|
|
|
|
|
2020-03-26 18:13:32 +01:00
|
|
|
function newFunction_1(i, j, mesh, morphVector, finalVector) {
|
2020-03-26 07:28:47 +01:00
|
|
|
var skinIndices = geometry.getAttribute([geometry.skinIndexNames[j]]);
|
|
|
|
var weights = geometry.getAttribute([geometry.skinWeightNames[j]]);
|
2020-03-27 21:57:17 +01:00
|
|
|
|
|
|
|
var skinIndex = [
|
|
|
|
skinIndices.getX(i),
|
|
|
|
skinIndices.getY(i),
|
|
|
|
skinIndices.getZ(i),
|
|
|
|
skinIndices.getW(i)
|
|
|
|
];
|
|
|
|
|
|
|
|
var skinWeight = [
|
|
|
|
weights.getX(i),
|
|
|
|
weights.getY(i),
|
|
|
|
weights.getZ(i),
|
|
|
|
weights.getW(i)
|
|
|
|
];
|
|
|
|
|
|
|
|
var inverses = [
|
|
|
|
mesh.skeleton.boneInverses[skinIndex[0]],
|
|
|
|
mesh.skeleton.boneInverses[skinIndex[1]],
|
|
|
|
mesh.skeleton.boneInverses[skinIndex[2]],
|
|
|
|
mesh.skeleton.boneInverses[skinIndex[3]]
|
|
|
|
];
|
|
|
|
|
|
|
|
var skinMatrices = [
|
|
|
|
mesh.skeleton.bones[skinIndex[0]].matrixWorld,
|
|
|
|
mesh.skeleton.bones[skinIndex[1]].matrixWorld,
|
|
|
|
mesh.skeleton.bones[skinIndex[2]].matrixWorld,
|
|
|
|
mesh.skeleton.bones[skinIndex[3]].matrixWorld
|
|
|
|
];
|
|
|
|
|
2020-03-26 07:28:47 +01:00
|
|
|
for (var k = 0; k < 4; k++) {
|
2020-03-27 21:57:17 +01:00
|
|
|
newFunction(morphVector, finalVector, skinWeight, inverses, skinMatrices, k);
|
2020-03-26 07:28:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-27 21:57:17 +01:00
|
|
|
function newFunction(morphVector, finalVector, skinWeight, inverses, skinMatrices, k) {
|
2020-03-27 22:22:47 +01:00
|
|
|
//var vectorToCopy = geometry.morphTargetInfluences !== undefined && geometry.morphTargetInfluences.reduce((p, c) => p + c) > 0
|
|
|
|
// ? morphVector
|
|
|
|
// : vertex;
|
|
|
|
var vectorToCopy = vertex;
|
2020-03-26 07:28:47 +01:00
|
|
|
var tempVector = new Vector4(vectorToCopy.x, vectorToCopy.y, vectorToCopy.z)
|
|
|
|
tempVector.multiplyScalar(skinWeight[k]);
|
|
|
|
//the inverse takes the vector into local bone space
|
|
|
|
//which is then transformed to the appropriate world space
|
|
|
|
tempVector
|
|
|
|
.applyMatrix4(inverses[k])
|
|
|
|
.applyMatrix4(skinMatrices[k])
|
|
|
|
.applyMatrix4(matrixRotation)
|
|
|
|
.applyMatrix4(matrixScale);
|
|
|
|
finalVector.add(tempVector);
|
|
|
|
}
|
2019-10-17 11:33:48 +02:00
|
|
|
|