X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=blender%2Fio_mesh_mspgl%2Fmesh.py;h=aa8df8d254665d4240b50a34934753515a56e96c;hb=95cc5788bd736be92b3810d3fea398fadc8865b1;hp=ce4a7fd984f8fdffbcf7617c8c17830447ad6779;hpb=ccce05f213b3e97e18d88c1665c144df7ed1c218;p=libs%2Fgl.git diff --git a/blender/io_mesh_mspgl/mesh.py b/blender/io_mesh_mspgl/mesh.py index ce4a7fd9..aa8df8d2 100644 --- a/blender/io_mesh_mspgl/mesh.py +++ b/blender/io_mesh_mspgl/mesh.py @@ -67,7 +67,6 @@ class Face: self.vertices = mf.vertices[:] self.uvs = [] self.flag = False - self.material = None def __getattr__(self, attr): return getattr(self._mface, attr) @@ -91,6 +90,10 @@ class Face: return e raise KeyError("No edge %s"%(key,)) + def get_neighbors(self): + neighbors = [e.other_face(self) for e in self.edges] + return list(filter(bool, neighbors)) + class Line: def __init__(self, e): @@ -100,23 +103,29 @@ class Line: class UvLayer: - def __init__(self, l): + def __init__(self, l, t): self._layer = l - self.name = None + self.uvtex = t + self.name = self.uvtex.name + self.unit = None + self.hidden = False + dot = self.name.find('.') + if dot>=0: + ext = self.name[dot:] + if ext.startswith(".unit") and ext[5:].isdigit(): + self.unit = int(ext[5:]) + elif ext==".hidden": + self.hidden = True def __getattr__(self, attr): return getattr(self._layer, attr) class FakeUvLayer: def __init__(self, n): + self.uvtex = None self.name = n - -def uvtex_unit_number(uvtex): - dot = uvtex.name.find('.') - if dot!=-1 and uvtex.name[dot+1:dot+5]=="unit" and uvtex.name[dot+5:].isdigit(): - return int(uvtex.name[dot+5]) - else: - return 1000 + self.unit = None + self.hidden = False class Mesh: def __init__(self, m): @@ -127,11 +136,8 @@ class Mesh: self.materials = self.materials[:] - self.uv_layers = [UvLayer(u) for u in self.uv_layers] - for i in range(len(self.uv_layers)): - self.uv_layers[i].name = self.uv_textures[i].name - self.uv_layers = [u for u in self.uv_layers if not u.name.endswith(".hidden")] - self.uv_layers.sort(key=uvtex_unit_number) + self.uv_layers = [UvLayer(self.uv_layers[i], self.uv_textures[i]) for i in range(len(self.uv_layers))] + self.assign_texture_units() for f in self.faces: f.vertices = [self.vertices[i] for i in f.vertices] @@ -178,7 +184,8 @@ class Mesh: offset = len(self.faces) for f in other.faces: f.index += offset - f.material = material_map[f.material_index] + if other.materials: + f.material_index = material_map[f.material_index] self.faces.append(f) for e in other.edges.values(): @@ -194,8 +201,22 @@ class Mesh: for e in self.edges.values(): e.check_smooth(1) + def assign_texture_units(self): + # Assign texture units for any non-hidden UV layers that lack one + units = [u.unit for u in self.uv_layers if u.unit is not None] + if units: + free_unit = max(units)+1 + else: + free_unit = 0 + for u in self.uv_layers: + if u.unit is None: + if not u.hidden: + u.unit = free_unit + free_unit += 1 + def generate_material_uv(self): self.uv_layers.append(FakeUvLayer("material_tex")) + self.assign_texture_units() for f in self.faces: f.uvs.append([((f.material_index+0.5)/len(self.materials), 0.5)]*len(f.vertices)) @@ -341,6 +362,7 @@ class Mesh: v.bino.normalize() def create_strip(self, face, max_len): + # Find an edge with another unused face next to it edge = None for e in face.edges: other = e.other_face(face) @@ -351,6 +373,8 @@ class Mesh: if not edge: return None + # Add initial vertices so that we'll complete the edge on the first + # iteration vertices = face.pivot_vertices(*edge.vertices) if len(vertices)==3: result = [vertices[-1], vertices[0]] @@ -358,10 +382,13 @@ class Mesh: result = [vertices[-2], vertices[-1]] while 1: + face.flag = True + vertices = face.pivot_vertices(*result[-2:]) k = len(result)%2 - face.flag = True + # Quads need special handling because the winding of every other + # triangle in the strip is reversed if len(vertices)==4 and not k: result.append(vertices[3]) result.append(vertices[2]) @@ -371,11 +398,10 @@ class Mesh: if len(result)>=max_len: break + # Hop over the last edge edge = face.get_edge(*result[-2:]) - - next = edge.other_face(face) - if not next or next.flag: + face = edge.other_face(face) + if not face or face.flag: break - face = next return result