NewFunctions.jp
8.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
* F3DEX(.NoN), F3DLX(.NoN), F3DLX.Rej, F3DLP.Rej, L3DEX で追加, 変更された
関数情報
+ 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 は Release 1.02 以降でサポートされ, 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)
および S2DEX スプライトマイクロコードに限ります.
ただし, S2DEX のロードは Version 1.22 あるいは開発環境 2.0H 以降
でのみ有効です.
Fast3D や Turbo3D, Sprite2D をロードすることは出来ません.
マイクロコードのロードはオーバーヘッドとなるため, パフォーマンス
の取得のためにはむやみなロードは行なわない方が良いでしょう.
現実的には F3DLX などのクリップ処理が可能なマイクロコードで地形を
描き, F3DLX_Rej などの高速のマイクロコードで人物を描くというように
その時々の描画処理に対応するマイクロコードに切り替えていくことにな
ると思われます.
また従来のようにラインを描くときの F3DEX-L3DEX の切り替えにも有効
でしょう.
* 注意 *
この 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;
このフラグ処理を有効にするために, OS にパッチをあてる必要があります.
パッチのあてかたについては README.jp の "OS のパッチ" の項を参照して
ください. パッチをあてた OS は. パッチ前のものの上位互換となっていま
す.
+ 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)
以上