#!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:<br>

Missing:<br>
	Smoothing
    Animation

Known issues:<br>
    Only tested with HalfLife2 (Source engine). May not work with HalfLife1

Notes:<br>
    
"""

# $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], 0])
			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], 0])
			vec = Blender.Mathutils.VecMultMat(vec, object.getMatrix('worldspace'))
			file.write("%f %f %f " % (vec.x, vec.y, vec.z))
		#file.write("%f %f %f " % (-v.no[2], -v.no[1], v.no[0]));
		
		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)