From b41506fd5a43f873f6316886ff0435fa7f1e212c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20=C4=8C=C3=AD=C5=BE?= Date: Sat, 1 Feb 2020 23:17:22 +0100 Subject: [PATCH] Improve fog --- levels.h | 14 +++++++------- main.c | 18 +++++++++++++----- platform_pokitto.h | 3 +++ settings.h | 6 ++++++ 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/levels.h b/levels.h index bc796d9..f79d3fc 100644 --- a/levels.h +++ b/levels.h @@ -364,12 +364,12 @@ SFG_PROGRAM_MEMORY SFG_Level SFG_level1 = /*22*/ o ,o ,o ,8 ,8 ,o ,o ,o ,o ,8 ,8 ,o ,o ,o ,o ,o ,o ,3 ,3 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 22 /*23*/ o ,o ,8 ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,o ,o ,5 ,5 ,5 ,4 ,4 ,5 ,5 ,5 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 23 /*24*/ o ,8 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,o ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 24 -/*25*/ o ,8 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,o ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 25 -/*26*/ 8 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 26 -/*27*/ 8 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 27 -/*28*/ 8 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 28 -/*29*/ 8 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 29 -/*30*/ o ,8 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,o ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,6 ,o ,o ,o ,o ,o ,o ,o ,o ,3 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 30 +/*25*/ o ,8 ,o ,o ,o ,9 ,9 ,9 ,9 ,o ,o ,o ,8 ,o ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 25 +/*26*/ 8 ,o ,o ,o ,9 ,9 ,9 ,9 ,9 ,9 ,o ,o ,o ,8 ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 26 +/*27*/ 8 ,o ,o ,o ,9 ,9 ,9 ,9 ,9 ,9 ,o ,o ,o ,8 ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 27 +/*28*/ 8 ,o ,o ,o ,9 ,9 ,9 ,9 ,9 ,9 ,o ,o ,o ,8 ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 28 +/*29*/ 8 ,o ,o ,o ,9 ,9 ,9 ,9 ,9 ,9 ,o ,o ,o ,8 ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 29 +/*30*/ o ,8 ,o ,o ,o ,9 ,9 ,9 ,9 ,o ,o ,o ,8 ,o ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,6 ,o ,o ,o ,o ,o ,o ,o ,o ,3 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 30 /*31*/ o ,8 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,o ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,6 ,o ,o ,o ,o ,o ,o ,o ,o ,3 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 31 /*32*/ o ,o ,8 ,o ,o ,o ,o ,o ,o ,o ,o ,8 ,o ,o ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 32 /*33*/ o ,o ,o ,8 ,8 ,o ,o ,o ,o ,8 ,8 ,o ,o ,o ,5 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,o ,o ,o ,o ,o ,o ,o ,o ,1 ,1 ,1 ,1 ,1 ,1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , // 33 @@ -415,7 +415,7 @@ SFG_PROGRAM_MEMORY SFG_Level SFG_level1 = { // tileDictionary SFG_TD(14,31,0,0),SFG_TD(18,31,0,0),SFG_TD(26,31,0,0),SFG_TD(16,31,0,0), // 0 SFG_TD(18, 8,0,0),SFG_TD(26, 0,0,0),SFG_TD(18,31,4,0),SFG_TD(12,12,0,5), // 4 - SFG_TD(26, 0,4,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0), // 8 + SFG_TD(26, 0,4,0),SFG_TD(15,31,2,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0), // 8 SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0), // 12 SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0), // 16 SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0),SFG_TD(0 ,31,0,0), // 20 diff --git a/main.c b/main.c index 6f6a6de..aab7cf1 100755 --- a/main.c +++ b/main.c @@ -531,6 +531,11 @@ SFG_PROGRAM_MEMORY int8_t SFG_backgroundBlurOffsets[9] = }; #endif +uint8_t static inline SFG_fogValueDiminish(RCL_Unit depth) +{ + return depth / SFG_FOG_DIMINISH_STEP; +} + void SFG_pixelFunc(RCL_PixelInfo *pixel) { uint8_t color; @@ -593,8 +598,8 @@ void SFG_pixelFunc(RCL_PixelInfo *pixel) if (color != SFG_TRANSPARENT_COLOR) { #if SFG_DITHERED_SHADOW - uint8_t fogShadow = (pixel->depth * 4) / (RCL_UNITS_PER_SQUARE); - + uint8_t fogShadow = (pixel->depth * 8) / SFG_FOG_DIMINISH_STEP; + uint8_t fogShadowPart = fogShadow & 0x07; fogShadow /= 8; @@ -605,7 +610,7 @@ void SFG_pixelFunc(RCL_PixelInfo *pixel) shadow += fogShadow + SFG_ditheringPatterns[fogShadowPart * 8 + yMod2 * 4 + xMod4]; #else - shadow += pixel->depth / (RCL_UNITS_PER_SQUARE * 2); + shadow += SFG_fogValueDiminish(pixel->depth); #endif #if SFG_ENABLE_FOG @@ -2025,7 +2030,7 @@ void SFG_gameStep() RCL_min(0,SFG_player.camera.shear + SFG_CAMERA_SHEAR_STEP_PER_FRAME); } -#if SFG_HEADBOB_ENABLED +#if SFG_HEADBOB_ENABLED && !SFG_PREVIEW_MODE if (bobbing) { SFG_player.headBobFrame += SFG_HEADBOB_FRAME_INCREASE_PER_FRAME; @@ -2149,9 +2154,11 @@ void SFG_gameStep() if (eliminate) // take the item { +#if !SFG_PREVIEW_MODE SFG_removeItem(i); SFG_player.lastItemTakenFrame = SFG_gameFrame; i--; +#endif } else // collide { @@ -2919,7 +2926,8 @@ void SFG_draw() SFG_drawScaledSprite(s, p.position.x * SFG_RAYCASTING_SUBSAMPLE,p.position.y, RCL_perspectiveScale(spriteSize,p.depth), - p.depth / (RCL_UNITS_PER_SQUARE * 2),p.depth); + SFG_fogValueDiminish(p.depth), + p.depth); } #if SFG_HEADBOB_ENABLED diff --git a/platform_pokitto.h b/platform_pokitto.h index 3b90074..b78a288 100644 --- a/platform_pokitto.h +++ b/platform_pokitto.h @@ -31,6 +31,9 @@ #undef SFG_DITHERED_SHADOW #define SFG_DITHERED_SHADOW 0 +#undef SFG_FOG_DIMINISH_STEP +#define SFG_FOG_DIMINISH_STEP 2048 + #undef SFG_RAYCASTING_MAX_STEPS #define SFG_RAYCASTING_MAX_STEPS 20 diff --git a/settings.h b/settings.h index 9baea85..4ea9b6a 100644 --- a/settings.h +++ b/settings.h @@ -80,6 +80,12 @@ */ #define SFG_DITHERED_SHADOW 1 +/** + Depth step (in RCL_Units) after which fog diminishes a color by one value + point. For performance reasons this number should be kept a power of two! +*/ +#define SFG_FOG_DIMINISH_STEP 4096 + /** Maximum number of squares that will be traversed by any cast ray. Smaller number is faster but can cause visual artifacts.