/*---------------------------------------------------------------------------
 *
 * moveBG HEADER。
 *
 * $Id: m_collision_bg_move.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 * Program:Hiromichi Miyake
 *
 *---------------------------------------------------------------------------*/
#ifndef USE_MOVE_BG
#define USE_MOVE_BG
/*----------------------------------------------------------------------
 *
 * moveBGの制限。(この制限でできないものは各自で処理をしてください)
 *
 * 1.速度の速いものには対応していない。
 *
 * 2.予測のできる動きのものに。
 *    (BGとmoveBGでPLAYERを挟んでしまうことがないように)
 *
 * 3.moveBGどおしの衝突は見ていないので各ACTORで処理をすること。
 *
 *----------------------------------------------------------------------*/
/* moveBGの高さ初期化用。*/
#define NO_MOVE_BG		(- 500.0F)
/*----------------------------------------------------------------------*/
/* moveBGの最大登録数。							*/
/*(今は家具の設置最大数に揃えている。					*/
/* 増やす際はRAMの状況で勝手にどうぞ でも減らさないでね)		*/
/*									*/
/* moveBGをテーブルに登録できても処理の候補になっただけであり		*/
/* 衝突データ登録領域に入らないときがあるので注意。			*/
/*----------------------------------------------------------------------*/
#define mCoBG_MOVE_BG_MAX	(64)

/*----------------------------------------------------------------------
 *
 * moveBG登録用 形状クラス。
 *
 *----------------------------------------------------------------------*/
typedef struct __move_bg__size_info {
    float	rt_size_x;	/* 右方向幅	*/
    float	lt_size_x;	/* 左方向幅	*/
    float	up_size_z;	/* 上方向幅	*/
    float	dn_size_z;	/* 下方向幅	*/
} mCoBG_moveBgSize_c;


/*----------------------------------------------------------------------
 *
 * moveBGの種類(*はモデルの中心)
 *
 * MOVE_A   MOVE_B_0     MOVE_B_270 MOVE_C 
 * +---+    +---+---+    +---+     +---+---+  
 * | * |    | * |   |    | * |     | * |   |  
 * +---+    +---+---+    +---+     +---+---+  
 *                       |   |     |   |   |  
 *                       +---+     +---+---+  
 * MOVE_B_180   MOVE_B_90
 * +---+---+    +---+
 * |   | * |    |   | 
 * +---+---+    +---+
 *              | * |
 *              +---+
 *
 * これら以外を用いる場合は MOVE_FREE にして大きさを各自設定をする。
 *
 *----------------------------------------------------------------------*/
enum __move_bg_kind {
    mCoBG_MOVE_A,	/* 正方形小		*/
    mCoBG_MOVE_B_0,	/* 長方形Default	*/
    mCoBG_MOVE_B_180,	/* 長方形180度回転	*/
    mCoBG_MOVE_B_270,	/* 長方形270度回転	*/
    mCoBG_MOVE_B_90,	/* 長方形90度回転	*/
    mCoBG_MOVE_C,	/* 正方形大		*/

    mCoBG_MOVE_FREE,	/* 可変サイズ		*/
    
    mCoBG_MOVE_KIND
};

/*----------------------------------------------------------------------
 *
 * moveBGと接触しているACTOR情報の確保数。
 *
 * 現在は接触ACTORの名前と接触時の壁角度などの簡易情報
 * しかわからない。
 *(moveACTORが接触情報参照時接触しているACTORが解放されている
 *可能性があるため危険)
 *
 *----------------------------------------------------------------------*/
#define mCoBG_ACTORS (5)

/*----------------------------------------------------------------------
 *
 * SIDE接触情報クラス。
 *
 *----------------------------------------------------------------------*/
typedef struct __side_infomation__ {
    short		name;		/* 名前 	*/
    short		side_angle;	/* 角度 	*/
} mCoBG_sideInf_c;
typedef struct __movebg_actor_info_side__ {
    /* SIDE接触情報。*/
    mCoBG_sideInf_c	sideInf[mCoBG_ACTORS];
    /* 接触ACTOR数。*/
    int			count;
} mCoBG_sideContact_c;

