#!BPY """ Name: 'MX Simulator Model (.jm)...' Blender: 232 Group: 'Export' Tooltip: 'Export selected mesh for MX Simulator' """ __author__ = "Josh Vanderhoof" __version__ = "0.1" __bpydoc__ = """\ This script exports meshes for use in MX Simulator. Usage: Select meshes to be exported and run this script from "File->Export" menu. """ import Blender import sys from Blender import * def reduce_verts(v, t): s = [] # sorted with original indices for i in xrange(0, len(v)): s.append((v[i], i)) s.sort() r = [] # new vertex array tr = [] # new triangle array m = [0] * len(s) # maps original vertex indices to new indices r.append(s[0][0]) for i in xrange(0, len(s)): if r[len(r) - 1] != s[i][0]: r.append(s[i][0]) m[s[i][1]] = len(r) - 1 for i in xrange(0, len(t)): tr.append(m[t[i]]) return (r, tr) def bone_index(bonelist, bonename): for i in xrange(len(bonelist)): if bonename == bonelist[i]: return i return 0 def vert_to_string(v, bones): s = "%f %f %f %f %f %f %f %f" % (v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]) for i in xrange(len(bones)): w = " 0" for b in v[8]: if bones[i] == b[0]: w = " %f" % (b[1]) s += w s += "\n" return s def add_face(face, m, key, mesh): if not key in m: m[key] = ([],[]) verts, tris = m[key] vbase = len(verts) for i in xrange(len(face.v)): v = face.v[i] try: tc = (face.uv[i][0], face.uv[i][1]) except: tc = (0.0, 0.0) verts.append((v.co[0], v.co[1], v.co[2], v.no[0], v.no[1], v.no[2]) + tc + (mesh.getVertexInfluences(v.index),)) for i in range(3): tris.append(vbase + i) if len(face.v) == 4: # output other half of quad for i in (2, 3, 0): tris.append(vbase + i) def add_object_by_material(obj, m): mesh = obj.getData(False, True) for face in mesh.faces: try: mat = mesh.materials[face.mat] mirror_alpha = mat.rayMirr mirror_rgb = mat.mirCol spec_alpha = mat.spec spec_rgb = mat.specCol spec_exp = mat.hard except: mirror_alpha = 0.0 mirror_rgb = [0.0, 0.0, 0.0] spec_alpha = 0.0 spec_rgb = [0.0, 0.0, 0.0] spec_exp = 0 if mirror_alpha == 0.0: key = (spec_exp,) + (spec_alpha,) + tuple(spec_rgb) add_face(face, m, key, mesh) elif mirror_alpha == 1.0: key = (-1.0,) + (mirror_alpha,) + tuple(mirror_rgb) add_face(face, m, key, mesh) else: key = (spec_exp,) + (spec_alpha,) + tuple(spec_rgb) add_face(face, m, key, mesh) key = (-1.0,) + (mirror_alpha,) + tuple(mirror_rgb) add_face(face, m, key, mesh) def findarmature(obj): mseq = obj.modifiers for i in xrange(mseq.__len__()): m = mseq.__getitem__(i) if m.type == Modifier.Types.ARMATURE: return m.__getitem__(Modifier.Settings.OBJECT) return None def getbones(obj): armobj = findarmature(obj) if armobj == None: return [] arm = armobj.getData() return arm.bones.keys() def write(filename): file = open(filename, "wb") objects = Blender.Object.GetSelected() mesh_by_material = {} bones = [] for obj in objects: add_object_by_material(obj, mesh_by_material) bones = bones + getbones(obj) keys = mesh_by_material.keys() keys.sort() keys.reverse() bones.sort() if len(bones) > 0: file.write("JM2\n") file.write("%d\n" % (len(bones))) file.write(",".join(bones)) file.write("\n") else: file.write("JM1\n") for key in keys: verts, tris = mesh_by_material[key] verts, tris = reduce_verts(verts, tris) pad = "" for val in key: file.write("%s%f" % (pad, val)) pad = " " file.write("\n%d %d\n" % (len(verts), len(tris) / 3)) for v in verts: file.write(vert_to_string(v, bones)) for t in tris: file.write("%d\n" % t) file.close() def fs_callback(filename): if filename.find('.jm', -3) <= 0: filename += '.jm' write(filename) Blender.Window.FileSelector(fs_callback, "Export jm", Blender.Object.GetSelected()[0].name + ".jm")