/******************************************************************************
 *<
	FILE: bipexp.h
				  
	DESCRIPTION:  Export Interface Functionality for BIped

	CREATED BY: Susan Amkraut with a lot of help from John Chadwick

	HISTORY: created June 2, 1998

 *>     Copyright (c) Unreal Pictures, Inc. 1997, 1998 All Rights Reserved.
 *******************************************************************************/

#ifndef BIPEXP_H
#define BIPEXP_H

#ifdef BLD_BIPED
#define BIPExport __declspec( dllexport )
#else
#define BIPExport __declspec( dllimport )
#endif

#include "max.h"

// This is the interface ID for a Biped Controller Interface
#define I_BIPINTERFACE	0x00100101

// These are subanim numbers for the center of mass (root) controller
#define VERTICAL_SUBANIM	0
#define HORIZONTAL_SUBANIM	1
#define ROTATION_SUBANIM	2


// These are the Class ID defines for Biped Controllers.
#ifndef BLD_BIPED

// this is the class for all biped controllers except the root and the footsteps
#define BIPSLAVE_CONTROL_CLASS_ID Class_ID(0x9154,0)

// this is the class for the center of mass, biped root controller ("Bip01")
#define BIPBODY_CONTROL_CLASS_ID  Class_ID(0x9156,0) 

// this is the class for the biped footstep controller ("Bip01 Footsteps")
#define FOOTPRINT_CLASS_ID Class_ID(0x3011,0)        

#endif

// Using the Biped Export Interface
// 
//  1.	Find the Biped Controller you wish to export from (see the sample code).
//
//	2.	Given  a Biped controller c, get the Biped Export Interface:
//		IBipedExport *BipIface = (BipedExport *)c->GetInterface(I_BIPINTERFACE);		
//
// At the moment this interface only allows you to remove the non uniform scale.
// This allows you to export cleaner transform information from a biped.
// In the future, more virtual functions will be added, and you'll be able
// to get more information about the biped via this interface.

// Sample Code
//
// // Get a biped node - in this case the root
// INode *node = ip->GetINodeByName("Bip01");
//
// if (node)
// {
//     // Get the node's transform control
//     Control *c = node->GetTMController();
//
//     // You can test whether or not this is a biped controller with the following pseudo code:
//     if ((c->ClassID() == BIPSLAVE_CONTROL_CLASS_ID) ||
//         (c->ClassID() == BIPBODY_CONTROL_CLASS_ID) 
//         (c->ClassID() == FOOTPRINT_CLASS_ID))
//     {
//
//         // Get the Biped Export Interface from the controller 
//         IBipedExport *BipIface = (IBipedExport *) c->GetInterface(I_BIPINTERFACE);
//
//         // Remove the non uniform scale
//         BipIface->RemoveNonUniformScale(1);

//         // Begin or End figure mode
//         BipIface->BeginFigureMode(1);
//         BipIface->EndFigureMode(1);
//     }
// }


// BipedExport: This class can be returned by calling the method GetInterface() from a Biped controller
// Given controller *c points to a Biped controller, then:
// IBipedExport *BipIface = (IBipedExport *) (c->GetInterface(I_BIPINTERFACE));
// will return the interface for this Biped Controller, else returns NULL.

class IBipedExport
{
	public:
		
		BIPExport virtual ~IBipedExport() {}

        // For the BipedExport you got from the center of mass (root) controller, send in: 
        // VERTICAL_SUBANIM, HORIZONTAL_SUBANIM, and ROTATION_SUBANIM 
        // to get information for those tracks.
        // For other BipedExports this method is irrelevant.
		// The SetSubAnim method is actually included for future releases, 
		// when more methods will be added to the IBipedExport class.
		// Then you could call these methods for the three center of mass subanims.
		// It is not presently useful.
        BIPExport virtual void SetSubAnim (int i) {};

		// call this from any IBipedExport instance to remove or restore non uniform scaling
		BIPExport virtual void RemoveNonUniformScale(BOOL onOFF) {};

        // call these to begin and end figure mode
		BIPExport virtual void BeginFigureMode(int redraw) {};
		BIPExport virtual void EndFigureMode(int redraw) {};
};


#endif

