X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=blender%2Fio_mesh_mspgl%2Fmesh.py;h=8b3ad37052a62eba8d03237a5386a43cf8775e22;hb=7af1f6d70e6ef191991ac909aa134b88d7bdb826;hp=e3405f9f8e055490b71bf7a4323abcfc1475c752;hpb=203ef7534bcbb98b2cddfe9a52128134e46d4133;p=libs%2Fgl.git diff --git a/blender/io_mesh_mspgl/mesh.py b/blender/io_mesh_mspgl/mesh.py index e3405f9f..8b3ad370 100644 --- a/blender/io_mesh_mspgl/mesh.py +++ b/blender/io_mesh_mspgl/mesh.py @@ -41,13 +41,15 @@ class Vertex: self._mvert = mv._mvert self.normal = mv.normal self.uvs = mv.uvs[:] + self.tan = mv.tan + self.bino = mv.bino else: self._mvert = mv self.uvs = [] + self.tan = None + self.bino = None self.flag = False self.faces = [] - self.tan = None - self.bino = None def __getattr__(self, attr): return getattr(self._mvert, attr) @@ -65,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) @@ -97,32 +98,49 @@ class Line: self.flag = False -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 +class UvLayer: + def __init__(self, l, t): + self._layer = l + 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 + self.unit = None + self.hidden = False class Mesh: def __init__(self, m): self._mesh = m self.vertices = [Vertex(v) for v in self.vertices] - self.faces = [Face(f) for f in self.faces] + self.faces = [Face(f) for f in self.polygons] self.materials = self.materials[:] - self.uv_textures = [u for u in self.uv_textures if not u.name.endswith(".hidden")] - self.uv_textures.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] for v in f.vertices: v.faces.append(f) - for u in self.uv_textures: - r = u.data[f.index].uv_raw; - f.uvs.append([(r[i], r[i+1]) for i in range(0, 8, 2)]) + for u in self.uv_layers: + f.uvs.append([u.data[f.loop_indices[i]].uv for i in range(len(f.vertices))]) self.edges = dict([(e.key, Edge(e)) for e in self.edges]) for f in self.faces: @@ -162,7 +180,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(): @@ -178,10 +197,24 @@ 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.uv = ([(f.material_index+0.5)/len(self.materials), 0.5],)*len(f.vertices) - self.has_uv = True + f.uvs.append([((f.material_index+0.5)/len(self.materials), 0.5)]*len(f.vertices)) def split_vertices(self, find_group_func, progress, *args): groups = [] @@ -295,24 +328,18 @@ class Mesh: i = f.vertices.index(v) v.uvs = [u[i] for u in f.uvs] - def compute_tbn(self, uvtex): - if not self.uv_textures: + def compute_tbn(self, index): + if not self.uv_layers: return - uvtex_names = [u.name for u in self.uv_textures] - if uvtex in uvtex_names: - uvtex_index = uvtex_names.index(uvtex) - else: - uvtex_index = 0 - for v in self.vertices: v.tan = mathutils.Vector() v.bino = mathutils.Vector() for f in v.faces: fv = f.pivot_vertices(v) - uv0 = fv[0].uvs[uvtex_index] - uv1 = fv[1].uvs[uvtex_index] - uv2 = fv[-1].uvs[uvtex_index] + uv0 = fv[0].uvs[index] + uv1 = fv[1].uvs[index] + uv2 = fv[-1].uvs[index] du1 = uv1[0]-uv0[0] du2 = uv2[0]-uv0[0] dv1 = uv1[1]-uv0[1]