function transformPoint(matrix, attribute) {
  if (defined(attribute)) {
    const values = attribute.values;
    const length = values.length;
    for (let i = 0; i < length; i += 3) {
      Cartesian3.unpack(values, i, scratchCartesian3);
      Matrix4.multiplyByPoint(matrix, scratchCartesian3, scratchCartesian3);
      Cartesian3.pack(scratchCartesian3, values, i);
    }
  }
}
Encodes floating-point geometry attribute values as two separate attributes to improve
rendering precision.
<p>
This is commonly used to create high-precision position vertex attributes.
</p>

@param {Geometry} geometry The geometry to modify.
@param {string} attributeName The name of the attribute.
@param {string} attributeHighName The name of the attribute for the encoded high bits.
@param {string} attributeLowName The name of the attribute for the encoded low bits.
@returns {Geometry} The modified <code>geometry</code> argument, with its encoded attribute.

@exception {DeveloperError} geometry must have attribute matching the attributeName argument.
@exception {DeveloperError} The attribute componentDatatype must be ComponentDatatype.DOUBLE.

@example
geometry = Cesium.GeometryPipeline.encodeAttribute(geometry, 'position3D', 'position3DHigh', 'position3DLow');