static void set_lighting(void) { /* create light */ z64_gbi_lights_t *gbi_lights = gDisplayListAlloc(&z64_ctxt.gfx->poly_opa.d, sizeof(z64_gbi_lights_t)); gbi_lights->numlights = 0; Ambient *a = &gbi_lights->lites.a; a->l.col[0] = a->l.colc[0] = z64_game.lighting.ambient[0]; a->l.col[1] = a->l.colc[1] = z64_game.lighting.ambient[1]; a->l.col[2] = a->l.colc[2] = z64_game.lighting.ambient[2]; /* fill light */ for (z64_light_node_t *light_node = z64_game.lighting.light_list; light_node; light_node = light_node->next) { z64_light_handler_t handler = z64_light_handlers[light_node->light->type]; handler(gbi_lights, &light_node->light->lightn, NULL); } /* set light */ gSPNumLights(z64_ctxt.gfx->poly_opa.p++, gbi_lights->numlights); gSPNumLights(z64_ctxt.gfx->poly_xlu.p++, gbi_lights->numlights); for (int i = 0; i < gbi_lights->numlights; ++i) { gSPLight(z64_ctxt.gfx->poly_opa.p++, &gbi_lights->lites.l[i], i + 1); gSPLight(z64_ctxt.gfx->poly_xlu.p++, &gbi_lights->lites.l[i], i + 1); } gSPLight(z64_ctxt.gfx->poly_opa.p++, &gbi_lights->lites.a, gbi_lights->numlights + 1); gSPLight(z64_ctxt.gfx->poly_xlu.p++, &gbi_lights->lites.a, gbi_lights->numlights + 1); }
void F3DEX2CBFD_MoveWord( u32 w0, u32 w1 ) { switch (_SHIFTR( w0, 16, 8 )) { case G_MW_NUMLIGHT: gSPNumLights(w1 / 48); break; case G_MW_CLIP: gSPClipRatio( w1 ); break; case G_MW_SEGMENT: gSPSegment( _SHIFTR( w0, 0, 16 ) >> 2, w1 & 0x00FFFFFF ); break; case G_MW_FOG: gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) ); break; case G_MW_PERSPNORM: gSPPerspNormalize( w1 ); break; case G_MV_COORDMOD: gSPCoordMod( w0, w1 ); break; } }
void F3DCBFD_MoveWord( u32 w0, u32 w1 ) { switch (_SHIFTR( w0, 16, 8 )) { case G_MW_NUMLIGHT: gSPNumLights( w1 / 48 ); break; default: F3DEX2_MoveWord( w0, w1 ); break; } }