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

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

　Ver.0.10	1999.7.16	K.Takabe
　$Id: tex_fmt.txt,v 1.1.1.3 2002/11/19 11:41:44 Yoshizawa1 Exp $

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

　現在のこのテクスチャフォーマットは暫定版であり、今後
テクスチャ入れ替えや追加機能によって大幅に変更が加えられる可能
性があるので注意すること。

＜概要＞
　現在、テクスチャはカラーモード毎に、１つの大きなテクスチャ内に個々の
テクスチャを配置したＣＭ２ファイルと、複数のＣＭ２ファイルをＰＳ２
ＶＲＡＭイメージに変換したＴＲＩファイルの２段階の変換を経由して
システム対応データになる。
　ＣＭ２ファイル自体は単一の無圧縮のテクスチャデータであり、そのテクスチャを
構成するテクスチャの配置情報及びパレット情報が付加された形式になっている。
　ＴＲＩファイルは複数のＣＭ２テクスチャをＶＲＡＭに３２ビットカラーとして
一度に転送できる形式になっており、同時に各テクスチャのＰＳ２専用パラメータ
等もも記述される。
　実機に読み込まれたＴＲＩデータはＴＲＩ一つに対して一つのＤＭＡパケットが
生成され、テクスチャ入れ替え単位の基準になる。


＜ＣＭ２ファイルフォーマット＞

typedef struct _tex_data{
	unsigned short	strcode ;			/* テクスチャＩＤ（旧コード） */
	unsigned short	n_colors ;			/* 使用パレット数 */
	unsigned short	width ;				/* テクスチャ幅（ピクセル数） */
	unsigned short	height ;			/* テクスチャ高さ（ピクセル数） */
	unsigned short	pix_x, pix_y ;		/* 配置オフセット */
	unsigned short	clut_x, clut_y ;	/* clut_x:テクスチャ番号 clut_y:0 */
	long32		clut_addr ;				/* clutアドレスオフセット */
} TexData ;

typedef struct _cm2_fileheader{
	long32		magic ;					/* マジックナンバー */
	long32		width, height ;			/* テクスチャ幅、高さ */
	long32		dx, dy ;				/* dx:0 dy:0 */
	long32		n_textures ;			/* 格納テクスチャ数 */
	long32		mode ;					/* モード */
	TexData		*texdatas ;				/* テクスチャ情報へのオフセット */
	void		*pixdata ;				/* テクセルデータへのオフセット */
} CM2_FILEHEADER ;

ＣＭ２自体のテクスチャサイズは最大で１０２４×１０２４までで、幅高さともに
２＾ｎでなければならない。ただし、横は６４以上高さは３２以上が望ましい。
また、未使用領域を最小限にするため、基本的に縦長（テクスチャ配置時に
縦方向が１０２４以内に納まらなかったらテクスチャの横幅を広げて
テクスチャ配置を試みる）にしなければならない。



＜ＴＲＩファイルフォーマット＞

typedef struct _tex_tag {
	unsigned long64		tex0_base ;	/* TEX0基本設定値 */
	unsigned long64		tex1 ;		/* TEX1設定値（現在未使用） */
	unsigned long64		tex2 ;		/* TEX2設定値（現在未使用） */
	unsigned long64		clamp ;		/* CLAMP設定値 */
	unsigned long64		alpha ;		/* ALPHA設定値 */
	float				u_offset ;	/* 使用テクスチャの開始Ｕ座標 */
	float				v_offset ;	/* 使用テクスチャの開始Ｖ座標 */
	float				u_scale ;	/* 使用テクスチャのスケール補正値 */
	float				v_scale ;	/* 使用テクスチャのスケール補正値 */
	unsigned long32		tex_id ;	/* テクスチャＩＤ */
	unsigned long32		pad ;		/* リザーブ */
} TEXTAG ;

typedef struct _tri_fileheader {
	unsigned long32		tex_offset ;	/* テクスチャデータ開始オフセット（ブロック単位）＝０ */
	unsigned long32		tex_size ;		/* テクスチャデータサイズ（ブロック単位） */
	unsigned long32		clut_offset ;	/* ＣＬＵＴデータ開始オフセット（ブロック単位） */
	unsigned long32		clut_size ;		/* ＣＬＵＴデータサイズ（ブロック単位） */
	unsigned long32		n_textures ;	/* テクスチャデータ数 */
	unsigned long32		compress_flag ;	/* 圧縮（現在未使用）フラグ＆半透明フラグ */
	unsigned long32		texel_addr ;	/* テクセルデータへのポインタ（現在未使用） */
	unsigned long32		clut_addr ;		/* ＣＬＵＴデータへのポインタ（現在未使用） */
} TRI_FILEHEADER ;

