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 Y軸ビルボード変換を行います。バリエーションによってY軸ビルボード変換した行列をスタックに格納したりできます。
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命令です。


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

参照

履歴

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