X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=blender%2Fio_mspgl%2Fmesh.py;h=125bc5bbbaf01a938af18ec21eefb76239f1534b;hb=ff85f90d33023d908c534b0bf5d9a65e9fc2cce2;hp=78cae28b22f662d3e0eb2ca9fdbb8073536f7893;hpb=171f8e9be4fd17ebc7a467d9a8f959a1bba6b3e6;p=libs%2Fgl.git diff --git a/blender/io_mspgl/mesh.py b/blender/io_mspgl/mesh.py index 78cae28b..125bc5bb 100644 --- a/blender/io_mspgl/mesh.py +++ b/blender/io_mspgl/mesh.py @@ -1,6 +1,7 @@ import bpy import math import mathutils +import itertools def make_edge_key(i1, i2): return (min(i1, i2), max(i1, i2)) @@ -167,6 +168,7 @@ class UvLayer: class Mesh: def __init__(self, mesh): self._mesh = mesh + self.name = mesh.name self.winding_test = mesh.winding_test self.tbn_vecs = mesh.tbn_vecs @@ -187,17 +189,21 @@ class Mesh: self.uv_layers = [] else: self.uv_layers = [UvLayer(u) for u in mesh.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))) + + # Assign texture unit numbers to UV layers that lack one + missing_unit = [u for u in self.uv_layers if u.unit is None] + if missing_unit: + missing_unit = sorted(missing_unit, key=(lambda u: u.name)) + used_units = [u.unit for u in self.uv_layers if u.unit is not None] + for u, n in zip(missing_unit, (i for i in itertools.count() if i not in used_units)): + u.unit = n + + self.uv_layers = sorted(self.uv_layers, key=(lambda u: u.unit)) if self.use_uv=='UNIT0': self.uv_layers = [self.uv_layers[0]] - - # Assign texture unit numbers to UV layers that lack one - next_unit = max((u.unit+1 for u in self.uv_layers if u.unit is not None), default=0) - for u in self.uv_layers: - if not u.unit: - u.unit = next_unit - next_unit += 1 + if self.uv_layers[0].unit!=0: + self.uv_layers = [] # Rewrite links between elements to point to cloned data, or create links # where they don't exist @@ -387,6 +393,30 @@ class Mesh: for g in v.groups: g.group = group_index_map[g.group] + def apply_material_map(self, material_map): + for m in self.materials: + if m not in material_map.materials: + raise Exception("Material map is not compatible with Mesh") + + if self.use_uv=='NONE': + return + + layer = UvLayer("material_map") + if self.use_uv=='UNIT0': + self.uv_layers = [layer] + layer.unit = 0 + else: + self.uv_layers.append(layer) + used_units = [u.unit for u in self.uv_layers] + layer.unit = next(i for i in itertools.count() if i not in used_units) + self.uv_layers.sort(key=lambda u: u.unit) + + 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]) + for i in f.loop_indices: + layer.uvs[i] = uv + def prepare_uv(self, progress): # Form a list of UV layers referenced by materials with the array atlas # property set @@ -734,7 +764,7 @@ class Mesh: self._mesh = None -def create_mesh_from_object(context, obj, progress): +def create_mesh_from_object(context, obj, progress, *, material_map=None): if obj.type!="MESH": raise Exception("Object is not a mesh") @@ -773,6 +803,11 @@ def create_mesh_from_object(context, obj, progress): else: mesh = me + mesh.name = obj.data.name + + if material_map: + mesh.apply_material_map(material_map) + progress.set_task("Triangulating", 0.2, 0.3) mesh.prepare_triangles(progress) progress.set_task("Smoothing", 0.3, 0.5)