Ninjaライブラリ - ライト関数

njSetUserLight

ライトにユーザーが作成したライト関数を設定

書式

void  njSetUserLight( *ptr, func ) 
NJS_LIGHT *ptr 
NJF_LIGHT_FUNC func 

引数

*ptr   ライトのポインタ
func   コールバック関数名(ポインタ)

戻り値

なし

解説

njCreateLightで光源の種類をNJD_USER_LIGHTとすることでユーザーが作成したライト関数を設定します(チャンクモデルを除く)。 ユーザーライトの引数は、原則として第一引数のNJS_ARGB以外は、書き換えないでください。 第1引数は、NJS_ARGB argb[2] として扱ってください。 ただし、njDrawObject関数、njFastDrawObject関数にユーザー関数を反映させる場合では、設定値が違います。 ライトがすでに複数設定されている場合には、第1引数の各成分と足し合わせてください。 この足し合わせが、行われなければこの関数が呼ばれる以前のライト関数の効果はすべ失なわれます。


<njDrawObjectの場合>
NJS_ARGB argb[2]として設定してください。
argb[0].a argb[0].r argb[0].g argb[0].bディフューズ
argb[1].a argb[1].r argb[1].g argb[1].bスペキュラ
コールバック関数の基本的な設定方法:
func(NJS_ARGB* argb, NJS_POINT3* pnt, NJS_VECTOR* nml, NJS_LIGHT* lt)
{
NJS_ARGB dif, spc;

/* ライトの計算 */

argb[0].a += dif.a;
argb[0].r += dif.r;
argb[0].g += dif.g;
argb[0].b += dif.b;

/*argb[1].a += spc.a;*/
argb[1].r += spc.r;
argb[1].g += spc.g;
argb[1].b += spc.b;
}
<njFastDrawObjectの場合>
NJS_ARGB argb[0]のa,r成分のみ設定してください。( = Float intensity[2])
argb[0].aディフューズ
argb[0].rスペキュラ
コールバック関数の基本的な設定方法:
func(NJS_ARGB* argb, NJS_POINT3* pnt, NJS_VECTOR* nml, NJS_LIGHT* lt)
{
Float dif, spc;

/* ライトの計算 */

argb[0].a += dif.a;
argb[0].r += dif.r;
}


用例

	:
NJS_LIGHT light;
void func(NJS_ARGB* argb, NJS_POINT3* pnt,
	NJS_VECTOR* nml, NJS_LIGHT* lt)
{
	:
 /* ポリゴン法線と光線方向の内積の例 */
   deg = - nml->x * NJM_LIGHT_VECTOR(lt). x
   - nml->y * NJM_LIGHT_VECTOR(lt).y
   - nml->z * NJM_LIGHT_VECTOR(lt).z;
 	:
   /* argb */

   if (deg > 0.f) {
         argb[0].a += deg * deg * NJM_LIGHT_SPC(lt).a;
         argb[1].r += deg * deg * NJM_LIGHT_SPC(lt).r;
         argb[1].g += deg * deg * NJM_LIGHT_SPC(lt).g;
         argb[1].b += deg * deg * NJM_LIGHT_SPC(lt).b;

         argb[0].r += deg * NJM_LIGHT_DIF(lt).r;
         argb[0].g += deg * NJM_LIGHT_DIF(lt).g;
         argb[0].b += deg * NJM_LIGHT_DIF(lt).b;
   }
}
void
njUserInit(void)
{
 		:
	njCreateLight(&light, NJD_USER_LIGHT);
	/*ライトltにユーザー関数funcを設定*/
	njSetUserLight (&light, func);
 		:
}

備考

njCreateLight関数でNJD_USER_LIGHTライトが選択されている必要があります。

ユーザーが作成するライト関数、その中で使用されるマクロは以下のとおりです。

1.func(argb, pnt, nml, ptr):コールバック関数


<書式>
func( *argb, *pnt, *nml, *ptr)
NJS_ARGB *argb
NJS_POINT3 *pnt
NJS_VECTOR *nml
NJS_LIGHT *ptr

<引数>

 *argb   演算後のポインタ。 
 *pnt   ポリゴンの位置ベクトルのポインタ。 
 *nml   ポリゴンの法線ベクトルのポインタ。 
 *ptr   njCreateLightによって設定されたライトのポインタ。 

2.マクロ(NJS_LIGHT *ptr の時)

<NJM_LIGHT_VECTOR(ptr)>

ライトのカレントの方向:NJS_VECTORです。NJM_LIGHT_VECTOR(ptr).x のように参照してください。

<NJM_LIGHT_POINT(ptr)>

ライトのカレントの位置:NJS_POINT3です。NJM_LIGHT_POINT(ptr).xのように参照してください。

<NJM_LIGHT_AMB(ptr)>

環境光強度:NJS_ARGBで、一般的には0−1.fの値が入っております(ただし、1.f以上の値も取り得ます)。NJM_LIGHT_AMB(ptr).rのように参照してください 。

<NJM_LIGHT_DIF(ptr)>

デフューズ光強度:NJS_ARGBで、一般的には0−1.fの値が入っております(ただし、1.f以上の値も取り得ます)。NJM_LIGHT_DIF(ptr).rのように参照してく ださい。

<NJM_LIGHT_SPC(ptr)>

スペキュラ光強度:NJS_ARGBで、一般的には0−1.fの値が入っております(ただし、1.f以上の値も取り得ます)。NJM_LIGHT_SPC(ptr).rのように参照してく ださい。

<NJM_LIGHT_EXP(ptr)>

指数:オブジェクトデータ中の情報の一部で、Intです。 これによりスペキュラの広がりが得られます。以下にSOFTIMAGEとの対応表を示します。

 Ninja   SOFTIMAGE 
 0   0 
 1   1 
 2   2 
 3   3 
 4   4 
 5   6 
 6   8 
 7   12 
 8   16 
 9   24 
 10   32 
 11   48 
 12   64 
 13   96 
 14   128 
 15   192 
 16   256 

<NJM_LIGHT_COLOR(ptr)>

ライトの色:NJS_ARGBです。ライトの色が得られます。

<NJM_LIGHT_INIT_VECTOR(ptr)>

ライトの行列計算前の方向:NJS_VECTORです。行列計算前の初期方向です。

<NJM_LIGHT_INIT_POINT(ptr)>

ライトの行列計算前の位置:NJS_POINT3です。行列計算前の初期位置です。

<NJM_LIGHT_MATRIX(ptr)>

ライトの行列:NJS_MATRIXです。ライトの行列です。


参照

njCreateLight()

njSetUserLight
COPYRIGHT © SEGA ENTERPRISES, LTD., 1998,1999