TRI_FILEHEADERの直後にテクスチャ数だけTEXTAGが並び、その直後から
ＶＲＡＭデータイメージになっている。
ＶＲＡＭデータイメージないにＣＬＵＴ情報なども入っているため、
１回のLoadImageにより全て転送することが出来る。また、LoadImageを行った
ベースアドレスをTEXTAGのtex0_baseに加算することにより実際の
TEX0に設定するべきパラメータとなる。

ＶＲＡＭイメージは３２ビットカラー、バッファ幅６４ピクセルの
状態でＬｏａｄＩｍａｇｅ転送することを想定したデータ形式に
変換されているので注意。また、複数のＣＭ２を１つにまとめた場合に
テクセル、テクセル・・・、ＣＬＵＴ、ＣＬＵＴ・・・のように順番に
並べ、テクセルの未使用領域があるときにはその未使用領域の
上に重ねるように詰めることによりデータ量を節約している。

現在の問題点としては、転送できる最大イメージサイズは横６４×縦４０９４と
なるため、最大テクスチャサイズは１Ｍバイトまでに制限されてしまうことである。


ＶＲＡＭイメージの詳しい形式についてはＳＣＥの方から
提供される予定になっている資料を参考のこと。



＜ＶＲＡＭイメージ構造についての補足＞

以下make_triのソースのコメントから抜粋

	ＰＳ２のＶＲＡＭデータはカラーモードによって特殊なアドレス変換が
	行われるが、現段階では仕様が公開されていない為、独自解析した結果を元に
	作成されている。

	＜用語定義＞

	ブロック：
	　ＶＲＡＭイメージ転送基準となるベースアドレスを先頭とした
	　連続した６４ワードの領域。ＶＲＡＭ上では連続した領域であるが
	　実機のデータ転送時に連続してデータを転送することは出来ない。
	　（データ転送機構による分散書き込みの為）
	　各カラーモードにおける格納データフォーマットは
	　　３２ビットカラー＞８×８テクセル
	　　１６ビットカラー＞１６×８テクセル
	　　８ビットインデックス＞１６×１６テクセル
	　　４ビットインデックス＞３２×１６テクセル
	　となっている。

	ブロックセット（ＳＣＥの正式名称は「ページ」となっているもの）：
	　３２ブロックを一塊としたＶＲＡＭ記憶領域単位。各カラーモード間の
	　独立性が保証される最小単位の為、別モードのテクスチャ格納先頭ベース
	　アドレスを同一ブロックセット内に収めてはならない。
	　ブロックセット中の各ブロックの配置順番は
	　（３２ビット、８ビットインデックスモード時）
	　　00 01 04 05 16 17 20 21 
	　　02 03 06 07 18 19 22 23 
	　　08 09 12 13 24 25 28 29 
	　　10 11 14 15 26 27 30 31 
	　（１６ビットカラーモード、４ビットインデックスモード時）
	　　00 02 08 10 
	　　01 03 09 11 
	　　04 06 12 14 
	　　05 07 13 15 
	　　16 18 24 26 
	　　17 19 25 27 
	　　20 22 28 30 
	　　21 23 29 31
	　のようになっている。つまり１ブロックセット当たりのテクセルサイズは
	　　３２ビットカラー＞６４×３２テクセル
	　　１６ビットカラー＞６４×６４テクセル
	　　８ビットインデックス＞１２８×６４テクセル
	　　４ビットインデックス＞１２８×１２８テクセル

	ブロック座標：
	　各ブロックを敷き詰めた時の２次元座標位置

	ブロックアドレス：
	　ＶＲＡＭ上でのブロック格納位置＝ベースアドレス

	ブロックイメージ：
	　ブロック内のデータ格納イメージ。カラーモードによってデータの並びが異なる
	　為、転送時の指定カラーモードに合わせてイメージの変換を行う必要がある。

=======================================================================
４ビットブロックイメージデータ配列（Ｙ座標１６進－Ｘ座標１６進）
    <  28   24   20   16   12    8    4    0>
