mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-11 15:22:16 +00:00
Diminishing light test
This commit is contained in:
parent
9cfee05102
commit
5277d4ae28
1 changed files with 46 additions and 0 deletions
|
@ -864,6 +864,10 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
|
|
||||||
uint32_t subsectorDepth = args->uniforms->subsectorDepth;
|
uint32_t subsectorDepth = args->uniforms->subsectorDepth;
|
||||||
|
|
||||||
|
uint32_t light = args->uniforms->light;
|
||||||
|
float shade = (64.0f - (light * 255 / 256 + 12.0f) * 32.0f / 128.0f) / 32.0f;
|
||||||
|
float globVis = 1706.0f;
|
||||||
|
|
||||||
for (int i = 0; i < NumFullSpans; i++)
|
for (int i = 0; i < NumFullSpans; i++)
|
||||||
{
|
{
|
||||||
const auto &span = FullSpans[i];
|
const auto &span = FullSpans[i];
|
||||||
|
@ -890,6 +894,8 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
|
|
||||||
for (int x = 0; x < width; x++)
|
for (int x = 0; x < width; x++)
|
||||||
{
|
{
|
||||||
|
int lightpos = 256 - (int)(clamp(shade - MIN(24.0f, globVis * blockPosX.W) / 32.0f, 0.0f, 31.0f / 32.0f) * 256.0f);
|
||||||
|
|
||||||
blockPosX.W += gradientX.W * 8;
|
blockPosX.W += gradientX.W * 8;
|
||||||
for (int j = 0; j < TriVertex::NumVarying; j++)
|
for (int j = 0; j < TriVertex::NumVarying; j++)
|
||||||
blockPosX.Varying[j] += gradientX.Varying[j] * 8;
|
blockPosX.Varying[j] += gradientX.Varying[j] * 8;
|
||||||
|
@ -902,17 +908,29 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
varyingStep[j] = (nextPos - varyingPos[j]) / 8;
|
varyingStep[j] = (nextPos - varyingPos[j]) / 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int lightnext = 256 - (int)(clamp(shade - MIN(24.0f, globVis * blockPosX.W) / 32.0f, 0.0f, 31.0f / 32.0f) * 256.0f);
|
||||||
|
int lightstep = (lightnext - lightpos) / 8;
|
||||||
|
|
||||||
for (int ix = 0; ix < 8; ix++)
|
for (int ix = 0; ix < 8; ix++)
|
||||||
{
|
{
|
||||||
int texelX = ((((uint32_t)varyingPos[0] << 8) >> 16) * texWidth) >> 16;
|
int texelX = ((((uint32_t)varyingPos[0] << 8) >> 16) * texWidth) >> 16;
|
||||||
int texelY = ((((uint32_t)varyingPos[1] << 8) >> 16) * texHeight) >> 16;
|
int texelY = ((((uint32_t)varyingPos[1] << 8) >> 16) * texHeight) >> 16;
|
||||||
uint32_t fg = texPixels[texelX * texHeight + texelY];
|
uint32_t fg = texPixels[texelX * texHeight + texelY];
|
||||||
|
|
||||||
|
uint32_t r = RPART(fg);
|
||||||
|
uint32_t g = GPART(fg);
|
||||||
|
uint32_t b = BPART(fg);
|
||||||
|
r = r * lightpos / 256;
|
||||||
|
g = g * lightpos / 256;
|
||||||
|
b = b * lightpos / 256;
|
||||||
|
fg = 0xff000000 | (r << 16) | (g << 8) | b;
|
||||||
|
|
||||||
dest[x * 8 + ix] = fg;
|
dest[x * 8 + ix] = fg;
|
||||||
subsector[x * 8 + ix] = subsectorDepth;
|
subsector[x * 8 + ix] = subsectorDepth;
|
||||||
|
|
||||||
for (int j = 0; j < TriVertex::NumVarying; j++)
|
for (int j = 0; j < TriVertex::NumVarying; j++)
|
||||||
varyingPos[j] += varyingStep[j];
|
varyingPos[j] += varyingStep[j];
|
||||||
|
lightpos += lightstep;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -948,6 +966,8 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
for (int j = 0; j < TriVertex::NumVarying; j++)
|
for (int j = 0; j < TriVertex::NumVarying; j++)
|
||||||
varyingPos[j] = (int32_t)(blockPosX.Varying[j] * rcpW);
|
varyingPos[j] = (int32_t)(blockPosX.Varying[j] * rcpW);
|
||||||
|
|
||||||
|
int lightpos = 256 - (int)(clamp(shade - MIN(24.0f, globVis * blockPosX.W) / 32.0f, 0.0f, 31.0f / 32.0f) * 256.0f);
|
||||||
|
|
||||||
blockPosX.W += gradientX.W * 8;
|
blockPosX.W += gradientX.W * 8;
|
||||||
for (int j = 0; j < TriVertex::NumVarying; j++)
|
for (int j = 0; j < TriVertex::NumVarying; j++)
|
||||||
blockPosX.Varying[j] += gradientX.Varying[j] * 8;
|
blockPosX.Varying[j] += gradientX.Varying[j] * 8;
|
||||||
|
@ -960,6 +980,9 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
varyingStep[j] = (nextPos - varyingPos[j]) / 8;
|
varyingStep[j] = (nextPos - varyingPos[j]) / 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int lightnext = 256 - (int)(clamp(shade - MIN(24.0f, globVis * blockPosX.W) / 32.0f, 0.0f, 31.0f / 32.0f) * 256.0f);
|
||||||
|
int lightstep = (lightnext - lightpos) / 8;
|
||||||
|
|
||||||
for (int x = 0; x < 8; x++)
|
for (int x = 0; x < 8; x++)
|
||||||
{
|
{
|
||||||
if (mask0 & (1 << 31))
|
if (mask0 & (1 << 31))
|
||||||
|
@ -968,6 +991,14 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
int texelY = ((((uint32_t)varyingPos[1] << 8) >> 16) * texHeight) >> 16;
|
int texelY = ((((uint32_t)varyingPos[1] << 8) >> 16) * texHeight) >> 16;
|
||||||
uint32_t fg = texPixels[texelX * texHeight + texelY];
|
uint32_t fg = texPixels[texelX * texHeight + texelY];
|
||||||
|
|
||||||
|
uint32_t r = RPART(fg);
|
||||||
|
uint32_t g = GPART(fg);
|
||||||
|
uint32_t b = BPART(fg);
|
||||||
|
r = r * lightpos / 256;
|
||||||
|
g = g * lightpos / 256;
|
||||||
|
b = b * lightpos / 256;
|
||||||
|
fg = 0xff000000 | (r << 16) | (g << 8) | b;
|
||||||
|
|
||||||
dest[x] = fg;
|
dest[x] = fg;
|
||||||
subsector[x] = subsectorDepth;
|
subsector[x] = subsectorDepth;
|
||||||
}
|
}
|
||||||
|
@ -975,6 +1006,7 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
|
|
||||||
for (int j = 0; j < TriVertex::NumVarying; j++)
|
for (int j = 0; j < TriVertex::NumVarying; j++)
|
||||||
varyingPos[j] += varyingStep[j];
|
varyingPos[j] += varyingStep[j];
|
||||||
|
lightpos += lightstep;
|
||||||
}
|
}
|
||||||
|
|
||||||
blockPosY.W += gradientY.W;
|
blockPosY.W += gradientY.W;
|
||||||
|
@ -993,6 +1025,8 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
for (int j = 0; j < TriVertex::NumVarying; j++)
|
for (int j = 0; j < TriVertex::NumVarying; j++)
|
||||||
varyingPos[j] = (int32_t)(blockPosX.Varying[j] * rcpW);
|
varyingPos[j] = (int32_t)(blockPosX.Varying[j] * rcpW);
|
||||||
|
|
||||||
|
int lightpos = 256 - (int)(clamp(shade - MIN(24.0f, globVis * blockPosX.W) / 32.0f, 0.0f, 31.0f / 32.0f) * 256.0f);
|
||||||
|
|
||||||
blockPosX.W += gradientX.W * 8;
|
blockPosX.W += gradientX.W * 8;
|
||||||
for (int j = 0; j < TriVertex::NumVarying; j++)
|
for (int j = 0; j < TriVertex::NumVarying; j++)
|
||||||
blockPosX.Varying[j] += gradientX.Varying[j] * 8;
|
blockPosX.Varying[j] += gradientX.Varying[j] * 8;
|
||||||
|
@ -1005,6 +1039,9 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
varyingStep[j] = (nextPos - varyingPos[j]) / 8;
|
varyingStep[j] = (nextPos - varyingPos[j]) / 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int lightnext = 256 - (int)(clamp(shade - MIN(24.0f, globVis * blockPosX.W) / 32.0f, 0.0f, 31.0f / 32.0f) * 256.0f);
|
||||||
|
int lightstep = (lightnext - lightpos) / 8;
|
||||||
|
|
||||||
for (int x = 0; x < 8; x++)
|
for (int x = 0; x < 8; x++)
|
||||||
{
|
{
|
||||||
if (mask1 & (1 << 31))
|
if (mask1 & (1 << 31))
|
||||||
|
@ -1013,6 +1050,14 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
int texelY = ((((uint32_t)varyingPos[1] << 8) >> 16) * texHeight) >> 16;
|
int texelY = ((((uint32_t)varyingPos[1] << 8) >> 16) * texHeight) >> 16;
|
||||||
uint32_t fg = texPixels[texelX * texHeight + texelY];
|
uint32_t fg = texPixels[texelX * texHeight + texelY];
|
||||||
|
|
||||||
|
uint32_t r = RPART(fg);
|
||||||
|
uint32_t g = GPART(fg);
|
||||||
|
uint32_t b = BPART(fg);
|
||||||
|
r = r * lightpos / 256;
|
||||||
|
g = g * lightpos / 256;
|
||||||
|
b = b * lightpos / 256;
|
||||||
|
fg = 0xff000000 | (r << 16) | (g << 8) | b;
|
||||||
|
|
||||||
dest[x] = fg;
|
dest[x] = fg;
|
||||||
subsector[x] = subsectorDepth;
|
subsector[x] = subsectorDepth;
|
||||||
}
|
}
|
||||||
|
@ -1020,6 +1065,7 @@ void ScreenTriangle::Draw(const TriDrawTriangleArgs *args)
|
||||||
|
|
||||||
for (int j = 0; j < TriVertex::NumVarying; j++)
|
for (int j = 0; j < TriVertex::NumVarying; j++)
|
||||||
varyingPos[j] += varyingStep[j];
|
varyingPos[j] += varyingStep[j];
|
||||||
|
lightpos += lightstep;
|
||||||
}
|
}
|
||||||
|
|
||||||
blockPosY.W += gradientY.W;
|
blockPosY.W += gradientY.W;
|
||||||
|
|
Loading…
Reference in a new issue