Advertisement
Guest User

Export script

a guest
Jan 26th, 2014
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.98 KB | None | 0 0
  1. #!BPY
  2.  
  3. """
  4. Name: 'MX Simulator Model (.jm)...'
  5. Blender: 232
  6. Group: 'Export'
  7. Tooltip: 'Export selected mesh for MX Simulator'
  8. """
  9.  
  10. __author__ = "Josh Vanderhoof"
  11. __version__ = "0.1"
  12.  
  13. __bpydoc__ = """\
  14. This script exports meshes for use in MX Simulator.
  15.  
  16. Usage:
  17.  
  18. Select meshes to be exported and run this script from "File->Export" menu.
  19. """
  20.  
  21.  
  22. import Blender
  23. import sys
  24. from Blender import *
  25.  
  26. def reduce_verts(v, t):
  27.     s = []  # sorted with original indices
  28.  
  29.     for i in xrange(0, len(v)):
  30.         s.append((v[i], i))
  31.  
  32.     s.sort()
  33.     r = []  # new vertex array
  34.     tr = [] # new triangle array
  35.     m = [0] * len(s)    # maps original vertex indices to new indices
  36.  
  37.     r.append(s[0][0])
  38.  
  39.     for i in xrange(0, len(s)):
  40.         if r[len(r) - 1] != s[i][0]:
  41.             r.append(s[i][0])
  42.         m[s[i][1]] = len(r) - 1
  43.  
  44.     for i in xrange(0, len(t)):
  45.         tr.append(m[t[i]])
  46.  
  47.     return (r, tr)
  48.  
  49. def bone_index(bonelist, bonename):
  50.     for i in xrange(len(bonelist)):
  51.         if bonename == bonelist[i]:
  52.             return i
  53.     return 0
  54.  
  55. def vert_to_string(v, bones):
  56.     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])
  57.  
  58.     for i in xrange(len(bones)):
  59.         w = " 0"
  60.  
  61.         for b in v[8]:
  62.             if bones[i] == b[0]:
  63.                 w = " %f" % (b[1])
  64.  
  65.         s += w
  66.  
  67.     s += "\n"
  68.  
  69.     return s
  70.  
  71. def add_face(face, m, key, mesh):
  72.     if not key in m:
  73.         m[key] = ([],[])
  74.  
  75.     verts, tris = m[key]
  76.  
  77.     vbase = len(verts)
  78.     for i in xrange(len(face.v)):
  79.         v = face.v[i]
  80.         try:
  81.             tc = (face.uv[i][0], face.uv[i][1])
  82.         except:
  83.             tc = (0.0, 0.0)
  84.         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),))
  85.  
  86.     for i in range(3):
  87.         tris.append(vbase + i)
  88.  
  89.     if len(face.v) == 4:
  90.         # output other half of quad
  91.         for i in (2, 3, 0):
  92.             tris.append(vbase + i)
  93.  
  94. def add_object_by_material(obj, m):
  95.     mesh = obj.getData(False, True)
  96.  
  97.     for face in mesh.faces:
  98.         try:
  99.             mat = mesh.materials[face.mat]
  100.             mirror_alpha = mat.rayMirr
  101.             mirror_rgb = mat.mirCol
  102.             spec_alpha = mat.spec
  103.             spec_rgb = mat.specCol
  104.             spec_exp = mat.hard
  105.         except:
  106.             mirror_alpha = 0.0
  107.             mirror_rgb = [0.0, 0.0, 0.0]
  108.             spec_alpha = 0.0
  109.             spec_rgb = [0.0, 0.0, 0.0]
  110.             spec_exp = 0
  111.  
  112.  
  113.         if mirror_alpha == 0.0:
  114.             key = (spec_exp,) + (spec_alpha,) + tuple(spec_rgb)
  115.             add_face(face, m, key, mesh)
  116.         elif mirror_alpha == 1.0:
  117.             key = (-1.0,) + (mirror_alpha,) + tuple(mirror_rgb)
  118.             add_face(face, m, key, mesh)
  119.         else:
  120.             key = (spec_exp,) + (spec_alpha,) + tuple(spec_rgb)
  121.             add_face(face, m, key, mesh)
  122.             key = (-1.0,) + (mirror_alpha,) + tuple(mirror_rgb)
  123.             add_face(face, m, key, mesh)
  124.  
  125. def findarmature(obj):
  126.     mseq = obj.modifiers
  127.  
  128.     for i in xrange(mseq.__len__()):
  129.         m = mseq.__getitem__(i)
  130.         if m.type == Modifier.Types.ARMATURE:
  131.             return m.__getitem__(Modifier.Settings.OBJECT)
  132.     return None
  133.  
  134. def getbones(obj):
  135.     armobj = findarmature(obj)
  136.  
  137.     if armobj == None:
  138.         return []
  139.  
  140.     arm = armobj.getData()
  141.  
  142.     return arm.bones.keys()
  143.  
  144. def write(filename):
  145.     file = open(filename, "wb")
  146.  
  147.     objects = Blender.Object.GetSelected()
  148.  
  149.     mesh_by_material = {}
  150.  
  151.     bones = []
  152.  
  153.     for obj in objects:
  154.         add_object_by_material(obj, mesh_by_material)
  155.         bones = bones + getbones(obj)
  156.  
  157.  
  158.     keys = mesh_by_material.keys()
  159.  
  160.     keys.sort()
  161.     keys.reverse()
  162.  
  163.     bones.sort()
  164.  
  165.     if len(bones) > 0:
  166.         file.write("JM2\n")
  167.         file.write("%d\n" % (len(bones)))
  168.         file.write(",".join(bones))
  169.         file.write("\n")
  170.     else:
  171.         file.write("JM1\n")
  172.  
  173.     for key in keys:
  174.  
  175.         verts, tris = mesh_by_material[key]
  176.  
  177.         verts, tris = reduce_verts(verts, tris)
  178.  
  179.         pad = ""
  180.         for val in key:
  181.             file.write("%s%f" % (pad, val))
  182.             pad = " "
  183.  
  184.         file.write("\n%d %d\n" % (len(verts), len(tris) / 3))
  185.  
  186.         for v in verts:
  187.             file.write(vert_to_string(v, bones))
  188.  
  189.         for t in tris:
  190.             file.write("%d\n" % t)
  191.  
  192.     file.close()
  193.  
  194. def fs_callback(filename):
  195.     if filename.find('.jm', -3) <= 0: filename += '.jm'
  196.     write(filename)
  197.  
  198. Blender.Window.FileSelector(fs_callback, "Export jm", Blender.Object.GetSelected()[0].name + ".jm")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement