/*---------------------------------------------------------------------------

    NN motion header

    Copyright (C) 2002 - 2009 SEGA Corporation CS R&D Support Dept.
    All Rights Reserved.

    Module  : NN motion
    File    : nnfmotion.h
    Create  : 2002/05/10
    Modify  : 2003/05/23
    Modify  : 2003/06/05 NND_SMOTTYPE_VALUETYPE_MASK追加
    Modify  : 2003/08/21 ノードユーザデータモーションに対応
    Modify  : 2003/09/09 NND_SMOTTYPE_USER_MASK追加、NND_SMOTIPTYPE_IP_MASK修正
    Modify  : 2003/09/19 NNS_MOTION 構造体にフレームレートを追加、伴って
                         NND_MOTIONTYPE_VERSION2 を追加
    Modify  : 2003/09/25 トリガ補間タイプ修正
    Modify  : 2003/12/19 マテリアルモーション対応
    Modify  : 2003/12/19 NND_SMOTTYPE_TEXTURE_MASK追加
    Modify  : 2004/02/06 ノードハイドモーション対応
    Modify  : 2004/08/26 ライトモーション対応
    Version : 1.16.53
    Note    :

---------------------------------------------------------------------------*/

#ifndef	__NNFMOTION_H__
#define	__NNFMOTION_H__

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*************/
/* Submotion */
/*************/

/* Submotion type */
typedef Uint32	NNF_SUBMOTION_TYPE;

/* Submotion interpolate-repeat type */
typedef Uint32	NNF_SMOTIPTYPE;

/* Submotion */
typedef struct {
	NNF_SUBMOTION_TYPE	fType;			/* サブモーションのタイプ */
	NNF_SMOTIPTYPE		fIPType;		/* 補間、リピートタイプ */
	union {
		Sint32			Id;				/* サブモーションID、適用先 */
		struct {
			Sint16		Id0;			/* サブモーションサブID0 適用先 */
			Sint16		Id1;			/* サブモーションサブID1 適用先 */
		};
	};
	Float				StartFrame;		/* このサブモーション最初のフレーム */
	Float				EndFrame;		/* このサブモーション最後のフレーム */
	Float				StartKeyFrame;	/* 最初のキーのフレーム */
	Float				EndKeyFrame;	/* 最初のキーのフレーム */
	Sint32				nKeyFrame;		/* キーフレームの数 */
	Sint32				KeySize;		/* キーフレームデータサイズ */
	void				*pKeyList;		/* モーションキーリストへのポインタ */
} NNS_SUBMOTION;


/**********/
/* Motion */
/**********/

/* Motion type */
typedef Uint32	NNF_MOTIONTYPE;

/* Motion (Version2) */
typedef struct {
	NNF_MOTIONTYPE		fType;			/* モーションのタイプ */
	Float				StartFrame;		/* モーションの最初のフレーム番号 */
	Float				EndFrame;		/* モーションの最後のフレーム番号 */
	Sint32				nSubmotion;		/* サブモーションの数 */
	NNS_SUBMOTION		*pSubmotion;	/* サブモーションリストポインタ */
	Float				FrameRate;		/* フレームレート（V2パラメータ） */
	Uint32				Reserved0;		/* 予約（V2パラメータ） */
	Uint32				Reserved1;		/* 予約（V2パラメータ） */
} NNS_MOTION;
/* fType に NND_MOTIONTYPE_VERSION2 のビットが立っていないときに */
/* FrameRate, Reserved0, Reserved1 へのアクセスは禁止            */


/*******************/
/* Submotion Types */
/*******************/

/* Key frame type */
#define	NND_SMOTTYPE_FRAME_FLOAT	((Uint32)1 << 0)	/* Floatキーフレーム番号 */
#define	NND_SMOTTYPE_FRAME_SINT16	((Uint32)1 << 1)	/* Sint16キーフレーム番号 */
#define	NND_SMOTTYPE_FRAME_MASK	\
	( NND_SMOTTYPE_FRAME_FLOAT | NND_SMOTTYPE_FRAME_SINT16 )

/* Angle type */
#define	NND_SMOTTYPE_ANGLE_RADIAN	((Uint32)1 << 2)	/* ラジアンで記述 (no support) */
#define	NND_SMOTTYPE_ANGLE_ANGLE32	((Uint32)1 << 3)	/* Angle32で記述 */
#define	NND_SMOTTYPE_ANGLE_ANGLE16	((Uint32)1 << 4)	/* Angle16で記述 */
#define	NND_SMOTTYPE_ANGLE_MASK	\
	( NND_SMOTTYPE_ANGLE_RADIAN | NND_SMOTTYPE_ANGLE_ANGLE32 |	\
	  NND_SMOTTYPE_ANGLE_ANGLE16 )

