# niff2gfxコンバータ

1. niff2gfxの使い方

特徴
使い方
オプション解説
インダイレクトファイル仕様

2. 出力仕様
ＧＢＩ出力仕様
制限
mat_type が MAT_TYPE_NIFF の時のＣＣ設定の仕様
3. 現在わかっているバグ、または制限
4. 変更履歴

## １．niff2gfxの使い方

### 特徴：

- NIFF形式のデータフォーマットをGBIディスプレイリスト形式のＣソースファイルにコンバートするコンバーターです。

- ディスプレイリストで最もパフォーマンスに影響するテクスチャのロードを、ポリゴンソートの最上位に置いてパフォーマンスの向上を図っています。

- 高度な頂点キャッシュアルゴリズムを適用して、NINTENDO64で、よりパフォーマンスの高いディスプレイリストを出力します。

- 複数のオブジェクト、階層構造をもったオブジェクトをコンバートする為、オブジェクトの管理情報も出力します。

- オブジェクト管理情報は、添付のビューワーキットに含まれるプログラムによって解析され、正常にオブジェクトの表示（ディスプレイリスト呼び出し）を行います。

- 対応するマイクロコードは、gspF3DEX をベースで作成されます。よって、関連するマイクロコード（spF3DLX, gspF3DLX.Rej, gspF3DLP.Rej, gspL3DEX）で転用可能です。

- 頂点バッファ数もオプション(-vtxcache)で設定出来るため、各マイクロコードのパフォーマンスを、より生かしたデータを出力できます。

- オブジェクト構造体＋実機用表示ドライバで、obj_render_pri に合わせた表示順でオブジェクトを表示するため、半透明、デカールマップといったＮ６４の機能を生かしたデータを矛盾無く表示することが可能です。

- 出力する Gfx は、Gfx 内部で使用するリソースに関して、アニメーションなど、 外からのリソースを操作する場合もあるので、セグメント分割されています。 セグメントによる参照は、Vtx, Texture Imge, TLUT の４つのタイプにそれぞれ一 つずつ割り振っています。

- Binary files can be outputted for Qick Pre-view.

## 使い方：

> コマンドラインから、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)

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

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

    -niffinfo fname　NIFF infomation on to file fname.

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

    -nocomdef        common define,typedef block no output.

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

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

    -regmask val     prevent RDP register assignment.

  出力するディスプレイリストにおいて、ＲＤＰのレジスタ設定の出力を 抑制します。パラメータの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 では、コンバート時、ＲＣＰでの頂点計算のパフォーマンスを向上させるため、出来るだけ頂点バッファを連続して転送させるようにします。 そのため、頂点テーブルには、同じ頂点情報が複数出力されます。 そのとき、既に出力した頂点バッファを見て、同じ連続する部分を使い回す評価を行うようにします。

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

    -vtxcache val    vertex cache size(default 32).

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

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

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

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

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

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

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

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

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

  通常コンバータは、データを出力する際６４ビットアライメントを維持 するため、u64 サイズのダミーワードを挿入します。 このオプションはこのダミーワードの出力を抑制します。

    -outobj name     output object by name.(default: all objects)

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

    -outmask val     prevent output dataclass assignment.

  出力するデータの種類を限定します。このスイッチのパラメータ valも ビットアサインされた８ビットの整数を取り込みます。各ビットは 次のようにマッピングされています

