1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Fix hardware lighting. It was broken when lighting method was rewritten in 6af6e2c17f

Hardware lighting is incompatible with new lighting method.
Model matrix may be different for different vartices, but only latest state of inverted light vectors are loaded to shader.
Thus I reverted calculations of data for hardware lighting.

Minor code cleanup.

Fixed: Zelda OOT, bad lighting with HW per pixel lighting #1652
This commit is contained in:
Sergey Lipskiy 2017-11-11 15:06:12 +07:00
parent 591eda82ba
commit dcdf66dc0b
4 changed files with 38 additions and 46 deletions

View File

@ -254,7 +254,7 @@ void GBIInfo::_makeCurrent(MicrocodeInfo * _pCurrent)
break;
case T3DUX:
F3D_Init();
m_hwlSupported = true;
m_hwlSupported = false;
break;
case F3DEX2ACCLAIM:
F3DEX2ACCLAIM_Init();

View File

@ -823,7 +823,7 @@ public:
void update(bool _force) override
{
for (s32 i = 0; i <= gSP.numLights; ++i) {
uLightDirection[i].set(gSP.lights.i_xyz[i], _force);
uLightDirection[i].set(gSP.lights.xyz[i], _force);
uLightColor[i].set(gSP.lights.rgb[i], _force);
}
}

View File

@ -298,11 +298,9 @@ void gSPLightVertex_NEON(u32 vnum, u32 v, SPVertex * spVtx)
}
} else {
for(int j = 0; j < vnum; ++j) {
SPVertex & vtx = spVtx[v + j];
SPVertex & vtx = spVtx[v+j];
TransformVectorNormalize(&vtx.r, gSP.matrix.modelView[gSP.matrix.modelViewi]);
vtx.HWLight = gSP.numLights;
vtx.r = vtx.nx;
vtx.g = vtx.ny;
vtx.b = vtx.nz;
}
}
}

View File

