TINYGL,GRIM: Replace custom shadows to stencil buffer solution

This commit is contained in:
Paweł Kołodziejski 2021-12-10 18:37:24 +01:00
parent 0e4075ff77
commit c66ca22cbb
No known key found for this signature in database
GPG key ID: 0BDADC9E74440FF7
15 changed files with 77 additions and 265 deletions

View file

@ -98,17 +98,12 @@ FORCEINLINE void FrameBuffer::putPixelDepth(FrameBuffer *buffer, int buf, unsign
return;
}
}
if (kDepthWrite && buffer->compareDepth(z, pz[_a])) {
pz[_a] = z;
bool depthTestResult = buffer->compareDepth(z, pz[_a]);
if (kStencilEnabled) {
stencilOp(true, depthTestResult, ps + _a);
}
z += dzdx;
}
template <bool kDepthWrite, bool kAlphaTestEnabled, bool kEnableScissor, bool kBlendingEnabled>
FORCEINLINE void FrameBuffer::putPixelShadow(FrameBuffer *buffer, int buf, unsigned int *pz, int _a, int x, int y, unsigned int &z,
unsigned int &r, unsigned int &g, unsigned int &b, int &dzdx, unsigned char *pm) {
if ((!kEnableScissor || !buffer->scissorPixel(x + _a, y)) && buffer->compareDepth(z, pz[_a]) && pm[_a]) {
buffer->writePixel<kAlphaTestEnabled, kBlendingEnabled, kDepthWrite>(buf + _a, 255, r >> (ZB_POINT_RED_BITS - 8), g >> (ZB_POINT_GREEN_BITS - 8), b >> (ZB_POINT_BLUE_BITS - 8), z);
if (kDepthWrite && depthTestResult) {
pz[_a] = z;
}
z += dzdx;
}
@ -167,7 +162,6 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
ZBufferPoint *tp, *pr1 = 0, *pr2 = 0, *l1 = 0, *l2 = 0;
float fdx1, fdx2, fdy1, fdy2, fz0, d1, d2;
uint *pz1 = nullptr;
byte *pm1 = nullptr;
byte *ps1 = nullptr;
int part, update_left = 1, update_right = 1;
@ -299,15 +293,6 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
}
switch (kDrawLogic) {
case DRAW_SHADOW_MASK:
pm1 = _shadowMaskBuf + p0->y * _pbufWidth;
break;
case DRAW_SHADOW:
pm1 = _shadowMaskBuf + p0->y * _pbufWidth;
r1 = _shadowColorR;
g1 = _shadowColorG;
b1 = _shadowColorB;
break;
case DRAW_DEPTH_ONLY:
break;
case DRAW_FLAT:
@ -424,8 +409,7 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
while (nb_lines > 0) {
int x = x1;
{
if (kDrawLogic == DRAW_DEPTH_ONLY ||
(kDrawLogic == DRAW_FLAT && !(kInterpST || kInterpSTZ))) {
if (kDrawLogic == DRAW_DEPTH_ONLY || (kDrawLogic == DRAW_FLAT && !(kInterpST || kInterpSTZ))) {
int pp;
int n;
unsigned int *pz;
@ -489,62 +473,6 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
n -= 1;
x += 1;
}
} else if (kDrawLogic == DRAW_SHADOW_MASK) {
unsigned char *pm;
int n;
n = (x2 >> 16) - x1;
pm = pm1 + x1;
while (n >= 3) {
pm[0] = 0xff;
pm[1] = 0xff;
pm[2] = 0xff;
pm[3] = 0xff;
pm += 4;
n -= 4;
x += 4;
}
while (n >= 0) {
pm[0] = 0xff;
pm += 1;
n -= 1;
x += 1;
}
} else if (kDrawLogic == DRAW_SHADOW) {
unsigned char *pm;
int n;
unsigned int *pz;
unsigned int z;
unsigned int r = r1;
unsigned int g = g1;
unsigned int b = b1;
n = (x2 >> 16) - x1;
int buf = pp1 + x1;
pm = pm1 + x1;
pz = pz1 + x1;
z = z1;
while (n >= 3) {
putPixelShadow<kDepthWrite, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, pz, 0, x, y, z, r, g, b, dzdx, pm);
putPixelShadow<kDepthWrite, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, pz, 1, x, y, z, r, g, b, dzdx, pm);
putPixelShadow<kDepthWrite, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, pz, 2, x, y, z, r, g, b, dzdx, pm);
putPixelShadow<kDepthWrite, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, pz, 3, x, y, z, r, g, b, dzdx, pm);
pz += 4;
pm += 4;
buf += 4;
n -= 4;
x += 4;
}
while (n >= 0) {
putPixelShadow<kDepthWrite, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, pz, 0, x, y, z, r, g, b, dzdx, pm);
pz += 1;
pm += 1;
buf += 1;
n -= 1;
x += 1;
}
} else if (kDrawLogic == DRAW_SMOOTH && !(kInterpST || kInterpSTZ)) {
unsigned int *pz;
byte *ps = nullptr;
@ -708,8 +636,6 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
ps1 += _pbufWidth;
}
if (kDrawLogic == DRAW_SHADOW || kDrawLogic == DRAW_SHADOW_MASK)
pm1 += _pbufWidth;
nb_lines--;
y++;
}
@ -817,26 +743,4 @@ void FrameBuffer::fillTriangleTextureMappingPerspectiveFlat(ZBufferPoint *p0, ZB
fillTriangle<interpRGB, interpZ, interpST, interpSTZ, DRAW_FLAT, false>(p0, p1, p2);
}
void FrameBuffer::fillTriangleFlatShadowMask(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint *p2) {
const bool interpZ = true;
const bool interpRGB = false;
const bool interpST = false;
const bool interpSTZ = false;
if (_depthWrite && _depthTestEnabled)
fillTriangle<interpRGB, interpZ, interpST, interpSTZ, DRAW_SHADOW_MASK, true>(p0, p1, p2);
else
fillTriangle<interpRGB, interpZ, interpST, interpSTZ, DRAW_SHADOW_MASK, false>(p0, p1, p2);
}
void FrameBuffer::fillTriangleFlatShadow(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint *p2) {
const bool interpZ = true;
const bool interpRGB = false;
const bool interpST = false;
const bool interpSTZ = false;
if (_depthWrite && _depthTestEnabled)
fillTriangle<interpRGB, interpZ, interpST, interpSTZ, DRAW_SHADOW, true>(p0, p1, p2);
else
fillTriangle<interpRGB, interpZ, interpST, interpSTZ, DRAW_SHADOW, false>(p0, p1, p2);
}
} // end of namespace TinyGL