X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=blender%2Fio_mspgl%2Fexport_mesh.py;h=18ae856a927ce8f28b70a45c51ab4ed5b9cfda00;hb=820d8ff86b911f1119b8cde03839687176b9b1ee;hp=3f0771fe426b60ad1a59d4fbeb47f85016c5a686;hpb=fcdc70624618488c514676874006f5eddc4e63df;p=libs%2Fgl.git diff --git a/blender/io_mspgl/export_mesh.py b/blender/io_mspgl/export_mesh.py index 3f0771fe..18ae856a 100644 --- a/blender/io_mspgl/export_mesh.py +++ b/blender/io_mspgl/export_mesh.py @@ -1,5 +1,5 @@ +import itertools import bpy -from .outfile import OutFile class VertexCache: def __init__(self, size): @@ -44,10 +44,10 @@ class MeshExporter: self.tbn_vecs = False self.tbn_uvtex = "" self.compound = False - self.object = False self.material_tex = False - self.textures = "REF" self.smoothing = "MSPGL" + self.export_groups = False + self.max_groups = 2 def stripify(self, mesh, progress = None): for f in mesh.faces: @@ -191,7 +191,7 @@ class MeshExporter: return strips, loose - def export(self, context, fn): + def export(self, context, out_file): if self.compound: objs = context.selected_objects else: @@ -206,7 +206,7 @@ class MeshExporter: from .mesh import Mesh from .util import Progress - progress = Progress() + progress = Progress(context) progress.set_task("Preparing", 0.0, 0.0) mesh = None @@ -227,17 +227,36 @@ class MeshExporter: if self.smoothing!="BLENDER": mesh.compute_normals() + if self.export_groups: + mesh.sort_vertex_groups(self.max_groups) + + # Create a mapping from vertex group indices to bone indices + group_index_map = dict((i, i) for i in range(len(objs[0].vertex_groups))) + if objs[0].parent and objs[0].parent.type=="ARMATURE": + armature = objs[0].parent.data + bone_indices = dict((armature.bones[i].name, i) for i in range(len(armature.bones))) + for g in objs[0].vertex_groups: + if g.name in bone_indices: + group_index_map[g.index] = bone_indices[g.name] + if self.material_tex and mesh.materials: mesh.generate_material_uv() texunits = [] - if mesh.uv_layers and self.export_uv!="NONE": + force_unit0 = False + if mesh.uv_layers and (self.export_uv!="NONE" or self.material_tex): # Figure out which UV layers to export - if self.export_uv=="UNIT0": - if mesh.uv_layers[0].unit==0: - texunits = [0] - else: + if self.export_uv=="ALL": texunits = range(len(mesh.uv_layers)) + elif self.material_tex: + # The material UV layer is always the last one + texunits = [len(mesh.uv_layers)-1] + force_unit0 = True + else: + for i, u in enumerate(mesh.uv_layers): + if u.unit==0: + texunits = [i] + break texunits = [(i, mesh.uv_layers[i]) for i in texunits] texunits = [u for u in texunits if not u[1].hidden] @@ -267,43 +286,53 @@ class MeshExporter: progress.set_task("Writing file", 0.95, 1.0) - out_file = OutFile(fn) - if self.object: - out_file.begin("mesh") + from .outfile import open_output + out_file = open_output(out_file) - fmt = "NORMAL3" + fmt = ["NORMAL3"] if texunits: for i, u in texunits: - if u.unit==0: - fmt += "_TEXCOORD2" + if u.unit==0 or force_unit0: + fmt.append("TEXCOORD2") else: - fmt += "_TEXCOORD2%d"%u.unit + fmt.append("TEXCOORD2_%d"%u.unit) if self.tbn_vecs: - fmt += "_ATTRIB33_ATTRIB34" - fmt += "_VERTEX3" - out_file.begin("vertices", fmt) + fmt += ["TANGENT3", "BINORMAL3"] + if self.export_groups: + fmt.append("ATTRIB%d_5"%(self.max_groups*2)) + fmt.append("VERTEX3") + out_file.begin("vertices", *fmt) normal = None - uvs = [None]*len(texunits) + uvs = [None]*(max(u[0] for u in texunits)+1) tan = None bino = None + group = None for v in mesh.vertices: if v.normal!=normal: out_file.write("normal3", *v.normal) normal = v.normal for i, u in texunits: if v.uvs[i]!=uvs[i]: - if u.unit==0: + if u.unit==0 or force_unit0: out_file.write("texcoord2", *v.uvs[i]) else: out_file.write("multitexcoord2", u.unit, *v.uvs[i]) uvs[i] = v.uvs[i] if self.tbn_vecs: if v.tan!=tan: - out_file.write("attrib3", 3, *v.tan) + out_file.write("tangent3", *v.tan) tan = v.tan if v.bino!=bino: - out_file.write("attrib3", 4, *v.bino) + out_file.write("binormal3", *v.bino) bino = v.bino + if self.export_groups: + group_attr = [(group_index_map[g.group], g.weight*v.group_weight_scale) for g in v.groups[:self.max_groups]] + while len(group_attr)