def METHOD_NAME(orig: np.ndarray, direction: np.ndarray,
                          v0: np.ndarray, v1: np.ndarray, v2: np.ndarray) -> Optional[np.ndarray]:
    """
    Pierces a triangle
    Parameters
    ----------
    orig : (3, ) float ndarray
        the point to pierce
    direction : (3, ) float ndarray
        the pierce vector
    v0, v1, v2 : (3, ) float ndarray
        the xyz points of the triangle
    Returns
    -------
    p : (3, ) float ndarray or None
        ndarray : the pierce point
        None : failed pierce
    """
    e1 = v1 - v0
    e2 = v2 - v0
    # Calculate planes normal vector
    pvec = np.cross(direction, e2)
    det = e1.dot(pvec)
    # Ray is parallel to plane
    if abs(det) < 1e-8:
        return None
    inv_det = 1 / det
    tvec = orig - v0
    u = tvec.dot(pvec) * inv_det
    if u < 0 or u > 1:
        return None
    qvec = np.cross(tvec, e1)
    v = direction.dot(qvec) * inv_det
    if v < 0 or u + v > 1:
        return None
    return orig + direction * (e2.dot(qvec) * inv_det)