#!BPY

""" Registration info for Blender menus:
Name: 'BZFlag'
Blender: 233
Group: 'Export'
Tip: 'Export to BZFlag World (.bzw) format.'
"""

# %g conversions lose precision.
# %s does not but may print rounding errors as digits.

import Blender
from math import pi

class object:
  def __init__(self, obj):
    self.obj=obj
  def saveattribs(self, file):
    file.write('name %s\n' % self.obj.name)
  def export(self, file):
    file.write('%s\n' % self.type)
    self.saveattribs(file)
    file.write('end\n')

class positioned(object):
  def saveattribs(self, file):
    object.saveattribs(self, file)
    loc=list(self.obj.loc)
    sizez=self.obj.size[2]
    if sizez < 0:
      loc[2]=loc[2]-sizez
    if loc != (0.0, 0.0, 0.0):
      file.write('position %g %g %g\n' % tuple(loc))
    if self.obj.rot[2] != 0.0:
      file.write('rotation %g\n' % (self.obj.rot[2]*180.0/pi))

class sized(positioned):
  def saveattribs(self, file):
    positioned.saveattribs(self, file)
    if self.obj.size != self.defaultsize:
      file.write('size %g %g %g\n' % self.obj.size)

class base(sized):
  type='base'
  defaultsize=(400.0, 400.0, 1.0)
  def saveattribs(self, file):
    sized.saveattribs(self, file)
    colors={'RedBase': 1, 'GreenBase': 2,
    	'BlueBase': 3, 'PurpleBase': 4}
    file.write('color %d\n'%colors[self.obj.data.name])

class box(sized):
  type='box'
  defaultsize=(30.0, 30.0, 9.42)

class pyramid(sized):
  type='pyramid'
  defaultsize=(8.2, 8.2, 10.25)

objtypes={ 'Box': box, 'Pyramid': pyramid,
	'RedBase': base, 'BlueBase': base,
	'PurpleBase': base, 'GreenBase': base }

def bzflag_export(filename):
  file=open(filename, 'w')
  world=None
  fh=None
  for obj in Blender.Object.Get():
    if obj.getType() == 'Mesh':
      try:
	objtypes[obj.data.name](obj).export(file)
      except KeyError:
	pass
      if obj.data.name == 'BZWorld':
        world=obj
    elif obj.getType()=='Empty' and obj.name=='flagHeight':
      fh=obj
  if world or fh:
    file.write('world\n')
    if world.name != 'example_world':
      file.write('name %s\n' % world.name)
    if world.size[0] != 400.0:
      file.write('size %g\n' % world.size[0])
    if fh and fh.loc[2]!=0.0:
      file.write('flagHeight %g\n' % fh.loc[2])
    file.write('end\n')
  del file

#Blender.Window.FileSelector(bzflag_export, "Export BZFlag World")
bzflag_export('/home/yann/Blender/testexport.bzw')

