NewFunctions.jp 8.61 KB
-----------------------------------------------------------------------------
* F3DEX(.NoN), F3DLX(.NoN), F3DLX.Rej, F3DLP.Rej, L3DEX で追加, 変更された
  関数情報
							--- Release 1.21
-----------------------------------------------------------------------------

+ gSPVertex (Gfx *pkt, Vtx *v, u32 n, u32 v0)
  gsSPVertex(          Vtx *v, u32 n, u32 v0)

	頂点キャッシュのサイズの変更により, n および v0 の値の範囲が変更に
	なりました. ただし, 一度にロードできる頂点の数は 32 以下ですので,
	それ以上の頂点をロードするには 2 回以上に分ける必要があります. 

	                  頂点キャッシュ
	                     サイズ           n の範囲       v0 の範囲
	F3DEX/F3DEX.NoN        32               1-32            0-31
	F3DLX/F3DLX.NoN        32               1-32            0-31
	F3DLX.Rej              64               1-32(*)         0-63
	F3DLP.Rej              80               1-32(*)         0-79
	L3DEX                  32               1-32            0-31

	(*)33頂点以上ロードしたいときは gSPVertex を複数回使用すること.


+ gSP2Triangles (pkt,  v00, v01, v02, flag0,  v10, v11, v12, flag1)
  gsSP2Triangles(      v00, v01, v02, flag0,  v10, v11, v12, flag1)
  
	gSP2Triangles は, 

	  gSP1Triangle(pkt++, v00, v01, v02, flag0);
	  gSP1Triangle(pkt++, v10, v11, v12, flag1);

	と等価な処理を行います. すなわち 3 角形を 2 つ描画します. 
	2 つの g*SP1Triangle を 1 つの DL で処理するため, メモリ上における
	DL のサイズを小さくすることが出来ます. 

	また, F3DLP.Rej, F3DLX.Rej においては gSP2Triangles の使用を前提に
	高速化を実現しているため, これらを使用する場合, 速度の面でも有利と
	なります. 


+ gSP1Quadrangle (pkt,  v0, v1, v2, v3, flag)
  gsSP1Quadrangle(      v0, v1, v2, v3, flag)

	4 角形 {v0, v1, v2, v3} を描画します. flag は flat shading 用です.
	実際には指定された 4 角形を 3 角形 2 個に分割して描画します. 

	Release 0.95 以前のバージョンで実装していた 4 角形の動的な分割
        線の判定は無くなりました. 理由として, SP における動的分割の計
	算処理におけるオーバーヘッドと比較して, DP が得られるパフォー
	マンスの向上が期待した程大きくなかった点にあります.
	
	Release 0.96 以降のバージョンでは, g*SP1Quadrangle は 
	g*SP2Triangles でエミュレートされていますので, Release 0.95 以
	前のバージョン用のアプリケーションも再コンパイルすることで変更
	なしに動作します.


+ gSPSetGeometryMode(Gfx *gdl, unsigned int mode)
  gsSPSetGeometryMode(unsigned int mode)

	mode として G_CLIPPING が追加されました.
	このフラグは F3DLX および F3DLX.NoN でのみ有効です. その他のマイクロ
	コードではこのフラグは無視されます. 

	これがクリアされているとクリップ処理を行いません. これにより速度向上
	が期待できます. 
	
	具体的には, それ以降の gSPVertex においてクリップ判定に必要なデータを
	計算しなくなります. 
	また gSP*Triangle/gSP1Quadrangle などの命令においてはクリッピング処理
	を行わなくなります. 

	よって以下の DL ではクリップに必要なデータを取得できないので
	gsSP1Triangle の動作は保証できません. ご注意ください. 

		gsSPClearGeometryMode(G_CLIPPING),	// クリッピング OFF
		gsSPVertex(v, 3, 0),			// 3 頂点ロード
		gsSPSetGeometryMode(G_CLIPPING),	// クリッピング ON
		gsSP1Triangle(0,1,2,0),			// TRI 描画
	
	同様にクリッピング OFF 時にロードした頂点を gSPCullDisplayList で
	指定しても正常に動作しませんので, ご注意ください. 

	G_CLIPPING は初期状態では ON になっています.


