From 48ac982460efff403726ff2a856247bbcab66991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20=C4=8C=C3=AD=C5=BE?= Date: Thu, 3 Oct 2019 23:37:52 +0200 Subject: [PATCH] Improve shadow dithering --- main.c | 51 ++++++++++++++++++++++++++++++++++++++++----------- settings.h | 2 +- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/main.c b/main.c index d2a4e6d..0f7151f 100755 --- a/main.c +++ b/main.c @@ -175,6 +175,38 @@ struct uint8_t doorRecordCount; } SFG_currentLevel; +#if SFG_DITHERED_SHADOW +SFG_PROGRAM_MEMORY uint8_t SFG_ditheringPatterns[] = +{ + 0,0,0,0, + 0,0,0,0, + + 0,0,0,0, + 0,1,0,0, + + 0,0,0,0, + 0,1,0,1, + + 1,0,1,0, + 0,1,0,0, + + 1,0,1,0, + 0,1,0,1, + + 1,0,1,0, + 0,1,1,1, + + 1,1,1,1, + 0,1,0,1, + + 1,1,1,1, + 0,1,1,1, + + 1,1,1,1, + 1,1,1,1 +}; +#endif + void SFG_pixelFunc(RCL_PixelInfo *pixel) { uint8_t color; @@ -230,20 +262,17 @@ void SFG_pixelFunc(RCL_PixelInfo *pixel) if (color != SFG_TRANSPARENT_COLOR) { #if SFG_DITHERED_SHADOW - uint8_t fogShadow = (pixel->depth) / RCL_UNITS_PER_SQUARE; + uint8_t fogShadow = (pixel->depth * 4) / (RCL_UNITS_PER_SQUARE); + + uint8_t fogShadowPart = fogShadow & 0x07; - uint8_t fogShadowPart = fogShadow & 0x03; - uint8_t xMod2 = pixel->position.x & 0x01; + fogShadow /= 8; + + uint8_t xMod4 = pixel->position.x & 0x03; uint8_t yMod2 = pixel->position.y & 0x01; - fogShadow >>= 2; - - if (((fogShadowPart == 1) && xMod2 && yMod2) || - ((fogShadowPart == 2) && (xMod2 == yMod2)) || - ((fogShadowPart == 3) && (xMod2 || yMod2))) - fogShadow += 1; - - shadow += fogShadow; + shadow += + fogShadow + SFG_ditheringPatterns[fogShadowPart * 8 + yMod2 * 4 + xMod4]; #else shadow += pixel->depth / (RCL_UNITS_PER_SQUARE * 2); #endif diff --git a/settings.h b/settings.h index aa8ec13..5ea2b0e 100644 --- a/settings.h +++ b/settings.h @@ -22,7 +22,7 @@ /** Whether shadows (fog) should be dithered, i.e. more smooth (needs a bit more - performance). + CPU performance and memory). */ #define SFG_DITHERED_SHADOW 1