/* Unit submotion data type */
/* Common submotion type */
/* For Node, Light, Camera motion */
#define	NND_SMOTTYPE_TRANSLATION_X		((Uint32)1 << 8)
#define	NND_SMOTTYPE_TRANSLATION_Y		((Uint32)1 << 9)
#define	NND_SMOTTYPE_TRANSLATION_Z		((Uint32)1 << 10)
#define	NND_SMOTTYPE_ROTATION_X			((Uint32)1 << 11)
#define	NND_SMOTTYPE_ROTATION_Y			((Uint32)1 << 12)
#define	NND_SMOTTYPE_ROTATION_Z			((Uint32)1 << 13)
#define	NND_SMOTTYPE_QUATERNION			((Uint32)1 << 14)

/* For Node motion */
#define	NND_SMOTTYPE_SCALING_X			((Uint32)1 << 15)
#define	NND_SMOTTYPE_SCALING_Y			((Uint32)1 << 16)
#define	NND_SMOTTYPE_SCALING_Z			((Uint32)1 << 17)

/* For Node user data */
#define	NND_SMOTTYPE_USER_UINT32		((Uint32)1 << 18)
#define	NND_SMOTTYPE_USER_FLOAT			((Uint32)1 << 19)

/* For Node hide motion */
#define	NND_SMOTTYPE_NODEHIDE			((Uint32)1 << 20)

/* For Camera, Light motion */
#define	NND_SMOTTYPE_TARGET_X			((Uint32)1 << 18)
#define	NND_SMOTTYPE_TARGET_Y			((Uint32)1 << 19)
#define	NND_SMOTTYPE_TARGET_Z			((Uint32)1 << 20)

/* For only Morph motion */
#define	NND_SMOTTYPE_MORPH_WEIGHT		((Uint32)1 << 24)

/* For only Camera motion */
#define	NND_SMOTTYPE_ROLL				((Uint32)1 << 21)
#define	NND_SMOTTYPE_UPTARGET_X			((Uint32)1 << 22)
#define	NND_SMOTTYPE_UPTARGET_Y			((Uint32)1 << 23)
#define	NND_SMOTTYPE_UPTARGET_Z			((Uint32)1 << 24)
#define	NND_SMOTTYPE_UPVECTOR_X			((Uint32)1 << 25)
#define	NND_SMOTTYPE_UPVECTOR_Y			((Uint32)1 << 26)
#define	NND_SMOTTYPE_UPVECTOR_Z			((Uint32)1 << 27)
#define	NND_SMOTTYPE_FOVY				((Uint32)1 << 28)
#define	NND_SMOTTYPE_ZNEAR				((Uint32)1 << 29)
#define	NND_SMOTTYPE_ZFAR				((Uint32)1 << 30)
#define	NND_SMOTTYPE_ASPECT				((Uint32)1 << 31)

/* For only Material motion */
#define	NND_SMOTTYPE_HIDE				((Uint32)1 << 8)
#define	NND_SMOTTYPE_DIFFUSE_R			((Uint32)1 << 9)
#define	NND_SMOTTYPE_DIFFUSE_G			((Uint32)1 << 10)
#define	NND_SMOTTYPE_DIFFUSE_B			((Uint32)1 << 11)
#define	NND_SMOTTYPE_ALPHA				((Uint32)1 << 12)
#define	NND_SMOTTYPE_SPECULAR_R			((Uint32)1 << 13)
#define	NND_SMOTTYPE_SPECULAR_G			((Uint32)1 << 14)
#define	NND_SMOTTYPE_SPECULAR_B			((Uint32)1 << 15)
#define	NND_SMOTTYPE_SPECULAR_LEVEL		((Uint32)1 << 16)
#define	NND_SMOTTYPE_SPECULAR_GLOSS		((Uint32)1 << 17)
#define	NND_SMOTTYPE_AMBIENT_R			((Uint32)1 << 18)
#define	NND_SMOTTYPE_AMBIENT_G			((Uint32)1 << 19)
#define	NND_SMOTTYPE_AMBIENT_B			((Uint32)1 << 20)
#define	NND_SMOTTYPE_TEXTURE_INDEX		((Uint32)1 << 21)
#define	NND_SMOTTYPE_TEXTURE_BLEND		((Uint32)1 << 22)
#define	NND_SMOTTYPE_OFFSET_U			((Uint32)1 << 23)
#define	NND_SMOTTYPE_OFFSET_V			((Uint32)1 << 24)
#define	NND_SMOTTYPE_MATCLBK_USER		((Uint32)1 << 25)

