code: function transformNormal(m, v, dst) {
    dst = dst || v3.create();
    const mi = inverse(m);
    const v0 = v[0];
    const v1 = v[1];
    const v2 = v[2];
  
    dst[0] = v0 * mi[0 * 4 + 0] + v1 * mi[0 * 4 + 1] + v2 * mi[0 * 4 + 2];
    dst[1] = v0 * mi[1 * 4 + 0] + v1 * mi[1 * 4 + 1] + v2 * mi[1 * 4 + 2];
    dst[2] = v0 * mi[2 * 4 + 0] + v1 * mi[2 * 4 + 1] + v2 * mi[2 * 4 + 2];
  
    return dst;
  }
docs: Takes a 4-by-4 matrix m and a vector v with 3 entries, interprets the vector
  as a normal to a surface, and computes a vector which is normal upon
  transforming that surface by the matrix. The effect of this function is the
  same as transforming v (as a direction) by the inverse-transpose of m.  This
  function assumes the transformation of 3-dimensional space represented by the
  matrix is parallel-preserving, i.e. any combination of rotation, scaling and
  translation, but not a perspective distortion.  Returns a vector with 3
  entries.
  @param {module:twgl/m4.Mat4} m The matrix.
  @param {module:twgl/v3.Vec3} v The normal.
  @param {module:twgl/v3.Vec3} [dst] The direction.
  @return {module:twgl/v3.Vec3} The transformed direction.
  @memberOf module:twgl/m4