//Copyright © 2008 Autodesk, Inc.
//All Rights Reserved.
//
//The coded instructions, statements, computer programs, and/or related material (collectively "Data")
//in these files contain unpublished information proprietary to Autodesk, Inc., ("Autodesk") which is
//protected by Canada and United States of America federal copyright law and by international treaties.
//
//The Data may not be disclosed or distributed to third parties, in whole or in part, without the prior
//written consent of Autodesk.
//
//THE DATA IS PROVIDED "AS IS" AND WITHOUT WARRANTY. ALL WARRANTIES ARE EXPRESSLY EXCLUDED AND DISCLAIMED.
//AUTODESK MAKES NO WARRANTY OF ANY KIND WITH RESPECT TO THE DATA, EXPRESS, IMPLIED OR ARISING BY CUSTOM
//OR TRADE USAGE, AND DISCLAIMS ANY IMPLIED WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
//FITNESS FOR A PARTICULAR PURPOSE OR USE. WITHOUT LIMITING THE FOREGOING, AUTODESK DOES NOT WARRANT THAT
//THE OPERATION OF THE DATA WILL BE UNINTERRUPTED OR ERROR FREE.
//
//IN NO EVENT SHALL AUTODESK, ITS AFFILIATES, PARENT COMPANIES, LICENSORS OR SUPPLIERS ("AUTODESK GROUP")
//BE LIABLE FOR ANY LOSSES, DAMAGES OR EXPENSES OF ANY KIND (INCLUDING WITHOUT LIMITATION PUNITIVE OR
//MULTIPLE DAMAGES OR OTHER SPECIAL, DIRECT, INDIRECT, EXEMPLARY, INCIDENTAL, LOSS OF PROFITS, REVENUE OR
//DATA, COST OF COVER OR CONSEQUENTIAL LOSSES OR DAMAGES OF ANY KIND), HOWEVER CAUSED, AND REGARDLESS OF
//THE THEORY OF LIABILITY, WHETHER DERIVED FROM CONTRACT, TORT (INCLUDING, BUT NOT LIMITED TO, NEGLIGENCE),
//OR OTHERWISE, ARISING OUT OF OR RELATING TO THE DATA OR ITS USE OR ANY OTHER PERFORMANCE, WHETHER OR NOT
//AUTODESK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE.

#ifndef __HIKSTATE2EFFECTOR_H__
#define __HIKSTATE2EFFECTOR_H__

#ifndef _DLL_
#ifdef _WINDOWS
	#define _DLL_				__declspec(dllimport) 
#else
	#define _DLL_
#endif
#endif


#include <maya/MPxNode.h>

#ifndef COMPILING_MAYAHIK_IN_MAYA
	#include <humanik/humanik.h>
	#include <humanik/hikutils.h>
#else
	#include <humanik.h>
	#include <hikutils.h>
#endif

#include <maya/MCallbackIdArray.h>

namespace MayaHIK
{	
	class CallbackRemover;
	
	class _DLL_ HIKState2Effector : public MPxNode
	{
		static MObject IState;

		// The OGX matrix attribute is deprecated
		static MObject OGX[LastNodeId];
		// OGXMulti will now store matrix information
		static MObject OGXMulti[LastNodeId];
		// Pivot for each effector and the children
		static MObject IPivot[LastEffectorId];
		static MObject IPivotxyz[LastEffectorId][3];

		static MString mIEffectorStateAttrName;

	public:
		static MTypeId id;
		static	void*	creator(){ return new HIKState2Effector  ; }
		static	MStatus	initialize();


		MStatus compute( const MPlug & plug, MDataBlock & block );

		static inline MString GetIEffectorStateAttrName() { return mIEffectorStateAttrName;}
		virtual bool isPassiveOutput(const MPlug& pPlug)const{return true;}

		// Callback id class
		static CallbackRemover callbackRemover;
				
	private:
		static void initializeCompatabilityCallbacks(); 
	};

	// Callback information
	class _DLL_ CallbackRemover
	{	// Simple utility class for tracking and removing callback IDs
		public:
			CallbackRemover() {}

			virtual ~CallbackRemover()
			{
				clear();
			}

			void clear()
			{	
				if ( idArray.length() > 0 )
					MMessage::removeCallbacks( idArray );
				idArray.clear();
			}

			void add( MCallbackId id )
			{
				idArray.append( id );
			}
		private:
			MCallbackIdArray idArray;

	};
}

#endif
