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

書 式

#include <Ninja.h>
void   njSetUserLight( *ptr, func )
NJS_LIGHT       *ptr
NJF_LIGHT_FUNC  func

引 数

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

返 値

なし

エラー

なし

機 能

 njCreateLight で光源の種類をNJD_USER_LIGHTとすることでユーザが作成したライト関数を設定します(CHUNKモデルを除く)。
ユーザライトの引数は、原則として第一引数のNJS_ARGB以外は、書き換えないでください。

 第一引数は、NJS_ARGB argb[2] として扱ってください。
ただし、njDrawObjectnjFastDrawObjectにユーザ関数を反映させる場合では、設定値が違います。 ライトがすでに複数設定されている場合には、第一引数の各成分と足し合わせてください。 この足し合わせが、行われなければこの関数が呼ばれる以前のライト関数の効果はすべて失われます。

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 <NINJA.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
ポリゴンの法線ベクトルのポインタ。
*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との対応表を示します。

NINJASOFTIMAGE
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
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