================================================================

　ＰＳＹ　メタルギアソリッドシステム　モデルフォーマット

　Ver.2.00	2000.02.22	K.Takabe
　$Id: mdl_fmt2.txt,v 1.1.1.3 2002/11/19 11:41:43 Yoshizawa1 Exp $

================================================================


****************************************************************

　　　通常型モデルフォーマット

****************************************************************
--------------------------------
　　　　名称定義
--------------------------------

[オブジェクト]
　モデルをある程度の固まりでまとめたもの。基本的にはオブジェクトは
同一属性を持つものだけで構成されており、関節型モデルの場合には１つの
関節が１つのオブジェクトに対応するようにしなければならない。
モデルフォーマット上ではオブジェクト１つがDG_MDL構造体１つに
対応している。

[オブジェクトパケット]
　実機上で一回に処理するプリミティブパケットを便宜上オブジェクト
パケットとして定義する。オブジェクトパケットは同一のフラグ、同一の
テクスチャＩＤを持つ必要がある。
　１つのオブジェクトパケットに含まれる最大頂点数は６４頂点（マルチテクスチャ
対応モデルでは３２頂点）までなので、それ以上の頂点数は切り離して別の
オブジェクトパケットとして定義しなければならない。
モデルフォーマット上では１つのオブジェクトパケット１つがDG_MDLPACK
構造体１つに対応している。


--------------------------------
　　　　定義定数
--------------------------------

オブジェクト属性種類
enum {
	DG_TYPE_FT4			= 0x0000,	/* 未使用								*/
	DG_TYPE_GT4			= 0x0001,	/* 未使用								*/
	DG_TYPE_TRANS		= 0x0002,	/* 半透明化								*/
	DG_TYPE_NOSHADE		= 0x0004,	/* 光源なし（プリシェード時のみ有効）	*/
	DG_TYPE_AUTOSIDE	= 0x0200,	/* 自動片面（プリシェード時のみ有効）	*/
	DG_TYPE_SINGLESIDE	= 0x0400,	/* 片面（プリシェード時のみ有効）		*/
	DG_TYPE_OVERLAY0	= 0x0800,	/* テクスチャの重ねぬり					*/
	DG_TYPE_OVERLAY1	= 0x1000,	/* テクスチャの重ねぬり					*/
	DG_TYPE_OVERLAY2	= 0x2000,	/* テクスチャの重ねぬり					*/
	DG_TYPE_EXTEND		= 0x4000,	/* 拡張モデル（parentに付随する）		*/
} ;

データフォーマットＩＤ
enum {
	MGS_MODEL_NORM			= 13112177,	/* 通常モデル */
	MGS_MODEL_MULTITEX		= 11686819,	/* 通常マルチテクスチャモデル */
	MGS_MODEL_MULTIWEIGHT	= 13335939,	/* マルチウェイトエンベロープモデル */
} ;

新kms及びevmファイルフォーマット用パケットフラグ
enum {
	DG_PACKFLAG_ENVELOPE	= 0x0001,	/* エンベロープ処理付き	*/
	DG_PACKFLAG_CULLAUTO	= 0x0002,	/* プリシェード時に距離に応じてカリング処理	*/
	DG_PACKFLAG_CULLON		= 0x0004,	/* プリシェード時にカリング処理ＯＮ	*/
	/* 描画属性（マルチテクスチャ時のみ有効） */
	DG_PACKFLAG_TEX0	= 0x0008,	/* テクスチャ０使用 */
	DG_PACKFLAG_TEX1	= 0x0010,	/* テクスチャ１使用 */
	DG_PACKFLAG_TEX2	= 0x0020,	/* テクスチャ２使用 */
	DG_PACKFLAG_UV0		= 0x0040,	/* 通常ＵＶ０使用 */
	DG_PACKFLAG_UV1		= 0x0080,	/* 通常ＵＶ１使用 */
	/* 拡張計算フラグ（下のフラグは共に排他でなければならない）*/
	DG_PACKFLAG_UV2		= 0x0100,	/* 通常ＵＶ２使用 */
	DG_PACKFLAG_EMAP	= 0x0200,	/* 環境マッピング（ＵＶ２へ格納） */
	DG_PACKFLAG_SMAP	= 0x0400,	/* 環境マッピング影（ＵＶ２へ格納） */
	DG_PACKFLAG_BMAP	= 0x0800,	/* バンプマッピング（ＵＶ１をずらしたものをＵＶ２へ格納） */
} ;


--------------------------------
　　　モデルデータ構造
--------------------------------

＜データ格納順番＞
　[ファイルヘッダ]
　[オブジェクト情報データ]×総オブジェクト数
　[オブジェクトパケット情報データ]×総オブジェクトパケット数
　[頂点データ]
　[法線データ]
　[ＵＶ０データ]
　[ＵＶ１データ]
　[ＵＶ２データ]


＜各データの詳細＞
（メンバがポインタになっているものはファイル上ではファイル先頭からの
オフセット値が入っていなければならない）

