#!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)