/* For only Light motion */
#define	NND_SMOTTYPE_LIGHT_COLOR_R		((Uint32)1 << 21)
#define	NND_SMOTTYPE_LIGHT_COLOR_G		((Uint32)1 << 22)
#define	NND_SMOTTYPE_LIGHT_COLOR_B		((Uint32)1 << 23)
#define	NND_SMOTTYPE_LIGHT_ALPHA		((Uint32)1 << 24)	/* No support */
#define	NND_SMOTTYPE_LIGHT_INTENSITY	((Uint32)1 << 25)
#define	NND_SMOTTYPE_FALLOFF_START		((Uint32)1 << 26)
#define	NND_SMOTTYPE_FALLOFF_END		((Uint32)1 << 27)
#define	NND_SMOTTYPE_INNER_ANGLE		((Uint32)1 << 28)
#define	NND_SMOTTYPE_OUTER_ANGLE		((Uint32)1 << 29)
#define	NND_SMOTTYPE_INNER_RANGE		((Uint32)1 << 30)
#define	NND_SMOTTYPE_OUTER_RANGE		((Uint32)1 << 31)

/* Combined submotion type */
#define	NND_SMOTTYPE_TRANSLATION_XYZ	\
( NND_SMOTTYPE_TRANSLATION_X | NND_SMOTTYPE_TRANSLATION_Y |	\
	NND_SMOTTYPE_TRANSLATION_Z )
#define	NND_SMOTTYPE_ROTATION_XYZ	\
( NND_SMOTTYPE_ROTATION_X | NND_SMOTTYPE_ROTATION_Y | NND_SMOTTYPE_ROTATION_Z )
#define	NND_SMOTTYPE_SCALING_XYZ	\
( NND_SMOTTYPE_SCALING_X | NND_SMOTTYPE_SCALING_Y | NND_SMOTTYPE_SCALING_Z )
#define	NND_SMOTTYPE_TARGET_XYZ	\
( NND_SMOTTYPE_TARGET_X | NND_SMOTTYPE_TARGET_Y | NND_SMOTTYPE_TARGET_Z )
#define	NND_SMOTTYPE_UPTARGET_XYZ	\
( NND_SMOTTYPE_UPTARGET_X | NND_SMOTTYPE_UPTARGET_Y | NND_SMOTTYPE_UPTARGET_Z )
#define	NND_SMOTTYPE_UPVECTOR_XYZ	\
( NND_SMOTTYPE_UPVECTOR_X | NND_SMOTTYPE_UPVECTOR_Y | NND_SMOTTYPE_UPVECTOR_Z )
#define	NND_SMOTTYPE_DIFFUSE_RGB	\
( NND_SMOTTYPE_DIFFUSE_R | NND_SMOTTYPE_DIFFUSE_G | NND_SMOTTYPE_DIFFUSE_B )
#define	NND_SMOTTYPE_SPECULAR_RGB	\
( NND_SMOTTYPE_SPECULAR_R | NND_SMOTTYPE_SPECULAR_G | NND_SMOTTYPE_SPECULAR_B )
#define	NND_SMOTTYPE_AMBIENT_RGB	\
( NND_SMOTTYPE_AMBIENT_R | NND_SMOTTYPE_AMBIENT_G | NND_SMOTTYPE_AMBIENT_B )
#define	NND_SMOTTYPE_OFFSET_UV	\
( NND_SMOTTYPE_OFFSET_U | NND_SMOTTYPE_OFFSET_V )
#define	NND_SMOTTYPE_LIGHT_COLOR_RGB	\
( NND_SMOTTYPE_LIGHT_COLOR_R | NND_SMOTTYPE_LIGHT_COLOR_G | NND_SMOTTYPE_LIGHT_COLOR_B )