+00: 2-1C 0-18 2-14 0-10 2-0C 0-08 2-04 0-00  ; ３２×４テクセルが１６ワード内に右のように並ぶ
+01: 2-1D 0-19 2-15 0-11 2-0D 0-09 2-05 0-01
+02: 2-1E 0-1A 2-16 0-12 2-0E 0-0A 2-06 0-02
+03: 2-1F 0-1B 2-17 0-13 2-0F 0-0B 2-07 0-03
+04: 2-18 0-1C 2-10 0-14 2-08 0-0C 2-00 0-04
+05: 2-19 0-1D 2-11 0-15 2-09 0-0D 2-01 0-05
+06: 2-1A 0-1E 2-12 0-16 2-0A 0-0E 2-02 0-06
+07: 2-1B 0-1F 2-13 0-17 2-0B 0-0F 2-03 0-07

+08: 3-1C 1-18 3-14 1-10 3-0C 1-08 3-04 1-00
+09: 3-1D 1-19 3-15 1-11 3-0D 1-09 3-05 1-01
+0A: 3-1E 1-1A 3-16 1-12 3-0E 1-0A 3-06 1-02
+0B: 3-1F 1-1B 3-17 1-13 3-0F 1-0B 3-07 1-03
+0C: 3-18 1-1C 3-10 1-14 3-08 1-0C 3-00 1-04
+0D: 3-19 1-1D 3-11 1-15 3-09 1-0D 3-01 1-05
+0E: 3-1A 1-1E 3-12 1-16 3-0A 1-0E 3-02 1-06
+0F: 3-1B 1-1F 3-13 1-17 3-0B 1-0F 3-03 1-07

+10: 6-18 4-1C 6-10 4-14 6-08 4-0C 6-00 4-04  ; 次の３２×４テクセルは１６ワード内に右のように並ぶ
+01: 6-19 4-1D 6-11 4-15 6-09 4-0D 6-01 4-05
+02: 6-1A 4-1E 6-12 4-16 6-0A 4-0E 6-02 4-06
+03: 6-1B 4-1F 6-13 4-17 6-0B 4-0F 6-03 4-07
+04: 6-1C 4-18 2-14 4-10 6-0C 4-08 6-04 4-00
 .
 .
 .

以降３２×８テクセル単位で上記の３２ワードのパターンで配置される

=======================================================================
８ビットブロックイメージデータ配列（Ｙ座標１６進－Ｘ座標１６進）
    <  24   16    8    0>
+00: 2-0C 0-08 2-04 0-00  ; １６×４テクセルが１６ワード内に右のように並ぶ
+01: 2-0D 0-09 2-05 0-01
+02: 2-0E 0-0A 2-06 0-02
+03: 2-0F 0-0B 2-07 0-03
+04: 2-08 0-0C 2-00 0-04
+05: 2-09 0-0D 2-01 0-05
+06: 2-0A 0-0E 2-02 0-06
+07: 2-0B 0-0F 2-03 0-07

+08: 3-0C 1-08 3-04 1-00
+09: 3-0D 1-09 3-05 1-01
+0A: 3-0E 1-0A 3-06 1-02
+0B: 3-0F 1-0B 3-07 1-03
+0C: 3-08 1-0C 3-00 1-04
+0D: 3-09 1-0D 3-01 1-05
+0E: 3-0A 1-0E 3-02 1-06
+0F: 3-0B 1-0F 3-03 1-07

+00: 6-08 4-0C 6-00 4-04  ; 次の１６×４テクセルは１６ワード内に右のように並ぶ
+01: 6-09 4-0D 6-01 4-05
+02: 6-0A 4-0E 6-02 4-06
+03: 6-0B 4-0F 6-03 4-07
+04: 6-0C 4-00 6-04 4-00
 .
 .
 .

以降１６×８テクセル単位で上記の３２ワードのパターンで配置される

=======================================================================
１６ビットブロックイメージデータ配列（Ｙ座標１６進－Ｘ座標１６進）
    <  16    0>
+00: 0-08 0-00  ; １６×１テクセルが８ワード内に右のように並ぶ
+01: 0-09 0-01
+02: 0-0A 0-02
+03: 0-0B 0-03
+04: 0-0C 0-04
+05: 0-0D 0-05
+06: 0-0E 0-06
+07: 0-0F 0-07

+08: 1-08 1-00
 .
 .
 .

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