/*----------------------------------------------------------------------
 *
 * ON接触情報クラス。
 *
 *----------------------------------------------------------------------*/
typedef struct __on_infomation__ {
    short		name;		/* 名前	 	*/
} mCoBG_onInf_c;
typedef struct __movebg_actor_info_above__ {
    /* ON接触情報。*/
    mCoBG_onInf_c	onInf[mCoBG_ACTORS];
    /* 接触ACTOR数。*/
    int			count;
} mCoBG_onContact_c;

/*----------------------------------------------------------------------
 *
 * SIDE ON接触情報クラス。
 *
 *----------------------------------------------------------------------*/
typedef struct __next_actor_infomation__ {
    mCoBG_sideContact_c		side;	/* SIDE接触情報	*/
    mCoBG_onContact_c		on;	/* ON接触ACTOR	*/
} mCoBG_moveBgCnt_c;

/*----------------------------------------------------------------------
 *
 * moveBG BGCheck登録クラス。
 *
 * (BGCheck側はmoveBGを以下のクラスで登録を受け付け
 *  各ACTORのBGCheckの際には登録データを元に衝突データ
 *  を作成しBGCheckを行う)
 *
 * 1．ACTORクラスに登録情報クラスを確保。
 * 2．ACTORクラスに接触情報クラスを確保。
 *    （接触情報を参照する必要があるならば）
 *
 * mCoBG_RegistMoveBg をCallすることにより登録クラス
 * 各形状データを登録
 *
 * (ACTORの座標,角度と対応させれば使い勝手が良いが
 *  ACTOR以外からも登録できる
 *  1つのACTORからmoveBGがいくつでも登録できる
 *  などの利点があるのでこのような形にした)
 *
 *----------------------------------------------------------------------*/
typedef struct __move_bg_regist_class__ {
    xyz_t		*wpos;		/* 位置				*/
    xyz_t		*old_wpos;	/* 前位置			*/
    short		*angle_y;	/* 角度				*/
    mCoBG_moveBgCnt_c	*moveBgCnt;	/* 接触ACTOR情報		*/
    mCoBG_moveBgSize_c	*mBgSize;	/* moveBG形状データ		*/
    xyz_t		*base_offset;	/* シェイプベースoffset		*/
    float		height;		/* シェイプの高さ		*/
    mCoBG_clInf_t 	attribute;	/* 地形的な属性			*/
    float		check_dist;	/* 有効にするACTORとの距離	*/
    float		*scale_rate;	/* ScaleRate			*/
} mCoBG_mBgRegist_c;
/* SIDE 接触数。*/
#define mCoBG_GET_SIDE_CNT(moveBgCnt)	\
(moveBgCnt.side.count)
/* SIDE ACTORネーム。*/
#define mCoBG_GET_SIDE_CNT_NAME(moveBgCnt,n) \
    (moveBgCnt.side.sideInf[n].name)
/* SIDE ACTOR接触角度。*/
#define mCOBG_GET_SIDE_CNT_ANGLE(moveBgCnt,n) \
    (moveBgCnt.side.sideInf[n].side_angle)
/* ON接触数。*/
#define mCoBG_GET_ON_CNT(moveBgCnt)	\
    (moveBgCnt.on.count)
/* ON ACTORネーム。*/
#define mCoBG_GET_ON_CNT_NAME(moveBgCnt,n) \
    (moveBgCnt.on.onInf[n].name)
    
/*----------------------------------------------------------------------
 *
 * BGCheck側で扱う登録パッククラス 。
 *(BGCheckではこのなかに入るぶんだけ扱う)
 *
 *----------------------------------------------------------------------*/
typedef struct __move_bg_data_pack {
    mCoBG_mBgRegist_c	*mBgRegist[mCoBG_MOVE_BG_MAX];
    int			mBg_count;
} mCoBG_mBgMgr_c;

/*----------------------------------------------------------------------
 *
 * 各ACTORで扱う接触ACTOR情報の初期化。
 *(毎FRAME moveBGACTOR動作処理をぬける際にCall)
 *
 *----------------------------------------------------------------------*/