#define NND_SMOTTYPE_TRANSLATION_MASK		NND_SMOTTYPE_TRANSLATION_XYZ
#define NND_SMOTTYPE_ROTATION_MASK			(NND_SMOTTYPE_ROTATION_XYZ | NND_SMOTTYPE_QUATERNION)
#define NND_SMOTTYPE_SCALING_MASK			NND_SMOTTYPE_SCALING_XYZ
#define NND_SMOTTYPE_TARGET_MASK			NND_SMOTTYPE_TARGET_XYZ
#define NND_SMOTTYPE_UPTARGET_MASK			NND_SMOTTYPE_UPTARGET_XYZ
#define NND_SMOTTYPE_UPVECTOR_MASK			NND_SMOTTYPE_UPVECTOR_XYZ
#define NND_SMOTTYPE_DIFFUSE_MASK			NND_SMOTTYPE_DIFFUSE_RGB
#define NND_SMOTTYPE_SPECULAR_MASK			NND_SMOTTYPE_SPECULAR_RGB
#define NND_SMOTTYPE_AMBIENT_MASK			NND_SMOTTYPE_AMBIENT_RGB
#define NND_SMOTTYPE_OFFSET_MASK			NND_SMOTTYPE_OFFSET_UV
#define NND_SMOTTYPE_USER_MASK				(NND_SMOTTYPE_USER_UINT32 | NND_SMOTTYPE_USER_FLOAT)
#define NND_SMOTTYPE_TEXTURE_MASK			(NND_SMOTTYPE_TEXTURE_INDEX | NND_SMOTTYPE_TEXTURE_BLEND | NND_SMOTTYPE_OFFSET_UV)
#define	NND_SMOTTYPE_LIGHT_COLOR_MASK		NND_SMOTTYPE_LIGHT_COLOR_RGB

#define NND_SMOTTYPE_VALUETYPE_MASK		((Uint32)0xffffff00)

/*******************/
/* Submotion Types */
/*******************/

/* Submotion interpolate type for scalar */
#define	NND_SMOTIPTYPE_SPLINE		( (Uint32)1 << 0 )	/* ３次スプライン補間 */
#define	NND_SMOTIPTYPE_LINEAR		( (Uint32)1 << 1 )	/* 線形補間 */
#define	NND_SMOTIPTYPE_CONSTANT		( (Uint32)1 << 2 )	/* 定数補間 */
#define	NND_SMOTIPTYPE_BEZIER		( (Uint32)1 << 4 )	/* ベジェスプライン補間 */
#define	NND_SMOTIPTYPE_SI_SPLINE	( (Uint32)1 << 5 )	/* SIスプライン補間 */
#define	NND_SMOTIPTYPE_TRIGGER		( (Uint32)1 << 6 )	/* トリガ */

/* Submotion interpolate type for 3D-angle */
#define	NND_SMOTIPTYPE_QUAT_LERP	( (Uint32)1 << 9 )	/* クォータニオン線形補間 */
#define	NND_SMOTIPTYPE_QUAT_SLERP	( (Uint32)1 << 10 )	/* クォータニオン球面線形補間 */
#define	NND_SMOTIPTYPE_QUAT_SQUAD	( (Uint32)1 << 11 )	/* クォータニオン球面３次スプライン補間 */

#define	NND_SMOTIPTYPE_IP_MASK	\
	( NND_SMOTIPTYPE_SPLINE | NND_SMOTIPTYPE_LINEAR | NND_SMOTIPTYPE_CONSTANT |	\
	NND_SMOTIPTYPE_BEZIER | NND_SMOTIPTYPE_SI_SPLINE | NND_SMOTIPTYPE_TRIGGER | \
	NND_SMOTIPTYPE_QUAT_LERP | NND_SMOTIPTYPE_QUAT_SLERP | NND_SMOTIPTYPE_QUAT_SQUAD )

/* Submotion repeat type */
#define	NND_SMOTIPTYPE_NOREPEAT		( (Uint32)1 << 16 )	/* 範囲外はモーションしない */
#define	NND_SMOTIPTYPE_CONSTREPEAT	( (Uint32)1 << 17 )	/* 範囲外はコンスタント */
#define	NND_SMOTIPTYPE_REPEAT		( (Uint32)1 << 18 )	/* リピート */
#define	NND_SMOTIPTYPE_MIRROR		( (Uint32)1 << 19 )	/* ミラーリピート */
#define	NND_SMOTIPTYPE_OFFSET		( (Uint32)1 << 20 )	/* オフセットリピート No support */

#define	NND_SMOTIPTYPE_REPEAT_MASK	\
	( NND_SMOTIPTYPE_NOREPEAT | NND_SMOTIPTYPE_CONSTREPEAT |	\
	NND_SMOTIPTYPE_REPEAT | NND_SMOTIPTYPE_MIRROR | NND_SMOTIPTYPE_OFFSET )


/****************/
/* Motion Types */
/****************/

/* Motion category */
#define	NND_MOTIONTYPE_NODE			((Uint32)1 << 0)	/* ノードモーション */
#define	NND_MOTIONTYPE_CAMERA		((Uint32)1 << 1)	/* カメラモーション */
#define	NND_MOTIONTYPE_LIGHT		((Uint32)1 << 2)	/* ライトモーション */
#define	NND_MOTIONTYPE_MORPH		((Uint32)1 << 3)	/* モーフモーション */
#define	NND_MOTIONTYPE_MATERIAL		((Uint32)1 << 4)	/* マテリアルモーション */
#define	NND_MOTIONTYPE_CATEGORY_MASK	\
	( NND_MOTIONTYPE_NODE | NND_MOTIONTYPE_CAMERA | NND_MOTIONTYPE_LIGHT | \
	NND_MOTIONTYPE_MORPH | NND_MOTIONTYPE_MATERIAL )

