niff2gfxコンバータ


  1. niff2gfxの使い方
  2. 特徴
    使い方
    オプション解説
    インダイレクトファイル仕様
  3. 出力仕様
  4. GBI出力仕様
    制限
    mat_type が MAT_TYPE_NIFF の時のCC設定の仕様
  5. 現在わかっているバグ、または制限
  6. 変更履歴

1.niff2gfxの使い方

特徴:

使い方:

コマンドラインから、niff2gfx -h と実行すると、次のように表示されます。
NIFF to N64 GBI format convertor. version 1.3.6
supported format revisions: NIFF 1.0
usage: niff2gfx [option] infile outfile
  infile  ... NIFF format file.
  outfile ... N64 Displaylist C source file.
option:
  -q               quiet mode.
  -verbose         verbose mode.
  -header fname, -d fname
                   set output header filename.
  -label str       set label string.(label string = str)
  -scale fval      set convert scale.(scale = (float)fval)
  -niffinfo fname  NIFF information onto file fname.
  -nocomdef        common define,typedef block no output.
  -regmask val     prevent RDP register assignment.
  -vtxshare val    vertex share on set minimum match length.
  -vtxcache val    vertex cache size(default 32).
  -vtxload val     vertex cache load limit(default 32).
  -strictflat      flat normal output to 3 vertices at all times.
  -noalignpad      prevent alignment of 8-byte order no padding.
  -outobj name     output object by name.(default: all objects)
  -outmask val     prevent output dataclass assignment.
  -nogeomclr       geometry mode no clear.
  -preview val     preview type value.(default: 0x1c)
  -binary, -b      output gfx in binary file.
  -rotorder val    default rotation order.(default: 0x010203)
  -vtxseg val      Vtx segment number.(default: 5)
  -imgseg val      image data segment number.(default: 6)
  -tlutseg val     TLUT data segment number.(default: 7)
  -nomodify        disable modify vertex.
  -strictcidx      CIDX pixel/bits follow 'tex_type'.
  -noreduct        CIDX no color reduction.
  -nullanim        output null animation data.
  -?, -h           help
  @fname           indirect option file.

オプション解説:

-header fname    set output header filename.

#define, typedef などの定義部分を、別なヘッダファイルとして出力するスイッチです。 -header に続いて、ヘッダ部分を出力するファイル名を指定してください。
-label str       set label string.(label string = str)

コンバータは入力として与えられたファイルに含まれるすべてのオブジェクトを出力します。 これらはリスト化されテーブルとして出力され、実機側へのインターフェイスとなります。 また、同時に指定されたスケール値、オブジェクト総数などのデファインマクロ名にも使われます。 そのベースのラベル名を与えます。
-scale fval      set convert scale.(svale = (float)fval)

コンバート時のスケール値を指定します。


 N64では頂点値は符合付き16ビット整数として、Vtx テーブルに 記述されるため、元になるモデルデータによっては、数値の丸めによって 元の形状が壊されてしまう場合があります。そのとき指定してください。 デフォルトでは20倍に設定されています。

-niffinfo fname NIFF infomation on to file fname.

NIFFファイルを読み込んだ時のインフォメーション情報を 出力します。ファイル名として、ハイフン('-')を指定すると 標準出力へ書き出します。
-nocomdef        common define,typedef block no output.

コンバーターは数々のヘッダ情報を、出力ファイルの先頭(もしくは、-header オプションによって指定された出力ヘッダファイル)に出力しますが、これらのうち、モデルデータに関わらず共通の部分の出力を抑制します。


 複数のコンバートファイルを1つのコンパイル環境などで利用する場合などに便利です。

-regmask val     prevent RDP register assignment.

出力するディスプレイリストにおいて、RDPのレジスタ設定の出力を 抑制します。パラメータのvalはビットアサインされた6ビットの 整数を取り込みます。各ビットは次のような機能があります。

 

 

bit0 ... CycleMode設定を抑制します。
bit1 ... RenderMode設定を抑制します。
bit2 ... ColorCombinerMode設定を抑制します。
bit3 ... Primitive color register への設定を抑制します。
bit4 ... Environment color register への設定を抑制します。
bit5 ... オブジェクトの先頭に来るレジスタ設定を抑制します。
-vtxshare val    vertex shar on set minimum match length.

頂点バッファの最低使い回し数を指定します。


 niff2gfx では、コンバート時、RCPでの頂点計算のパフォーマンスを向上させるため、出来るだけ頂点バッファを連続して転送させるようにします。 そのため、頂点テーブルには、同じ頂点情報が複数出力されます。 そのとき、既に出力した頂点バッファを見て、同じ連続する部分を使い回す評価を行うようにします。

 たとえば、これから10頂点を頂点テーブルとして出力しようとする場合、 通常このまま10個のVtx を出力しますが、-vtxshare 5 としておくと、 過去に遡ってこの10頂点のうち、5頂点まで連続している部分があれば、 過去の頂点バッファを利用して、頂点の転送命令(gsSPVertex)を発行します。 このとき、頂点の転送命令が2つに増えていることにご注意下さい。

