 /**********************************************************************
 
	FILE: IFaceDataMgr.h

	DESCRIPTION:  Face-Data management API

	CREATED BY: Attila Szabo, Discreet

	HISTORY: [attilas|30.8.2000]


 *>	Copyright (c) 1998-2000, All Rights Reserved.
 **********************************************************************/

#ifndef __IFACEDATAMGR__H
#define __IFACEDATAMGR__H

#include "idatachannel.h"
#include "baseinterface.h"

// GUID that identifies this ifc (interface)
#define FACEDATAMGR_INTERFACE Interface_ID(0x1b454148, 0x6a066927)

//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
// Interface for managing face-data channels. 
// Objects that want to have face-data channels should implement this ifc
//
// If this interface needs to b changed, a new one should be derived from
// it and changed (IFaceDataMgr2) and made sure objects that support 
// face-data implement both old and new interfaces
//________________________________________________________________________
class IFaceDataMgr : public BaseInterface
{
	public:
		//
		// Modifiers and procedural objects should call these methods 
		// to add\remove\retrieve a face-data channel on an object (mesh,patch,poly)
		//

		// Returns the number of face-data-channels
		virtual ULONG		NumFaceDataChans( ) const = 0;

		// Retrieves a face-data-channel 
		virtual IFaceDataChannel* GetFaceDataChan( const Class_ID& ID ) const = 0;

		// Adds a face-data-channel to the object. Returns TRUE on success
		virtual BOOL		AddFaceDataChan( IFaceDataChannel* pChan ) = 0;

		// Removes a face-data-channel from the object. Returns TRUE on success
		virtual BOOL		RemoveFaceDataChan( const Class_ID& ID ) = 0;

		//
		// The "system" (Max) should call these methods to manage the
		// face-data channels when the object flows up the stack
		//

		// Appends a face-data-channel to the object. Returns TRUE on success
		virtual BOOL		AppendFaceDataChan( const IFaceDataChannel* pChan ) = 0;

		// Adds or appends face-data channels from the from object, to this object
		// If the channel already exists on this object, it's appended otherwise 
		// gets added
		virtual BOOL		CopyFaceDataChans( const IFaceDataMgr* pFrom ) = 0;

		// Deletes all face-data-channels from this object
		virtual void		RemoveAllFaceDataChans() = 0;

		// Mechanism for executing an operation for all face-data-channels on this object:
		// For all face-data-channels calls IFaceDataEnumCallBack::proc() with 
		// a pointer to that face-data- channel and a context data
		// Returns FALSE if the call back returns FALSE for any of the face-data-channels
		virtual BOOL EnumFaceDataChans( IFaceDataChannelsEnumCallBack& cb, void* pContext ) const = 0; 

		// Allow persistance of info kept in object implementing this interface
		virtual IOResult Save(ISave* isave) = 0;
		virtual IOResult Load(ILoad* iload) = 0;

		// --- from GenericInterface
		virtual Interface_ID	GetID() { return FACEDATAMGR_INTERFACE; }

};

#endif 