[ファイルヘッダフォーマット]
typedef	struct	_DG_DEF{
	unsigned int	data_format ;	/* データフォーマットＩＤ		*/
	unsigned int	n_models ;		/* ユニット数					*/
	unsigned int	n_x_models ;	/* ユニット数（拡張ユニット込）	*/
	unsigned int	texture ;		/* テクスチャファイルＩＤ		*/
	int				pad[3] ;
	float			lx, ly, lz ;	/* 全体バウンディングボックス	*/
	float			ux, uy, uz ;	/*								*/
	float			tx, ty, tz ;	/* モデルの基準表示位置			*/
	DG_MDL		models[ NULL_ARRAY ] ;	/* ユニット配列				*/
} DG_DEF ;

[オブジェクト情報データフォーマット]
typedef	struct _DG_MDL	{
	unsigned int	type ;			/* 属性フラグ				*/
	unsigned int	n_packs ;		/* ポリゴン数				*/
	float			lx, ly, lz ;	/* バウンディングボックス	*/
	float			ux, uy, uz ;	/* バウンディングボックス	*/
	float			tx, ty, tz ;	/* ユニットの相対座標		*/
	int				parent ;		/* 親ユニット番号			*/
	DG_MDLPACK		*packs ;		/* オブジェクトパケット		*/
	int				pad0 ;			/* リザーブ		*/
	int				pad1 ;			/* リザーブ		*/
	int				pad2 ;			/* リザーブ		*/
} DG_MDL ;

[オブジェクトパケット情報データフォーマット]
typedef	struct _DG_MDLPACK	{
	unsigned int	flag ;			/* 属性フラグ						*/
	unsigned int	n_verts ;		/* ポリゴン数						*/
	unsigned int	tex_id[3] ;		/* テクスチャＩＤ（３セット）		*/
	short			*verts ;		/* 頂点データ						*/
	short			*norms ;		/* 法線データ						*/
	short			*uvs[3] ;		/* ＵＶデータ（３セット）			*/
	CVECTOR			*rgbs ;			/* プリシェードデータへ（未使用）	*/
	int				pad ;			/* リザーブ */
} DG_MDLPACK ;

＜パケット中の最大頂点数について＞
通常シングルテクスチャモデルでは最大６４頂点まで１パケットに含めることができる
が、マルチテクスチャモデルでは最大３２頂点までしか含めることができないので注意。


/* 頂点データフォーマット */
/*
	各種頂点データの先頭アドレスは１６バイト境界に揃っていなければならない
	（つまり頂点データなどは８バイトなので頂点数が奇数の場合にはダミーを入れる必要がある）

	頂点データ
	short	x ;	Ｘ座標（固定小数点(1.15.0)）
	short	y ;	Ｙ座標（固定小数点(1.15.0)）
	short	z ;	Ｚ座標（固定小数点(1.15.0)）
	short	w ; ウェイト値（固定小数点(1.3.12)）
				ウェイト値は1.0でその関節に100%、0.0で親オブジェクトに100%になる

	法線データ
	short	x ;	法線ベクトルＸ（固定小数点(1.3.12)）
	short	y ;	法線ベクトルＹ（固定小数点(1.3.12)）
	short	z ;	法線ベクトルＺ（固定小数点(1.3.12)）
	short	f ;	キックフラグ（0x0fff:描画キック、0x8fff:頂点キックのみ）
				0x8000 ... 描画キックを行なわない
				0x4000 ... ＶＵ内部で使用するため使用してはならない
				0x0fff ... カリングＯＮ時に両面表示（従来のデフォルト）
				0x0020 ... カリングＯＮ時に左回りをカリング（将来の拡張用）
				0x0000 ... カリングＯＮ時に右回りをカリング（将来の拡張用）

	ＵＶデータ
	short	u ;	Ｕ座標（固定小数点(1.3.12)）
	short	v ;	Ｖ座標（固定小数点(1.3.12)）


	＜カリングフラグについての補足＞（実際にはまだ未実装）
	キックフラグのカリング用フラグはカメラから見て右回りの時にクリップする
	ポリゴン（つまり左回りが表の場合）にはキックフラグの下位１２ビットを
	0x0fffではなく0x0000にし、逆に左回りの時にクリップするポリゴン（右回りが表の場合）
	には0x0020を設定する。両面ポリゴンであれば0x0fffのままにする。
	また、ＭＧＳ２では右手座標系が採用されているので注意すること。

	＜右手座標系＞
	  |+Y
	  |
	  |_____+X
	  /
	 /
	/+Z

*/


****************************************************************

　　　マルチウェイト対応ＤＭＡ転送モデルフォーマット

****************************************************************

