mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +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:
parent
591eda82ba
commit
dcdf66dc0b
|
@ -254,7 +254,7 @@ void GBIInfo::_makeCurrent(MicrocodeInfo * _pCurrent)
|
||||||
break;
|
break;
|
||||||
case T3DUX:
|
case T3DUX:
|
||||||
F3D_Init();
|
F3D_Init();
|
||||||
m_hwlSupported = true;
|
m_hwlSupported = false;
|
||||||
break;
|
break;
|
||||||
case F3DEX2ACCLAIM:
|
case F3DEX2ACCLAIM:
|
||||||
F3DEX2ACCLAIM_Init();
|
F3DEX2ACCLAIM_Init();
|
||||||
|
|
|
@ -823,7 +823,7 @@ public:
|
||||||
void update(bool _force) override
|
void update(bool _force) override
|
||||||
{
|
{
|
||||||
for (s32 i = 0; i <= gSP.numLights; ++i) {
|
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);
|
uLightColor[i].set(gSP.lights.rgb[i], _force);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -298,11 +298,9 @@ void gSPLightVertex_NEON(u32 vnum, u32 v, SPVertex * spVtx)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for(int j = 0; j < vnum; ++j) {
|
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.HWLight = gSP.numLights;
|
||||||
vtx.r = vtx.nx;
|
|
||||||
vtx.g = vtx.ny;
|
|
||||||
vtx.b = vtx.nz;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
74
src/gSP.cpp
74
src/gSP.cpp
|
@ -500,10 +500,8 @@ void gSPLightVertexStandard(u32 v, SPVertex * spVtx)
|
||||||
} else {
|
} else {
|
||||||
for(int j = 0; j < VNUM; ++j) {
|
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.HWLight = gSP.numLights;
|
||||||
vtx.r = vtx.nx;
|
|
||||||
vtx.g = vtx.ny;
|
|
||||||
vtx.b = vtx.nz;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -881,17 +879,23 @@ u32 gSPLoadVertexData(const Vertex *orgVtx, SPVertex * spVtx, u32 v0, u32 vi, u3
|
||||||
//vtx.flag = vertex->flag;
|
//vtx.flag = vertex->flag;
|
||||||
vtx.s = _FIXED2FLOAT( orgVtx->s, 5 );
|
vtx.s = _FIXED2FLOAT( orgVtx->s, 5 );
|
||||||
vtx.t = _FIXED2FLOAT( orgVtx->t, 5 );
|
vtx.t = _FIXED2FLOAT( orgVtx->t, 5 );
|
||||||
|
|
||||||
if (gSP.geometryMode & G_LIGHTING) {
|
if (gSP.geometryMode & G_LIGHTING) {
|
||||||
vtx.nx = _FIXED2FLOAT( orgVtx->normal.x, 7 );
|
vtx.nx = _FIXED2FLOAT(orgVtx->normal.x, 7);
|
||||||
vtx.ny = _FIXED2FLOAT( orgVtx->normal.y, 7 );
|
vtx.ny = _FIXED2FLOAT(orgVtx->normal.y, 7);
|
||||||
vtx.nz = _FIXED2FLOAT( orgVtx->normal.z, 7 );
|
vtx.nz = _FIXED2FLOAT(orgVtx->normal.z, 7);
|
||||||
vtx.a = orgVtx->color.a * 0.0039215689f;
|
if (isHWLightingAllowed()) {
|
||||||
|
vtx.r = orgVtx->normal.x;
|
||||||
|
vtx.g = orgVtx->normal.y;
|
||||||
|
vtx.b = orgVtx->normal.z;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
vtx.r = orgVtx->color.r * 0.0039215689f;
|
vtx.r = _FIXED2FLOAT(orgVtx->color.r, 8);
|
||||||
vtx.g = orgVtx->color.g * 0.0039215689f;
|
vtx.g = _FIXED2FLOAT(orgVtx->color.g, 8);
|
||||||
vtx.b = orgVtx->color.b * 0.0039215689f;
|
vtx.b = _FIXED2FLOAT(orgVtx->color.b, 8);
|
||||||
vtx.a = orgVtx->color.a * 0.0039215689f;
|
|
||||||
}
|
}
|
||||||
|
vtx.a = _FIXED2FLOAT(orgVtx->color.a, 8);
|
||||||
|
|
||||||
++orgVtx;
|
++orgVtx;
|
||||||
}
|
}
|
||||||
gSPProcessVertex<VNUM>(vi, spVtx);
|
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.nx = _FIXED2FLOAT((s8)color[3], 7);
|
||||||
vtx.ny = _FIXED2FLOAT((s8)color[2], 7);
|
vtx.ny = _FIXED2FLOAT((s8)color[2], 7);
|
||||||
vtx.nz = _FIXED2FLOAT((s8)color[1], 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 {
|
} else {
|
||||||
vtx.r = color[3] * 0.0039215689f;
|
vtx.r = _FIXED2FLOAT(color[3], 8);
|
||||||
vtx.g = color[2] * 0.0039215689f;
|
vtx.g = _FIXED2FLOAT(color[2], 8);
|
||||||
vtx.b = color[1] * 0.0039215689f;
|
vtx.b = _FIXED2FLOAT(color[1], 8);
|
||||||
vtx.a = color[0] * 0.0039215689f;
|
|
||||||
}
|
}
|
||||||
|
vtx.a = _FIXED2FLOAT(color[0], 8);
|
||||||
|
|
||||||
++orgVtx;
|
++orgVtx;
|
||||||
}
|
}
|
||||||
gSPProcessVertex<VNUM>(vi, spVtx);
|
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.y = *(s16*)&RDRAM[(address + 2) ^ 2];
|
||||||
vtx.z = *(s16*)&RDRAM[(address + 4) ^ 2];
|
vtx.z = *(s16*)&RDRAM[(address + 4) ^ 2];
|
||||||
|
|
||||||
if (gSP.geometryMode & G_LIGHTING) {
|
vtx.r = _FIXED2FLOAT((*(u8*)&RDRAM[(address + 6) ^ 3]), 8);
|
||||||
vtx.nx = _FIXED2FLOAT(*(s8*)&RDRAM[(address + 6) ^ 3], 7);
|
vtx.g = _FIXED2FLOAT((*(u8*)&RDRAM[(address + 7) ^ 3]), 8);
|
||||||
vtx.ny = _FIXED2FLOAT(*(s8*)&RDRAM[(address + 7) ^ 3], 7);
|
vtx.b = _FIXED2FLOAT((*(u8*)&RDRAM[(address + 8) ^ 3]), 8);
|
||||||
vtx.nz = _FIXED2FLOAT(*(s8*)&RDRAM[(address + 8) ^ 3], 7);
|
vtx.a = _FIXED2FLOAT((*(u8*)&RDRAM[(address + 9) ^ 3]), 8);
|
||||||
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;
|
|
||||||
}
|
|
||||||
address += 10;
|
address += 10;
|
||||||
}
|
}
|
||||||
gSPProcessVertex<VNUM>(vi, spVtx);
|
gSPProcessVertex<VNUM>(vi, spVtx);
|
||||||
|
@ -1040,15 +1043,6 @@ void gSPDMAVertex( u32 a, u32 n, u32 v0 )
|
||||||
if ((address + 10 * n) > RDRAMSize)
|
if ((address + 10 * n) > RDRAMSize)
|
||||||
return;
|
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);
|
SPVertex * spVtx = dwnd().getDrawer().getVertexPtr(0);
|
||||||
u32 i = gSPLoadDMAVertexData<VEC_OPT>(address, spVtx, v0, v0, n);
|
u32 i = gSPLoadDMAVertexData<VEC_OPT>(address, spVtx, v0, v0, n);
|
||||||
if (i < n + v0)
|
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.ny = _FIXED2FLOAT(((s8*)RDRAM)[(gSP.vertexNormalBase + normaleAddrOffset + 1) ^ 3], 7);
|
||||||
vtx.nz = _FIXED2FLOAT((s8)(orgVtx->flag & 0xFF), 7);
|
vtx.nz = _FIXED2FLOAT((s8)(orgVtx->flag & 0xFF), 7);
|
||||||
}
|
}
|
||||||
vtx.r = orgVtx->color.r * 0.0039215689f;
|
vtx.r = _FIXED2FLOAT(orgVtx->color.r, 8);
|
||||||
vtx.g = orgVtx->color.g * 0.0039215689f;
|
vtx.g = _FIXED2FLOAT(orgVtx->color.g, 8);
|
||||||
vtx.b = orgVtx->color.b * 0.0039215689f;
|
vtx.b = _FIXED2FLOAT(orgVtx->color.b, 8);
|
||||||
vtx.a = orgVtx->color.a * 0.0039215689f;
|
vtx.a = _FIXED2FLOAT(orgVtx->color.a, 8);
|
||||||
++orgVtx;
|
++orgVtx;
|
||||||
}
|
}
|
||||||
gSPProcessVertex<VNUM>(vi, spVtx);
|
gSPProcessVertex<VNUM>(vi, spVtx);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user