return 1
return cmp(self.index, other.index)
+ def pivot_vertex(self, v):
+ n = self.vertices.index(v)
+ return [(n+i)%len(self.vertices) for i in range(len(self.vertices))]
+
def pivot_vertices(self, *vt):
flags = [(v in vt) for v in self.vertices]
l = len(self.vertices)
self.loops = self.loops[:]
self.materials = self.materials[:]
- if self.use_uv=='NONE':
+ if self.use_uv=='NONE' or not self.uv_layers:
self.uv_layers = []
- elif self.uv_layers:
+ else:
self.uv_layers = [UvLayer(u) for u in self.uv_layers]
self.uv_layers = sorted([u for u in self.uv_layers if not u.hidden], key=(lambda u: (u.unit or 1000, u.name)))
self.lines += other.lines
- def prepare_smoothing(self, progress=None):
+ def prepare_smoothing(self, progress):
smooth_limit = -1
if self.smoothing=='NONE':
for f in self.faces:
for e in self.edges:
e.check_smooth(smooth_limit)
+ progress.push_task("Sharp edges", 0.0, 0.7)
self.split_vertices(self.find_smooth_group, progress)
if self.smoothing!='BLENDER':
- self.compute_normals()
+ progress.set_task("Updating normals", 0.7, 1.0)
+ self.compute_normals(progress)
+
+ progress.pop_task()
def prepare_vertex_groups(self, obj):
for v in self.vertices:
for g in v.groups:
g.group = group_index_map[g.group]
- def prepare_uv(self, obj, progress=None):
+ def prepare_uv(self, obj, progress):
if obj.material_tex and self.use_uv!='NONE':
layer = UvLayer("material_tex")
for u in self.uv_layers:
f.uvs.append([u.uvs[i] for i in f.loop_indices])
+ prog_count = len(self.uv_layers)
+ prog_step = 0
+
tbn_layer_index = -1
if self.tbn_vecs:
uv_names = [u.name for u in self.uv_layers]
if self.tbn_uvtex in uv_names:
+ prog_count += 1
tbn_layer_index = uv_names.index(self.tbn_uvtex)
- self.compute_tbn(tbn_layer_index)
+ progress.push_task_slice("Computing TBN", 0, 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
- for i in range(len(self.uv_layers)):
+ for i, u in enumerate(self.uv_layers):
+ if i==tbn_layer_index:
+ continue
+
+ progress.push_task_slice(u.name, prog_step, prog_count)
self.split_vertices(self.find_uv_group, progress, i)
+ progress.pop_task()
+ prog_step += 1
for v in self.vertices:
if v.faces:
groups.append(vg)
- if progress:
- progress.set_progress(i*0.5/len(self.vertices))
+ progress.set_progress(i*0.5/len(self.vertices))
for i in range(len(self.vertices)):
for g in groups[i][1:]:
ne.index = len(self.edges)
self.edges.append(ne)
+ ne.other_vertex(self.vertices[i]).edges.append(ne)
+
for f in e_faces_in_g:
e.faces.remove(f)
f.edges[f.edges.index(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
+ v.edges.append(e)
e.key = make_edge_key(e.vertices[0].index, e.vertices[1].index)
self.edge_map[e.key] = e
f.vertices[f.vertices.index(self.vertices[i])] = v
v.faces.append(f)
- if progress:
- progress.set_progress(0.5+i*0.5/len(self.vertices))
+ progress.set_progress(0.5+i*0.5/len(self.vertices))
def find_smooth_group(self, vertex, face):
face.flag = True
return group
- def compute_normals(self):
- for v in self.vertices:
+ def compute_normals(self, progress):
+ for i, v in enumerate(self.vertices):
v.normal = mathutils.Vector()
for f in v.faces:
fv = f.pivot_vertices(v)
else:
v.normal = mathutils.Vector((0, 0, 1))
- def compute_tbn(self, index):
+ progress.set_progress(i/len(self.vertices))
+
+ def compute_tbn(self, index, progress):
layer_uvs = self.uv_layers[index].uvs
- for v in self.vertices:
+ for i, v in enumerate(self.vertices):
v.tan = mathutils.Vector()
v.bino = mathutils.Vector()
for f in v.faces:
- vi = f.vertices.index(v)
- uv0 = layer_uvs[f.loop_indices[vi]]
- uv1 = layer_uvs[f.loop_indices[vi+1]]
- uv2 = layer_uvs[f.loop_indices[vi-1]]
+ vi = f.pivot_vertex(v)
+ uv0 = layer_uvs[f.loop_indices[vi[0]]]
+ uv1 = layer_uvs[f.loop_indices[vi[1]]]
+ uv2 = layer_uvs[f.loop_indices[vi[-1]]]
du1 = uv1[0]-uv0[0]
du2 = uv2[0]-uv0[0]
dv1 = uv1[1]-uv0[1]
dv2 = uv2[1]-uv0[1]
- edge1 = f.vertices[vi+1].co-f.vertices[vi].co
- edge2 = f.vertices[vi-1].co-f.vertices[vi].co
+ edge1 = f.vertices[vi[1]].co-f.vertices[vi[0]].co
+ edge2 = f.vertices[vi[-1]].co-f.vertices[vi[0]].co
div = (du1*dv2-du2*dv1)
if div:
mul = edge1.angle(edge2)/div
if v.bino.length:
v.bino.normalize()
+ progress.set_progress(i/len(self.vertices))
+
def drop_references(self):
for v in self.vertices:
v._mvert = None
return result
-def create_mesh_from_object(context, obj, progress=None):
+def create_mesh_from_object(context, obj, progress):
if obj.type!="MESH":
raise Exception("Object is not a mesh")
+ progress.push_task("Preparing mesh", 0.0, 0.3)
+
objs = [(obj, mathutils.Matrix())]
i = 0
while i<len(objs):
for o, m in objs:
bmesh = o.to_mesh(context.scene, True, "PREVIEW")
bmeshes.append(bmesh)
+
+ # Object.to_mesh does not copy custom properties
+ bmesh.winding_test = o.data.winding_test
+ bmesh.smoothing = o.data.smoothing
+ bmesh.use_lines = o.data.use_lines
+ bmesh.vertex_groups = o.data.vertex_groups
+ bmesh.max_groups_per_vertex = o.data.max_groups_per_vertex
+ bmesh.use_uv = o.data.use_uv
+ bmesh.tbn_vecs = o.data.tbn_vecs
+ bmesh.tbn_uvtex = o.data.tbn_uvtex
+
me = Mesh(bmesh)
me.transform(m)
else:
mesh = me
+ progress.set_task("Smoothing", 0.3, 0.6)
mesh.prepare_smoothing(progress)
+ progress.set_task("Vertex groups", 0.6, 0.7)
mesh.prepare_vertex_groups(obj)
+ progress.set_task("Preparing UVs", 0.7, 1.0)
mesh.prepare_uv(obj, progress)
mesh.drop_references()
for m in bmeshes:
bpy.data.meshes.remove(m)
+ progress.pop_task()
+
return mesh