＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝



　中間出力モデル「KM3」フォーマットについて



　Ver.1.00	1999.7.26	K.Takabe

　$Id: km3_fmt.txt,v 1.1.1.3 2002/11/19 11:41:42 Yoshizawa1 Exp $



＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝





＜.KMDからの変更点＞



・座標関連が全てfloat型になった。

・頂点＆法線のインデックスを１６ビットに拡張したため、最大頂点数は６万まで。

・頂点及び法線のvwにはシングルウェイトエンベロープ用の重みが入っている。

・テクスチャＩＤではなく、テクスチャ名の文字列とそれを差すオフセットの配列

　で指定するように変更。







＜オブジェクト中で使用する属性フラグ（今のところ半透明以外は使用していない）＞



	/*

		パーツ単位での属性フラグ

	*/

enum {

	DG_TYPE_FT4 = 0x0000,		/* フラット（禁止）		*/

	DG_TYPE_GT4 = 0x0001,		/* グーロー（必須）		*/

	DG_TYPE_TRANS = 0x0002,		/* 半透明化			*/

	DG_TYPE_NOSHADE = 0x0004,	/* 光源なし			*/

	DG_TYPE_RAISED = 0x0100,	/* 優先アップ			*/

	DG_TYPE_SUNKEN = 0x0200,	/* 優先ダウン			*/

	DG_TYPE_TWOSIDE = 0x0400,	/* 両面あり			*/

	DG_TYPE_TWOCLIP = 0x0800,	/* （予約）			*/

} ;







＜モデルデータ構造＞



モデルファイルは以下のような順番でデータが格納されている。



 [ファイルヘッダ]

 [オブジェクト情報データ]×総オブジェクト数

 [頂点データ]

 [法線データ]

 [ＵＶデータ]

 [テクスチャ名テーブル]

  .

  .

  .



＜各データセクションのフォーマットについて＞



[ファイルヘッダフォーマット]

	unsigned int	n_models ;			/* オブジェクト数 */

	unsigned int	n_x_models ;		/* オブジェクト数（拡張ユニット込） */

	float			lx, ly, lz ;		/* 全体バウンディングボックス（最小値） */

	float			ux, uy, uz ;		/* 全体バウンディングボックス（最大値） */





[オブジェクト情報データフォーマット]

	unsigned int	type ;			/* 属性フラグ */

	unsigned int	n_prims ;		/* ポリゴン数 */

	float			lx, ly, lz ;	/* バウンディングボックス（最小値） */

	float			ux, uy, uz ;	/* バウンディングボックス（最大値） */

	float			tx, ty, tz ;	/* ユニットの相対座標 */

	int				parent ;		/* 親ユニット番号 */

	int				extend ;		/* 拡張ユニット番号 */

	/*

		頂点データ

	*/

	unsigned int	n_verts ;		/* 頂点数 */

	unsigned int	verts ;			/* 頂点座標配列へのオフセット（n_verts） */

	unsigned int	vid ;			/* 頂点ＩＤ配列へのオフセット（n_prims * 4） */

	/*

		法線データ

	*/

	unsigned int	n_norms ;		/* 法線数 */

	unsigned int	norms ;			/* 法線方向配列へのオフセット（n_norms） */

	unsigned int	nid ;			/* 法線ＩＤ配列へのオフセット（n_prims * 4） */

	/*

		テクスチャデータ

	*/

	unsigned int	uvs ;			/* ＵＶ座標配列へのオフセット（n_prims * 4） */

	unsigned int	tex_name ;		/* テクスチャ名オフセット配列へのオフセット（n_prims） */

	/*

		ＲＧＢデータ（通常は NULL）

	*/

	unsinged int	rgbs ;			/* ＲＧＢ配列へのオフセット（n_prims * 4） */





[頂点座標配列フォーマット]

	float			vx ;			/* Ｘ座標 */

	float			vy ;			/* Ｙ座標 */

	float			vz ;			/* Ｚ座標 */

	float			vw ;			/* シングルウェイトエンベロープ用重み(0.0～1.0まで) */

									/* 通常は1.0、エンベロープで親モデルに100%付く時0.0になる */



[頂点ＩＤ配列フォーマット]

	unsigned short	index_num0 ;	/* 頂点のインデックスナンバー（最大65535まで） */	

	unsigned short	index_num1 ;	/* 時計回りの順番で格納される */	

	unsigned short	index_num2 ;	/* ３角形ポリゴンの時には３番目と４番目は同じ値になる */	

	unsigned short	index_num3 ;	/*  */	





[法線座標配列フォーマット]

	float			vx ;			/* Ｘ座標 */

	float			vy ;			/* Ｙ座標 */

	float			vz ;			/* Ｚ座標 */

	float			vw ;			/* シングルウェイトエンベロープ用重み(0.0～1.0まで) */

									/* 通常は1.0、エンベロープで親モデルに100%付く時0.0になる */

									/* （無理していれる必要もないかも・・・） */





[法線ＩＤ配列フォーマット]

	unsigned short	index_num0 ;	/* 頂点のインデックスナンバー（最大65535まで） */	

	unsigned short	index_num1 ;	/* 時計回りの順番で格納される */	

	unsigned short	index_num2 ;	/* ３角形ポリゴンの時には３番目と４番目は同じ値になる */	

	unsigned short	index_num3 ;	/*  */	





[ＵＶ座標配列フォーマット]

	float			u ;				/* テクスチャ座標Ｕ */

	float			v ;				/* テクスチャ座標Ｖ */





[テクスチャ名オフセット配列フォーマット]

	unsigned int	file_name ;		/* テクスチャ名へのオフセット値 */





[テクスチャ名フォーマット]

	char			filename[] ;	/* テクスチャ名のASCIIZ文字列（\0で終わる文字列） */



