void render(NODE * node, Vector camPos) { Mtx tmp; if(!node->isRenderable()) return;//Skip non-renderable nodes such as empty nodes, regions or lights if(node->flags & F_Visible)//Is it visible? { //Set matrices Mtx aux, inv; GX_ClearVtxDesc(); node->absMtx(modelM); char msg[64]; guMtxConcat(view, modelM, modelview); GX_LoadPosMtxImm(modelview, GX_PNMTX0);//Load model view matrix guMtxInverse(modelview, tmp); guMtxTranspose(tmp,inv); GX_LoadNrmMtxImm(inv, GX_PNMTX0);//Load normal matrix //TODO: Better lighting (multiple lights) std::vector<LIGHT*>::iterator light = mainRoot->getLights().begin(); //if(light == mainRoot->getLights().end()) // REVConsole->write("LIGHT"); GXLightObj lObj[8]; u8 lightMask = 0, tmpLight = GX_LIGHT0; for(u8 i = 0;light != mainRoot->getLights().end(); ++light, ++i) { Vector lpos = (*light)->getPos(); guVecMultiply(view, &lpos, &lpos); GX_InitLightPos(&lObj[i],lpos.x,lpos.y,lpos.z); GX_InitLightAttn(&lObj[i], 1.0f,0.0f,0.0f,1.0f,0.0f,0.0f); GX_InitLightSpot(&lObj[i],0.0f,GX_SP_OFF); GX_InitLightColor(&lObj[i],(*light)->clr); GX_LoadLightObj(&lObj[i],tmpLight); lightMask |= tmpLight; tmpLight *= 2; } //Render the node node->render(lightMask); } }
void SetLight(Mtx view) { guVector lpos; GXLightObj lobj; lpos.x = 0; lpos.y = 0; lpos.z = 2.0f; guVecMultiply(view,&lpos,&lpos); GX_InitLightPos(&lobj,lpos.x,lpos.y,lpos.z); GX_InitLightColor(&lobj,lightColor[0]); GX_LoadLightObj(&lobj,GX_LIGHT0); // set number of rasterized color channels GX_SetNumChans(1); GX_SetChanCtrl(GX_COLOR0A0,GX_ENABLE,GX_SRC_VTX,GX_SRC_VTX,GX_LIGHT0,GX_DF_CLAMP,GX_AF_NONE); GX_SetChanAmbColor(GX_COLOR0A0,lightColor[1]); GX_SetChanMatColor(GX_COLOR0A0,lightColor[2]); }