extern  void
mCoBG_InitMoveBgContact(
   mCoBG_moveBgCnt_c	*moveBgCnt );

/*----------------------------------------------------------------------
 *
 * moveBG領域の初期化。
 *
 * SCENEが変わるごとにCall。
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_InitMoveBgData( void );

/*----------------------------------------------------------------------
 *
 * moveBG登録。
 * 
 * （moveBGをあつかいたいACTORのコンストラクトで
 *  返り値のＩＤは登録抹消の際に必要なので必ず確保する）
 *
 * 接触情報,特別処理に関しては必要がなければNULLをセット
 *
 * 登録領域	必需データである。
 *		
 * 位置		ポジションのポインタ（必需）
 * 前位置	前FRAMEのポジションのポインタ（必需）
 * Y角度	必需
 * 高さ情報	OBJの基準点からどれくらいの高さをもっているか
 *		登録（必需）
 * サイズ	形状タイプで mCoBG_MOVE_FREE にした時は必需
 * 接触情報	自分に衝突してきたACTORの名前が知りたかったら登録
 * 特別処理	シェイプの回転の中心を変えるときに必要
 *		基本的にはいらない。
 *		（使用例 : 家具の回転時の中心軸ずらし）
 * 形状タイプ	自由に設定するなら mCoBG_MOVE_FREE
 *
 * 属性		ACTORがのったときに返す属性値
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_RegistMoveBg(
    mCoBG_mBgRegist_c	*mBgRegist,	/* 登録領域		*/
    
    xyz_t		*wpos,		/* 位置			*/
    xyz_t		*old_wpos,	/* 前位置		*/
    short		*angle_y,	/* Y角度		*/
    float		height,		/* 高さ情報		*/
    mCoBG_moveBgSize_c	*mBgSize,	/* SizeRate		*/
    float		*scale_rate,	/* ScaleRate(必要なら)	*/
    mCoBG_moveBgCnt_c	*moveBgCnt,	/* 接触情報		*/
    xyz_t		*base_offset,	/* 特別処理		*/
    int			type,		/* 形状タイプ		*/
    mCoBG_clInf_t 	attribute,	/* 属性			*/

    float		check_dist);	/* Check距離		*/
/* ちょこっと簡易 moveBGマクロ */
#define mCoBG_RegistSimpleMoveBg(mBgRegist,\
				 pos,\
				 old_pos,\
				 angle_y,\
				 height,\
				 size,\
				 attr )\
mCoBG_RegistMoveBg(mBgRegist,\
		   pos,\
		   old_pos,\
		   angle_y,\
		   height,\
		   size,\
		   NULL,\
		   NULL,\
		   NULL,\
		   mCoBG_MOVE_FREE,\
		   attr )
/*----------------------------------------------------------------------
 *
 * moveBG登録Indexから登録領域のPointerを取得。
 *
 *----------------------------------------------------------------------*/
extern mCoBG_mBgRegist_c *
mCoBG_Idx2RegistPointer(
    int		move_bg_idx
    );

/*----------------------------------------------------------------------
 *
 * moveBGの登録抹消。
 *
 * (登録時に確保しておいた登録Indexをもちいて抹消する
 *  基本的にDestructで呼ぶ
 *  もし抹消を忘れると絵のない衝突がSCENEが変わるまで
 *  残り続けるので猛烈に注意する )
 *
 *----------------------------------------------------------------------*/
extern void
mCoBG_CrossOffMoveBg(
    int		idx
    );

/*----------------------------------------------------------------------
 *
 * moveBGの地面Checkを行う。
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_JudgeMoveBgGroundCheck(
    float	*point,
    float	*move,
    float	chest_dist
    );

/*----------------------------------------------------------------------
 *
 * moveBGの高さ探索関数。
 *
 * moveBGの上にいる......moveBG登録番号が返る
 * moveBGの上にいない....(-1)が返る
 *
 *----------------------------------------------------------------------*/
extern int
mCoBG_GetMoveBgHeight(
    float	*move_bg_height,
    xyz_t	*pos
    );


#endif