-vtxcache val    vertex cache size(default 32).

マイクロコードの頂点キャッシュを変更します。


 gspF3DEX では頂点キャッシュが32個ですが、gspF3DLX.Rej では64、 gspF3DLP では80個まで、頂点キャッシュが増えます。それらのマイクロ コードを利用する場合、このオプションで頂点キャッシュを増やして コンバートして下さい。デフォルトでは32になっています。

-vtxload val     set vertex cache load limit(default 32).

gsSPVertex で一度に転送できる頂点数を指定します。


-strictflat      flat normal output to 3 vertices at all times.

通常コンバータは、面法線を持った頂点を一つ出力し、他の2頂点に 関しては、頂点毎の法線をそのまま出力します。


 マイクロコードの仕様では、フラットシェーディング時、3頂点のうち、 法線を表す頂点は1つでいいのですが、反射マッピングなどのST値 自動生成は、3頂点それぞれ別個におこなわれます。

 そのため、フラットシェードで反射マッピングを行う場合、法線を 厳密に3頂点に設定する必要があります。このオプションは これらの設定を有効にします。

-noalignpad      prevent alignment of 8-byte order no padding.

通常コンバータは、データを出力する際64ビットアライメントを維持 するため、u64 サイズのダミーワードを挿入します。 このオプションはこのダミーワードの出力を抑制します。
-outobj name     output object by name.(default: all objects)

特定のオブジェクトのみの出力を得たい場合、得たいオブジェクト名 を指定することで、特定のオブジェクトのみを出力対象に出来ます。 また、このオプションは、複数指定出来ます。
-outmask val     prevent output dataclass assignment.

出力するデータの種類を限定します。このスイッチのパラメータ valも ビットアサインされた8ビットの整数を取り込みます。各ビットは 次のようにマッピングされています
bit0(0x001) ... ヘッダ
bit1(0x002) ... TLUT
bit2(0x004) ... ビットマップパターン
bit3(0x008) ... デフォーム関係データ
bit4(0x010) ... シェープ
bit5(0x020) ... 頂点リスト(Vtx 構造体配列)
bit6(0x040) ... ディスプレイリスト(Gfx 構造体配列)
bit7(0x080) ... オブジェクト構造体
bit8(0x100) ... アニメーション構造体
bit9(0x200) ... シーン構造体
各ビットが1の状態の時、そのデータクラスは出力が「抑制」されます。 また、bit4 が1の場合、bit5,6は、常に1扱いとなります。
-nogeomclr       geometry mode no clear.

コンバータは、Shape 単位にGfx を作りますが、デフォルトでは、それらの 先頭で、必ず、gSPClearGeomMode(-1) とし、ジオメトリーモードを 初期化しています。この初期化コードの出力を抑制します。
-binary, -b      output gfx in binary file.

コンバータはデフォルトで、outfile で指定されたファイルには、 C のソースファイルを出力しますが、このオプションを指定すると、 クイックプレビュー用のバイナリファイルを出力します。
-preview val     preview type value.(default: 0)

これは、プレビューワーでのビュータイプを変更するために 使用していましたが、1.3.0以降ではプレビューア側でこの値を参照しな くなったので現在は意味がありません。
-rotorder val    default rotation order.(default: 0x010203)

NIFFでは、アニメーションリンクがない場合、アニメーションの オーダーが決定されません。そのため、オブジェクトごとに ローテーションオーダーが変化してしまうことがあり、アプリケーション プログラミングの際の大きな制限になってしまいます。 このオプションでは、それらアニメーションを保持しないオブジェクトの ローテーションオーダーを設定します。
-vtxseg val      Vtx segment number.(default: 5)

出力される Gfx で参照する頂点バッファのセグメント番号を指定します。 デフォルトでは、5 になっています。
-imgseg val      image data segment number.(default: 6)

出力される Gfx で参照するテクスチャイメージのセグメント番号を指定 します。デフォルトでは、6 になっています。
  -tlutseg val     TLUT data segment number.(default: 7)

出力される Gfx で参照するテクスチャLUTのセグメント番号を指定 します。 デフォルトでは、7 になっています。
-nomodify        disable modify vertex.

gsSPModifyVertexによる頂点バッファの再利用を阻止します。 デフォームを有効にする場合必ず指定する必要があります。
-strictcidx      CIDX pixel/bits follow 'tex_type'.

