#! /usr/bin/python
# -*- python -*-

import sys, os, os.path, struct
import _soya, soya, soya.model


for arg in sys.argv:
  if arg == '--help' or arg == '-h':
    print 'Usage:', sys.argv[0], """PATH
  Convert all the soya materials into the new format. Materials
  must be in PATH/materials and images in PATH/images.
  If no PATH is given, PATH is guessed to be ./
"""
    sys.exit(0)


if len(sys.argv) > 1:
  GAME_PATH = sys.argv[1]
else:
  GAME_PATH = '.'


soya.model.Material.PATH = os.path.join(GAME_PATH, 'materials')
soya.model.Image.PATH    = os.path.join(GAME_PATH, 'images')



def material_old_setstate(self, state):

  cdata = state["_cdata"]
  del state["_cdata"]
    
  self.__dict__ = state

  # read old cdata
  format = 'Ifffffffffc'
  nb = struct.calcsize(format)
  data = struct.unpack(format, cdata[:nb])

  option = data[0]
  if option & (1<<1): self.separate_specular = 1
  if option & (1<<2): self.additive_blending = 1
  if option & (1<<5): self.clamp = 1

  self.shininess = data[1]
  self.diffuse  = (data[2], data[3], data[4], data[5])
  self.specular = (data[6], data[8], data[8], data[9])

  if data[10] == '\0':
    self.image = None
  else:
    # (String, Width, Height, NbColor)
    format = 'III'
    n = struct.calcsize(format)
    (nb_color, width, height) = struct.unpack(format, cdata[nb:nb + n])
    size = width * height * nb_color * struct.calcsize('B')
    pixels = cdata[nb + n:nb + n + size]
    self.image = _soya._Image(pixels, int(width), int(height), int(nb_color))
    #self.image = soya.model.Image(self.tex_filename)

  if isinstance(self, soya.SavedInAPath):
    if self.filename: self._alls[self.filename] = self



soya.model.Material.__setstate__ = material_old_setstate




DIRECTORY = soya.model.Material.PATH

files = os.listdir(DIRECTORY)

for file in files:
  if file[-5:] != '.data': continue
  m = soya.model.Material.get(file[:-5])
  m.save()
  print '  Material', m.filename, 'converted'

print '  [DONE]'


