diff --git a/include/PR/gbi.h b/include/PR/gbi.h index 09498219d2..3859c8ddfc 100644 --- a/include/PR/gbi.h +++ b/include/PR/gbi.h @@ -16,6 +16,9 @@ #define F3DEX_GBI_2 +/* F3DEX2 with Point Lighting */ +#define F3DEX_GBI_PL + #ifdef F3DEX_GBI_2 # ifndef F3DEX_GBI # define F3DEX_GBI @@ -288,7 +291,9 @@ #define G_TEXTURE_GEN 0x00040000 #define G_TEXTURE_GEN_LINEAR 0x00080000 #define G_LOD 0x00100000 /* NOT IMPLEMENTED */ -#define G_LIGHTING_POSITIONAL 0x00400000 +#ifdef F3DEX_GBI_PL +# define G_LIGHTING_POSITIONAL 0x00400000 +#endif #if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) # define G_CLIPPING 0x00800000 #else @@ -301,6 +306,9 @@ #define G_TEXTURE_GEN_H (G_TEXTURE_GEN/0x10000) #define G_TEXTURE_GEN_LINEAR_H (G_TEXTURE_GEN_LINEAR/0x10000) #define G_LOD_H (G_LOD/0x10000) /* NOT IMPLEMENTED */ +#ifdef F3DEX_GBI_PL +# define G_LIGHTING_POSITIONAL_H (G_LIGHTING_POSITIONAL/0x10000) +#endif #if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) # define G_CLIPPING_H (G_CLIPPING/0x10000) #endif @@ -1277,15 +1285,16 @@ typedef struct { char pad3; } Light_t; -// Added in MM +#ifdef F3DEX_GBI_PL typedef struct { - unsigned char col[3]; - unsigned char kc; - unsigned char colc[3]; - unsigned char kl; - short pos[3]; - unsigned char kq; + unsigned char col[3]; /* point light value (rgba) */ + unsigned char kc; /* constant attenuation (> 0 indicates point light) */ + unsigned char colc[3]; /* copy of point light value (rgba) */ + unsigned char kl; /* linear attenuation */ + short pos[3]; /* world-space position of light */ + unsigned char kq; /* quadratic attenuation */ } PointLight_t; +#endif typedef struct { unsigned char col[3]; /* ambient light value (rgba) */ @@ -1300,7 +1309,9 @@ typedef struct { typedef union { Light_t l; +#ifdef F3DEX_GBI_PL PointLight_t p; +#endif long long int force_structure_alignment[2]; } Light; @@ -1363,287 +1374,256 @@ typedef union { long int force_structure_alignment[4]; } Hilite; -#define gdSPDefLights0(ar,ag,ab) \ - { \ - {{ \ - { ar, ag, ab }, 0, \ - { ar, ag, ab }, 0 \ - }}, \ - { \ - {{ \ - { 0, 0, 0 }, 0, \ - { 0, 0, 0 }, 0, \ - { 0, 0, 0 }, 0 \ - }} \ - } \ +#define gDefAmbient(r, g, b) \ + {{ \ + { (r), (g), (b) }, 0, \ + { (r), (g), (b) }, 0, \ + }} + +#define gDefLight(r, g, b, x, y, z) \ + {{ \ + { (r), (g), (b) }, 0, \ + { (r), (g), (b) }, 0, \ + { (x), (y), (z) }, 0, \ + }} \ + +#define gdSPDefLights0(ar, ag, ab) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefLight(0, 0, 0, 0, 0, 0), \ + } \ } -#define gdSPDefLights1(ar,ag,ab, \ - r1,g1,b1, \ - x1,y1,z1) \ - { \ - {{ \ - { ar, ag, ab }, 0, \ - { ar, ag, ab }, 0 \ - }}, \ - { \ - {{ \ - { r1, g1, b1 }, 0, \ - { r1, g1, b1 }, 0, \ - { x1, y1, z1 }, 0 \ - }} \ - } \ +#define gdSPDefLights1(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefLight(r1, g1, b1, x1, y1, z1), \ + } \ } -#define gdSPDefLights2(ar,ag,ab, \ - r1,g1,b1, \ - x1,y1,z1, \ - r2,g2,b2, \ - x2,y2,z2) \ - { \ - {{ \ - { ar, ag, ab }, 0, \ - { ar, ag, ab }, 0 \ - }}, \ - { \ - {{ \ - { r1, g1, b1 }, 0, \ - { r1, g1, b1 }, 0, \ - { x1, y1, z1 }, 0 \ - }}, \ - {{ \ - { r2, g2, b2 }, 0, \ - { r2, g2, b2 }, 0, \ - { x2, y2, z2 }, 0 \ - }} \ - } \ +#define gdSPDefLights2(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefLight(r1, g1, b1, x1, y1, z1), \ + gDefLight(r2, g2, b2, x2, y2, z2), \ + } \ } -#define gdSPDefLights3(ar,ag,ab, \ - r1,g1,b1, \ - x1,y1,z1, \ - r2,g2,b2, \ - x2,y2,z2, \ - r3,g3,b3, \ - x3,y3,z3) \ - { \ - {{ \ - { ar, ag, ab }, 0, \ - { ar, ag, ab }, 0 \ - }}, \ - { \ - {{ \ - { r1, g1, b1 }, 0, \ - { r1, g1, b1 }, 0, \ - { x1, y1, z1 }, 0 \ - }}, \ - {{ \ - { r2, g2, b2 }, 0, \ - { r2, g2, b2 }, 0, \ - { x2, y2, z2 }, 0 \ - }}, \ - {{ \ - { r3, g3, b3 }, 0, \ - { r3, g3, b3 }, 0, \ - { x3, y3, z3 }, 0 \ - }} \ - } \ +#define gdSPDefLights3(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2) \ + r3, g3, b3, x3, y3, z3) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefLight(r1, g1, b1, x1, y1, z1), \ + gDefLight(r2, g2, b2, x2, y2, z2), \ + gDefLight(r3, g3, b3, x3, y3, z3), \ + } \ } -#define gdSPDefLights4(ar,ag,ab, \ - r1,g1,b1, \ - x1,y1,z1, \ - r2,g2,b2, \ - x2,y2,z2, \ - r3,g3,b3, \ - x3,y3,z3, \ - r4,g4,b4, \ - x4,y4,z4) \ - { \ - {{ \ - { ar, ag, ab }, 0, \ - { ar, ag, ab }, 0 \ - }}, \ - { \ - {{ \ - { r1, g1, b1 }, 0, \ - { r1, g1, b1 }, 0, \ - { x1, y1, z1 }, 0 \ - }}, \ - {{ \ - { r2, g2, b2 }, 0, \ - { r2, g2, b2 }, 0, \ - { x2, y2, z2 }, 0 \ - }}, \ - {{ \ - { r3, g3, b3 }, 0, \ - { r3, g3, b3 }, 0, \ - { x3, y3, z3 }, 0 \ - }}, \ - {{ \ - { r4, g4, b4 }, 0, \ - { r4, g4, b4 }, 0, \ - { x4, y4, z4 }, 0 \ - }} \ - } \ +#define gdSPDefLights4(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3, \ + r4, g4, b4, x4, y4, z4) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefLight(r1, g1, b1, x1, y1, z1), \ + gDefLight(r2, g2, b2, x2, y2, z2), \ + gDefLight(r3, g3, b3, x3, y3, z3), \ + gDefLight(r4, g4, b4, x4, y4, z4), \ + } \ } -#define gdSPDefLights5(ar,ag,ab, \ - r1,g1,b1, \ - x1,y1,z1, \ - r2,g2,b2, \ - x2,y2,z2, \ - r3,g3,b3, \ - x3,y3,z3, \ - r4,g4,b4, \ - x4,y4,z4, \ - r5,g5,b5, \ - x5,y5,z5) \ - { \ - {{ \ - { ar, ag, ab }, 0, \ - { ar, ag, ab }, 0 \ - }}, \ - { \ - {{ \ - { r1, g1, b1 }, 0, \ - { r1, g1, b1 }, 0, \ - { x1, y1, z1 }, 0 \ - }}, \ - {{ \ - { r2, g2, b2 }, 0, \ - { r2, g2, b2 }, 0, \ - { x2, y2, z2 }, 0 \ - }}, \ - {{ \ - { r3, g3, b3 }, 0, \ - { r3, g3, b3 }, 0, \ - { x3, y3, z3 }, 0 \ - }}, \ - {{ \ - { r4, g4, b4 }, 0, \ - { r4, g4, b4 }, 0, \ - { x4, y4, z4 }, 0 \ - }}, \ - {{ \ - { r5, g5, b5 }, 0, \ - { r5, g5, b5 }, 0, \ - { x5, y5, z5 }, 0 \ - }} \ - } \ +#define gdSPDefLights5(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3, \ + r4, g4, b4, x4, y4, z4) \ + r5, g5, b5, x5, y5, z5) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefLight(r1, g1, b1, x1, y1, z1), \ + gDefLight(r2, g2, b2, x2, y2, z2), \ + gDefLight(r3, g3, b3, x3, y3, z3), \ + gDefLight(r4, g4, b4, x4, y4, z4), \ + gDefLight(r5, g5, b5, x5, y5, z5), \ + } \ } -#define gdSPDefLights6(ar,ag,ab, \ - r1,g1,b1, \ - x1,y1,z1, \ - r2,g2,b2, \ - x2,y2,z2, \ - r3,g3,b3, \ - x3,y3,z3, \ - r4,g4,b4, \ - x4,y4,z4, \ - r5,g5,b5, \ - x5,y5,z5, \ - r6,g6,b6, \ - x6,y6,z6) \ - { \ - {{ \ - { ar, ag, ab }, 0, \ - { ar, ag, ab }, 0 \ - }}, \ - { \ - {{ \ - { r1, g1, b1 }, 0, \ - { r1, g1, b1 }, 0, \ - { x1, y1, z1 }, 0 \ - }}, \ - {{ \ - { r2, g2, b2 }, 0, \ - { r2, g2, b2 }, 0, \ - { x2, y2, z2 }, 0 \ - }}, \ - {{ \ - { r3, g3, b3 }, 0, \ - { r3, g3, b3 }, 0, \ - { x3, y3, z3 }, 0 \ - }}, \ - {{ \ - { r4, g4, b4 }, 0, \ - { r4, g4, b4 }, 0, \ - { x4, y4, z4 }, 0 \ - }}, \ - {{ \ - { r5, g5, b5 }, 0, \ - { r5, g5, b5 }, 0, \ - { x5, y5, z5 }, 0 \ - }}, \ - {{ \ - { r6, g6, b6 }, 0, \ - { r6, g6, b6 }, 0, \ - { x6, y6, z6 }, 0 \ - }} \ - } \ +#define gdSPDefLights6(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3, \ + r4, g4, b4, x4, y4, z4, \ + r5, g5, b5, x5, y5, z5, \ + r6, g6, b6, x6, y6, z6) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefLight(r1, g1, b1, x1, y1, z1), \ + gDefLight(r2, g2, b2, x2, y2, z2), \ + gDefLight(r3, g3, b3, x3, y3, z3), \ + gDefLight(r4, g4, b4, x4, y4, z4), \ + gDefLight(r5, g5, b5, x5, y5, z5), \ + gDefLight(r6, g6, b6, x6, y6, z6), \ + } \ } -#define gdSPDefLights7(ar,ag,ab, \ - r1,g1,b1, \ - x1,y1,z1, \ - r2,g2,b2, \ - x2,y2,z2, \ - r3,g3,b3, \ - x3,y3,z3, \ - r4,g4,b4, \ - x4,y4,z4, \ - r5,g5,b5, \ - x5,y5,z5, \ - r6,g6,b6, \ - x6,y6,z6, \ - r7,g7,b7, \ - x7,y7,z7) \ - { \ - {{ \ - { ar, ag, ab }, 0, \ - { ar, ag, ab }, 0 \ - }}, \ - { \ - {{ \ - { r1, g1, b1 }, 0, \ - { r1, g1, b1 }, 0, \ - { x1, y1, z1 }, 0 \ - }}, \ - {{ \ - { r2, g2, b2 }, 0, \ - { r2, g2, b2 }, 0, \ - { x2, y2, z2 }, 0 \ - }}, \ - {{ \ - { r3, g3, b3 }, 0, \ - { r3, g3, b3 }, 0, \ - { x3, y3, z3 }, 0 \ - }}, \ - {{ \ - { r4, g4, b4 }, 0, \ - { r4, g4, b4 }, 0, \ - { x4, y4, z4 }, 0 \ - }}, \ - {{ \ - { r5, g5, b5 }, 0, \ - { r5, g5, b5 }, 0, \ - { x5, y5, z5 }, 0 \ - }}, \ - {{ \ - { r6, g6, b6 }, 0, \ - { r6, g6, b6 }, 0, \ - { x6, y6, z6 }, 0 \ - }}, \ - {{ \ - { r7, g7, b7 }, 0, \ - { r7, g7, b7 }, 0, \ - { x7, y7, z7 }, 0 \ - }} \ - } \ +#define gdSPDefLights7(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3, \ + r4, g4, b4, x4, y4, z4, \ + r5, g5, b5, x5, y5, z5, \ + r6, g6, b6, x6, y6, z6) \ + r7, g7, b7, x7, y7, z7) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefLight(r1, g1, b1, x1, y1, z1), \ + gDefLight(r2, g2, b2, x2, y2, z2), \ + gDefLight(r3, g3, b3, x3, y3, z3), \ + gDefLight(r4, g4, b4, x4, y4, z4), \ + gDefLight(r5, g5, b5, x5, y5, z5), \ + gDefLight(r6, g6, b6, x6, y6, z6), \ + gDefLight(r7, g7, b7, x7, y7, z7), \ + } \ } +#ifdef F3DEX_GBI_PL + +#define gDefPointLight(r, g, b, x, y, z, kc, kl, kq) \ + {{ \ + { (r1), (g1), (b1) }, (kc), \ + { (r1), (g1), (b1) }, (kl), \ + { (x1), (y1), (z1) }, (kq), \ + }} \ + +#define gdSPDefPointLights0(ar, ag, ab) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefPointLight(0, 0, 0, 0, 0, 0, 0, 0, 0), \ + } \ + } + +#define gdSPDefPointLights1(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, c1, l1, q1) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \ + } \ + } + +#define gdSPDefPointLights2(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, c1, l1, q1, \ + r2, g2, b2, x2, y2, z2, c2, l2, q2) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \ + gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \ + } \ + } + +#define gdSPDefPointLights3(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, c1, l1, q1, \ + r2, g2, b2, x2, y2, z2, c2, l2, q2) \ + r3, g3, b3, x3, y3, z3, c3, l3, q3) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \ + gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \ + gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \ + } \ + } + +#define gdSPDefPointLights4(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, c1, l1, q1, \ + r2, g2, b2, x2, y2, z2, c2, l2, q2, \ + r3, g3, b3, x3, y3, z3, c3, l3, q3, \ + r4, g4, b4, x4, y4, z4, c4, l4, q4) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \ + gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \ + gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \ + gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \ + } \ + } + +#define gdSPDefPointLights5(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, c1, l1, q1, \ + r2, g2, b2, x2, y2, z2, c2, l2, q2, \ + r3, g3, b3, x3, y3, z3, c3, l3, q3, \ + r4, g4, b4, x4, y4, z4, c4, l4, q4) \ + r5, g5, b5, x5, y5, z5, c5, l5, q5) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \ + gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \ + gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \ + gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \ + gDefPointLight(r5, g5, b5, x5, y5, z5, c5, l5, q5), \ + } \ + } + +#define gdSPDefPointLights6(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, c1, l1, q1, \ + r2, g2, b2, x2, y2, z2, c2, l2, q2, \ + r3, g3, b3, x3, y3, z3, c3, l3, q3, \ + r4, g4, b4, x4, y4, z4, c4, l4, q4) \ + r5, g5, b5, x5, y5, z5, c5, l5, q5) \ + r6, g6, b6, x6, y6, z6, c6, l6, q6) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \ + gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \ + gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \ + gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \ + gDefPointLight(r5, g5, b5, x5, y5, z5, c5, l5, q5), \ + gDefPointLight(r6, g6, b6, x6, y6, z6, c6, l6, q6), \ + } \ + } + +#define gdSPDefPointLights7(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, c1, l1, q1, \ + r2, g2, b2, x2, y2, z2, c2, l2, q2, \ + r3, g3, b3, x3, y3, z3, c3, l3, q3, \ + r4, g4, b4, x4, y4, z4, c4, l4, q4, \ + r5, g5, b5, x5, y5, z5, c5, l5, q5, \ + r6, g6, b6, x6, y6, z6, c6, l6, q6) \ + r7, g7, b7, x7, y7, z7, c7, l7, q7) \ + { \ + gDefAmbient(ar, ag, ab), \ + { \ + gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \ + gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \ + gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \ + gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \ + gDefPointLight(r5, g5, b5, x5, y5, z5, c5, l5, q5), \ + gDefPointLight(r6, g6, b6, x6, y6, z6, c6, l6, q6), \ + gDefPointLight(r7, g7, b7, x7, y7, z7, c7, l7, q7), \ + } \ + } + +#endif + #define gdSPDefLookAt(rightx,righty,rightz,upx,upy,upz) \ {{ \ {{ \