@ -500,10 +500,8 @@ void gSPLightVertexStandard(u32 v, SPVertex * spVtx)
} else {
for(int j = 0; j < VNUM; ++j) {
SPVertex & vtx = spVtx[v+j];
TransformVectorNormalize(&vtx.r, gSP.matrix.modelView[gSP.matrix.modelViewi]);
vtx.HWLight = gSP.numLights;
vtx.r = vtx.nx;
vtx.g = vtx.ny;
vtx.b = vtx.nz;
}
}
#else
@ -881,17 +879,23 @@ u32 gSPLoadVertexData(const Vertex *orgVtx, SPVertex * spVtx, u32 v0, u32 vi, u3
//vtx.flag = vertex->flag;
vtx.s = _FIXED2FLOAT( orgVtx->s, 5 );
vtx.t = _FIXED2FLOAT( orgVtx->t, 5 );
if (gSP.geometryMode & G_LIGHTING) {
vtx.nx = _FIXED2FLOAT( orgVtx->normal.x, 7 );
vtx.ny = _FIXED2FLOAT( orgVtx->normal.y, 7 );
vtx.nz = _FIXED2FLOAT( orgVtx->normal.z, 7 );
vtx.a = orgVtx->color.a * 0.0039215689f;
vtx.nx = _FIXED2FLOAT(orgVtx->normal.x, 7);
vtx.ny = _FIXED2FLOAT(orgVtx->normal.y, 7);
vtx.nz = _FIXED2FLOAT(orgVtx->normal.z, 7);
if (isHWLightingAllowed()) {
vtx.r = orgVtx->normal.x;
vtx.g = orgVtx->normal.y;
vtx.b = orgVtx->normal.z;
}
} else {
vtx.r = orgVtx->color.r * 0.0039215689f;
vtx.g = orgVtx->color.g * 0.0039215689f;
vtx.b = orgVtx->color.b * 0.0039215689f;
vtx.a = orgVtx->color.a * 0.0039215689f;
vtx.r = _FIXED2FLOAT(orgVtx->color.r, 8);
vtx.g = _FIXED2FLOAT(orgVtx->color.g, 8);
vtx.b = _FIXED2FLOAT(orgVtx->color.b, 8);
}
vtx.a = _FIXED2FLOAT(orgVtx->color.a, 8);
++orgVtx;
}
gSPProcessVertex<VNUM>(vi, spVtx);
@ -950,13 +954,18 @@ u32 gSPLoadCIVertexData(const PDVertex *orgVtx, SPVertex * spVtx, u32 v0, u32 vi
vtx.nx = _FIXED2FLOAT((s8)color[3], 7);
vtx.ny = _FIXED2FLOAT((s8)color[2], 7);
vtx.nz = _FIXED2FLOAT((s8)color[1], 7);
vtx.a = color[0] * 0.0039215689f;
if (isHWLightingAllowed()) {
vtx.r = (s8)color[3];
vtx.g = (s8)color[2];
vtx.b = (s8)color[1];
}
} else {
vtx.r = color[3] * 0.0039215689f;
vtx.g = color[2] * 0.0039215689f;
vtx.b = color[1] * 0.0039215689f;
vtx.a = color[0] * 0.0039215689f;
vtx.r = _FIXED2FLOAT(color[3], 8);
vtx.g = _FIXED2FLOAT(color[2], 8);
vtx.b = _FIXED2FLOAT(color[1], 8);
}
vtx.a = _FIXED2FLOAT(color[0], 8);
++orgVtx;
}
gSPProcessVertex<VNUM>(vi, spVtx);
@ -1007,17 +1016,11 @@ u32 gSPLoadDMAVertexData(u32 address, SPVertex * spVtx, u32 v0, u32 vi, u32 n)
vtx.y = *(s16*)&RDRAM[(address + 2) ^ 2];
vtx.z = *(s16*)&RDRAM[(address + 4) ^ 2];
if (gSP.geometryMode & G_LIGHTING) {
vtx.nx = _FIXED2FLOAT(*(s8*)&RDRAM[(address + 6) ^ 3], 7);
vtx.ny = _FIXED2FLOAT(*(s8*)&RDRAM[(address + 7) ^ 3], 7);
vtx.nz = _FIXED2FLOAT(*(s8*)&RDRAM[(address + 8) ^ 3], 7);
vtx.a = *(u8*)&RDRAM[(address + 9) ^ 3] * 0.0039215689f;
} else {
vtx.r = *(u8*)&RDRAM[(address + 6) ^ 3] * 0.0039215689f;
vtx.g = *(u8*)&RDRAM[(address + 7) ^ 3] * 0.0039215689f;
vtx.b = *(u8*)&RDRAM[(address + 8) ^ 3] * 0.0039215689f;
vtx.a = *(u8*)&RDRAM[(address + 9) ^ 3] * 0.0039215689f;
}
vtx.r = _FIXED2FLOAT((*(u8*)&RDRAM[(address + 6) ^ 3]), 8);
vtx.g = _FIXED2FLOAT((*(u8*)&RDRAM[(address + 7) ^ 3]), 8);
vtx.b = _FIXED2FLOAT((*(u8*)&RDRAM[(address + 8) ^ 3]), 8);
vtx.a = _FIXED2FLOAT((*(u8*)&RDRAM[(address + 9) ^ 3]), 8);
address += 10;
}
gSPProcessVertex<VNUM>(vi, spVtx);
@ -1040,15 +1043,6 @@ void gSPDMAVertex( u32 a, u32 n, u32 v0 )
if ((address + 10 * n) > RDRAMSize)
return;
if ((gSP.geometryMode & G_LIGHTING) != 0) {
if ((gSP.changed & CHANGED_LIGHT) != 0)
gSPUpdateLightVectors();
if (((gSP.geometryMode & G_TEXTURE_GEN) != 0) && ((gSP.changed & CHANGED_LOOKAT) != 0))
gSPUpdateLookatVectors();
}
SPVertex * spVtx = dwnd().getDrawer().getVertexPtr(0);
u32 i = gSPLoadDMAVertexData<VEC_OPT>(address, spVtx, v0, v0, n);
if (i < n + v0)
@ -1073,10 +1067,10 @@ u32 gSPLoadCBFDVertexData(const Vertex *orgVtx, SPVertex * spVtx, u32 v0, u32 vi
vtx.ny = _FIXED2FLOAT(((s8*)RDRAM)[(gSP.vertexNormalBase + normaleAddrOffset + 1) ^ 3], 7);
vtx.nz = _FIXED2FLOAT((s8)(orgVtx->flag & 0xFF), 7);
}
vtx.r = orgVtx->color.r * 0.0039215689f;
vtx.g = orgVtx->color.g * 0.0039215689f;
vtx.b = orgVtx->color.b * 0.0039215689f;
vtx.a = orgVtx->color.a * 0.0039215689f;
vtx.r = _FIXED2FLOAT(orgVtx->color.r, 8);
vtx.g = _FIXED2FLOAT(orgVtx->color.g, 8);
vtx.b = _FIXED2FLOAT(orgVtx->color.b, 8);
vtx.a = _FIXED2FLOAT(orgVtx->color.a, 8);
++orgVtx;
}
gSPProcessVertex<VNUM>(vi, spVtx);