| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | ( function () {	/** * MDD is a special format that stores a position for every vertex in a model for every frame in an animation. * Similar to BVH, it can be used to transfer animation data between different 3D applications or engines. * * MDD stores its data in binary format (big endian) in the following way: * * number of frames (a single uint32) * number of vertices (a single uint32) * time values for each frame (sequence of float32) * vertex data for each frame (sequence of float32) */	class MDDLoader extends THREE.Loader {		constructor( manager ) {			super( manager );		}		load( url, onLoad, onProgress, onError ) {			const scope = this;			const loader = new THREE.FileLoader( this.manager );			loader.setPath( this.path );			loader.setResponseType( 'arraybuffer' );			loader.load( url, function ( data ) {				onLoad( scope.parse( data ) );			}, onProgress, onError );		}		parse( data ) {			const view = new DataView( data );			const totalFrames = view.getUint32( 0 );			const totalPoints = view.getUint32( 4 );			let offset = 8; // animation clip			const times = new Float32Array( totalFrames );			const values = new Float32Array( totalFrames * totalFrames ).fill( 0 );			for ( let i = 0; i < totalFrames; i ++ ) {				times[ i ] = view.getFloat32( offset );				offset += 4;				values[ totalFrames * i + i ] = 1;			}			const track = new THREE.NumberKeyframeTrack( '.morphTargetInfluences', times, values );			const clip = new THREE.AnimationClip( 'default', times[ times.length - 1 ], [ track ] ); // morph targets			const morphTargets = [];			for ( let i = 0; i < totalFrames; i ++ ) {				const morphTarget = new Float32Array( totalPoints * 3 );				for ( let j = 0; j < totalPoints; j ++ ) {					const stride = j * 3;					morphTarget[ stride + 0 ] = view.getFloat32( offset );					offset += 4; // x					morphTarget[ stride + 1 ] = view.getFloat32( offset );					offset += 4; // y					morphTarget[ stride + 2 ] = view.getFloat32( offset );					offset += 4; // z				}				const attribute = new THREE.BufferAttribute( morphTarget, 3 );				attribute.name = 'morph_' + i;				morphTargets.push( attribute );			}			return {				morphTargets: morphTargets,				clip: clip			};		}	}	THREE.MDDLoader = MDDLoader;} )();
 |