code: def process(self):
          
          # if there are no vertices or faces exit early
          if self.is_empty:
              return self
  
          # avoid clearing the cache during operations
          with self._cache:
              self.remove_infinite_values()
              self.merge_vertices()
              # if we're cleaning remove duplicate
              # and degenerate faces
              if self._validate:
                  self.remove_duplicate_faces()
                  self.remove_degenerate_faces()
          # since none of our process operations moved vertices or faces,
          # we can keep face and vertex normals in the cache without recomputing
          # if faces or vertices have been removed, normals are validated before
          # being returned so there is no danger of inconsistent dimensions
          self._cache.clear(exclude=['face_normals',
                                     'vertex_normals'])
          self.metadata['processed'] = True
          return self
docs: Do the bare minimum processing to make a mesh useful.
  
          Does this by:
              1) removing NaN and Inf values
  
              2) merging duplicate vertices
  
          If self._validate:
              3) Remove triangles which have one edge of their rectangular 2D
                 oriented bounding box shorter than tol.merge
  
              4) remove duplicated triangles
  
          Returns
          ------------
          self: trimesh.Trimesh
            Current mesh