Fix fog calculation for additive surfaces

This commit is contained in:
Lwmte 2022-11-04 20:45:34 +02:00
parent e8b5f7d1c6
commit 7fc4055a12
2 changed files with 13 additions and 18 deletions

View file

@ -1133,16 +1133,16 @@ void TriggerWaterfallMist(const ItemInfo& item)
float finalFade = (fadeMin == fadeMax >= 1.0f) ? 1.0f : std::max(fadeMin, fadeMax);
auto startColor = item.Color / 2.0f * finalFade * float(UCHAR_MAX);
auto endColor = item.Color / 4.0f * finalFade * float(UCHAR_MAX);
auto startColor = item.Color / 4.0f * finalFade * float(UCHAR_MAX);
auto endColor = item.Color / 8.0f * finalFade * float(UCHAR_MAX);
float step = size * 0.75f;
float step = size * scale;
int steps = int((width / 2) / step);
int currentStep = 0;
while (true)
{
int offset = (step * currentStep) + (Random::GenerateInt(0, 64) - 32);
int offset = (step * currentStep) + Random::GenerateInt(-32, 32);
if (offset > width)
break;
@ -1152,7 +1152,7 @@ void TriggerWaterfallMist(const ItemInfo& item)
auto* spark = GetFreeParticle();
spark->on = true;
char colorOffset = (Random::GenerateInt(0, 32)) - 16;
char colorOffset = (Random::GenerateInt(-8, 8));
spark->sR = std::clamp(int(startColor.x) + colorOffset, 0, UCHAR_MAX);
spark->sG = std::clamp(int(startColor.y) + colorOffset, 0, UCHAR_MAX);
spark->sB = std::clamp(int(startColor.z) + colorOffset, 0, UCHAR_MAX);
@ -1162,22 +1162,22 @@ void TriggerWaterfallMist(const ItemInfo& item)
spark->colFadeSpeed = 1;
spark->blendMode = BLEND_MODES::BLENDMODE_ADDITIVE;
spark->life = spark->sLife = Random::GenerateInt(0, 16) + 16;
spark->life = spark->sLife = Random::GenerateInt(8, 12);
spark->fadeToBlack = spark->life - 6;
spark->x = offset * sign * sin + Random::GenerateInt(0, 16) + item.Pose.Position.x - 8;
spark->x = offset * sign * sin + Random::GenerateInt(-8, 8) + item.Pose.Position.x;
spark->y = Random::GenerateInt(0, 16) + item.Pose.Position.y - 8;
spark->z = offset * sign * cos + Random::GenerateInt(0, 16) + item.Pose.Position.z - 8;
spark->z = offset * sign * cos + Random::GenerateInt(-8, 8) + item.Pose.Position.z;
spark->xVel = 0;
spark->yVel = Random::GenerateInt(0, 128) + 64;
spark->yVel = Random::GenerateInt(-64, 64);
spark->zVel = 0;
spark->friction = 0;
spark->rotAng = GetRandomControl() & 0xFFF;
spark->scalar = scale;
spark->maxYvel = 0;
spark->rotAdd = Random::GenerateInt(0, 32) - 16;
spark->rotAdd = Random::GenerateInt(-16, 16);
spark->gravity = -spark->yVel >> 2;
spark->sSize = spark->size = Random::GenerateInt(0, 3) * scale + size;
spark->dSize = 2 * spark->size;

View file

@ -46,25 +46,21 @@ float4 DoFog(float4 sourceColor, float4 fogColor, float value)
if (FogMaxDistance == 0)
return sourceColor;
float alphaMult = 1.0f;
switch (BlendMode)
{
case BLENDMODE_ADDITIVE:
case BLENDMODE_SCREEN:
case BLENDMODE_LIGHTEN:
alphaMult = Luma(sourceColor.xyz);
fogColor.w = 0.0f;
fogColor.xyz *= Luma(sourceColor.xyz);
break;
case BLENDMODE_SUBTRACTIVE:
case BLENDMODE_EXCLUDE:
alphaMult = 1.0f - Luma(sourceColor.xyz);
fogColor.w = 0.0f;
fogColor.xyz *= 1.0f - Luma(sourceColor.xyz);
break;
case BLENDMODE_ALPHABLEND:
alphaMult = sourceColor.w;
fogColor.w = sourceColor.w;
break;
default:
@ -75,7 +71,6 @@ float4 DoFog(float4 sourceColor, float4 fogColor, float value)
fogColor.w = sourceColor.w;
float4 result = lerp(sourceColor, fogColor, value);
result.w *= alphaMult;
return result;
}