# SBCとコールバック

## 説明

レンダリング、及びアニメーションの計算はNNS_G3dDrawの実行の際、モデルリソースバイナリ内の（ユーザー独自のものも指定できる）SBC(Structure Byte Code)と呼ばれる何種類かのバイトコード命令のストリームを処理することで行われます。SBCには、ジョイントの親子関係を定義するもの、使用するマテリアルを指定するもの、描画するプリミティブを指定するものがあり、実行時にそれらを適切に解釈することにより、描画やアニメーションを行います。
以下に各SBC命令の概略を表にまとめておきます。各命令の先頭1バイトは5bitと3bitのフィールドに分かれていて、前者が各SBC命令に対応し、後者でそのバリエーションを指定するようになっています。それぞれの命令はいくつかの引数を持つ場合があります。

NNS_G3D_SBC_NOP | 何もしません。g3dcvtrはこのコードをSBC命令列の終わりに4バイトアラインメントをとるために出力します。
NNS_G3D_SBC_RET | SBC命令列の処理を終了します。
NNS_G3D_SBC_NODE | 現在どのノードを処理しているのかを引数のノードIDで指定し、そのノードに所属しているプリミティブがvisibleかinvisibleかを指定します。ビジビリティアニメーションはこの命令で処理されます。
NNS_G3D_SBC_MTX | ジオメトリエンジンのPosition/Vector行列スタックの指定した場所からカレント行列に行列をロードします。
NNS_G3D_SBC_MAT | どのマテリアルを使用するかを引数のマテリアルIDで指定し、対応するマテリアル情報をジオメトリエンジンに送信します。マテリアルアニメーションはこの命令で処理されます。
NNS_G3D_SBC_SHP | どのシェイプを使用するかを引数のシェイプIDで指定し、対応するシェイプ(プリミティブのディスプレイリスト)をジオメトリエンジンに送信します。
NNS_G3D_SBC_NODEDESC | 引数でノードの親子関係を定義します。ノードに対応するPosition/Vector行列が格納される行列スタックのIDが指定されることもあります。ジョイントアニメーションはこの命令で処理されます。
NNS_G3D_SBC_BB | ビルボード変換を行います。バリエーションによってビルボード変換した行列をスタックに格納したりできます。
NNS_G3D_SBC_BBY | Ｙ軸ビルボード変換を行います。バリエーションによってＹ軸ビルボード変換した行列をスタックに格納したりできます。
NNS_G3D_SBC_NODEMIX | ウェイテッドエンベロープ表示に使用する行列を計算し、計算結果を行列スタックに格納します。
NNS_G3D_SBC_CALLDL | 引数でオフセットとサイズを指定したディスプレイリストをジオメトリエンジンに送信します。g3dcvtrはこのSBC命令を出力しません。
NNS_G3D_SBC_POSSCALE | NITRO中間ファイルの.imdフォーマットで指定される<model_info>::pos_scaleを処理するためにg3dcvtrが出力するSBC命令。
NNS_G3D_SBC_ENVMAP | 環境マップのためのテクスチャ行列計算を行うためのSBC命令です。
NNS_G3D_SBC_PRJMAP | 投影マップのためにテクスチャ行列計算を行うためのSBC命令です。

それぞれの命令には最大で３つのコールバック可能なポイント（タイミング）が設定されています。各命令には１つずつコールバックを設定することができます。使用したいコールバックが１つだけの場合は、`NNS_G3dRenderObjSetCallBack`関数を使用することで指定することができます。使用したいコールバックが複数ある場合は、`NNS_G3dRenderObjSetInitFunc`関数で描画直前に実行されるコールバック関数を登録しておいて、コールバック関数内で`NNS_G3dRSSetCallBack`関数を利用することにより、複数のコールバックを登録することができます。それぞれのタイミングがどのような用途に適しているかについては、各命令についての解説を参照してください。

## 参照

## 履歴

2004/10/11 改訂版
2004/08/02 初版