+ smooth_limit = -1
+
+ for e in self.edges.itervalues():
+ e.v1 = self.verts[e.v1.index]
+ e.v2 = self.verts[e.v2.index]
+ e.check_smooth(smooth_limit)
+
+ def __getattr__(self, attr):
+ return getattr(self._mesh, attr)
+
+ def splice(self, other):
+ material_map = []
+ for m in other.materials:
+ if m in self.materials:
+ material_map.append(self.materials.index(m))
+ else:
+ material_map.append(len(self.materials))
+ self.materials.append(m)
+
+ offset = len(self.verts)
+ for v in other.verts:
+ v.index += offset
+ self.verts.append(v)
+
+ offset = len(self.faces)
+ for f in other.faces:
+ f.index += offset
+ f.mat = material_map[f.mat]
+ self.faces.append(f)
+
+ for e in other.edges.itervalues():
+ e.key = make_edge_key(e.v1.index, e.v2.index)
+ self.edges[e.key] = e
+
+ self.lines += other.lines
+
+ def generate_material_uv(self):
+ for f in self.faces:
+ f.uv = ([(f.mat+0.5)/len(self.materials), 0.5],)*len(f.verts)
+ self.faceUV = True
+
+ def split_vertices(self, find_group_func, debug):
+ groups = []
+ for i in range(len(self.verts)):
+ v = self.verts[i]
+ for f in v.faces:
+ f.flag = False
+
+ vg = []
+ for f in v.faces:
+ if not f.flag:
+ vg.append(find_group_func(v, f))
+
+ groups.append(vg)
+
+ set_progress(i*0.5/len(self.verts))
+
+ for i in range(len(self.verts)):
+ if len(groups[i])==1:
+ continue
+
+ if debug:
+ print "Vertex %s has %d groups"%(self.verts[i], len(groups[i]))
+
+ for g in groups[i][1:]:
+ v = Vertex(self.verts[i])
+ v.index = len(self.verts)
+ self.verts.append(v)
+
+ if debug:
+ print " -> %d %s"%(v.index, [f.index for f in g])
+
+ for f in g:
+ for j in range(len(f.edges)):
+ e = f.edges[j]
+
+ if e.v1!=self.verts[i] and e.v2!=self.verts[i]:
+ continue
+
+ if debug:
+ print " Splitting edge %s with faces %s"%(e.key, e.faces)
+
+ if e.other_face(f) not in g and len(e.faces)>=2:
+ k = e.faces.index(f)
+ e.faces.remove(f)
+ e = Edge(e)
+ f.edges[j] = e
+ e.faces.append(f)
+ else:
+ del self.edges[e.key]
+
+ if e.v1==self.verts[i]:
+ e.v1 = v
+ elif e.v2==self.verts[i]:
+ e.v2 = v
+
+ e.key = make_edge_key(e.v1.index, e.v2.index)
+ self.edges[e.key] = e
+
+ self.verts[i].faces.remove(f)
+ f.verts[f.verts.index(self.verts[i])] = v
+ v.faces.append(f)
+
+ set_progress(0.5+i*0.5/len(self.verts))
+
+ def split_smooth(self, debug = False):
+ self.split_vertices(self.find_smooth_group, debug)
+
+ def split_uv(self, debug = False):
+ self.split_vertices(self.find_uv_group, debug)
+
+ def find_smooth_group(self, vert, face):
+ face.flag = True
+ queue = [face]
+
+ for f in queue:
+ for e in f.edges:
+ other = e.other_face(f)
+ #if not other or other.index not in face_indices:
+ if other not in vert.faces:
+ continue
+