+ gSPCullDisplaylist(Gfx *gdl, unsigned int v0, unsigned int vn)
  gsSPCullDisplaylist(unsigned int v0, unsigned int vn)

	頂点キャッシュの増加により, v0, vn の範囲が変更になりました. 
	具体的には gSPVertex における v0 の範囲と同じです. ただし, 
	v0 <= vn である必要があります. (man ページの記述は誤りです.)

	F3DEX(.NoN), F3DLX(.NoN), L3DEX では Fast3D と同じ動作をしますが, 
	F3DLX.Rej, F3DLP.Rej における本関数の振る舞いは Fast3D とは異なり
	ますので注意が必要です.


+ gSPClipRatio(Gfx *gdl, r)
  gsSPClipRatio(r)

	F3DEX(.NoN), F3DLX(.NoN) における gSPClipRatio() の動作は Fast3D
	と同じですが, F3DL*.Rej では Fast3D と異なり, リジェクトボックス
	の大きさの変更用として使用されています.
	F3DL*.Rej での初期値は FRUSTRATIO_2 となっています. 


+ gSPModiftVertex(Gfx *gdl, 
		  unsigned int vtx, unsigned int where, unsigned int val)
  gsSPModifyVertex(unsigned int vtx, unsigned int where, unsigned int val)

	頂点キャッシュの増加により, vtx の範囲が変更になりました. 
	具体的には gSPVertex における v0 の範囲と同じです.


+ gSPBranchLessZ(Gfx *gdl, Gfx *branchdl, unsigned int vtx,
		 float zval, float near, float far, int flag)
  gsSPBranchLessZ(Gfx *branchdl, unsigned int vtx,
		  float zval, float near, float far, int flag)

	vtx で指定した頂点の奥行き値が zval 以下なら branchdl で指し示され
	る DL へ BranchDisplayList を行ないます. zval を超えるなら何もしま
	せん. これによってモデルの LOD 処理が簡単に行なえます. 
	以下は 3 段階の LOD をもつモデルです.

	Gfx model_near[] = {		// 距離   32 以上  200 以下のモデル
		.....
		gsSPEndDisplayList(),
	};

	Gfx model_mid[] = {		// 距離  201 以上  800 以下のモデル
		.....
		gsSPEndDisplayList(),
	};

	Gfx model_far[] = {		// 距離  801 以上 1600 以下のモデル
		.....
		gsSPEndDisplayList(),
	};

	Gfx model[] = {
		gsSPVertex(testvtx, 1, 0),
		gsSPBranchLessZ(model_near, 0,  200, 32, 2000, G_BZ_PERSP),
		gsSPBranchLessZ(model_mid,  0,  800, 32, 2000, G_BZ_PERSP),
		gsSPBranchLessZ(model_far,  0, 1600, 32, 2000, G_BZ_PERSP),
		gsSPEndDisplayList(),	// 距離 1601 以上なら描画せず
	};

	このコマンドは以下の視野に関するパラメータを必要とします.

	near	Near plane の位置 (guPerspective/guOrtho で指定した値)
	far	Far  plane の位置 (guPerspective/guOrtho で指定した値)
	flag	透視射影のときは G_BZ_PERSP を正射影のときは G_BZ_ORTHO を
		指定する.
	
	このコマンドはビューポートの Z 方向のパラメータ vp.vscale[2] と
	vp.vtrans[2] の値が共に G_MAXZ/2 であることを想定しています. 
	このとき奥行き値は 0 以上 G_MAXZ 以下となります. 通常はアプリケー
	ション側でこの奥行き値の範囲を変更する必要はありません.
	ただし, どうしてもこの値を変更したい場合は, 代りに 
	g*SPBranchLessZrg をご使用ください.

	この GBI は F3DEX/LX/LX.Rej, LP.Rej/L3DEX の全てで共通に使用できます. 


