|
@@ -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 ) {
|