# NNSG3dRS構造体とアクセサ

## 説明

`NNSG3dRS`構造体は、レンダリング中の状態を保持するための構造体です。この構造体は、レンダリングやアニメーションの計算において参照されたり変更されたりする、いわゆるマシンステートに相当するデータを保持するためのデータ構造です。この構造体は、通常`NNS_G3dDraw`関数内部でスタック領域(DTCM)に確保され、SBC命令を処理する関数やコールバック関数などの実行の際には、第１引数としてポインタが渡されています。また、`NNS_G3dDraw`関数の実行中には、グローバル変数の`NNS_G3dRS`にもポインタが格納されています。
通常は、この構造体についての知識はなくとも問題はないのですが、コールバックで描画中の動作を細かくカスタマイズしたい場合には、この構造体が保持するデータを、参照・改変する必要が生じてきます。そこでこの項では、`NNS_G3dRS`構造体のデータメンバへのアクセサについて説明いたします。

## アクセサ関数

`#include <nnsys/g3d/sbc.h> void NNS_G3dRSSetCallBack(NNSG3dRS* rs, NNSG3dSbcCallBackFunc func, u8 cmd, NNSG3dSbcCallBackTiming timing);`
SBC命令cmdに対してコールバックを設定します。`引数については`NNS_G3dRenderObjSetCallBack`関数を参照してください。 コールバックはcmd１つにつき１つ有効となります。同じcmdに対して実行された場合は設定が上書きされます。`コールバックを複数設定したい場合は、`NNS_G3dRenderObjSetCallBack関数を複数回呼び出すのではなくこちらの関数を使用してください。`

`#include <nnsys/g3d/sbc.h> void NNS_G3dRSResetCallBack(NNSG3dRS* rs, u8 cmd);`
SBC命令cmdに対して設定されているコールバックを無効にします。

`#include <nnsys/g3d/sbc.h> NNSG3dRenderObj* NNS_G3dRSGetRenderObj(NNSG3dRS* rs);`
`NNSG3dRenderObj`構造体へのポインタを取得します。

`#include <nnsys/g3d/sbc.h> NNSG3dMatAnmResult* NNS_G3dRSGetMatAnmResult(NNSG3dRS* rs);`
`NNSG3dMatAnmResult`構造体へのポインタを取得します。`NNS_G3D_SBC_MAT`コマンドのタイミングA, タイミングBのコールバックにおいて参照、変更可能。その他の場合は`NULL`です。

`#include <nnsys/g3d/sbc.h> NNSG3dJntAnmResult* NNS_G3dRSGetJntAnmResult(NNSG3dRS* rs);`
`NNSG3dJntAnmResult`構造体へのポインタを取得します。`NNS_G3D_SBC_NODEDESC`コマンドのタイミングA, タイミングBのコールバックにおいて参照、変更可能。その他の場合は`NULL`です。

`#include <nnsys/g3d/sbc.h> NNSG3dVisAnmResult* NNS_G3dRSGetVisAnmResult(NNSG3dRS* rs);`
`NNSG3dVisAnmResult`構造体へのポインタを取得します。`NNS_G3D_SBC_NODE`コマンドのタイミングA, タイミングBのコールバックにおいて参照、変更可能。その他の場合は`NULL`です。

`#include <nnsys/g3d/sbc.h> u8* NNS_G3dRSGetSbcPtr(NNSG3dRS* rs);`
現在実行中のSBC命令へのポインタを取得します。

`#include <nnsys/g3d/sbc.h> u8* NNS_G3dRSSetFlag(NNSG3dRS* rs, NNSG3dRSFlag flag);`
sbc.hで定義されている`NNSG3dRSFlag`型のフラグを指定してONにする。

`#include <nnsys/g3d/sbc.h> u8* NNS_G3dRSResetFlag(NNSG3dRS* rs, NNSG3dRSFlag flag);`
sbc.hで定義されている`NNSG3dRSFlag`型のフラグを指定してOFFにする。

