//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 __HIKGETCHARACTERNODE_H__
#define __HIKGETCHARACTERNODE_H__

#include <maya/MPxNode.h>
#include <maya/MPxLocatorNode.h>
#include <maya/MPxCommand.h>


#ifndef _DLL_
#ifdef _WINDOWS
	#define _DLL_				__declspec(dllimport) 
#else
	#define _DLL_
#endif
#endif

namespace MayaHIK
{

    //Align Axis so that the rotation axis for each bone is apporpriate.
    //For instance spine bone will have x axis pointing to child spine bone...
    //fingers will point to their child so that they can easily rotate in a natural manner
    class HIKInitAxis : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();
	};

    class ComputeReference : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
        static MSyntax newSyntax();
		static void* creator();
	};


    class GetHIKMatrixDecomposition : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();
	};

	class GetHIKNode : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();
	};

	class GetHIKNodeCount : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();

	};

	class GetHIKNodeName : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();

	};

	class GetHIKNodeIdFromName : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();

	};


	class GetHIKEffectorCount : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();

	};

	class GetHIKEffectorName : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();

	};

	class GetHIKEffectorIdFromName : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static void* creator();

	};

	class GetHIKChildCount : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static MSyntax newSyntax();
		static void* creator();

	};

	class GetHIKChildId : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static MSyntax newSyntax();
		static void* creator();

	};

	class GetHIKParentId : public MPxCommand
	{
	public:
		MStatus doIt(const MArgList& args);
		static MSyntax newSyntax();
		static void* creator();

	};

    class GetFKIdFromEffectorId : public MPxCommand
    {
    public:
        MStatus doIt(const MArgList& args);
        static void* creator();
    };

    int hikGetFKIdFromEffectorId( int id );
}
#endif
