]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mspgl/mesh.py
Fix normal map property name in material exporter
[libs/gl.git] / blender / io_mspgl / mesh.py
index da5e76aaf34ed259d48ff5f3a0b872c32f36cdda..8f19676ac1127627e2a78771e949d89a9ce5b9c4 100644 (file)
@@ -70,8 +70,12 @@ class Vertex:
 
 class VertexGroup:
        def __init__(self, group):
-               self.group = group.group
-               self.weight = group.weight
+               if group:
+                       self.group = group.group
+                       self.weight = group.weight
+               else:
+                       self.group = 0
+                       self.weight = 0.0
 
 
 class Face:
@@ -162,8 +166,9 @@ class Mesh:
 
                # Clone basic data
                self.vertices = [Vertex(v) for v in mesh.vertices]
-               for v in self.vertices:
-                       v.groups = [VertexGroup(g) for g in v.groups]
+               if self.vertex_groups:
+                       for v in self.vertices:
+                               v.groups = [VertexGroup(g) for g in v.groups]
 
                self.faces = [Face(f) for f in mesh.polygons]
                self.edges = [Edge(e) for e in mesh.edges]
@@ -172,6 +177,7 @@ class Mesh:
 
                self.use_auto_smooth = mesh.use_auto_smooth
                self.auto_smooth_angle = mesh.auto_smooth_angle
+               self.max_groups_per_vertex = mesh.max_groups_per_vertex
 
                # Clone only the desired UV layers
                if mesh.use_uv=='NONE' or not mesh.uv_layers:
@@ -240,12 +246,12 @@ class Mesh:
 
                # Merge materials and form a lookup from source material indices to the
                # merged material list
-               material_map = []
+               material_atlas = []
                for m in other.materials:
                        if m in self.materials:
-                               material_map.append(self.materials.index(m))
+                               material_atlas.append(self.materials.index(m))
                        else:
-                               material_map.append(len(self.materials))
+                               material_atlas.append(len(self.materials))
                                self.materials.append(m)
 
                # Append data and adjust indices where necessary.  Since the data is
@@ -276,7 +282,7 @@ class Mesh:
                        f.index += offset
                        f.loop_indices = range(f.loop_indices.start+offset, f.loop_indices.stop+offset)
                        if other.materials:
-                               f.material_index = material_map[f.material_index]
+                               f.material_index = material_atlas[f.material_index]
 
                offset = len(self.edges)
                self.edges += other.edges
@@ -371,6 +377,9 @@ class Mesh:
                progress.pop_task()
 
        def prepare_vertex_groups(self, obj):
+               if not self.vertex_groups:
+                       return
+
                for v in self.vertices:
                        if v.groups:
                                weight_sum = sum(g.weight for g in v.groups)
@@ -378,6 +387,8 @@ class Mesh:
                                weight_scale = weight_sum/sum(g.weight for g in v.groups)
                                for g in v.groups:
                                        g.weight *= weight_scale
+                       while len(v.groups)<self.max_groups_per_vertex:
+                               v.groups.append(VertexGroup(None))
 
                if obj.parent and obj.parent.type=="ARMATURE":
                        armature = obj.parent.data
@@ -391,15 +402,15 @@ class Mesh:
                                for g in v.groups:
                                        g.group = group_index_map[g.group]
 
-       def apply_material_map(self, material_map):
+       def apply_material_atlas(self, material_atlas):
                for m in self.materials:
-                       if m.name not in material_map.material_names:
-                               raise Exception("Material map is not compatible with Mesh")
+                       if m.name not in material_atlas.material_names:
+                               raise Exception("Material atlas is not compatible with Mesh")
 
                if self.use_uv=='NONE':
                        return
 
-               layer = UvLayer("material_map")
+               layer = UvLayer("material_atlas")
                if self.use_uv=='UNIT0':
                        self.uv_layers = [layer]
                        layer.unit = 0
@@ -411,7 +422,7 @@ class Mesh:
 
                layer.uvs = [(0.0, 0.0)]*len(self.loops)
                for f in self.faces:
-                       uv = material_map.get_material_uv(self.materials[f.material_index])
+                       uv = material_atlas.get_material_uv(self.materials[f.material_index])
                        for i in f.loop_indices:
                                layer.uvs[i] = uv
 
@@ -772,7 +783,7 @@ class Mesh:
                        e.key = make_edge_key(e.vertices[0].index, e.vertices[1].index)
 
 
-def create_mesh_from_object(context, obj, progress, *, material_map=None):
+def create_mesh_from_object(context, obj, progress, *, material_atlas=None):
        if obj.type!="MESH":
                raise Exception("Object is not a mesh")
 
@@ -818,8 +829,8 @@ def create_mesh_from_object(context, obj, progress, *, material_map=None):
 
        mesh.name = obj.data.name
 
-       if material_map:
-               mesh.apply_material_map(material_map)
+       if material_atlas:
+               mesh.apply_material_atlas(material_atlas)
 
        progress.set_task("Triangulating", 0.2, 0.3)
        mesh.prepare_triangles(progress)