Merge pull request #5895 from lioncash/sw
TransformUnit: Get rid of most pointer casting in TransformColor()
This commit is contained in:
commit
f64b189850
|
@ -5,7 +5,9 @@
|
||||||
#include "VideoBackends/Software/TransformUnit.h"
|
#include "VideoBackends/Software/TransformUnit.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
#include "Common/Assert.h"
|
#include "Common/Assert.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
@ -265,7 +267,7 @@ static float CalculateLightAttn(const LightPointer* light, Vec3* _ldir, const Ve
|
||||||
return attn;
|
return attn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void LightColor(const Vec3& pos, const Vec3& normal, u8 lightNum, LitChannel& chan,
|
static void LightColor(const Vec3& pos, const Vec3& normal, u8 lightNum, const LitChannel& chan,
|
||||||
Vec3& lightCol)
|
Vec3& lightCol)
|
||||||
{
|
{
|
||||||
const LightPointer* light = (const LightPointer*)&xfmem.lights[lightNum];
|
const LightPointer* light = (const LightPointer*)&xfmem.lights[lightNum];
|
||||||
|
@ -322,15 +324,15 @@ void TransformColor(const InputVertexData* src, OutputVertexData* dst)
|
||||||
for (u32 chan = 0; chan < xfmem.numChan.numColorChans; chan++)
|
for (u32 chan = 0; chan < xfmem.numChan.numColorChans; chan++)
|
||||||
{
|
{
|
||||||
// abgr
|
// abgr
|
||||||
u8 matcolor[4];
|
std::array<u8, 4> matcolor;
|
||||||
u8 chancolor[4];
|
std::array<u8, 4> chancolor;
|
||||||
|
|
||||||
// color
|
// color
|
||||||
LitChannel& colorchan = xfmem.color[chan];
|
const LitChannel& colorchan = xfmem.color[chan];
|
||||||
if (colorchan.matsource)
|
if (colorchan.matsource)
|
||||||
*(u32*)matcolor = *(u32*)src->color[chan]; // vertex
|
std::memcpy(matcolor.data(), src->color[chan], sizeof(u32)); // vertex
|
||||||
else
|
else
|
||||||
*(u32*)matcolor = xfmem.matColor[chan];
|
std::memcpy(matcolor.data(), &xfmem.matColor[chan], sizeof(u32));
|
||||||
|
|
||||||
if (colorchan.enablelighting)
|
if (colorchan.enablelighting)
|
||||||
{
|
{
|
||||||
|
@ -344,7 +346,7 @@ void TransformColor(const InputVertexData* src, OutputVertexData* dst)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
u8* ambColor = (u8*)&xfmem.ambColor[chan];
|
const u8* ambColor = reinterpret_cast<u8*>(&xfmem.ambColor[chan]);
|
||||||
lightCol.x = ambColor[1];
|
lightCol.x = ambColor[1];
|
||||||
lightCol.y = ambColor[2];
|
lightCol.y = ambColor[2];
|
||||||
lightCol.z = ambColor[3];
|
lightCol.z = ambColor[3];
|
||||||
|
@ -366,11 +368,11 @@ void TransformColor(const InputVertexData* src, OutputVertexData* dst)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*(u32*)chancolor = *(u32*)matcolor;
|
chancolor = matcolor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// alpha
|
// alpha
|
||||||
LitChannel& alphachan = xfmem.alpha[chan];
|
const LitChannel& alphachan = xfmem.alpha[chan];
|
||||||
if (alphachan.matsource)
|
if (alphachan.matsource)
|
||||||
matcolor[0] = src->color[chan][0]; // vertex
|
matcolor[0] = src->color[chan][0]; // vertex
|
||||||
else
|
else
|
||||||
|
@ -382,7 +384,7 @@ void TransformColor(const InputVertexData* src, OutputVertexData* dst)
|
||||||
if (alphachan.ambsource)
|
if (alphachan.ambsource)
|
||||||
lightCol = src->color[chan][0]; // vertex
|
lightCol = src->color[chan][0]; // vertex
|
||||||
else
|
else
|
||||||
lightCol = (float)(xfmem.ambColor[chan] & 0xff);
|
lightCol = static_cast<float>(xfmem.ambColor[chan] & 0xff);
|
||||||
|
|
||||||
u8 mask = alphachan.GetFullLightMask();
|
u8 mask = alphachan.GetFullLightMask();
|
||||||
for (int i = 0; i < 8; ++i)
|
for (int i = 0; i < 8; ++i)
|
||||||
|
@ -400,7 +402,8 @@ void TransformColor(const InputVertexData* src, OutputVertexData* dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
// abgr -> rgba
|
// abgr -> rgba
|
||||||
*(u32*)dst->color[chan] = Common::swap32(*(u32*)chancolor);
|
const u32 rgba_color = Common::swap32(chancolor.data());
|
||||||
|
std::memcpy(dst->color[chan], &rgba_color, sizeof(u32));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue