| njSetUserLight | English |
|---|---|
▲|INDEX|▼ | |
| ライトにユーザが作成したライト関数を設定します。 | |
#include <NINJA.H> void njSetUserLight( *ptr, func ) NJS_LIGHT *ptr NJF_LIGHT_FUNC func
第一引数は、NJS_ARGB argb[2] として扱ってください。
ただし、njDrawObject、njFastDrawObjectにユーザ関数を反映させる場合では、設定値が違います。
ライトがすでに複数設定されている場合には、第一引数の各成分と足し合わせてください。
この足し合わせが、行われなければこの関数が呼ばれる以前のライト関数の効果はすべて失われます。
<njDrawObjectの場合>
NJS_ARGB argb[2]として設定してください。
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の場合>コールバック関数の基本的な設定方法:
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;
}
}
/* メインルーチン中 */
.......
njInitSystem();
njCreateLight(&light, NJD_USER_LIGHT);
/*ライトltにユーザ関数funcを設定*/
njSetUserLight (&light, func);
...........
func(argb, pnt, nml, ptr) NJS_ARGB *argb NJS_POINT3 *pnt NJS_VECTOR *nml NJS_LIGHT *ptr
*argb 演算後のポインタ。 *pnt ポリゴンの位置ベクトルのポインタ。 *nml ポリゴンの法線ベクトルのポインタ。 *ptr njCreateLightによって設定されたライトのポインタ。
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
| njSetUserLight | ▲|INDEX|▼ |
|---|