RwReal *_rwSkyLightFillPos; RwUInt32 _rwSkyLightQWordsWritten; RwUInt128 _rwSkyLightBuffer[1+rwPS2ALLMAXLIGHTBUFFERSIZE]; void RxPipelineNodePS2AllApplyLight(const RpLight *light, const RwMatrix *inverseMat, RwReal invScale, RwReal recipInvScale) { RwV3d *pos, *at; RwFrame *frame; RwRGBAReal *color; if(_rwSkyLightQWordsWritten >= rwPS2ALLMAXLIGHTBUFFERSIZE-4) return; if(_rwSkyLightQWordsWritten == 0){ if(inverseMat){ *_rwSkyLightFillPos++ = inverseMat->right.x; *_rwSkyLightFillPos++ = inverseMat->right.y; *_rwSkyLightFillPos++ = inverseMat->right.z; *_rwSkyLightFillPos++ = invScale; *_rwSkyLightFillPos++ = inverseMat->up.x; *_rwSkyLightFillPos++ = inverseMat->up.y; *_rwSkyLightFillPos++ = inverseMat->up.z; *_rwSkyLightFillPos++ = invScale; *_rwSkyLightFillPos++ = inverseMat->at.x; *_rwSkyLightFillPos++ = inverseMat->at.y; *_rwSkyLightFillPos++ = inverseMat->at.z; *_rwSkyLightFillPos++ = invScale; *_rwSkyLightFillPos++ = inverseMat->pos.x; *_rwSkyLightFillPos++ = inverseMat->pos.y; *_rwSkyLightFillPos++ = inverseMat->pos.z; *_rwSkyLightFillPos++ = recipInvScale; }else{ *_rwSkyLightFillPos++ = 1.0f; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = invScale; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = 1.0f; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = invScale; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = 1.0f; *_rwSkyLightFillPos++ = invScale; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = 0.0f; *_rwSkyLightFillPos++ = recipInvScale; } _rwSkyLightQWordsWritten += 4; } color = RpLightGetColor(light); if(frame = RpLightGetFrame(light)){ pos = &RwFrameGetLTM(frame)->pos; at = &RwFrameGetLTM(frame)->at; }else{ pos = NULL; at = NULL; } _rwSkyLightFillPos[0] = color->red; _rwSkyLightFillPos[1] = color->green; _rwSkyLightFillPos[2] = color->blue; ((int32*)_rwSkyLightFillPos)[3] = RpLightGetType(light); switch(RpLightGetType(light)){ case rpLIGHTDIRECTIONAL: _rwSkyLightFillPos += 4; *_rwSkyLightFillPos++ = at->x; *_rwSkyLightFillPos++ = at->y; *_rwSkyLightFillPos++ = at->z; *_rwSkyLightFillPos++ = 0.0f; _rwSkyLightQWordsWritten += 2; break; case rpLIGHTAMBIENT: _rwSkyLightFillPos += 4; _rwSkyLightQWordsWritten++; break; case rpLIGHTPOINT: _rwSkyLightFillPos += 4; *_rwSkyLightFillPos++ = pos->x; *_rwSkyLightFillPos++ = pos->y; *_rwSkyLightFillPos++ = pos->z; *_rwSkyLightFillPos++ = RpLightGetRadius(light); _rwSkyLightQWordsWritten += 2; break; case rpLIGHTSPOT: case rpLIGHTSPOTSOFT: _rwSkyLightFillPos += 4; *_rwSkyLightFillPos++ = pos->x; *_rwSkyLightFillPos++ = pos->y; *_rwSkyLightFillPos++ = pos->z; *_rwSkyLightFillPos++ = RpLightGetRadius(light); *_rwSkyLightFillPos++ = at->x; *_rwSkyLightFillPos++ = at->y; *_rwSkyLightFillPos++ = at->z; *_rwSkyLightFillPos++ = light->minusCosAngle; _rwSkyLightQWordsWritten += 3; break; } }