8 self.show_progress = True
9 self.export_all = False
11 def export_to_file(self, context, out_fn):
13 objs = [o for o in context.selected_objects if o.type=="MESH"]
15 objs = [context.active_object]
17 from .util import Progress
19 path, base = os.path.split(out_fn)
20 base, ext = os.path.splitext(base)
22 progress = Progress(self.show_progress and context)
23 for i, obj in enumerate(objs):
25 out_fn = os.path.join(path, obj.data.name+ext)
27 progress.push_task_slice(obj.data.name, i, len(objs))
28 resource = self.export_mesh(context, obj, progress)
30 resource.write_to_file(out_fn)
33 def export_mesh(self, context, mesh_or_obj, progress):
34 from .mesh import Mesh, create_mesh_from_object
36 if type(mesh_or_obj)==Mesh:
39 progress.push_task("", 0.0, 0.9)
40 mesh = create_mesh_from_object(context, mesh_or_obj, progress)
43 from .datafile import Resource, Statement, Token
44 resource = Resource(mesh.name+".mesh", "mesh")
45 statements = resource.statements
47 st = Statement("vertices", Token("NORMAL3"))
48 if mesh.vertices[0].color:
49 st.append(Token("COLOR4_UBYTE"))
51 for u in mesh.uv_layers:
52 size = str(len(u.uvs[0]))
54 st.append(Token("TEXCOORD"+size))
56 st.append(Token("TEXCOORD{}_{}".format(size, u.unit)))
58 st.append(Token("TANGENT3"))
59 if mesh.vertex_groups:
60 st.append(Token("GROUP{}".format(mesh.max_groups_per_vertex)))
61 st.append(Token("WEIGHT{}".format(mesh.max_groups_per_vertex)))
62 st.append(Token("VERTEX3"))
66 uvs = [None]*len(mesh.uv_layers)
70 for v in mesh.vertices:
72 st.sub.append(Statement("normal", *v.normal))
75 st.sub.append(Statement("color", *v.color))
77 for i, u in enumerate(mesh.uv_layers):
80 st.sub.append(Statement("texcoord", *v.uvs[i]))
82 st.sub.append(Statement("multitexcoord", u.unit, *v.uvs[i]))
86 st.sub.append(Statement("tangent", *v.tan))
88 if mesh.vertex_groups:
89 v_group = [g.group for g in v.groups]
90 v_weight = [g.weight for g in v.groups]
92 st.sub.append(Statement("group", *v_group))
95 st.sub.append(Statement("weight", *v_weight))
97 st.sub.append(Statement("vertex", *v.co))
102 for s in mesh.vertex_sequence:
103 st = Statement("batch", Token("TRIANGLE_STRIP"))
104 for i in range(0, len(s), 32):
105 st.sub.append(Statement("indices", *(v.index for v in s[i:i+32])))
106 statements.append(st)
108 st = Statement("batch", Token('TRIANGLES'))
110 st.sub.append(Statement("indices", *(v.index for v in f.vertices)))
111 statements.append(st)
114 st = Statement("batch", Token('LINES'))
116 st.sub.append(Statement("indices", *(v.index for v in l.vertices)))
117 statements.append(st)
119 if mesh.winding_test:
120 statements.append(Statement("winding", Token('COUNTERCLOCKWISE')))
122 progress.set_progress(1.0)