提交 e77c03fd 编写于 作者: K Kyle Larson

FBXLoader2 fixes:

- Fixed bug where FBX's with more than 4 deformers per vertex caused infinite looping.
- Fixed animation bug where lack of keyframes on animation nodes caused improper animation generation.
上级 24f5862b
......@@ -571,11 +571,10 @@
var faceVertexBuffer = [];
var polygonIndex = 0;
for ( var polygonVertexIndex = 0; polygonVertexIndex < indexBuffer.length; ++ polygonVertexIndex ) {
indexBuffer.forEach( function ( vertexIndex, polygonVertexIndex, indexBuffer ) {
var endOfFace;
var vertexIndex = indexBuffer[ polygonVertexIndex ];
if ( indexBuffer[ polygonVertexIndex ] < 0 ) {
var endOfFace = false;
if ( vertexIndex < 0 ) {
vertexIndex = vertexIndex ^ - 1;
indexBuffer[ polygonVertexIndex ] = vertexIndex;
......@@ -587,27 +586,24 @@
var weights = [];
vertex.position.fromArray( vertexBuffer, vertexIndex * 3 );
// If we have a deformer for this geometry, get the skinIndex and skinWeights for this object.
// They are stored as vertex indices on each deformer, and we need them as deformer indices
// for each vertex.
if ( deformer ) {
for ( var j = 0; j < deformer.array.length; ++ j ) {
deformer.array.forEach( function ( subDeformer, subDeformerIndex ) {
var index = deformer.array[ j ].indices.findIndex( function ( index ) {
var index = subDeformer.indices.findIndex( function ( indx ) {
return index === indexBuffer[ polygonVertexIndex ];
return indx === vertexIndex;
} );
if ( index !== - 1 ) {
weights.push( deformer.array[ j ].weights[ index ] );
weightIndices.push( j );
weights.push( subDeformer.weights[ index ] );
weightIndices.push( subDeformerIndex );
}
}
} );
if ( weights.length > 4 ) {
......@@ -616,34 +612,33 @@
var WIndex = [ 0, 0, 0, 0 ];
var Weight = [ 0, 0, 0, 0 ];
for ( var polygonVertexIndex = 0; polygonVertexIndex < weights.length; ++ polygonVertexIndex ) {
weights.forEach( function ( weight, weightIndex ) {
var currentWeight = weights[ polygonVertexIndex ];
var currentIndex = weightIndices[ polygonVertexIndex ];
for ( var j = 0; j < Weight.length; ++ j ) {
var currentWeight = weight;
var currentIndex = weightIndices[ weightIndex ];
Weight.forEach( function ( comparedWeight, comparedWeightIndex, comparedWeightArray ) {
if ( currentWeight > Weight[ j ] ) {
if ( currentWeight > comparedWeight ) {
var tmp = Weight[ j ];
Weight[ j ] = currentWeight;
currentWeight = tmp;
comparedWeightArray[ comparedWeightIndex ] = currentWeight;
currentWeight = comparedWeight;
tmp = WIndex[ j ];
WIndex[ j ] = currentIndex;
var tmp = WIndex[ comparedWeightIndex ];
WIndex[ comparedWeightIndex ] = currentIndex;
currentIndex = tmp;
}
}
} );
}
} );
weightIndices = WIndex;
weights = Weight;
}
for ( var i = weights.length; i < 4; i ++ ) {
for ( var i = weights.length; i < 4; ++ i ) {
weights[ i ] = 0;
weightIndices[ i ] = 0;
......@@ -653,8 +648,6 @@
vertex.skinWeights.fromArray( weights );
vertex.skinIndices.fromArray( weightIndices );
//vertex.skinWeights.normalize();
}
if ( normalInfo ) {
......@@ -669,13 +662,8 @@
}
//Add vertex to face buffer.
faceVertexBuffer.push( vertex );
// If index was negative to start with, we have finished this individual face
// and can generate the face data to the geometry.
if ( endOfFace ) {
var face = new Face();
......@@ -689,7 +677,7 @@
}
}
} );
/**
* @type {{vertexBuffer: number[], normalBuffer: number[], uvBuffer: number[], skinIndexBuffer: number[], skinWeightBuffer: number[], materialIndexBuffer: number[]}}
......@@ -2762,6 +2750,23 @@
animations.stacks.forEach( function ( stack ) {
/**
* @type {{
* name: string,
* fps: number,
* length: number,
* hierarchy: Array.<{
* parent: number,
* name: string,
* keys: Array.<{
* time: number,
* pos: Array.<number>,
* rot: Array.<number>,
* scl: Array.<number>
* }>
* }>
* }}
*/
var animationData = {
name: stack.name,
fps: 30,
......@@ -2875,7 +2880,7 @@
return [ 'x', 'y', 'z' ].every( function ( key ) {
return attributeNode.curves[ key ] !== undefined;
return attributeNode.curves[ key ] !== null;
} );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册