/* モデルフォーマットヘッダ */
typedef struct _dg_mwdef {
	unsigned int	n_models ;		/* スケルトン数						*/
	unsigned int	n_x_models ;	/* スケルトン数（拡張ユニット込）	*/
	float			lx, ly, lz ;	/* 全体バウンディングボックス		*/
	float			ux, uy, uz ;	/*									*/
	int				type ;			/*									*/
	int				texture ;		/* 使用テクスチャグループＩＤ		*/
	int				n_packs ;		/* ポリゴンパケット数				*/
	EVM_PACK		*packet ;		/* ポリゴンパケット					*/
	EVM_SKEL		skeleton[ NULL_ARRAY ] ;
} EVM_DEF ;

/* モデルスケルトン情報 */
typedef struct _evm_skel {
	int				flag ;
	int				parent ;		/* 親スケルトン番号				*/
	float			tx,ty,tz ;		/* 親からのオフセット位置		*/
	float			rt_tx, rt_ty, rt_tz ;	/* ルートからのオフセット */
} EVM_SKEL ;

/* パケットデータ情報 */
typedef struct _evm_pack {
	unsigned int	flag ;			/* 属性フラグ				*/
	unsigned int	tex_id[3] ;		/* テクスチャＩＤ			*/
	unsigned int	n_verts ;		/* 頂点数（最大３２頂点）	*/
	unsigned int	n_mats ;		/* 使用マトリクス数			*/
	unsigned char	mat_id[8] ;		/* 使用マトリクス番号		*/
	void			*verts ;		/* 頂点データ				*/
	void			*norms ;		/* 法線データ				*/
	void			*uvs[3] ;		/* ＵＶデータ				*/
	void			*weight ;		/* ウェイトデータ			*/
	void			*rgbs ;			/* 頂点カラーデータ（現在未使用）*/
	int				pad1 ;			/* リザーブ領域				*/
} EVM_PACK ;



/* データの並び順について */
/*

	<ヘッダー>
	EVM_DEF * 1

	<スケルトン情報>
	EVM_SKEL * n_models

	<パケット情報>
	EVM_PACK * n_packs

	<頂点情報>
	[verts data 0]
	[verts data 1]
	[verts data 2]
	...
	[verts data n_packs-1]

	<法線情報>
	[norms data 0]
	......
	[norms data n_packs-1]

	<ＵＶ０情報>
	[uvs[0] data 0]
	......
	[uvs[0] data n_packs-1]

	<ＵＶ１情報>（場合によっては省略可）
	[uvs[1] data 0]
	......
	[uvs[1] data n_packs-1]

	<ＵＶ２情報>（場合によっては省略可）
	[uvs[2] data 0]
	......
	[uvs[2] data n_packs-1]

	<ウェイト値情報>
	[weight data 0]
	......
	[weight data n_packs-1]

	<EOF>
*/


/* 頂点データフォーマット */
/*
	各種頂点データの先頭アドレスは１６バイト境界に揃っていなければならない
	（つまり頂点データなどは８バイトなので頂点数が奇数の場合にはダミーを入れる必要がある）

	頂点データ
	short	x ;	Ｘ座標（固定小数点(1.15.0)）
	short	y ;	Ｙ座標（固定小数点(1.15.0)）
	short	z ;	Ｚ座標（固定小数点(1.15.0)）
	short	f ;	キックフラグ（0x0fff:描画キック、0x8fff:頂点キックのみ）
	又は
	short	x ;	Ｘ座標（固定小数点(1.11.4)）
	short	y ;	Ｙ座標（固定小数点(1.11.4)）
	short	z ;	Ｚ座標（固定小数点(1.11.4)）
	short	f ;	キックフラグ（0x0fff:描画キック、0x8fff:頂点キックのみ）

	法線データ
	short	x ;	法線ベクトルＸ（固定小数点(1.3.12)）
	short	y ;	法線ベクトルＹ（固定小数点(1.3.12)）
	short	z ;	法線ベクトルＺ（固定小数点(1.3.12)）
	short	pad ;	

	ＵＶデータ
	short	u ;	Ｕ座標（固定小数点(1.3.12)）
	short	v ;	Ｖ座標（固定小数点(1.3.12)）
	short	w ;	Ｗ座標（固定小数点(1.3.12)）但し精度が低いので1.0固定とする
	short	pad ;

	ウェイトデータ
	u_char	w0 ;	マトリクス０に対するウェイト値（固定小数点(0.1.7)）
	u_char	w1 ;	マトリクス１に対するウェイト値（固定小数点(0.1.7)）
	u_char	w2 ;	マトリクス２に対するウェイト値（固定小数点(0.1.7)）
	u_char	w3 ;	マトリクス３に対するウェイト値（固定小数点(0.1.7)）
	u_char	w4 ;	マトリクス４に対するウェイト値（固定小数点(0.1.7)）
	u_char	w5 ;	マトリクス５に対するウェイト値（固定小数点(0.1.7)）
	u_char	w6 ;	マトリクス６に対するウェイト値（固定小数点(0.1.7)）
	u_char	w7 ;	マトリクス７に対するウェイト値（固定小数点(0.1.7)）



*/