コンバート時、8ビットカラーインデックステクスチャとして指定された イメージが16色以内である場合、通常4ビットテクスチャとして最適化を はかるのですが、このオプションを指定することで、最適化を阻止し、 NIFFで指定した通りのビット幅でテクスチャパターンを出力します。
-noreduct        CIDX no color reduction.

コンバート時、8ビットカラーインデックステクスチャとして指定された イメージが256色以上である場合と4ビットカラーインデックステクスチャ として指定されたイメージが16色以上である場合はカラーリダクションを 行いますが,このオプションを指定するとリダクションを行いません。

-nullanim        output null animation data.

オブジェクトが有効なアニメーションデータを持たないときに、Animation List にNULLを出力し、オブジェクトからはそのNULLを参照することでアニメー ションへのリンクを作成します。 別のファイルなどからアニメーションデータを持ってくる場合に利用すること ができますが、nd は Animation List のNULLをサポートしていないので、nd からはそのまま使用することはできません。
@fname           indirect option file.

fnameをインダイレクトファイル名として受けとり、コマンドライン パラメータが記述されているものとして解釈します。 インダイレクトファイルの詳しい仕様は下記のインダイレクトファイル仕様 を参照して下さい。
-?, -h          help

コマンドラインの指定とオプションの簡単な説明を出力します。

インダイレクトファイル仕様

(例1)
command line:
  % niff2gfx @ind cube.niff mdl_a.c

"ind" file:
  -header a.h -strictflat

converter parsing...:
  % niff2gfx -header a.h -strictflat cube.niff mdl_a.c

(例2)
command line:
  % niff2gfx @ind

"ind" file:
  # option
  -header model.h
  -regmask 0x5          # no CycleMode & CC mode
  # input file
  cube.niff
  # output file
  model.c

converter parsing...:
  % niff2gfx -header model.h -regmask 0x5 cube.niff model.c

(例3)
command line:
  % niff2gfx @opt @file

"opt" file:
  # option
  -header model.h
  -regmask 0x5          # no CycleMode & CC mode

"file" file:
  cube.niff model.c

converter parsing...:
  (例2)と同じ


2.出力仕様

GBI出力仕様:

制限:


mat_type が MAT_TYPE_NIFF の時のCC設定の仕様:

リソースの使用規則:

コンバータは、NIFFデータを解析して、幾つかのRDPレジスタを 使用します。

 PrimColor に、RDPのレジスタの Prim Color レジスタを、TriColor に、 Environment Color レジスタを、それぞれ割り当てて、カラーの変更は レジスタに割り付けられます。

カラーコンバイナモードの決定:

カラーコンバイナのモードは、 mat_shade_type の MAT_SHADE_LIGHT_* と、mat_color_type0 の以下のビットによって決定されます。
        MAT_CC_NIFF_VTX        = 0x00000001
        MAT_CC_NIFF_TRI        = 0x00000002
        MAT_CC_NIFF_PRIM       = 0x00000004
        MAT_CC_NIFF_TEX0       = 0x00000008
        MAT_CC_NIFF_TEX1       = 0x00000010
        MAT_CC_NIFF_TRI_ALPHA  = 0x00020000
        MAT_CC_NIFF_PRIM_ALPHA = 0x00040000
        MAT_CC_NIFF_TEX0_ALPHA = 0x00080000

以下のビットは、参照されません。
        MAT_CC_NIFF_VTX_ALPHA  = 0x00010000
        MAT_CC_NIFF_TEX1_ALPHA = 0x00100000

それぞれビットアサインされているため、さまざまなモードが考えられます。 それは、以下のように決定されます。

 まず、カラーコンバイナ式ですが、以下のような計算式として評価します。

                (Wch - Xch) * Ych + Zch
Wch, Xch, Ych, Zch は仮想カラーチャンネルで、これらは mat_color_type0 の 他のビットによって決定されます。

まず、MAT_CC_NIFF_VTX, _TEX0_ALPHA, _PRIM_ALPHA,_TRI_ALPHA,_VTX_ALPHA によって、Ych が決定されます。

VTX_A TRI_A PRIM_A TEX0_A VTX
Ych
0
0
0
0
0
Shade color(※)
0
0
0
0
1
Vertex color
0
0
0
1
*
Texel0 alpha
0
0
1
*
*
Primitive alpha
0
1
*
*
*
Env alpha
1
*
*
*
0
Shade alpha
1
*
*
*
1
Vertex alpha

上記 (*) の部分は不定値です。要するに、_VTX_ALPHA,_TRI_ALPHA,_PRIM_ALPHA, _TEX0_ALPHA,_VTX の順に評価され、上記のいずれかのモードに設定されます。

Shade color はライティングの設定とモデルのシェードから、SPが計算で 割り出すカラー値をあらわします。

 Vertex color は、GeometryMode の設定で、G_LIGHTING を off としたとき、 Vtx 構造体の法線部分を利用したカラー値を抽出したものです。