/* Motion repeat type */
#define	NND_MOTIONTYPE_NOREPEAT		NND_SMOTIPTYPE_NOREPEAT		/* 範囲外はモーションしない */
#define	NND_MOTIONTYPE_CONSTREPEAT	NND_SMOTIPTYPE_CONSTREPEAT	/* 範囲外はコンスタント */
#define	NND_MOTIONTYPE_REPEAT		NND_SMOTIPTYPE_REPEAT		/* リピート */
#define	NND_MOTIONTYPE_MIRROR		NND_SMOTIPTYPE_MIRROR		/* ミラーリピート */
#define	NND_MOTIONTYPE_OFFSET		NND_SMOTIPTYPE_OFFSET		/* オフセットリピート No support */
#define	NND_MOTIONTYPE_TRIGGER		NND_SMOTIPTYPE_TRIGGER		/* トリガ */

/* Motion with framerate */
/* FrameRateメンバが追加されたフォーマット変更後のモーションであることを表す */
#define	NND_MOTIONTYPE_VERSION2		((Uint32)1 << 28)

#define	NND_MOTIONTYPE_REPEAT_MASK	\
	( NND_MOTIONTYPE_NOREPEAT | NND_MOTIONTYPE_CONSTREPEAT |	\
	NND_MOTIONTYPE_REPEAT | NND_MOTIONTYPE_MIRROR |	\
	NND_MOTIONTYPE_OFFSET | NND_MOTIONTYPE_TRIGGER )


/***************************/
/* Default Key data types */
/***************************/

/* For bezier handle */
typedef struct {
	NNS_VECTOR2D In;
	NNS_VECTOR2D Out;
} NNS_MOTION_BEZIER_HANDLE;

/* For SI-spline handle */
typedef struct {
	Float In;
	Float Out;
} NNS_MOTION_SI_SPLINE_HANDLE;

/* 1 float value key */
typedef struct {
	Float		Frame;
	Float		Value;
}	NNS_MOTION_KEY_FLOAT,
	NNS_MOTION_KEY_TRANSLATION_X,
	NNS_MOTION_KEY_TRANSLATION_Y,
	NNS_MOTION_KEY_TRANSLATION_Z,
	NNS_MOTION_KEY_SCALING_X,
	NNS_MOTION_KEY_SCALING_Y, 
	NNS_MOTION_KEY_SCALING_Z, 
	NNS_MOTION_KEY_USER_FLOAT, 
	NNS_MOTION_KEY_MORPH_WEIGHT,
	NNS_MOTION_KEY_TARGET_X,
	NNS_MOTION_KEY_TARGET_Y,
	NNS_MOTION_KEY_TARGET_Z,
	NNS_MOTION_KEY_UPTARGET_X,
	NNS_MOTION_KEY_UPTARGET_Y,
	NNS_MOTION_KEY_UPTARGET_Z,
	NNS_MOTION_KEY_UPVECTOR_X,
	NNS_MOTION_KEY_UPVECTOR_Y,
	NNS_MOTION_KEY_UPVECTOR_Z,
	NNS_MOTION_KEY_ZNEAR,
	NNS_MOTION_KEY_ZFAR,
	NNS_MOTION_KEY_ASPECT,
	NNS_MOTION_KEY_DIFFUSE_R,
	NNS_MOTION_KEY_DIFFUSE_G,
	NNS_MOTION_KEY_DIFFUSE_B,
	NNS_MOTION_KEY_ALPHA,
	NNS_MOTION_KEY_SPECULAR_R,
	NNS_MOTION_KEY_SPECULAR_G,
	NNS_MOTION_KEY_SPECULAR_B,
	NNS_MOTION_KEY_SPECULAR_LEVEL,
	NNS_MOTION_KEY_SPECULAR_GLOSS,
	NNS_MOTION_KEY_AMBIENT_R,
	NNS_MOTION_KEY_AMBIENT_G,
	NNS_MOTION_KEY_AMBIENT_B,
	NNS_MOTION_KEY_TEXTURE_BLEND,
	NNS_MOTION_KEY_OFFSET_U,
	NNS_MOTION_KEY_OFFSET_V,
	NNS_MOTION_KEY_LIGHT_COLOR_R,
	NNS_MOTION_KEY_LIGHT_COLOR_G,
	NNS_MOTION_KEY_LIGHT_COLOR_B,
	NNS_MOTION_KEY_LIGHT_INTENSITY,
	NNS_MOTION_KEY_FALLOFF_START,
	NNS_MOTION_KEY_FALLOFF_END,
	NNS_MOTION_KEY_INNER_RANGE,
	NNS_MOTION_KEY_OUTER_RANGE;

