# -*- indent-tabs-mode: t -*-

# Soya
# Copyright (C) 2005 Jean-Baptiste LAMY
#
# 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

"""soya.cerealizer

Import this module to make Soya's objects cerealizable.
"""

import sys
import cerealizer
import soya, soya.cursor, soya.laser, soya.ray, soya.spc_material
_soya = sys.modules["soya._soya"]


class SavedInAPathHandler(cerealizer.ObjHandler):
	def collect(self, obj, dumper):
		if (not soya._SAVING is obj) and obj._filename: # self is saved in another file, save filename only
			return cerealizer.Handler.collect(self, obj, dumper)
		else: return cerealizer.ObjHandler.collect(self, obj, dumper)
		
	def dump_obj(self, obj, dumper, s):
		cerealizer.ObjHandler.dump_obj(self, obj, dumper, s)
		if (not soya._SAVING is obj) and obj._filename: # self is saved in another file, save filename only
			dumper.dump_ref(obj._filename, s)
		else: dumper.dump_ref("", s)
		
	def dump_data(self, obj, dumper, s):
		if (not soya._SAVING is obj) and obj._filename: # self is saved in another file, save filename only
			return cerealizer.Handler.dump_data(self, obj, dumper, s)
		else: cerealizer.ObjHandler.dump_data(self, obj, dumper, s)
		
	def undump_obj(self, dumper, s):
		filename = dumper.undump_ref(s)
		if filename: return self.Class._reffed(filename)
		return cerealizer.ObjHandler.undump_obj(self, dumper, s)
	
	def undump_data(self, obj, dumper, s):
		if not getattr(obj, "_filename", 0): # else, has been get'ed
			cerealizer.ObjHandler.undump_data(self, obj, dumper, s)

cerealizer.register_class(soya.Vertex)
cerealizer.register_class(soya.World, SavedInAPathHandler(soya.World))
cerealizer.register_class(soya.NoBackgroundAtmosphere)
cerealizer.register_class(soya.FixTraveling)
cerealizer.register_class(soya.SimpleModel, SavedInAPathHandler(soya.SimpleModel))
cerealizer.register_class(soya.Material, SavedInAPathHandler(soya.Material))
cerealizer.register_class(soya.CylinderSprite)
cerealizer.register_class(soya.Light)
cerealizer.register_class(soya.TravelingCamera)
cerealizer.register_class(soya.Vector)
cerealizer.register_class(soya.Point)
cerealizer.register_class(soya.Image, SavedInAPathHandler(soya.Image))
cerealizer.register_class(soya.CellShadingModel, SavedInAPathHandler(soya.CellShadingModel))
cerealizer.register_class(soya._soya._AnimatedModelData)
cerealizer.register_class(soya.Model, SavedInAPathHandler(soya.Model))
cerealizer.register_class(soya.SkyAtmosphere)
cerealizer.register_class(soya.Portal)
cerealizer.register_class(soya.Terrain)
cerealizer.register_class(soya.Face)
cerealizer.register_class(soya.Atmosphere)
cerealizer.register_class(soya.TreeModel, SavedInAPathHandler(soya.TreeModel))
cerealizer.register_class(soya.SolidModel, SavedInAPathHandler(soya.SolidModel))
cerealizer.register_class(soya.Particles)
cerealizer.register_class(soya.Sprite)
cerealizer.register_class(soya.Bonus)
cerealizer.register_class(soya.AnimatedModel, SavedInAPathHandler(soya.AnimatedModel))
#cerealizer.register_class(soya.Cal3dBody)
cerealizer.register_class(soya.Body)
#cerealizer.register_class(soya.SavedInAPath)
cerealizer.register_class(soya.ThirdPersonTraveling)
cerealizer.register_class(soya.cursor.Cursor)
cerealizer.register_class(soya.laser.Laser)
cerealizer.register_class(soya.ray.Ray)
cerealizer.register_class(soya.ray.HalfRay)
cerealizer.register_class(soya.spc_material.ZoomingMaterial, SavedInAPathHandler(soya.spc_material.ZoomingMaterial))
cerealizer.register_class(soya.spc_material.MovingMaterial, SavedInAPathHandler(soya.spc_material.MovingMaterial))
cerealizer.register_class(soya.spc_material.RotatingMaterial, SavedInAPathHandler(soya.spc_material.RotatingMaterial))

cerealizer.register_class(_soya.TreeModelBuilder)
cerealizer.register_class(_soya.SimpleModelBuilder)
#cerealizer.register_class(_soya.RaypickContext)
#cerealizer.register_class(_soya.CoordSyst)
cerealizer.register_class(_soya.FlagFirework)
cerealizer.register_class(_soya.Fountain)
cerealizer.register_class(_soya.Smoke)
cerealizer.register_class(_soya.CellShadingModelBuilder)
#cerealizer.register_class(_soya.Traveling)
#cerealizer.register_class(_soya.PythonCoordSyst)
cerealizer.register_class(_soya.FlagSubFire)
#cerealizer.register_class(_soya.Position)
#cerealizer.register_class(_soya.ModelBuilder)
#cerealizer.register_class(_soya._CObj)

if hasattr(soya, "Sound"):
	# Has sound / OpenAL support
	cerealizer.register_class(soya.WAVSound, SavedInAPathHandler(soya.WAVSound))
	cerealizer.register_class(soya.OGGVorbisSound, SavedInAPathHandler(soya.OGGVorbisSound))
	cerealizer.register_class(soya.SoundPlayer)
	
# Aliases for backward compatibility
cerealizer.register_alias(soya.Body            , "soya.Cal3dVolume")
cerealizer.register_alias(soya.Body            , "soya.Cal3dBody")
cerealizer.register_alias(soya.Body            , "soya.Volume")
cerealizer.register_alias(soya.Model           , "soya.Shape")
cerealizer.register_alias(soya.SimpleModel     , "soya.SimpleShape")
cerealizer.register_alias(soya.SolidModel      , "soya.SolidShape")
cerealizer.register_alias(soya.CellShadingModel, "soya.CellShadingShape")
cerealizer.register_alias(soya.TreeModel       , "soya.TreeShape")
cerealizer.register_alias(soya.AnimatedModel   , "soya.Cal3dShape")
cerealizer.register_alias(soya.Terrain         , "soya.Land")

if __name__ == "__main__": # Testing stuff
	class W(soya.World):
		def __setstate__(self, state):
			print "children", self.children
			print "W.__setstate__", state
			soya.World.__setstate__(self, state)
			print "children", self.children
	cerealizer.register_class(W)
		
	class V(soya.Body):
		def __setstate__(self, state):
			print "V.__setstate__", state
	cerealizer.register_class(V)
	
	w = W()
	#v = soya.Body(w)
	v = V(w)
	
	
	print w.__getstate__()
	
	s = cerealizer.dumps(w)
	print s
	z = cerealizer.loads(s)
	print z
	print
	
	print z.children[0].parent
	
