Add texture averaging

This commit is contained in:
Miloslav Číž 2018-09-10 08:03:09 +02:00
parent a625079d61
commit 7124e58b5e
2 changed files with 25 additions and 1 deletions

View file

@ -19,6 +19,7 @@ Player player;
#define SHOT_SPEED 5 * UNITS_PER_SQUARE #define SHOT_SPEED 5 * UNITS_PER_SQUARE
#define INFO_BAR_START 70 #define INFO_BAR_START 70
#define TEXTURE_DISTANCE (UNITS_PER_SQUARE * 6)
const unsigned char level[] = const unsigned char level[] =
{ {
@ -469,6 +470,7 @@ const unsigned char spritePlasma[] =
}; };
const unsigned char *textures[] = {texture1, texture2, texture3, texture4}; const unsigned char *textures[] = {texture1, texture2, texture3, texture4};
unsigned char textureAverageColors[4];
Unit floorHeightAt(int16_t x, int16_t y) Unit floorHeightAt(int16_t x, int16_t y)
{ {
@ -508,7 +510,9 @@ inline void pixelFunc(PixelInfo pixel)
if (pixel.isWall) if (pixel.isWall)
{ {
c = sampleImage(textures[pixel.hit.type],pixel.hit.textureCoord,pixel.textureCoordY); c = pixel.depth > TEXTURE_DISTANCE ?
textureAverageColors[pixel.hit.type] :
sampleImage(textures[pixel.hit.type],pixel.hit.textureCoord,pixel.textureCoordY);
if (previousColumn == pixel.position.x) if (previousColumn == pixel.position.x)
{ {
@ -562,6 +566,9 @@ int main()
{ {
initGeneral(); initGeneral();
for (uint8_t i = 0; i < 4; ++i)
textureAverageColors[i] = computeAverageColor(textures[i]);
cFloor = rgbToIndex(0,1,1); cFloor = rgbToIndex(0,1,1);
cCeiling = rgbToIndex(1,0,1); cCeiling = rgbToIndex(1,0,1);

View file

@ -236,4 +236,21 @@ void initGeneral()
zBuffer[i] = 0; zBuffer[i] = 0;
} }
unsigned char computeAverageColor(const unsigned char *texture)
{
uint32_t sumR = 0;
uint32_t sumG = 0;
uint32_t sumB = 0;
uint32_t pixels = texture[0] * texture[1];
for (uint16_t i = 0; i < pixels; ++i)
{
sumR += texture[2 + i] & 0b00000111;
sumG += (texture[2 + i] & 0b00111000) >> 3;
sumB += (texture[2 + i] & 0b11000000) >> 6;
}
return rgbToIndex(sumR / pixels,sumG / pixels,sumB / pixels);
}
#endif #endif