setup( builder ) {

		const { geometry } = builder;

		const hasMorphPosition = geometry.morphAttributes.position !== undefined;
		const hasMorphNormals = geometry.hasAttribute( 'normal' ) && geometry.morphAttributes.normal !== undefined;

		const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
		const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;

		// nodes

		const { texture: bufferMap, stride, size } = getEntry( geometry );

		if ( hasMorphPosition === true ) positionLocal.mulAssign( this.morphBaseInfluence );
		if ( hasMorphNormals === true ) normalLocal.mulAssign( this.morphBaseInfluence );

		const width = int( size.width );

		Loop( morphTargetsCount, ( { i } ) => {

			const influence = float( 0 ).toVar();

			if ( this.mesh.count > 1 && ( this.mesh.morphTexture !== null && this.mesh.morphTexture !== undefined ) ) {

				influence.assign( textureLoad( this.mesh.morphTexture, ivec2( int( i ).add( 1 ), int( instanceIndex ) ) ).r );

			} else {

				influence.assign( reference( 'morphTargetInfluences', 'float' ).element( i ).toVar() );

			}

			If( influence.notEqual( 0 ), () => {

				if ( hasMorphPosition === true ) {

					positionLocal.addAssign( getMorph( {
						bufferMap,
						influence,
						stride,
						width,
						depth: i,
						offset: int( 0 )
					} ) );

				}

				if ( hasMorphNormals === true ) {

					normalLocal.addAssign( getMorph( {
						bufferMap,
						influence,
						stride,
						width,
						depth: i,
						offset: int( 1 )
					} ) );

				}

			} );

		} );

	}
Setups the morph node by assigning the transformed vertex data to predefined node variables.

@param {NodeBuilder} builder - The current node builder.