Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!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")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement