view engine/python/fife/extensions/loaders.py @ 654:5d6b1820b953

* Added the ability to change screen modes on the fly. This works both in OpenGL and SDL modes. * Added IEngineChangeListener so the client can update the cameras viewport if the screen mode has been changed. I chose to do it this way because the engine has no way to know which camera it should update. It will be up to the client to do it. * The cursor surface is now correctly freed when exiting. * Added DeviceCaps::getNearestScreenMode() for the client to request a supported screen mode. closes[t:315]
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Thu, 21 Oct 2010 18:50:50 +0000
parents b84dbc4665b0
children e3140f01749d
line wrap: on
line source

# -*- coding: utf-8 -*-

# ####################################################################
#  Copyright (C) 2005-2009 by the FIFE team
#  http://www.fifengine.de
#  This file is part of FIFE.
#
#  FIFE is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2.1 of the License, or (at your option) any later version.
#
#  This library 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
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library; if not, write to the
#  Free Software Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
# ####################################################################

# Loader interface for FIFE's native xml format.

import os.path

from fife import fife

from fife.extensions.serializers.xmlmap import XMLMapLoader
from fife.extensions.serializers import WrongFileType, NameClash

from fife.extensions.serializers.xmlobject import XMLObjectLoader

objectFileMapping = { 'xml' : XMLObjectLoader }
mapFileMapping = { 'xml' : XMLMapLoader}
fileExtensions = ('xml',)
mapFileExtensions = ('xml',)

def loadMapFile(path, engine, callback=None, debug=True):
	""" load map file and get (an optional) callback if major stuff is done:
	- map creation
	- parsed imports
	- parsed layers
	- parsed cameras
	the callback will send both a string and a float (which shows
	the overall process), callback(string, float)

	@type	engine:		object
	@param	engine: 	FIFE engine instance
	@type	callback:	function
	@param	callback:	callback for maploading progress
	@type	debug:		bool
	@param	debug:		flag to activate / deactivate print statements

	@type	map:	object
	@return	map:	FIFE map object
	"""
	(filename, extension) = os.path.splitext(path)
	map_loader = mapFileMapping[extension[1:]](engine, callback, debug)
	map = map_loader.loadResource(fife.ResourceLocation(path))
	if debug: print "--- Loading map took: ", map_loader.time_to_load, " seconds."
	return map


def loadImportFile(path, engine, debug=False):
	""" uses XMLObjectLoader to load import files from path

	@type	path:	string
	@param	path:	path to import file
	@type	engine:	object
	@param	engine:	FIFE engine instance
	@type	debug:	bool
	@param	debug:	flag to activate / deactivate print statements
	"""
	(filename, extension) = os.path.splitext(path)
	object_loader = objectFileMapping[extension[1:]](engine.getImagePool(), engine.getAnimationPool(), engine.getModel(), engine.getVFS())
	res = None
	try:
		res = object_loader.loadResource(fife.ResourceLocation(path))
		if debug: print 'imported object file ' + path
	except WrongFileType:
		pass
#		print 'ignored non-object file ' + path
	except NameClash:
		pass
#		print 'ignored already loaded file ' + path
	return res

def loadImportDir(path, engine, debug=False):
	""" helper function to call loadImportFile on a directory

	@type	path:	string
	@param	path:	path to import directory
	@type	engine:	object
	@param	engine:	FIFE engine instance
	@type	debug:	bool
	@param	debug:	flag to activate / deactivate print statements
	"""
	for file in filter(lambda f: f.split('.')[-1] == 'xml', engine.getVFS().listFiles(path)):
		loadImportFile('/'.join([path, file]), engine, debug)

def loadImportDirRec(path, engine, debug=False):
	""" helper function to call loadImportFile recursive on a directory

	@type	path:	string
	@param	path:	path to import directory
	@type	engine:	object
	@param	engine:	FIFE engine instance
	@type	debug:	bool
	@param	debug:	flag to activate / deactivate print statements
	"""
	loadImportDir(path, engine, debug)

	for dir in filter(lambda d: not d.startswith('.'), engine.getVFS().listDirectories(path)):
		loadImportDirRec('/'.join([path, dir]), engine, debug)


def addObjectFileLoader(fileExtension, loaderClass):
	"""Add a new loader for fileextension
	@type   fileExtension: string
	@param  fileExtension: The file extension the loader is registered for
	@type   loaderClass:   object
	@param  loaderClass:   A fife.ResourceLoader implementation that loads objects
	                       from files with the given fileExtension
	"""
	objectFileMapping[fileExtension] = loaderClass
	_updateFileExtenions()


def addMapLoader(fileExtension, loaderClass):
	"""Add a new loader for fileextension
	@type   fileExtension: string
	@param  fileExtension: The file extension the loader is registered for
	@type   loaderClass:   object
	@param  loaderClass:   A fife.ResourceLoader implementation that loads maps
	                       from files with the given fileExtension
	"""
	mapFileMapping[fileExtension] = loaderClass
	_updateMapFileExtensions()

def _updateFileExtensions():
	fileExtensions = set(objectFileMapping.keys())

def _updateMapFileExtensions():
	mapFileExtensions = set(mapFileMapping.keys())