> bit0(0x001) ... ヘッダ
> bit1(0x002) ... TLUT
> bit2(0x004) ... ビットマップパターン
> bit3(0x008) ... デフォーム関係データ
> bit4(0x010) ... シェープ
> bit5(0x020) ... 頂点リスト(Vtx 構造体配列）
> bit6(0x040) ... ディスプレイリスト(Gfx 構造体配列）
> bit7(0x080) ... オブジェクト構造体
> bit8(0x100) ... アニメーション構造体
> bit9(0x200) ... シーン構造体

各ビットが１の状態の時、そのデータクラスは出力が「抑制」されます。 また、bit4 が１の場合、bit5,6は、常に１扱いとなります。

    -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 で参照するテクスチャＬＵＴのセグメント番号を指定 します。 デフォルトでは、7 になっています。

    -nomodify        disable modify vertex.

  gsSPModifyVertexによる頂点バッファの再利用を阻止します。 デフォームを有効にする場合必ず指定する必要があります。

    -strictcidx      CIDX pixel/bits follow 'tex_type'.

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

    -noreduct        CIDX no color reduction.

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

    -nullanim        output null animation data.

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

    @fname           indirect option file.

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

    -?, -h          help

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

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

- ファイルは各処理系のテキストファイルとして認識されます。
- ファイルに記述されたオプションスイッチは、１文字以上のホワイトスペース（スペース、タブ、改行、改頁）で区切られた１単語を１ワードとして受け付けます。
- オプションは、コマンドラインに指定する場合と同じ用に解釈されるので、 ワードの先頭にハイフンをつけるとオプションとして解釈されます。
- インダイレクトファイルは、コマンドラインに指定された場所に、 パラメータと同じように展開され解釈されます。
- インダイレクトファイルは複数指定できます。
- ワードの先頭として'#' を検出した場合、その文字を含む、行末（改行文字）まで、注釈として読み飛ばします。

>     （例１）
>     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

>     （例２）
>     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

>     （例３）
>     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.出力仕様

### ＧＢＩ出力仕様:

- 1つのNIFFファイルから出力されるＧＢＩは、Shape 単位で、Ｖｔｘ、 Ｇｆｘを生成し、全ての Shape によって使われる、テクスチャイメージ、 ＴＬＵＴは、単一のバッファに格納され、共用されます。

- NIFFの、TexDataAreaと、テクスチャの張られる面のＳＴ値によって、 テクスチャの読み込みコードを作成しています。

- StData は、Ｎ６４では使用するタイル情報に依存するため、コンバート時は、 適用するテクスチャの大きさに合わせて、ＳＴ値をスケーリングして、Ｖｔｘ バッファを形成しています。

- Tri, Prim のカラーを両方生かす場面があるため、Triのカラーは、Environment Color Register を使用して設定されます。

- PrimColReg. EnvColReg. 共に、マテリアルの指定で使われる使われないに 関わらず、カラー値の変更が行われます。

- テクスチャイメージの種類は、RGBA(32ビット,16ビット)、 インデックスカラー(8ビット,4ビット)、 IA(16ビット,8ビット,4ビット)、I(8ビット,4ビット)の計9種類に対応しています。

- 階層化オブジェクトを実現するため、'nd'という独自のデータ構造と定数値を 利用してオブジェクトのトランスフォームマトリクス情報、リンク情報を格納しています。

- Animノードは、ANIM_TYPE_STATIC の場合のみ、オブジェクト構造体の トランスフォームデータとして取り込むようになっています。

- トランスフォームのローテーション情報をコンバーター出力する際、 NIFFからは、ラジアン値として渡されるものとして、Radian to Degree の コンバートを行って出力しています。

- Objエリアの obj_pri は、下位８ビットのみ評価され、オブジェクト構造体の プライオリティレジスタに格納されます。

- TexエリアのテクスチャタイプがCIの時に、 イメージで使われている色数が8ビットで256色、4ビットで16色を超える場合は、 自動的にカラーリダクション(減色)を行います。

まず、イメージで使用されている色を16ビット(RGBA5551)にリダクションを 行い、その色で使用回数の多い順にソートして8ビットなら前から256色、4ビットなら 16色をパレットに設定しています。 αは１ビットしか有効になりませんので元のデータが0で透明、 0以外で不透明としています。

このパレットの色の中にに一致するものがない場合、RGBそれぞれの成分の差の自乗の和が最も小さいものを選択しています。

-noreduct を指定した場合は色数が多いとコンバートを中止します。

## 制限：

- 出力されるディスプレイリストはマイクロコード gspFast3D には対応していません。

- ディスプレイリスト内で、RenderMode, ColorCombinerMode, を設定しているため これらのＲＤＰレジスタをユーザーが操作してのオブジェクト表示には、 オプション regmask を使用して、レジスタ設定のみをマスクする形で、 コンバートを行い、オブジェクトマネージャ側で、Gfx 展開時に、マスクした レジスタの設定を行って下さい。

- ObjArea の obj_render_pri が、OBJ_RENDER_FLAG_NIFF = 1 で、 OBJ_RENDER_NIFF_*_INTER, OBJ_RENDER_NIFF_*_DECAL 時、ShapeArea の shape_type で SHAPE_TYPE_ZB = 0 なら、強制的に、SHAPE_TYPE_ZB = 1 に置き換えられます。 これは、RenderMode に、Zバッファ無効の INTER, DECAL が存在しない為です。

- NIFFで定義されるシンボル名は、そのままの文字列で、コンバート後の シンボルに使用する場合もあります。コンバート後のデータが、うまくコンパイル 出来ない場合、NIFFデータ内のシンボル情報に注意してください。

- キーフレームアニメーションの補間方法は LINEAR のみ対応しています。 LINEAR 以外のデータは出力もされません。

- ライト情報はローカルライトは出力されません。

- Matエリアの mat_type で MAT_SHADE_USE_HILGHT = 1 または、 MAT_SHADE_USE_REFLECT = 1のとき、ライティングがONの扱いにしている。 ONにしないとハイライト、リフレクト設定効果が出ないのでそちらを優先しました。

## mat_type が MAT_TYPE_NIFF の時のＣＣ設定の仕様:

> ### リソースの使用規則：

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

> > PrimColor に、ＲＤＰのレジスタの 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 はライティングの設定とモデルのシェードから、ＳＰが計算で 割り出すカラー値をあらわします。

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

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

> >                     (1.0 - Xch) * Wch + Zch

> > 尚、２サイクルモードの時の ２サイクル目に対しては、この特殊ルールは 適用されません。

> > 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

> > １サイクルモードの場合、以上の設定が、パイプライン２にも適用されます。
> > ２サイクルモード時は、以上同様の評価を、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 の各チャンネルは、上記の有効な５つのフラグによって、以下のような法則で決定されます。

> > 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

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

## 3.現在わかっているバグ（または制限）

- Ｎ６４では、ＴＭＥＭサイズに収まらないテクスチャパターンを、いくつかに 分割してロード、描画を繰り返す、タイル定義が出来るため、このコンバータでも 大きなテクスチャパターンを大きいまま扱います。 そのため、一部しか用いられないテクスチャパターンも、全体を出力してしまいます。

- 大きなテクスチャを分割して張る場合、テクスチャラッピング（繰り返し）を行なうことが出来なくなります。 これは、テクスチャパターンの境界部分のテクスチャロードが１描画タイルを作成するために、４回タイルロードが必要になる場合があり、描画タイル設定も非常に複雑になります。 これらのタイルロードとタイル設定は、それだけでかなりのディスプレイリストを消費してしまうため、４ＫバイトのＴＭＥＭをうまく配置するためにする処理としてはコストがかかり過ぎます。 このコンバーターでは、４ＫバイトのＴＭＥＭサイズに収まり切らないテクスチャをうまくポリゴン分割してあれば、ちゃんと張ることが出来る代償として、ラッピングが行なわれない、と考えて下さい。

- タイルの設定において、テクスチャの読み込み範囲である、uls, ult, lrs, lrt は、 ポリゴンのテクスチャ座標値(S、T)から決定されます。この時、lrs, lrt は右下 ＳＴ値から求められますが、コンバーターではバイリニア補間が行われる事を前提に している為、右下ＳＴ値の存在するテクセルより１テクセル広い範囲を、一度に ＴＭＥＭに読み込むようにする為、ユーザーが任意で、ＴＭＥＭの容量を超える テクスチャをポリゴン分割し、分割した範囲それぞれがＴＭＥＭ限界の範囲でＳＴを マップした場合、１回のテクスチャの読み込み範囲がＴＭＥＭの範囲を超えて しまい、テクスチャが崩れて表示されてしまいます。

ex.)

> ＴＭＥＭに収まらない64x32 のテクスチャを、バイリニア補間が有効なままで正方形のポリゴンに張り付けようとした場合、中央で２分割して32x32 の２つの四角ポリゴンとして張ろうと考えます。

> 左側の四角ポリゴンで０ピクセル目から３１ピクセル目までを、隣り合うポリゴンで３２ピクセルから６３ピクセルまでを描こうと考えるわけですが、この時左側の３１ピクセル目から３２ピクセル目へのバイリニア補間が必要なため、テクスチャとしては、33x33ピクセルをロードしなければなりません。 コンバータでは、そこまでを評価に入れますが、そのテクスチャタイルが４ＫのＴＭＥＭに収まるかまでは評価しません。

> よって、「ＴＭＥＭにピッタリ収まる」つもりで用意すると、時にテクスチャのパターンが崩れてしまう場合があります。

- ビルボードオブジェクトは評価しているが、テストされていません。また、 LookAt関数の特徴として、上方向のベクトルと、注視点方向が一致（又は 正反対）の場合ハングアップするという問題を解決していません。

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

目次に戻る