(※)Ych が Shade Colorで、mat_shade_type の MAT_SHADE_LIGHT_* の 設定が、LOCAL, GLOBAL 共に0(照明が無効)の時、カラーコンバイナ式は、 以下の様に変更されます。

                (1.0 - Xch) * Wch + Zch
尚、2サイクルモードの時の 2サイクル目に対しては、この特殊ルールは 適用されません。

 Wch, Xch, Zch は、MAT_CC_NIFF_TRI/_PRIM/_TEX0/_TEX1 によって、決定されます。

TRI T1/PRIM TEX0
Wch
Xch
Zch
0
0
0
1.0
0.0
0.0
0
0
1
Tex0
0.0
0.0
0
1
0
T1/Prim
0.0
0.0
0
1
1
Tex0
T1/Prim
T1/Prim
1
0
0
Env
0.0
0.0
1
0
1
Tex0
Env
Env
1
1
0
T1/Prim
Env
Env
1
1
1
Tex0
T1/Prim
Env

Tex0 は、Texel0 カラーを示します。

 Prim は、Primitive Color Register を示します。

 Env は、Environment Color Register を示します。

 T1/Prim は、TEXEL1/PRIMITIVE のどちらかで、 以下の様な規則によって 決定されます。
 
 

TEXEL1 PRIM T1/Prim 内容
0
0
0
----
0
1
1
Prim
1
*
1
TEXEL1

1サイクルモードの場合、以上の設定が、パイプライン2にも適用されます。
2サイクルモード時は、以上同様の評価を、mat_color_type1 に対して行ない、出力値の、
 
 

Shade color が Combine color に、
Shade Alpha が Combine Alpha に、


 それぞれ置き換えられて出力されます。

アルファコンバイナモードの決定:

アルファコンバイナモードは、 mat_alpha_type0 の以下のビットによって 決定されます。
        MAT_CC_NIFF_VTX_ALPHA  = 0x00010000
        MAT_CC_NIFF_TRI_ALPHA  = 0x00020000
        MAT_CC_NIFF_PRIM_ALPHA = 0x00040000
        MAT_CC_NIFF_TEX0_ALPHA = 0x00080000
        MAT_CC_NIFF_TEX1_ALPHA = 0x00100000

以下のビットは、参照されません。
        MAT_CC_NIFF_VTX  = 0x00000001
        MAT_CC_NIFF_TRI  = 0x00000002
        MAT_CC_NIFF_PRIM = 0x00000004
        MAT_CC_NIFF_TEX0 = 0x00000008
        MAT_CC_NIFF_TEX1 = 0x00000010

アルファコンバイナ式も、カラーコンバイナ式と同様に定義されます。
                (Wch - Xch) * Ych + Zch

Wch, Xch, Ych, Zch の各チャンネルは、上記の有効な5つのフラグによって、以下のような法則で決定されます。
 
 
VTX_A
TRI_A
T1/PRIM
TEX0_A
Wch
Xch
Ych
Zch
0
0
0
0
0.0
0.0
0.0
1.0
0
0
0
1
0.0
0.0
0.0
Tex0
0
0
1
0
0.0
0.0
0.0
T1/Prim
0
0
1
1
Tex0
0.0
T1/Prim
0.0
0
1
0
0
0.0
0.0
Env
0.0
0
1
0
1
Tex0
0.0
Env
0.0
0
1
1
0
T1/Prim
0.0
Env
0.0
0
1
1
1
Tex0
Env
T1/Prim
Env
1
0
0
0
0.0
0.0
0.0
Shade
1
0
0
1
Shade
0.0
Tex0
0.0
1
0
1
0
Shade
0.0
T1/Prim
0.0
1
0
1
1
Shade
T1/Prim
Tex0
T1/Prim
1
1
0
0
Shade
0.0
Env
0.0
1
1
0
1
Shade
Env
Tex0
Env
1
1
1
0
Shade
Env
T1/Prim
Env
1
1
1
1
Shade
T1/Prim
Tex0
Env

VTX_ALPHA が、ShadeColor の制御フラグになっています。

T1/Prim は、TEXEL1/PRIMITIVE のどちらかで、 以下の様な規則によって 決定されます。
 
 

TEXEL1_A PRIM_A T1/Prim 内容
0
0
0
----
0
1
1
Prim
1
*
1
TEXEL1

1サイクルモードの場合、以上の設定が、パイプライン2にも適用されます。
2サイクルモード時は、以上同様の評価を、mat_color_type1 に対して行ない、 出力値の、 Shade Alpha が Combine Alpha に、置き換えられて出力されます。
 
 


3.現在わかっているバグ(または制限)


Copyright 1997-1999 NINTENDO Co.,Ltd./1998-1999 MONEGI CORPORATION All rights reserved.

目次に戻る