提交 e93499f0 编写于 作者: A Arseny Kapoulkine

Use morphTargetsRelative in GLTF loader

This uses the newly added functionality for loading morph target data in
GLTF loader; there's no need to clone attribute data anymore.
上级 a3a79e2a
......@@ -1309,95 +1309,9 @@ THREE.GLTFLoader = ( function () {
var morphPositions = accessors[ 0 ];
var morphNormals = accessors[ 1 ];
// Clone morph target accessors before modifying them.
for ( var i = 0, il = morphPositions.length; i < il; i ++ ) {
if ( geometry.attributes.position === morphPositions[ i ] ) continue;
morphPositions[ i ] = cloneBufferAttribute( morphPositions[ i ] );
}
for ( var i = 0, il = morphNormals.length; i < il; i ++ ) {
if ( geometry.attributes.normal === morphNormals[ i ] ) continue;
morphNormals[ i ] = cloneBufferAttribute( morphNormals[ i ] );
}
for ( var i = 0, il = targets.length; i < il; i ++ ) {
var target = targets[ i ];
var attributeName = 'morphTarget' + i;
if ( hasMorphPosition ) {
// Three.js morph position is absolute value. The formula is
// basePosition
// + weight0 * ( morphPosition0 - basePosition )
// + weight1 * ( morphPosition1 - basePosition )
// ...
// while the glTF one is relative
// basePosition
// + weight0 * glTFmorphPosition0
// + weight1 * glTFmorphPosition1
// ...
// then we need to convert from relative to absolute here.
if ( target.POSITION !== undefined ) {
var positionAttribute = morphPositions[ i ];
positionAttribute.name = attributeName;
var position = geometry.attributes.position;
for ( var j = 0, jl = positionAttribute.count; j < jl; j ++ ) {
positionAttribute.setXYZ(
j,
positionAttribute.getX( j ) + position.getX( j ),
positionAttribute.getY( j ) + position.getY( j ),
positionAttribute.getZ( j ) + position.getZ( j )
);
}
}
}
if ( hasMorphNormal ) {
// see target.POSITION's comment
if ( target.NORMAL !== undefined ) {
var normalAttribute = morphNormals[ i ];
normalAttribute.name = attributeName;
var normal = geometry.attributes.normal;
for ( var j = 0, jl = normalAttribute.count; j < jl; j ++ ) {
normalAttribute.setXYZ(
j,
normalAttribute.getX( j ) + normal.getX( j ),
normalAttribute.getY( j ) + normal.getY( j ),
normalAttribute.getZ( j ) + normal.getZ( j )
);
}
}
}
}
if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;
if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;
geometry.morphTargetsRelative = true;
return geometry;
......@@ -1485,31 +1399,6 @@ THREE.GLTFLoader = ( function () {
}
function cloneBufferAttribute( attribute ) {
if ( attribute.isInterleavedBufferAttribute ) {
var count = attribute.count;
var itemSize = attribute.itemSize;
var array = attribute.array.slice( 0, count * itemSize );
for ( var i = 0, j = 0; i < count; ++ i ) {
array[ j ++ ] = attribute.getX( i );
if ( itemSize >= 2 ) array[ j ++ ] = attribute.getY( i );
if ( itemSize >= 3 ) array[ j ++ ] = attribute.getZ( i );
if ( itemSize >= 4 ) array[ j ++ ] = attribute.getW( i );
}
return new THREE.BufferAttribute( array, itemSize, attribute.normalized );
}
return attribute.clone();
}
/* GLTF PARSER */
function GLTFParser( json, extensions, options ) {
......
......@@ -1373,95 +1373,9 @@ var GLTFLoader = ( function () {
var morphPositions = accessors[ 0 ];
var morphNormals = accessors[ 1 ];
// Clone morph target accessors before modifying them.
for ( var i = 0, il = morphPositions.length; i < il; i ++ ) {
if ( geometry.attributes.position === morphPositions[ i ] ) continue;
morphPositions[ i ] = cloneBufferAttribute( morphPositions[ i ] );
}
for ( var i = 0, il = morphNormals.length; i < il; i ++ ) {
if ( geometry.attributes.normal === morphNormals[ i ] ) continue;
morphNormals[ i ] = cloneBufferAttribute( morphNormals[ i ] );
}
for ( var i = 0, il = targets.length; i < il; i ++ ) {
var target = targets[ i ];
var attributeName = 'morphTarget' + i;
if ( hasMorphPosition ) {
// Three.js morph position is absolute value. The formula is
// basePosition
// + weight0 * ( morphPosition0 - basePosition )
// + weight1 * ( morphPosition1 - basePosition )
// ...
// while the glTF one is relative
// basePosition
// + weight0 * glTFmorphPosition0
// + weight1 * glTFmorphPosition1
// ...
// then we need to convert from relative to absolute here.
if ( target.POSITION !== undefined ) {
var positionAttribute = morphPositions[ i ];
positionAttribute.name = attributeName;
var position = geometry.attributes.position;
for ( var j = 0, jl = positionAttribute.count; j < jl; j ++ ) {
positionAttribute.setXYZ(
j,
positionAttribute.getX( j ) + position.getX( j ),
positionAttribute.getY( j ) + position.getY( j ),
positionAttribute.getZ( j ) + position.getZ( j )
);
}
}
}
if ( hasMorphNormal ) {
// see target.POSITION's comment
if ( target.NORMAL !== undefined ) {
var normalAttribute = morphNormals[ i ];
normalAttribute.name = attributeName;
var normal = geometry.attributes.normal;
for ( var j = 0, jl = normalAttribute.count; j < jl; j ++ ) {
normalAttribute.setXYZ(
j,
normalAttribute.getX( j ) + normal.getX( j ),
normalAttribute.getY( j ) + normal.getY( j ),
normalAttribute.getZ( j ) + normal.getZ( j )
);
}
}
}
}
if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;
if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;
geometry.morphTargetsRelative = true;
return geometry;
......@@ -1549,31 +1463,6 @@ var GLTFLoader = ( function () {
}
function cloneBufferAttribute( attribute ) {
if ( attribute.isInterleavedBufferAttribute ) {
var count = attribute.count;
var itemSize = attribute.itemSize;
var array = attribute.array.slice( 0, count * itemSize );
for ( var i = 0, j = 0; i < count; ++ i ) {
array[ j ++ ] = attribute.getX( i );
if ( itemSize >= 2 ) array[ j ++ ] = attribute.getY( i );
if ( itemSize >= 3 ) array[ j ++ ] = attribute.getZ( i );
if ( itemSize >= 4 ) array[ j ++ ] = attribute.getW( i );
}
return new BufferAttribute( array, itemSize, attribute.normalized );
}
return attribute.clone();
}
/* GLTF PARSER */
function GLTFParser( json, extensions, options ) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册