]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mesh_mspgl/mesh.py
Improve texture unit handling
[libs/gl.git] / blender / io_mesh_mspgl / mesh.py
index e3405f9f8e055490b71bf7a4323abcfc1475c752..8b3ad37052a62eba8d03237a5386a43cf8775e22 100644 (file)
@@ -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]