+ gSPBranchLessZrg(Gfx *gdl, Gfx *branchdl, unsigned int vtx,
		   float zval, float near, float far, int flag,
		   int zmin, int zmax)
  gsSPBranchLessZrg(Gfx *branchdl, unsigned int vtx,
		    float zval, float near, float far, int flag,
		    int zmin, int zmax)

	通常のアプリケーションでは奥行き値として 0 以上 G_MAXZ 以下の範囲を
	使用しますが, 都合によってこの範囲を変更した場合は, 
	g[s]SPBranchLessZ の代りに g[s]SPBranchLessZrg を使用してください. 
	g[s]SPBranchLessZrg には, g[s]SPBranchLessZ のパラメータ near, far,
	flag に加えて以下のようなパラメータを与える必要があります. 

	zmin	奥行き値の最小値 (= vp.vtrans[2] - vp.vscale[2])
	zmax	奥行き値の最大値 (= vp.vtrans[2] + vp.vscale[2])
	
	この他のパラメータは同じです.
	この GBI は Release 1.02 以降でサポートされ, F3DEX/F3DLX/F3DLX.Rej
	F3DLP.Rej/L3DEX の全てで共通に使用できます. 


+ gSPLoadUcode(Gfx *gdl, u64 *uc_start, u64 *uc_dstart)
  gsSPLoadUcode(u64 *uc_start, u64 *uc_dstart)

	uc_start : マイクロコードのテキストセクションの先頭(物理アドレス)
	uc_dstart: マイクロコードのデータ  セクションの先頭(物理アドレス)

	指定されたマイクロコードをロードします. ただしロードが可能なのは
	本パッケージ内のマイクロコード(F3DEX/F3DLX/F3DLX_Rej/F3DLP_Rej/L3DEX)
	に限ります. Fast3D や Turbo3D をロードすることは出来ません.
	ただし, マイクロコードのロードはオーバーヘッドとなるため, パフォー
	マンスの取得のためにはむやみなロードは行なわない方が良いでしょう.
	現実的には F3DLX などのクリップ処理が可能なマイクロコードで地形を
	描き, F3DLX_Rej などの高速のマイクロコードで人物を描くというように
	その時々の描画処理に対応するマイクロコードに切り替えていくことにな
	ると思われます. また従来のようにラインを描くときの F3DEX-L3DEX の
	切り替えも CPU の介在なしに行なうことができます.

	* 注意 *
	この GBI でマイクロコードをロードしたときのグラフィックおよび RSP の
	内部状態は初期化されてしまいます. このためマイクロコードをロードした
	直後は RSP に関する設定を再度行なう必要があります. また DL のリンク
	情報も初期化されてしまうため, gSPDisplayList で呼び出した DL 内でこの
	命令を使用した場合, 呼び出し元の DL へ戻れなくなりますのでご注意くだ
	さい. この仕様は実装の都合上やむを得ないので, ご了承していただきます
	ようお願いいたします.

	このマイクロコードの g*SPLoadUcode 機能を使用可能にするには, 以下のよ
	うに OSTask 構造体のメンバーである flag に OS_TASK_LOADABLE フラグを
	セットする必要があります.

	OSTask *tp;
	tp->t.flag = OS_TASK_LOADABLE | OS_TASK_DP_WAIT;

	このフラグ処理を有効にするために, N64 開発環境 2.0h 以降が必要です.


+ gSPLoadUcodeL(Gfx *gdl, ucode_name)
  gsSPLoadUcodeL(ucode_name)

	g*SPLoadUcode の扱いを簡単にしたものです. 次の (a) (b) は等価です.

	(a) gsSPLoadUcode(OS_K0_TO_PHYSICAL(&gspF3DEX_fifoTextStart),
			  OS_K0_TO_PHYSICAL(&gspF3DEX_fifoDataStart))
	(b) gsSPLoadUcodeL(gspF3DEX_fifo)

									以上