typedef struct {
	Float						Frame;
	Float						Value;
	NNS_MOTION_BEZIER_HANDLE	Bhandle;
}	NNS_MOTION_KEY_FLOAT_BEZIER,
	NNS_MOTION_KEY_TRANSLATION_X_BEZIER,
	NNS_MOTION_KEY_TRANSLATION_Y_BEZIER,
	NNS_MOTION_KEY_TRANSLATION_Z_BEZIER,
	NNS_MOTION_KEY_SCALING_X_BEZIER,
	NNS_MOTION_KEY_SCALING_Y_BEZIER, 
	NNS_MOTION_KEY_SCALING_Z_BEZIER,
	NNS_MOTION_KEY_USER_FLOAT_BEZIER, 
	NNS_MOTION_KEY_MORPH_WEIGHT_BEZIER,
	NNS_MOTION_KEY_TARGET_X_BEZIER,
	NNS_MOTION_KEY_TARGET_Y_BEZIER,
	NNS_MOTION_KEY_TARGET_Z_BEZIER,
	NNS_MOTION_KEY_UPTARGET_X_BEZIER,
	NNS_MOTION_KEY_UPTARGET_Y_BEZIER,
	NNS_MOTION_KEY_UPTARGET_Z_BEZIER,
	NNS_MOTION_KEY_UPVECTOR_X_BEZIER,
	NNS_MOTION_KEY_UPVECTOR_Y_BEZIER,
	NNS_MOTION_KEY_UPVECTOR_Z_BEZIER,
	NNS_MOTION_KEY_ZNEAR_BEZIER,
	NNS_MOTION_KEY_ZFAR_BEZIER,
	NNS_MOTION_KEY_ASPECT_BEZIER,
	NNS_MOTION_KEY_DIFFUSE_R_BEZIER,
	NNS_MOTION_KEY_DIFFUSE_G_BEZIER,
	NNS_MOTION_KEY_DIFFUSE_B_BEZIER,
	NNS_MOTION_KEY_ALPHA_BEZIER,
	NNS_MOTION_KEY_SPECULAR_R_BEZIER,
	NNS_MOTION_KEY_SPECULAR_G_BEZIER,
	NNS_MOTION_KEY_SPECULAR_B_BEZIER,
	NNS_MOTION_KEY_SPECULAR_LEVEL_BEZIER,
	NNS_MOTION_KEY_SPECULAR_GLOSS_BEZIER,
	NNS_MOTION_KEY_AMBIENT_R_BEZIER,
	NNS_MOTION_KEY_AMBIENT_G_BEZIER,
	NNS_MOTION_KEY_AMBIENT_B_BEZIER,
	NNS_MOTION_KEY_TEXTURE_BLEND_BEZIER,
	NNS_MOTION_KEY_OFFSET_U_BEZIER,
	NNS_MOTION_KEY_OFFSET_V_BEZIER,
	NNS_MOTION_KEY_LIGHT_COLOR_R_BEZIER,
	NNS_MOTION_KEY_LIGHT_COLOR_G_BEZIER,
	NNS_MOTION_KEY_LIGHT_COLOR_B_BEZIER,
	NNS_MOTION_KEY_LIGHT_INTENSITY_BEZIER,
	NNS_MOTION_KEY_FALLOFF_START_BEZIER,
	NNS_MOTION_KEY_FALLOFF_END_BEZIER,
	NNS_MOTION_KEY_INNER_RANGE_BEZIER,
	NNS_MOTION_KEY_OUTER_RANGE_BEZIER;

