anarch/mods/full_zbuffer.diff

165 lines
4.8 KiB
Diff

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 991058d..36bba8e 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;
}
}
}
@@ -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;
- }
- }
- }