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

njSetUserLight

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

書式

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

引数

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

戻値

なし

解説

njCreateLight で光源の種類をNJD_USER_LIGHTとすることでユーザが作成したライト関数を設定します (CHUNKモデルを除く)。

ユーザライトの引数は、原則として第一引数のNJS_ARGB以外は、書き換えないでください。

第一引数は、NJS_ARGB argb[2] として扱ってください。

ただし、njDrawObject、njFastDrawObjectにユーザ関数を反映させる場合では、設定値が違います。

ライトがすでに複数設定されている場合には、第一引数の各成分と足し合わせてください。 この足し合わせが、行われなければこの関数が呼ばれる以前のライト関数の効果はすべて失われます。

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


用例

#include <Shinobi.h>
	:
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)
{
 	:
 sbInitSystem( NJD_RESOLUTION_VGA, NJD_FRAMEBUFFER_MODE_RGB565, 1);
 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ポリゴンの法線ベクトルのポインタ。
*ptrnjCreateLightによって設定されたライトのポインタ。

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です。 これによりスペキュラの広がりが得られます。以下にSOFTIAGEとの対応表を示します。

NINJASOFTIMAGE
00
11
22
33
44
56
68
712
816
924
1032
1148
1264
1396
14128
15192
16256

<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