class_docstr: Class for storing and operating on 3D mesh data.
  
  Parameters
  ----------
  vertices : ndarray, shape (Nv, 3)
      Vertex coordinates. If faces is not specified, then this will
      instead be interpreted as (Nf, 3, 3) array of coordinates.
  faces : ndarray, shape (Nf, 3)
      Indices into the vertex array.
  edges : None
      [not available yet]
  vertex_colors : ndarray, shape (Nv, 4)
      Vertex colors. If faces is not specified, this will be
      interpreted as (Nf, 3, 4) array of colors.
  face_colors : ndarray, shape (Nf, 4)
      Face colors.
  vertex_values : ndarray, shape (Nv,)
      Vertex values.
  
  Notes
  -----
  All arguments are optional.
  
  The object may contain:
  
  - list of vertex locations
  - list of edges
  - list of triangles
  - colors per vertex, edge, or tri
  - normals per vertex or tri
  
  This class handles conversion between the standard
  [list of vertices, list of faces] format (suitable for use with
  glDrawElements) and 'indexed' [list of vertices] format (suitable
  for use with glDrawArrays). It will automatically compute face normal
  vectors as well as averaged vertex normal vectors.
  
  The class attempts to be as efficient as possible in caching conversion
  results and avoiding unnecessary conversions.
code: def _compute_unindexed_vertices(self):
      # Given (Nv, 3, 3) array of vertices-indexed-by-face, convert
      # backward to unindexed vertices
      # This is done by collapsing into a list of 'unique' vertices
      # (difference < 1e-14)
  
      # I think generally this should be discouraged..
      faces = self._vertices_indexed_by_faces
      verts = {}  # used to remember the index of each vertex position
      self._faces = np.empty(faces.shape[:2], dtype=np.uint32)
      self._vertices = []
      self._vertex_faces = []
      self._face_normals = None
      self._vertex_normals = None
      for i in range(faces.shape[0]):
          face = faces[i]
          for j in range(face.shape[0]):
              pt = face[j]
              # quantize to ensure nearly-identical points will be merged
              pt2 = tuple([round(x * 1e14) for x in pt])
              index = verts.get(pt2, None)
              if index is None:
                  self._vertices.append(pt)
                  self._vertex_faces.append([])
                  index = len(self._vertices) - 1
                  verts[pt2] = index
              # track which vertices belong to which faces
              self._vertex_faces[index].append(i)
              self._faces[i, j] = index
      self._vertices = np.array(self._vertices, dtype=np.float32)
  
imports: import numpy
label_desc: Use image node_id 25 for calling the MeshData obj's underlying member method code with example usage: obj._compute_unindexed_vertices() without return types