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] として扱ってください。
  ただし、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 <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ライトが選択されている必要があります。ユーザが作成するライト関数、その中で使用されるマクロは以下の通りです。

  ### １．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によって設定されたライトのポインタ。

  ### ２．マクロ（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で、一般的には０−１．ｆの値が入っております（ただし、１．ｆ以上の値も取り得ます）。NJM_LIGHT_AMB(ptr).rのように参照してください 。

  ＜NJM_LIGHT_DIF(ptr)＞
    デフューズ光強度：NJS_ARGBで、一般的には０−１．ｆの値が入っております（ただし、１．ｆ以上の値も取り得ます）。NJM_LIGHT_DIF(ptr).rのように参照してく ださい。

  ＜NJM_LIGHT_SPC(ptr)＞
    スペキュラ光強度：NJS_ARGBで、一般的には０−１．ｆの値が入っております（ただし、１．ｆ以上の値も取り得ます）。NJM_LIGHT_SPC(ptr).rのように参照してく ださい。

  ＜NJM_LIGHT_EXP(ptr)＞
    指数：オブジェクトデータ中の情報の一部で、Intです。これによりスペキュラの広がりが得られます。以下にＳＯＦＴＩＭＡＧＥとの対応表を示します。

    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 |