/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

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 3 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, see <http://www.gnu.org/licenses/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/
#ifndef PL_COMPONENT_TOOLS_H
#define PL_COMPONENT_TOOLS_H

#include "hsTypes.h"
#include "hsTemplates.h"
#include "../pnKeyedObject/plKey.h"

class INode;
class plModifier;
class plKey;
class plLocation;
class plResponderModifier;
class plComponentBase;
class plMaxNodeBase;

typedef plKey		(*PAddModFunc) (plMaxNodeBase *, plModifier *);
typedef plKey		(*PGetNewKeyFunc) (const char*, plModifier*, plLocation);
typedef void		(*PSetActivatorKeyFunc) (plMaxNodeBase*, plMaxNodeBase*, plMaxNodeBase*, plResponderModifier*);
typedef plKey		(*PGetAnimModKeyFunc) (plComponentBase*, plMaxNodeBase*);
typedef const char*	(*PGetAnimNameFunc) (plComponentBase*);
typedef int			(*PGetMaterialAnimModKeyFunc) (Mtl* mtl, plMaxNodeBase* node, const char *segName, hsTArray<plKey>& keys);
typedef int			(*PGetSoundNameAndIndex) (plComponentBase*, plMaxNodeBase* node, const char*& name);

//
// A "toolbox" for external components to do their conversion with.  The idea
// is to give components the functions they need without pulling in every source
// file.
//
class plComponentTools
{
protected:
	PAddModFunc fAddModFunc;
	PGetNewKeyFunc fNewKey;
	PSetActivatorKeyFunc fActivator;
	PGetAnimModKeyFunc fAnimKey;
//	PGetAnimModKeyFunc fAnimLightKey;
	PGetAnimNameFunc fAnimName;
	PGetMaterialAnimModKeyFunc fMatMod;
	PGetSoundNameAndIndex fSndNameAndIdx;

	plComponentTools() {}

public:
	plComponentTools(PAddModFunc addMod, 
					PGetNewKeyFunc NewKey, 
					PSetActivatorKeyFunc activator, 
					PGetAnimModKeyFunc animKey,
//					PGetAnimModKeyFunc animLightKey,
					PGetAnimNameFunc animName,
					PGetMaterialAnimModKeyFunc matMod,
					PGetSoundNameAndIndex sndNameAndIdx)
		: fAddModFunc(addMod), 
		  fNewKey(NewKey),
		  fActivator(activator),
		  fAnimKey(animKey),
//		  fAnimLightKey(animLightKey),
		  fAnimName(animName),
		  fMatMod(matMod),
		  fSndNameAndIdx(sndNameAndIdx)
			{}

	plKey AddModifier(plMaxNodeBase *node, plModifier *mod);
	plKey GetNewKey(const char *name, plModifier *mod, plLocation loc);
	void SetActivatorKey(plMaxNodeBase *activatorNode, plMaxNodeBase *responderNode, plMaxNodeBase *convertNode, plResponderModifier *responderLogic);

	const char *GetAnimCompAnimName(plComponentBase *comp);
	plKey GetAnimCompModKey(plComponentBase *comp, plMaxNodeBase *node);
//	plKey GetAnimCompLightModKey(plComponentBase *comp, plMaxNodeBase *node);

	int GetMaterialAnimModKey(Mtl* mtl, plMaxNodeBase* node, const char *segName, hsTArray<plKey>& keys);

	int GetSoundNameAndIndex(plComponentBase* comp, plMaxNodeBase* node, const char*& name);
};

#endif //PL_COMPONENT_TOOLS_H