/*
 *	clipanms.h
 *
 *	ステートレスアニメーションシーケンサ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Sat Mar 05 21:53:08 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	* Sun Mar 06 21:12:57 JST 2016 Naoyuki Sawa
 *	- AnmSeqNo_GetVal()を追加しました。
 *	* Mon Mar 07 21:56:21 JST 2016 Naoyuki Sawa
 *	- AnmSeq_GetVal()の中の無駄な判定を削除して、コードを削減しました。
 *	* Tue Mar 29 21:02:48 JST 2016 Naoyuki Sawa
 *	- AnmSeq_GetLen(),AnmSeqNo_GetLen()を追加しました。
 *	  アニメーションの全体尺を取得するための関数で、tEndの値を返すだけの動作です。(ループ/非ループに関係無くtEndの値を返します)
 *	  (非ループデータならば)AnmSeq_GetVal()の戻り値が-1になるまで呼び出して全体尺を取得する事も出来るのですが、より直接的に全体尺を取得したい場合が有ったので当関数を追加する事にしました。
 *	- アプリケーションが直接pAnmSeq->tEndを参照しても構わないのですが、'dAnmSeqC.exeが出力したバイナリ形式を扱うためのユーティリティ関数'ではアプリケーションがpAnmSeqを保持していません。
 *	  従ってAnmSeqNo_GetLen()を追加する必要が有り、AnmSeqNo_GetLen()との対称性のために、AnmSeq_GetLen()も追加する事にしました。
 */
#ifndef __CLIP_ANMS_H__
#define __CLIP_ANMS_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	定数、構造体
 ****************************************************************************/
typedef struct _ST_AnmKey {
	uint16_t	tKey;			//+ 0, 2  このキーの時刻						┐
	uint16_t	iVal;			//+ 2, 2  このキーの値							┴このレイアウトは固定です。TBL_Key[-1].iValがST_AnmSeq.iValを指す事を前提で処理している箇所が有るからです。詳細はAnmSeq_GetVal()を参照して下さい。
} ST_AnmKey;					//= 4
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct _ST_AnmSeq {
	uint16_t	tEnd;			//+ 0, 2  最終時刻+1
	uint16_t	tRep;			//+ 2, 2  ループ戻り時刻	(tRep≧tEnd)ならばループしない。
	uint16_t	nKey;			//+ 4, 2  キーフレーム数(0〜)
	uint16_t	iVal;			//+ 6, 2  初期値		最初のキーフレーム未満の時刻の値	┐
	ST_AnmKey	TBL_Key[0/*nKey*/];	//+ 8, 4N キーフレーム配列						┴このレイアウトは固定です。TBL_Key[-1].iValがST_AnmSeq.iValを指す事を前提で処理している箇所が有るからです。詳細はAnmSeq_GetVal()を参照して下さい。
} ST_AnmSeq;					//= 8+ 4N
/****************************************************************************
 *	アプリケーション用関数
 ****************************************************************************/
int AnmSeq_GetVal(const ST_AnmSeq* pAnmSeq, int tNow, int* tNowPtr/*NULL可*/);
int AnmSeq_GetLen(const ST_AnmSeq* pAnmSeq);
/****************************************************************************
 *	dAnmSeqC.exeが出力したバイナリ形式を扱うためのユーティリティ関数
 ****************************************************************************/
#define USE_ANMSEQ_BIN	//ユーティリティ関数が不要ならばこのシンボル定義をコメントアウトしてください。
#ifdef  USE_ANMSEQ_BIN
int AnmSeqNo_GetVal(const void* pAnmSeqBin, int iAnmSeqNo, int tNow, int* tNowPtr/*NULL可*/);
int AnmSeqNo_GetLen(const void* pAnmSeqBin, int iAnmSeqNo);
#endif//USE_ANMSEQ_BIN
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_ANMS_H__
