njSetUserLight | |
ライトにユーザが作成したライト関数を設定します |
#include <Ninja.h> void njSetUserLight( *ptr, func ) NJS_LIGHT *ptr NJF_LIGHT_FUNC func
第一引数は、NJS_ARGB argb[2] として扱ってください。
ただし、njDrawObject、njFastDrawObjectにユーザ関数を反映させる場合では、設定値が違います。
ライトがすでに複数設定されている場合には、第一引数の各成分と足し合わせてください。
この足し合わせが、行われなければこの関数が呼ばれる以前のライト関数の効果はすべて失われます。
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; }
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); ........... }
func(argb, pnt, nml, ptr) NJS_ARGB *argb NJS_POINT3 *pnt NJS_VECTOR *nml NJS_LIGHT *ptr
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 |