class MeshExporter:
def __init__(self):
+ self.show_progress = True
self.use_strips = True
- self.use_degen_tris = True
+ self.use_degen_tris = False
self.max_strip_len = 1024
- self.optimize_cache = False
+ self.optimize_cache = True
self.cache_size = 64
- self.export_lines = True
+ self.export_lines = False
self.export_uv = "UNIT0"
self.tbn_vecs = False
self.tbn_uvtex = ""
return strips, loose
- def export(self, context, out_file):
+ def export(self, context, out_file, objs=None, progress=None):
if self.compound:
- objs = context.selected_objects
- else:
+ if objs is None:
+ objs = context.selected_objects
+ check = objs
+ while check:
+ children = []
+ for o in check:
+ for c in o.children:
+ if c.compound:
+ children.append(c)
+ objs += children
+ check = children
+ elif objs is None:
objs = [context.active_object]
if not objs:
from .mesh import Mesh
from .util import Progress
- progress = Progress()
- progress.set_task("Preparing", 0.0, 0.0)
+ if self.show_progress:
+ if not progress:
+ progress = Progress(context)
+ progress.set_task("Preparing", 0.0, 0.0)
+ else:
+ progress = None
mesh = None
bmeshes = []
else:
mesh.splice(Mesh(bmesh))
- progress.set_task("Smoothing", 0.05, 0.35)
+ if progress:
+ progress.set_task("Smoothing", 0.05, 0.35)
if self.smoothing=="NONE":
mesh.flatten_faces()
mesh.split_smooth(progress)
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]
texunits.insert(0, unit)
for i, u in texunits:
- progress.set_task("Splitting UVs", 0.35+0.3*i/len(texunits), 0.35+0.3*(i+1)/len(texunits))
+ if progress:
+ progress.set_task("Splitting UVs", 0.35+0.3*i/len(texunits), 0.35+0.3*(i+1)/len(texunits))
mesh.split_uv(i, progress)
if self.tbn_vecs and u.name==self.tbn_uvtex:
mesh.compute_uv()
strips = []
loose = mesh.faces
if self.use_strips:
- progress.set_task("Creating strips", 0.65, 0.95)
+ if progress:
+ progress.set_task("Creating strips", 0.65, 0.95)
strips, loose = self.stripify(mesh, progress)
- progress.set_task("Writing file", 0.95, 1.0)
+ if progress:
+ progress.set_task("Writing file", 0.95, 1.0)
from .outfile import open_output
out_file = open_output(out_file)
fmt = ["NORMAL3"]
if texunits:
for i, u in texunits:
- if u.unit==0:
+ if u.unit==0 or force_unit0:
fmt.append("TEXCOORD2")
else:
fmt.append("TEXCOORD2_%d"%u.unit)
fmt.append("VERTEX3")
out_file.begin("vertices", *fmt)
normal = None
- uvs = [None]*len(texunits)
+ uvs = {}
tan = None
bino = None
group = None
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 v.uvs[i]!=uvs.get(i):
+ if u.unit==0 or force_unit0:
out_file.write("texcoord2", *v.uvs[i])
else:
out_file.write("multitexcoord2", u.unit, *v.uvs[i])
out_file.end()
if self.export_lines and mesh.lines:
- out_file.write("batch", "LINES")
+ out_file.begin("batch", "LINES")
for l in mesh.lines:
out_file.write("indices", l.vertices[0].index, l.vertices[1].index)
out_file.end()
- progress.set_task("Done", 1.0, 1.0)
+ if progress:
+ progress.set_task("Done", 1.0, 1.0)
for m in bmeshes:
bpy.data.meshes.remove(m)