Try to fix a full z buffer bug

This commit is contained in:
Miloslav Ciz 2023-08-05 10:37:06 +02:00
parent 840783d717
commit 7cba79252e

View File

@ -1,9 +1,3 @@
This mod adds full z-buffer that mostly fixes the incorrect sprite visibility,
however RAM consumption increases quite a bit. Note that visiblity inaccuracies
may still occur as e.g. floor depth is not accurate and isn't used, but the game
generally looks much better. By drummyfish, released under CC0 1.0, public
domain.
diff --git a/constants.h b/constants.h
index 956baa0..da72f24 100644
--- a/constants.h
@ -18,7 +12,7 @@ index 956baa0..da72f24 100644
/**
Step in which walls get higher, in raycastlib units.
diff --git a/game.h b/game.h
index 24285cb..f8ef257 100755
index 991058d..36bba8e 100755
--- a/game.h
+++ b/game.h
@@ -951,6 +951,14 @@ void SFG_pixelFunc(RCL_PixelInfo *pixel)
@ -76,3 +70,95 @@ index 24285cb..f8ef257 100755
}
}
}
@@ -4682,7 +4686,7 @@ void SFG_draw()
}
else
{
- for (int_fast16_t i = 0; i < SFG_Z_BUFFER_SIZE; ++i)
+ for (uint32_t i = 0; i < SFG_Z_BUFFER_SIZE; ++i)
SFG_game.zBuffer[i] = 255;
int16_t weaponBobOffset = 0;
diff --git a/mods/full_zbuffer.diff b/mods/full_zbuffer.diff
index 9a3ec2f..e69de29 100644
--- a/mods/full_zbuffer.diff
+++ b/mods/full_zbuffer.diff
@@ -1,78 +0,0 @@
-This mod adds full z-buffer that mostly fixes the incorrect sprite visibility,
-however RAM consumption increases quite a bit. Note that visiblity inaccuracies
-may still occur as e.g. floor depth is not accurate and isn't used, but the game
-generally looks much better. By drummyfish, released under CC0 1.0, public
-domain.
-
-diff --git a/constants.h b/constants.h
-index 956baa0..da72f24 100644
---- a/constants.h
-+++ b/constants.h
-@@ -352,7 +352,7 @@
- #define SFG_FONT_SIZE_BIG 1
- #endif
-
--#define SFG_Z_BUFFER_SIZE SFG_GAME_RESOLUTION_X
-+#define SFG_Z_BUFFER_SIZE (SFG_GAME_RESOLUTION_X * SFG_GAME_RESOLUTION_Y)
-
- /**
- Step in which walls get higher, in raycastlib units.
-diff --git a/game.h b/game.h
-index 24285cb..f8ef257 100755
---- a/game.h
-+++ b/game.h
-@@ -951,6 +951,14 @@ void SFG_pixelFunc(RCL_PixelInfo *pixel)
- :
- SFG_TRANSPARENT_COLOR;
-
-+ uint8_t *zValue = SFG_game.zBuffer +
-+ pixel->position.y * SFG_GAME_RESOLUTION_X + pixel->position.x;
-+
-+ uint8_t zDistance = SFG_RCLUnitToZBuffer(pixel->depth);
-+
-+ if (*zValue >= zDistance)
-+ *zValue = zDistance;
-+
- shadow = pixel->hit.direction >> 1;
- }
- else // floor/ceiling
-@@ -1216,29 +1224,25 @@ void SFG_drawScaledSprite(
-
- for (int16_t x = x0, u = u0; x <= x1; ++x, ++u)
- {
-- if (SFG_game.zBuffer[x] >= zDistance)
-+ for (int16_t y = y0, v = v0; y <= y1; ++y, ++v)
- {
-- int8_t columnTransparent = 1;
-+ uint8_t color =
-+ SFG_getTexel(image,SFG_game.spriteSamplingPoints[u],
-+ SFG_game.spriteSamplingPoints[v]);
-
-- for (int16_t y = y0, v = v0; y <= y1; ++y, ++v)
-+ if (color != SFG_TRANSPARENT_COLOR)
- {
-- uint8_t color =
-- SFG_getTexel(image,SFG_game.spriteSamplingPoints[u],
-- SFG_game.spriteSamplingPoints[v]);
--
-- if (color != SFG_TRANSPARENT_COLOR)
-- {
- #if SFG_DIMINISH_SPRITES
-- color = palette_minusValue(color,minusValue);
-+ color = palette_minusValue(color,minusValue);
- #endif
-- columnTransparent = 0;
-+ uint8_t *zValue = SFG_game.zBuffer + y * SFG_GAME_RESOLUTION_X + x;
-
-+ if (*zValue >= zDistance)
-+ {
- SFG_setGamePixel(x,y,color);
-+ *zValue = zDistance;
- }
- }
--
-- if (!columnTransparent)
-- SFG_game.zBuffer[x] = zDistance;
- }
- }
- }