static compressPositions( mesh ) {

			if ( ! mesh.geometry ) {

				console.error( 'Mesh must contain geometry. ' );

			}

			const position = mesh.geometry.attributes.position;

			if ( ! position ) {

				console.error( 'Geometry must contain position attribute. ' );

			}

			if ( position.isPacked ) return;

			if ( position.itemSize != 3 ) {

				console.error( 'position.itemSize is not 3, which cannot be packed. ' );

			}

			const array = position.array;
			const encodingBytes = 2;
			const result = EncodingFuncs.quantizedEncode( array, encodingBytes );
			const quantized = result.quantized;
			const decodeMat = result.decodeMat; // IMPORTANT: calculate original geometry bounding info first, before updating packed positions

			if ( mesh.geometry.boundingBox == null ) mesh.geometry.computeBoundingBox();
			if ( mesh.geometry.boundingSphere == null ) mesh.geometry.computeBoundingSphere();
			mesh.geometry.setAttribute( 'position', new THREE.BufferAttribute( quantized, 3 ) );
			mesh.geometry.attributes.position.isPacked = true;
			mesh.geometry.attributes.position.needsUpdate = true;
			mesh.geometry.attributes.position.bytes = quantized.length * encodingBytes; // modify material

			if ( ! ( mesh.material instanceof PackedPhongMaterial ) ) {

				mesh.material = new PackedPhongMaterial().copy( mesh.material );

			}

			mesh.material.defines.USE_PACKED_POSITION = 0;
			mesh.material.uniforms.quantizeMatPos.value = decodeMat;
			mesh.material.uniforms.quantizeMatPos.needsUpdate = true;

		}
Make the input mesh.geometry's position attribute encoded and compressed.
Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the position data.

@param {THREE.Mesh} mesh