typedef struct {
	Float						Frame;
	Float						Value;
	NNS_MOTION_SI_SPLINE_HANDLE	Shandle;
}	NNS_MOTION_KEY_FLOAT_SI_SPLINE,
	NNS_MOTION_KEY_TRANSLATION_X_SI_SPLINE,
	NNS_MOTION_KEY_TRANSLATION_Y_SI_SPLINE,
	NNS_MOTION_KEY_TRANSLATION_Z_SI_SPLINE,
	NNS_MOTION_KEY_SCALING_X_SI_SPLINE,
	NNS_MOTION_KEY_SCALING_Y_SI_SPLINE, 
	NNS_MOTION_KEY_SCALING_Z_SI_SPLINE,
	NNS_MOTION_KEY_USER_FLOAT_SI_SPLINE, 
	NNS_MOTION_KEY_MORPH_WEIGHT_SI_SPLINE,
	NNS_MOTION_KEY_TARGET_X_SI_SPLINE,
	NNS_MOTION_KEY_TARGET_Y_SI_SPLINE,
	NNS_MOTION_KEY_TARGET_Z_SI_SPLINE,
	NNS_MOTION_KEY_UPTARGET_X_SI_SPLINE,
	NNS_MOTION_KEY_UPTARGET_Y_SI_SPLINE,
	NNS_MOTION_KEY_UPTARGET_Z_SI_SPLINE,
	NNS_MOTION_KEY_UPVECTOR_X_SI_SPLINE,
	NNS_MOTION_KEY_UPVECTOR_Y_SI_SPLINE,
	NNS_MOTION_KEY_UPVECTOR_Z_SI_SPLINE,
	NNS_MOTION_KEY_ZNEAR_SI_SPLINE,
	NNS_MOTION_KEY_ZFAR_SI_SPLINE,
	NNS_MOTION_KEY_ASPECT_SI_SPLINE,
	NNS_MOTION_KEY_DIFFUSE_R_SI_SPLINE,
	NNS_MOTION_KEY_DIFFUSE_G_SI_SPLINE,
	NNS_MOTION_KEY_DIFFUSE_B_SI_SPLINE,
	NNS_MOTION_KEY_ALPHA_SI_SPLINE,
	NNS_MOTION_KEY_SPECULAR_R_SI_SPLINE,
	NNS_MOTION_KEY_SPECULAR_G_SI_SPLINE,
	NNS_MOTION_KEY_SPECULAR_B_SI_SPLINE,
	NNS_MOTION_KEY_SPECULAR_LEVEL_SI_SPLINE,
	NNS_MOTION_KEY_SPECULAR_GLOSS_SI_SPLINE,
	NNS_MOTION_KEY_AMBIENT_R_SI_SPLINE,
	NNS_MOTION_KEY_AMBIENT_G_SI_SPLINE,
	NNS_MOTION_KEY_AMBIENT_B_SI_SPLINE,
	NNS_MOTION_KEY_TEXTURE_BLEND_SI_SPLINE,
	NNS_MOTION_KEY_OFFSET_U_SI_SPLINE,
	NNS_MOTION_KEY_OFFSET_V_SI_SPLINE,
	NNS_MOTION_KEY_LIGHT_COLOR_R_SI_SPLINE,
	NNS_MOTION_KEY_LIGHT_COLOR_G_SI_SPLINE,
	NNS_MOTION_KEY_LIGHT_COLOR_B_SI_SPLINE,
	NNS_MOTION_KEY_LIGHT_INTENSITY_SI_SPLINE,
	NNS_MOTION_KEY_FALLOFF_START_SI_SPLINE,
	NNS_MOTION_KEY_FALLOFF_END_SI_SPLINE,
	NNS_MOTION_KEY_INNER_RANGE_SI_SPLINE,
	NNS_MOTION_KEY_OUTER_RANGE_SI_SPLINE;

/* 2 float value key */
typedef struct {
	Float			Frame;
	NNS_TEXCOORD	Value;
}	NNS_MOTION_KEY_TEXCOORD,
	NNS_MOTION_KEY_OFFSET_UV;

/* 3 float value key */
typedef struct {
	Float		Frame;
	NNS_VECTOR	Value;
}	NNS_MOTION_KEY_FLOAT3,
	NNS_MOTION_KEY_TRANSLATION_XYZ,
	NNS_MOTION_KEY_TARGET_XYZ,
	NNS_MOTION_KEY_UPTARGET_XYZ,
	NNS_MOTION_KEY_UPVECTOR_XYZ,
	NNS_MOTION_KEY_SCALING_XYZ;

typedef struct {
	Float		Frame;
	NNS_RGB		Value;
}	NNS_MOTION_KEY_COLOR_RGB,
	NNS_MOTION_KEY_DIFFUSE_RGB,
	NNS_MOTION_KEY_SPECULAR_RGB,
	NNS_MOTION_KEY_AMBIENT_RGB,
	NNS_MOTION_KEY_LIGHT_COLOR_RGB;

/*  4 float value key */
typedef struct {
	Float			Frame;
	NNS_QUATERNION	Value;
}	NNS_MOTION_KEY_QUATERNION,
	NNS_MOTION_KEY_ROTATION_QUAT;