`#include <nnsys/g3d/sbc.h> int NNS_G3dRSGetCurrentMatID(const NNSG3dRS* rs);`
現在`NNS_G3D_SBC_MAT`コマンドで計算中か直前に実行された`NNS_G3D_SBC_MAT`コマンドで設定されたマテリアルIDを返します。マテリアルIDはSBCの`NNS_G3D_SBC_MAT`コマンドで設定され、次の`NNS_G3D_SBC_MAT`コマンドがオーバーライドするか、コールバック関数内部で変更されるまで値を保持しつづけます。なお、`NNS_G3D_SBC_MAT`コマンドが未実行か直前の`NNS_G3D_SBC_MAT`コマンドの結果が無効とされている場合は-1を返します。

`#include <nnsys/g3d/sbc.h> int NNS_G3dRSGetCurrentNodeID(const NNSG3dRS* rs);`
現在計算中の`NNS_G3D_SBC_NODE`コマンドか直前に実行された`NNS_G3D_SBC_NODE`コマンドで設定されたノードのIDを返します。ノードIDはSBCの`NNS_G3D_SBC_NODE`コマンドで設定され、次の`NNS_G3D_SBC_NODE`コマンドがオーバーライドするか、コールバック関数内部で変更されるまで値を保持しつづけます。なお、`NNS_G3D_SBC_NODE`コマンドが未実行か直前の`NNS_G3D_SBC_NODE`コマンドの結果が無効とされている場合は-1を返します。

`#include <nnsys/g3d/sbc.h> int NNS_G3dRSGetCurrentNodeDescID(const NNSG3dRS* rs);`
現在計算中の`NNS_G3D_SBC_NODEDESC`コマンドか直前に実行された`NNS_G3D_SBC_NODEDESC`コマンドで設定されたノードのIDを返します。ノードIDはSBCの`NNS_G3D_SBC_NODEDESC`コマンドで設定され、次の`NNS_G3D_SBC_NODEDESC`コマンドがオーバーライドするか、コールバック関数内部で変更されるまで値を保持しつづけます。なお、`NNS_G3D_SBC_NODEDESC`コマンドが未実行か直前の`NNS_G3D_SBC_NODEDESC`コマンドの結果が無効とされている場合は-1を返します。

`#include <nnsys/g3d/sbc.h> fx32 NNS_G3dRSGetPosScale(const NNSG3dRS* rs);`
`NNSG3dRS`構造体にキャッシュされている頂点座標に対するスケール値を取得します。

`#include <nnsys/g3d/sbc.h> fx32 NNS_G3dRSGetInvPosScale(const NNSG3dRS* rs);`
`NNSG3dRS`構造体にキャッシュされている頂点座標に対するスケール値の逆数を取得します。

以下は、`NNSG3dRSFlag`型の主要な値についての説明です。

    NNS_G3D_RSFLAG_NODE_VISIBLE

`NNS_G3D_SBC_NODE`コマンドで、ノードに属するポリゴンがvisibleのときにセットされます。

    NNS_G3D_RSFLAG_MAT_TRANSPARENT

`NNS_G3D_SBC_MAT`コマンドで、マテリアルが透明の場合にセットされます。

    NNS_G3D_RSFLAG_CURRENT_NODE_VALID

currentNodeに有効な値が入っている場合セットされています。

    NNS_G3D_RSFLAG_CURRENT_MAT_VALID

currentMatに有効な値が入っている場合セットされています。

    NNS_G3D_RSFLAG_RETURN

このフラグがセットされていると、現在のSBC命令終了後に`NNS_G3dDraw`関数の実行を終了します。

    NNS_G3D_RSFLAG_SKIP

このフラグがセットされていると、次のコールバックポイントか現在の命令が終了するまで、処理をスキップします。

## 参照

## 履歴

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