Merge pull request #4601 from stenzek/celdamage-lighting
ShaderGen: Always calculate lighting for both color channels
This commit is contained in:
commit
066471be07
|
@ -321,7 +321,7 @@ static void LightAlpha(const Vec3& pos, const Vec3& normal, u8 lightNum, const L
|
|||
|
||||
void TransformColor(const InputVertexData* src, OutputVertexData* dst)
|
||||
{
|
||||
for (u32 chan = 0; chan < xfmem.numChan.numColorChans; chan++)
|
||||
for (u32 chan = 0; chan < NUM_XF_COLOR_CHANNELS; chan++)
|
||||
{
|
||||
// abgr
|
||||
std::array<u8, 4> matcolor;
|
||||
|
|
|
@ -79,9 +79,9 @@ static void GenerateLightShader(ShaderCode& object, const LightingUidData& uid_d
|
|||
// inColorName is color in vs and colors_ in ps
|
||||
// dest is o.colors_ in vs and colors_ in ps
|
||||
void GenerateLightingShaderCode(ShaderCode& object, const LightingUidData& uid_data, int components,
|
||||
u32 numColorChans, const char* inColorName, const char* dest)
|
||||
const char* inColorName, const char* dest)
|
||||
{
|
||||
for (unsigned int j = 0; j < numColorChans; j++)
|
||||
for (unsigned int j = 0; j < NUM_XF_COLOR_CHANNELS; j++)
|
||||
{
|
||||
object.Write("{\n");
|
||||
|
||||
|
@ -185,7 +185,7 @@ void GenerateLightingShaderCode(ShaderCode& object, const LightingUidData& uid_d
|
|||
|
||||
void GetLightingShaderUid(LightingUidData& uid_data)
|
||||
{
|
||||
for (unsigned int j = 0; j < xfmem.numChan.numColorChans; j++)
|
||||
for (unsigned int j = 0; j < NUM_XF_COLOR_CHANNELS; j++)
|
||||
{
|
||||
uid_data.matsource |= xfmem.color[j].matsource << j;
|
||||
uid_data.matsource |= xfmem.alpha[j].matsource << (j + 2);
|
||||
|
|
|
@ -45,5 +45,5 @@ static const char s_lighting_struct[] = "struct Light {\n"
|
|||
"};\n";
|
||||
|
||||
void GenerateLightingShaderCode(ShaderCode& object, const LightingUidData& uid_data, int components,
|
||||
u32 numColorChans, const char* inColorName, const char* dest);
|
||||
const char* inColorName, const char* dest);
|
||||
void GetLightingShaderUid(LightingUidData& uid_data);
|
||||
|
|
|
@ -643,7 +643,7 @@ ShaderCode GeneratePixelShaderCode(APIType ApiType, const ShaderHostConfig& host
|
|||
// out.SetConstantsUsed(C_PLIGHTS, C_PLIGHTS+31); // TODO: Can be optimized further
|
||||
// out.SetConstantsUsed(C_PMATERIALS, C_PMATERIALS+3);
|
||||
GenerateLightingShaderCode(out, uid_data->lighting, uid_data->components << VB_COL_SHIFT,
|
||||
uid_data->numColorChans, "colors_", "col");
|
||||
"colors_", "col");
|
||||
}
|
||||
|
||||
// HACK to handle cases where the tex gen is not enabled
|
||||
|
|
|
@ -94,8 +94,8 @@ void WriteVertexLighting(ShaderCode& out, APIType api_type, const char* world_po
|
|||
const char* out_color_1_var)
|
||||
{
|
||||
out.Write("// Lighting\n");
|
||||
out.Write("%sfor (uint chan = 0u; chan < xfmem_numColorChans; chan++) {\n",
|
||||
api_type == APIType::D3D ? "[loop] " : "");
|
||||
out.Write("%sfor (uint chan = 0u; chan < %zu; chan++) {\n",
|
||||
api_type == APIType::D3D ? "[loop] " : "", NUM_XF_COLOR_CHANNELS);
|
||||
out.Write(" uint colorreg = xfmem_color(chan);\n"
|
||||
" uint alphareg = xfmem_alpha(chan);\n"
|
||||
" int4 mat = " I_MATERIALS "[chan + 2u]; \n"
|
||||
|
@ -196,8 +196,5 @@ void WriteVertexLighting(ShaderCode& out, APIType api_type, const char* world_po
|
|||
out.Write(" }\n"
|
||||
"}\n"
|
||||
"\n");
|
||||
|
||||
out.Write("if (xfmem_numColorChans < 2u && (components & %uu) == 0u)\n", VB_HAS_COL1);
|
||||
out.Write(" %s = %s;\n\n", out_color_1_var, out_color_0_var);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -171,6 +171,19 @@ ShaderCode GenVertexShader(APIType ApiType, const ShaderHostConfig& host_config,
|
|||
if (numTexgen > 0)
|
||||
GenVertexShaderTexGens(ApiType, numTexgen, out);
|
||||
|
||||
out.Write("if (xfmem_numColorChans == 0u) {\n");
|
||||
out.Write(" if ((components & %uu) != 0u)\n", VB_HAS_COL0);
|
||||
out.Write(" o.colors_0 = rawcolor0;\n");
|
||||
out.Write(" else\n");
|
||||
out.Write(" o.colors_1 = float4(1.0, 1.0, 1.0, 1.0);\n");
|
||||
out.Write("}\n");
|
||||
out.Write("if (xfmem_numColorChans < 2u) {\n");
|
||||
out.Write(" if ((components & %uu) != 0u)\n", VB_HAS_COL1);
|
||||
out.Write(" o.colors_0 = rawcolor1;\n");
|
||||
out.Write(" else\n");
|
||||
out.Write(" o.colors_1 = float4(1.0, 1.0, 1.0, 1.0);\n");
|
||||
out.Write("}\n");
|
||||
|
||||
// clipPos/w needs to be done in pixel shader, not here
|
||||
out.Write("o.clipPos = o.pos;\n");
|
||||
|
||||
|
|
|
@ -239,24 +239,8 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const ShaderHostConfig& ho
|
|||
"float3 ldir, h, cosAttn, distAttn;\n"
|
||||
"float dist, dist2, attn;\n");
|
||||
|
||||
if (uid_data->numColorChans == 0)
|
||||
{
|
||||
if (uid_data->components & VB_HAS_COL0)
|
||||
out.Write("o.colors_0 = rawcolor0;\n");
|
||||
else
|
||||
out.Write("o.colors_0 = float4(1.0, 1.0, 1.0, 1.0);\n");
|
||||
}
|
||||
|
||||
GenerateLightingShaderCode(out, uid_data->lighting, uid_data->components, uid_data->numColorChans,
|
||||
"rawcolor", "o.colors_");
|
||||
|
||||
if (uid_data->numColorChans < 2)
|
||||
{
|
||||
if (uid_data->components & VB_HAS_COL1)
|
||||
out.Write("o.colors_1 = rawcolor1;\n");
|
||||
else
|
||||
out.Write("o.colors_1 = o.colors_0;\n");
|
||||
}
|
||||
GenerateLightingShaderCode(out, uid_data->lighting, uid_data->components, "rawcolor",
|
||||
"o.colors_");
|
||||
|
||||
// transform texcoords
|
||||
out.Write("float4 coord = float4(0.0, 0.0, 1.0, 1.0);\n");
|
||||
|
@ -398,6 +382,21 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const ShaderHostConfig& ho
|
|||
out.Write("}\n");
|
||||
}
|
||||
|
||||
if (uid_data->numColorChans == 0)
|
||||
{
|
||||
if (uid_data->components & VB_HAS_COL0)
|
||||
out.Write("o.colors_0 = rawcolor0;\n");
|
||||
else
|
||||
out.Write("o.colors_0 = float4(1.0, 1.0, 1.0, 1.0);\n");
|
||||
}
|
||||
if (uid_data->numColorChans < 2)
|
||||
{
|
||||
if (uid_data->components & VB_HAS_COL1)
|
||||
out.Write("o.colors_1 = rawcolor1;\n");
|
||||
else
|
||||
out.Write("o.colors_1 = o.colors_0;\n");
|
||||
}
|
||||
|
||||
// clipPos/w needs to be done in pixel shader, not here
|
||||
out.Write("o.clipPos = o.pos;\n");
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
|
||||
class DataReader;
|
||||
|
||||
constexpr size_t NUM_XF_COLOR_CHANNELS = 2;
|
||||
|
||||
// Lighting
|
||||
|
||||
// Projection
|
||||
|
@ -266,10 +268,10 @@ struct XFMemory
|
|||
u32 perf1; // 0x1007
|
||||
INVTXSPEC hostinfo; // 0x1008 number of textures,colors,normals from vertex input
|
||||
NumColorChannel numChan; // 0x1009
|
||||
u32 ambColor[2]; // 0x100a, 0x100b
|
||||
u32 matColor[2]; // 0x100c, 0x100d
|
||||
LitChannel color[2]; // 0x100e, 0x100f
|
||||
LitChannel alpha[2]; // 0x1010, 0x1011
|
||||
u32 ambColor[NUM_XF_COLOR_CHANNELS]; // 0x100a, 0x100b
|
||||
u32 matColor[NUM_XF_COLOR_CHANNELS]; // 0x100c, 0x100d
|
||||
LitChannel color[NUM_XF_COLOR_CHANNELS]; // 0x100e, 0x100f
|
||||
LitChannel alpha[NUM_XF_COLOR_CHANNELS]; // 0x1010, 0x1011
|
||||
DualTexInfo dualTexTrans; // 0x1012
|
||||
u32 unk3; // 0x1013
|
||||
u32 unk4; // 0x1014
|
||||
|
|
Loading…
Reference in New Issue