/* 32 bit angle value key */
typedef struct {
	Float		Frame;
	Angle32		Value;
}	NNS_MOTION_KEY_ANGLE32,
	NNS_MOTION_KEY_ROTATION_X,
	NNS_MOTION_KEY_ROTATION_Y,
	NNS_MOTION_KEY_ROTATION_Z,
	NNS_MOTION_KEY_ROLL,
	NNS_MOTION_KEY_FOVY,
	NNS_MOTION_KEY_INNER_ANGLE,
	NNS_MOTION_KEY_OUTER_ANGLE;

typedef struct {
	Float						Frame;
	Angle32						Value;
	NNS_MOTION_BEZIER_HANDLE	Bhandle;
}	NNS_MOTION_KEY_ANGLE32_BEZIER,
	NNS_MOTION_KEY_ROTATION_X_BEZIER,
	NNS_MOTION_KEY_ROTATION_Y_BEZIER,
	NNS_MOTION_KEY_ROTATION_Z_BEZIER,
	NNS_MOTION_KEY_ROLL_BEZIER,
	NNS_MOTION_KEY_FOVY_BEZIER,
	NNS_MOTION_KEY_INNER_ANGLE_BEZIER,
	NNS_MOTION_KEY_OUTER_ANGLE_BEZIER;


typedef struct {
	Float						Frame;
	Angle32						Value;
	NNS_MOTION_SI_SPLINE_HANDLE	Shandle;
}	NNS_MOTION_KEY_ANGLE32_SI_SPLINE,
	NNS_MOTION_KEY_ROTATION_X_SI_SPLINE,
	NNS_MOTION_KEY_ROTATION_Y_SI_SPLINE,
	NNS_MOTION_KEY_ROTATION_Z_SI_SPLINE,
	NNS_MOTION_KEY_ROLL_SI_SPLINE,
	NNS_MOTION_KEY_FOVY_SI_SPLINE,
	NNS_MOTION_KEY_INNER_ANGLE_SI_SPLINE,
	NNS_MOTION_KEY_OUTER_ANGLE_SI_SPLINE;

/* 32 bit integer value key */
typedef struct {
	Float		Frame;
	Sint32		Value;
}	NNS_MOTION_KEY_SINT32,
	NNS_MOTION_KEY_HIDE,
	NNS_MOTION_KEY_TEXTURE_INDEX,
	NNS_MOTION_KEY_NODEHIDE;

typedef struct {
	Float		Frame;
	Uint32		Value;
}	NNS_MOTION_KEY_UINT32,
	NNS_MOTION_KEY_MATCLBK_USER,
	NNS_MOTION_KEY_USER_UINT32;

/* 3 32 bit integer value key */
typedef struct {
	Float			Frame;
	NNS_ROTATE_A32	Value;
} 	NNS_MOTION_KEY_ROTATION_A32,
	NNS_MOTION_KEY_ROTATION_XYZ;

/* 16 bit angle value key */
typedef struct {
	Sint16		Frame;
	Angle16		Value;
}	NNS_MOTION_KEY_ANGLE16,
	NNS_MOTION_KEY_ROTATION_X_A16,
	NNS_MOTION_KEY_ROTATION_Y_A16,
	NNS_MOTION_KEY_ROTATION_Z_A16,
	NNS_MOTION_KEY_ROLL_A16,
	NNS_MOTION_KEY_FOVY_A16,
	NNS_MOTION_KEY_INNER_ANGLE_A16,
	NNS_MOTION_KEY_OUTER_ANGLE_A16;

typedef struct {
	Sint16		Frame;
	Angle16		Value;
	NNS_MOTION_SI_SPLINE_HANDLE	Shandle;
}	NNS_MOTION_KEY_ANGLE16_SI_SPLINE,
	NNS_MOTION_KEY_ROTATION_X_A16_SI_SPLINE,
	NNS_MOTION_KEY_ROTATION_Y_A16_SI_SPLINE,
	NNS_MOTION_KEY_ROTATION_Z_A16_SI_SPLINE,
	NNS_MOTION_KEY_ROLL_A16_SI_SPLINE,
	NNS_MOTION_KEY_FOVY_A16_SI_SPLINE,
	NNS_MOTION_KEY_INNER_ANGLE_A16_SI_SPLINE,
	NNS_MOTION_KEY_OUTER_ANGLE_A16_SI_SPLINE;

/* 3 16 bit integer value key */
typedef struct {
	Sint16				Frame;
	NNS_ROTATE_A16		Value;
}	NNS_MOTION_KEY_ROTATION_A16,
	NNS_MOTION_KEY_ROTATION_XYZ_A16;

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif	//__NNFMOTION_H__


/* End of file */
