#!BPY """ Registration info for Blender menus: Name: 'HalfLife2 (.smd)...' Blender: 235 Group: 'Export' Submenu: 'Model: Selected...' model_sel Submenu: 'Phys: Selected...' phys_sel Tip: 'Export to HalfLife2 (.smd) format.' """ __author__ = "Pelle Johnsen" __url__ = ("blender", "elysiun", "AC3D's homepage, http://www.ac3d.org", "PLib 3d gaming lib, ") __version__ = "2.35 12/21/04" __bpydoc__ = """\ This script exports Blender meshes to HalfLife2's .smd file format. Supported:
Missing:
Smoothing Animation Known issues:
Only tested with HalfLife2 (Source engine). May not work with HalfLife1 Notes:
""" # $Id$ # # -------------------------------------------------------------------------- # smd_export version 2.35.2 # Program versions: Blender 2.35 and HalfLife2 # -------------------------------------------------------------------------- # ***** BEGIN GPL LICENSE BLOCK ***** # # Copyright (C) 2004: Pelle Johnsen, pelle.johnsen _at_ mail.dk # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # ***** END GPL LICENCE BLOCK ***** # -------------------------------------------------------------------------- import Blender ARG = __script__['arg'] doPhys = (ARG == 'phys_sel') def writeTri(file, object, face, verts, centre): mesh = object.getData() if mesh.hasFaceUV(): file.write("%s\n" % face.image.name) else: file.write("blkmetal.tga\n") for vi in verts: v = face.v[vi] # v.co(ordinates) vec = Blender.Mathutils.Vector([v.co[0], v.co[1], v.co[2], 1]) vec = Blender.Mathutils.VecMultMat(vec, object.getMatrix('worldspace')) file.write("0 %f %f %f " % (vec.x - centre[0], vec.y - centre[1], vec.z - centre[2])) # v.no are normals... subtract object orientation? if doPhys or face.smooth: vec = Blender.Mathutils.Vector([v.no[0], v.no[1], v.no[2], 1]) vec = Blender.Mathutils.VecMultMat(vec, object.getMatrix('worldspace')) file.write("%f %f %f " % (vec.x, vec.y, vec.z)) else: vec = Blender.Mathutils.Vector([face.no[0], face.no[1], face.no[2], 1]) vec = Blender.Mathutils.VecMultMat(vec, object.getMatrix('worldspace')) file.write("%f %f %f " % (vec.x, vec.y, vec.z)) if mesh.hasFaceUV(): file.write("%f %f\n" % (face.uv[vi][0], face.uv[vi][1])) else: file.write("%f %f\n" % (0, 0)) class SMDExport: def __init__(self, filename): print 'Trying SMDExport...' objects = Blender.Object.GetSelected() try: file = open(filename, 'w') except IOError, (errno, strerror): errmsg = "IOError #%s" % errno errmsg = errmsg + "%t|" + strerror Blender.Draw.PupMenu(errmsg) return None file.write("version 1\n") file.write("nodes\n") file.write("0 \"joint0\" -1\n") file.write("end\n") file.write("skeleton\n") file.write("time 0\n") file.write("0 %f %f %f %f %f %f\n" % (0, 0, 0, 0, 0, 0)) file.write("end\n") file.write("triangles\n") noUVWarned = False centre = (0, 0, 0) for object in objects: if object.getType() == 'Empty': centre = object.loc print 'found centre %f, %f, %f' % centre for object in objects: if object.getType() != 'Mesh': continue print 'object:' + object.name mesh = object.getData() #if not mesh.hasFaceUV(): # if not noUVWarned: # Blender.Draw.PupMenu("Face found with no UV. Ignoring.") # noUVWarned = True # #else: if True or mesh.hasFaceUV(): print 'face' faces = mesh.faces for face in faces: writeTri(file, object, face, [0, 1, 2], centre) if len(face.v) == 4: writeTri(file, object, face, [0, 2, 3], centre) file.write("end\n") file.close() print "Done. Saved to %s\n" % filename # -- end of class SMDExport def fs_callback(filename): if filename.find('.smd', -4) <= 0: filename += '.smd' test = SMDExport(filename) if ARG == 'config': exit else: fname = Blender.sys.makename(ext=".smd") Blender.Window.FileSelector(fs_callback, "Export SMD", fname)