return (min(i1, i2), max(i1, i2))
class Edge:
- def __init__(self, me):
- if me.__class__==Edge:
- self._medge = me._medge
- self.vertices = me.vertices[:]
- self.smooth = me.smooth
+ def __init__(self, edge):
+ if edge.__class__==Edge:
+ self._edge = edge._edge
+ self.vertices = edge.vertices[:]
+ self.smooth = edge.smooth
else:
- self._medge = me
+ self._edge = edge
self.smooth = False
- self.key = me.key
+ self.key = edge.key
self.faces = []
def __getattr__(self, attr):
- return getattr(self._medge, attr)
+ return getattr(self._edge, attr)
def check_smooth(self, limit):
if len(self.faces)!=2:
class Vertex:
- def __init__(self, mv):
- if mv.__class__==Vertex:
- self._mvert = mv._mvert
- self.uvs = mv.uvs[:]
- self.tan = mv.tan
- self.bino = mv.bino
+ def __init__(self, vertex):
+ if vertex.__class__==Vertex:
+ self._vertex = vertex._vertex
+ self.uvs = vertex.uvs[:]
+ self.tan = vertex.tan
+ self.bino = vertex.bino
else:
- self._mvert = mv
+ self._vertex = vertex
self.uvs = []
self.tan = None
self.bino = None
- self.index = mv.index
- self.co = mv.co
- self.normal = mv.normal
+ self.index = vertex.index
+ self.co = vertex.co
+ self.normal = vertex.normal
self.flag = False
self.edges = []
self.faces = []
- self.groups = mv.groups[:]
+ self.groups = vertex.groups[:]
def __getattr__(self, attr):
- return getattr(self._mvert, attr)
+ return getattr(self._vertex, attr)
def __cmp__(self, other):
if other is None:
class VertexGroup:
- def __init__(self, base):
- self._base = base
- self.group = base.group
- self.weight = base.weight
+ def __init__(self, group):
+ self._group = group
+ self.group = group.group
+ self.weight = group.weight
def __getattr__(self, attr):
- return getattr(self._mvert, attr)
+ return getattr(self._group, attr)
class Face:
- def __init__(self, mf):
- self._mface = mf
- self.index = mf.index
+ def __init__(self, face):
+ self._face = face
+ self.index = face.index
self.edges = []
- self.vertices = mf.vertices[:]
+ self.vertices = face.vertices[:]
self.uvs = []
self.flag = False
def __getattr__(self, attr):
- return getattr(self._mface, attr)
+ return getattr(self._face, attr)
def __cmp__(self, other):
if other is None:
class Mesh:
- def __init__(self, m):
- self._mesh = m
+ def __init__(self, mesh):
+ self._mesh = mesh
- self.winding_test = m.winding_test
- self.tbn_vecs = m.tbn_vecs
- self.vertex_groups = m.vertex_groups
+ self.winding_test = mesh.winding_test
+ self.tbn_vecs = mesh.tbn_vecs
+ self.vertex_groups = mesh.vertex_groups
self.vertices = [Vertex(v) for v in self.vertices]
self.faces = [Face(f) for f in self.polygons]
self.edges = [Edge(e) for e in self.edges]
- self.edge_map = {e.key: e for e in self.edges}
self.loops = self.loops[:]
self.materials = self.materials[:]
for v in self.vertices:
v.groups = [VertexGroup(g) for g in v.groups]
+ edge_map = {e.key: e for e in self.edges}
for f in self.faces:
if len(f.vertices)>4:
raise ValueError("Ngons are not supported")
v.faces.append(f)
for k in f.edge_keys:
- e = self.edge_map[k]
+ e = edge_map[k]
e.faces.append(f)
f.edges.append(e)
for e in self.edges[offset:]:
e.index += offset
e.key = make_edge_key(e.vertices[0].index, e.vertices[1].index)
- self.edge_map[e.key] = e
self.lines += other.lines
prog_count += 1
tbn_layer_index = uv_names.index(self.tbn_uvtex)
progress.push_task_slice("Computing TBN", 0, prog_count)
- self.compute_tbn(tbn_layer_index, progress)
- progress.set_task_slice(self.tbn_uvtex, 1, prog_count)
self.split_vertices(self.find_uv_group, progress, tbn_layer_index)
+ progress.set_task_slice(self.tbn_uvtex, 1, prog_count)
+ self.compute_tbn(tbn_layer_index, progress)
progress.pop_task()
prog_step = 2
v.uvs = [(0.0, 0.0)]*len(self.uv_layers)
def split_vertices(self, find_group_func, progress, *args):
- groups = []
- for i in range(len(self.vertices)):
+ vertex_count = len(self.vertices)
+ for i in range(vertex_count):
v = self.vertices[i]
for f in v.faces:
f.flag = False
- vg = []
+ groups = []
for f in v.faces:
if not f.flag:
- vg.append(find_group_func(v, f, *args))
-
- groups.append(vg)
+ groups.append(find_group_func(v, f, *args))
- progress.set_progress(i*0.5/len(self.vertices))
+ for g in groups[1:]:
+ nv = Vertex(v)
+ nv.index = len(self.vertices)
+ self.vertices.append(nv)
- for i in range(len(self.vertices)):
- for g in groups[i][1:]:
- v = Vertex(self.vertices[i])
- v.index = len(self.vertices)
- self.vertices.append(v)
-
- v_edges = []
- for e in self.vertices[i].edges:
+ for e in v.edges:
e_faces_in_g = [f for f in e.faces if f in g]
- if e_faces_in_g:
- boundary = len(e_faces_in_g)<len(e.faces)
- v_edges.append((e, boundary, e_faces_in_g))
+ if not e_faces_in_g:
+ continue
- for e, boundary, e_faces_in_g in v_edges:
- if boundary:
+ if len(e_faces_in_g)<len(e.faces):
ne = Edge(e)
ne.index = len(self.edges)
self.edges.append(ne)
+ ne.other_vertex(v).edges.append(ne)
+
for f in e_faces_in_g:
e.faces.remove(f)
f.edges[f.edges.index(e)] = ne
ne.faces.append(f)
+
e = ne
- else:
- del self.edge_map[e.key]
- self.vertices[i].edges.remove(e)
- v.edges.append(e)
- e.vertices[e.vertices.index(self.vertices[i])] = v
+ e.vertices[e.vertices.index(v)] = nv
+ nv.edges.append(e)
e.key = make_edge_key(e.vertices[0].index, e.vertices[1].index)
- self.edge_map[e.key] = e
+
+ v.edges = [e for e in v.edges if v in e.vertices]
for f in g:
- self.vertices[i].faces.remove(f)
- f.vertices[f.vertices.index(self.vertices[i])] = v
- v.faces.append(f)
+ v.faces.remove(f)
+ f.vertices[f.vertices.index(v)] = nv
+ nv.faces.append(f)
- progress.set_progress(0.5+i*0.5/len(self.vertices))
+ progress.set_progress(i/vertex_count)
def find_smooth_group(self, vertex, face):
face.flag = True
def drop_references(self):
for v in self.vertices:
- v._mvert = None
+ v._vertex = None
for g in v.groups:
- g._base = None
+ g._group = None
for e in self.edges:
- e._medge = None
+ e._edge = None
for f in self.faces:
- f._mface = None
+ f._face = None
for u in self.uv_layers:
u._layer = None
self._mesh = None