VideoCommon: use the Light struct in XF memory
This commit is contained in:
parent
e642c8d0c1
commit
027baad73b
|
@ -210,7 +210,7 @@ inline float SafeDivide(float n, float d)
|
||||||
|
|
||||||
void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, Vec3 &lightCol)
|
void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, Vec3 &lightCol)
|
||||||
{
|
{
|
||||||
const LightPointer *light = (const LightPointer*)&xfmem.lights[0x10*lightNum];
|
const LightPointer *light = (const LightPointer*)&xfmem.lights[lightNum];
|
||||||
|
|
||||||
if (!(chan.attnfunc & 1))
|
if (!(chan.attnfunc & 1))
|
||||||
{
|
{
|
||||||
|
@ -295,7 +295,7 @@ void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChann
|
||||||
|
|
||||||
void LightAlpha(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, float &lightCol)
|
void LightAlpha(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, float &lightCol)
|
||||||
{
|
{
|
||||||
const LightPointer *light = (const LightPointer*)&xfmem.lights[0x10*lightNum];
|
const LightPointer *light = (const LightPointer*)&xfmem.lights[lightNum];
|
||||||
|
|
||||||
if (!(chan.attnfunc & 1))
|
if (!(chan.attnfunc & 1))
|
||||||
{
|
{
|
||||||
|
@ -476,7 +476,7 @@ void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool s
|
||||||
break;
|
break;
|
||||||
case XF_TEXGEN_EMBOSS_MAP:
|
case XF_TEXGEN_EMBOSS_MAP:
|
||||||
{
|
{
|
||||||
const LightPointer *light = (const LightPointer*)&xfmem.lights[0x10*texinfo.embosslightshift];
|
const LightPointer *light = (const LightPointer*)&xfmem.lights[texinfo.embosslightshift];
|
||||||
|
|
||||||
Vec3 ldir = (light->pos - dst->mvPosition).normalized();
|
Vec3 ldir = (light->pos - dst->mvPosition).normalized();
|
||||||
float d1 = ldir * dst->normal[1];
|
float d1 = ldir * dst->normal[1];
|
||||||
|
|
|
@ -23,7 +23,7 @@ void XFWritten(u32 transferSize, u32 baseAddress)
|
||||||
// fix lights so invalid values don't trash the lighting computations
|
// fix lights so invalid values don't trash the lighting computations
|
||||||
if (baseAddress <= 0x067f && topAddress >= 0x0604)
|
if (baseAddress <= 0x067f && topAddress >= 0x0604)
|
||||||
{
|
{
|
||||||
u32* x = xfmem.lights;
|
u32* x = (u32*)xfmem.lights;
|
||||||
|
|
||||||
// go through all lights
|
// go through all lights
|
||||||
for (int light = 0; light < 8; light++)
|
for (int light = 0; light < 8; light++)
|
||||||
|
|
|
@ -108,16 +108,15 @@ void PixelShaderManager::SetConstants()
|
||||||
// lights don't have a 1 to 1 mapping, the color component needs to be converted to 4 floats
|
// lights don't have a 1 to 1 mapping, the color component needs to be converted to 4 floats
|
||||||
int istart = nLightsChanged[0] / 0x10;
|
int istart = nLightsChanged[0] / 0x10;
|
||||||
int iend = (nLightsChanged[1] + 15) / 0x10;
|
int iend = (nLightsChanged[1] + 15) / 0x10;
|
||||||
const float* xfmemptr = (const float*)&xfmem.lights[0x10 * istart];
|
|
||||||
|
|
||||||
for (int i = istart; i < iend; ++i)
|
for (int i = istart; i < iend; ++i)
|
||||||
{
|
{
|
||||||
u32 color = *(const u32*)(xfmemptr + 3);
|
const Light& light = xfmem.lights[i];
|
||||||
constants.plight_colors[i][0] = (color >> 24) & 0xFF;
|
constants.plight_colors[i][0] = light.color[3];
|
||||||
constants.plight_colors[i][1] = (color >> 16) & 0xFF;
|
constants.plight_colors[i][1] = light.color[2];
|
||||||
constants.plight_colors[i][2] = (color >> 8) & 0xFF;
|
constants.plight_colors[i][2] = light.color[1];
|
||||||
constants.plight_colors[i][3] = (color) & 0xFF;
|
constants.plight_colors[i][3] = light.color[0];
|
||||||
xfmemptr += 4;
|
const float* xfmemptr = light.cosatt;
|
||||||
|
|
||||||
for (int j = 0; j < 4; ++j, xfmemptr += 3)
|
for (int j = 0; j < 4; ++j, xfmemptr += 3)
|
||||||
{
|
{
|
||||||
|
|
|
@ -247,16 +247,17 @@ void VertexShaderManager::SetConstants()
|
||||||
// lights don't have a 1 to 1 mapping, the color component needs to be converted to 4 floats
|
// lights don't have a 1 to 1 mapping, the color component needs to be converted to 4 floats
|
||||||
int istart = nLightsChanged[0] / 0x10;
|
int istart = nLightsChanged[0] / 0x10;
|
||||||
int iend = (nLightsChanged[1] + 15) / 0x10;
|
int iend = (nLightsChanged[1] + 15) / 0x10;
|
||||||
const float* xfmemptr = (const float*)&xfmem.lights[0x10 * istart];
|
|
||||||
|
|
||||||
for (int i = istart; i < iend; ++i)
|
for (int i = istart; i < iend; ++i)
|
||||||
{
|
{
|
||||||
u32 color = *(const u32*)(xfmemptr + 3);
|
const Light& light = xfmem.lights[i];
|
||||||
constants.light_colors[i][0] = (color >> 24) & 0xFF;
|
|
||||||
constants.light_colors[i][1] = (color >> 16) & 0xFF;
|
// xfmem.light.color is packed as abgr in u8[4], so we have to swap the order
|
||||||
constants.light_colors[i][2] = (color >> 8) & 0xFF;
|
constants.light_colors[i][0] = light.color[3];
|
||||||
constants.light_colors[i][3] = (color) & 0xFF;
|
constants.light_colors[i][1] = light.color[2];
|
||||||
xfmemptr += 4;
|
constants.light_colors[i][2] = light.color[1];
|
||||||
|
constants.light_colors[i][3] = light.color[0];
|
||||||
|
const float* xfmemptr = light.cosatt;
|
||||||
|
|
||||||
for (int j = 0; j < 4; ++j, xfmemptr += 3)
|
for (int j = 0; j < 4; ++j, xfmemptr += 3)
|
||||||
{
|
{
|
||||||
|
|
|
@ -194,13 +194,9 @@ union DualTexInfo
|
||||||
struct Light
|
struct Light
|
||||||
{
|
{
|
||||||
u32 useless[3];
|
u32 useless[3];
|
||||||
u32 color; // rgba
|
u8 color[4];
|
||||||
float a0; // attenuation
|
float cosatt[3]; // cos attenuation
|
||||||
float a1;
|
float distatt[3]; // dist attenuation
|
||||||
float a2;
|
|
||||||
float k0; // k stuff
|
|
||||||
float k1;
|
|
||||||
float k2;
|
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
|
@ -241,7 +237,7 @@ struct XFMemory
|
||||||
u32 normalMatrices[96]; // 0x0400 - 0x045f
|
u32 normalMatrices[96]; // 0x0400 - 0x045f
|
||||||
u32 unk1[160]; // 0x0460 - 0x04ff
|
u32 unk1[160]; // 0x0460 - 0x04ff
|
||||||
u32 postMatrices[256]; // 0x0500 - 0x05ff
|
u32 postMatrices[256]; // 0x0500 - 0x05ff
|
||||||
u32 lights[128]; // 0x0600 - 0x067f
|
Light lights[8]; // 0x0600 - 0x067f
|
||||||
u32 unk2[2432]; // 0x0680 - 0x0fff
|
u32 unk2[2432]; // 0x0680 - 0x0fff
|
||||||
u32 error; // 0x1000
|
u32 error; // 0x1000
|
||||||
u32 diag; // 0x1001
|
u32 diag; // 0x1001
|
||||||
|
|
Loading…
Reference in New Issue