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