From 19f79861ddfa9341898b3ab4cf450d1e78f1c1b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20=C4=8C=C3=AD=C5=BE?= Date: Fri, 27 Sep 2019 19:04:49 +0200 Subject: [PATCH] Start door --- levels.h | 16 +++++++++++----- main.c | 20 ++++++++++++++------ raycastlib.h | 2 ++ settings.h | 4 ++++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/levels.h b/levels.h index 32c0073..c4a3f7c 100644 --- a/levels.h +++ b/levels.h @@ -51,6 +51,7 @@ typedef uint8_t SFG_MapArray[SFG_MAP_SIZE * SFG_MAP_SIZE]; bbbbbb: index into tile dictionary */ +#define SFG_TILE_PROPERTY_MASK 0xc0 #define SFG_TILE_PROPERTY_NORMAL 0x00 #define SFG_TILE_PROPERTY_ELEVATOR 0x40 #define SFG_TILE_PROPERTY_SQUEEZER 0x80 @@ -64,6 +65,8 @@ typedef struct can be at most 7 because of 3bit indexing (one value is reserved for special transparent texture). */ + uint8_t doorTextureIndex; /**< Index (global, NOT from textureIndices) of a + texture used for door. */ } SFG_Map; typedef struct @@ -93,11 +96,12 @@ static inline SFG_TileDefinition SFG_getMapTile static const SFG_Level SFG_level0 = { - { - { + { // map + { // map.mapArray #define o 0 #define AA (0x04 | SFG_TILE_PROPERTY_ELEVATOR) #define BB (0x04 | SFG_TILE_PROPERTY_SQUEEZER) + #define CC (0x02 | SFG_TILE_PROPERTY_DOOR) 1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,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 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , 1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,3 ,3 ,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 , 1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,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 , @@ -106,7 +110,7 @@ static const SFG_Level SFG_level0 = 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 ,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 , 1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,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 , 1 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,AA,BB,5 ,o ,BB,o ,AA,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 , - 1 ,o ,o ,o ,o ,o ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,5 ,5 ,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 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , + 1 ,o ,o ,o ,o ,o ,2 ,2 ,CC,2 ,2 ,2 ,2 ,CC,5 ,5 ,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 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , 1 ,o ,o ,o ,o ,o ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,5 ,5 ,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 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , 1 ,o ,o ,o ,o ,o ,2 ,2 ,2 ,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 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , 1 ,o ,o ,o ,o ,o ,2 ,2 ,2 ,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 ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o ,o , @@ -165,8 +169,9 @@ static const SFG_Level SFG_level0 = #undef o #undef AA #undef BB + #undef CC }, - { + { // map.tileDictionary SFG_TD(0 ,31,0,0),SFG_TD(15,63,5,0),SFG_TD(28,63,1,0),SFG_TD(6 ,63,6,0), // 0 SFG_TD(10,28,2,4),SFG_TD(4 ,26,4,6),SFG_TD(5 ,63,4,0),SFG_TD(1 ,10,1,0), // 4 SFG_TD(0 ,31,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0), // 8 @@ -184,7 +189,8 @@ static const SFG_Level SFG_level0 = SFG_TD(0 ,31,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0), // 56 SFG_TD(0 ,31,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0), // 60 }, - {0, 1, 2, 3, 4, 5, 6} + {0, 1, 2, 3, 4, 5, 6}, // map.textureIndices + 0 // map.doorTextureIndex } }; diff --git a/main.c b/main.c index 09609bf..23d8ea9 100755 --- a/main.c +++ b/main.c @@ -100,18 +100,26 @@ void SFG_pixelFunc(RCL_PixelInfo *pixel) { uint8_t textureIndex = pixel->isFloor ? - (pixel->hit.type & 0x7) : + ( + ((pixel->hit.type & SFG_TILE_PROPERTY_MASK) != SFG_TILE_PROPERTY_DOOR) ? + (pixel->hit.type & 0x7) + : + ( + (pixel->texCoords.y >= RCL_UNITS_PER_SQUARE) ? + (pixel->hit.type & 0x7) : SFG_currentLevel.mapPointer->doorTextureIndex + ) + ): ((pixel->hit.type & 0x38) >> 3); - RCL_Unit textureV = pixel->height - pixel->texCoords.y; + RCL_Unit textureV = pixel->height + pixel->texCoords.y; - if (pixel->hit.type & (SFG_TILE_PROPERTY_ELEVATOR)) + if ((pixel->hit.type & SFG_TILE_PROPERTY_MASK) == + SFG_TILE_PROPERTY_ELEVATOR) textureV -= pixel->wallHeight; - else if (pixel->hit.type & (SFG_TILE_PROPERTY_SQUEEZER)) + else if ((pixel->hit.type & SFG_TILE_PROPERTY_MASK) == + SFG_TILE_PROPERTY_SQUEEZER) textureV += pixel->wallHeight; - textureV %= RCL_UNITS_PER_SQUARE; // hopefully gets optimized to bitwise and - color = textureIndex != SFG_TILE_TEXTURE_TRANSPARENT ? (SFG_getTexel( diff --git a/raycastlib.h b/raycastlib.h index be61534..9428df9 100644 --- a/raycastlib.h +++ b/raycastlib.h @@ -1182,6 +1182,8 @@ static inline int16_t _RCL_drawWall( #endif #endif + pixelInfo->texCoords.y = RCL_absVal(pixelInfo->texCoords.y); + wallPosition++; RCL_PIXEL_FUNCTION(pixelInfo); } diff --git a/settings.h b/settings.h index ee6f2d1..807e292 100644 --- a/settings.h +++ b/settings.h @@ -7,4 +7,8 @@ #define SFG_DITHERED_SHADOW 1 +#define SFG_RAYCASTING_MAX_STEPS 30 + +#define SFG_RAYCASTING_MAX_HITS 10 + #endif // guard