Continue elevators

This commit is contained in:
Miloslav Číž 2019-09-27 04:41:45 +02:00
parent 4cc267cdec
commit e3685b58a5
3 changed files with 21 additions and 7 deletions

View File

@ -99,7 +99,7 @@ static const SFG_Level SFG_level0 =
.tileDictionary = .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(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,4,0),SFG_TD(4 ,63,4,0),SFG_TD(5 ,63,4,0),SFG_TD(1 ,10,1,0), // 4 SFG_TD(0 ,28,2,0),SFG_TD(4 ,63,4,0),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 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
SFG_TD(0 ,31,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0), // 12 SFG_TD(0 ,31,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0), // 12
SFG_TD(0 ,31,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0), // 16 SFG_TD(0 ,31,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0),SFG_TD(0 ,63,0,0), // 16

20
main.c
View File

@ -88,12 +88,19 @@ void SFG_pixelFunc(RCL_PixelInfo *pixel)
(pixel->hit.type & 0x7) : (pixel->hit.type & 0x7) :
((pixel->hit.type & 0x38) >> 3); ((pixel->hit.type & 0x38) >> 3);
RCL_Unit textureV = pixel->height - pixel->texCoords.y;
if (pixel->hit.type & SFG_TILE_PROPERTY_ELEVATOR)
textureV -= pixel->wallHeight;
textureV %= RCL_UNITS_PER_SQUARE; // hopefully gets optimized to bitwise and
color = color =
textureIndex != SFG_TILE_TEXTURE_TRANSPARENT ? textureIndex != SFG_TILE_TEXTURE_TRANSPARENT ?
(SFG_getTexel( (SFG_getTexel(
SFG_currentLevel.textures[pixel->hit.type], SFG_currentLevel.textures[textureIndex],
pixel->texCoords.x / 32, pixel->texCoords.x / 32,
((pixel->height - pixel->texCoords.y) % RCL_UNITS_PER_SQUARE) / 32) textureV / 32)
) : ) :
SFG_TRANSPARENT_COLOR; SFG_TRANSPARENT_COLOR;
@ -139,11 +146,12 @@ void SFG_pixelFunc(RCL_PixelInfo *pixel)
RCL_Unit SFG_texturesAt(int16_t x, int16_t y) RCL_Unit SFG_texturesAt(int16_t x, int16_t y)
{ {
uint8_t properties; uint8_t p;
SFG_TileDefinition tile = SFG_getMapTile(&(SFG_level0.map),x,y,&properties); SFG_TileDefinition tile = SFG_getMapTile(&(SFG_level0.map),x,y,&p);
return SFG_TILE_FLOOR_TEXTURE(tile) | (SFG_TILE_CEILING_TEXTURE(tile) << 3); return
// ^ store both textures (floor and ceiling) in one number SFG_TILE_FLOOR_TEXTURE(tile) | (SFG_TILE_CEILING_TEXTURE(tile) << 3) | p;
// ^ store both textures (floor and ceiling) and properties in one number
} }
RCL_Unit SFG_movingWallHeight RCL_Unit SFG_movingWallHeight

View File

@ -267,6 +267,7 @@ typedef struct
int8_t isHorizon; ///< If the pixel belongs to horizon segment. int8_t isHorizon; ///< If the pixel belongs to horizon segment.
RCL_Unit depth; ///< Corrected depth. RCL_Unit depth; ///< Corrected depth.
RCL_Unit height; ///< World height (mostly for floor). RCL_Unit height; ///< World height (mostly for floor).
RCL_Unit wallHeight;///< Only for wall pixels, says its height.
RCL_HitResult hit; ///< Corresponding ray hit. RCL_HitResult hit; ///< Corresponding ray hit.
RCL_Vector2D texCoords; /**< Normalized (0 to RCL_UNITS_PER_SQUARE - 1) RCL_Vector2D texCoords; /**< Normalized (0 to RCL_UNITS_PER_SQUARE - 1)
texture coordinates. */ texture coordinates. */
@ -1238,6 +1239,7 @@ void _RCL_columnFunctionComplex(RCL_HitResult *hits, uint16_t hitCount, uint16_t
p.height = 0; p.height = 0;
p.texCoords.x = 0; p.texCoords.x = 0;
p.texCoords.y = 0; p.texCoords.y = 0;
p.wallHeight = 0;
// we'll be simulatenously drawing the floor and the ceiling now // we'll be simulatenously drawing the floor and the ceiling now
for (RCL_Unit j = 0; j <= hitCount; ++j) for (RCL_Unit j = 0; j <= hitCount; ++j)
@ -1294,6 +1296,7 @@ void _RCL_columnFunctionComplex(RCL_HitResult *hits, uint16_t hitCount, uint16_t
// draw floor until wall // draw floor until wall
p.isFloor = 1; p.isFloor = 1;
p.height = fZ1World + _RCL_camera.height; p.height = fZ1World + _RCL_camera.height;
p.wallHeight = 0;
#if RCL_COMPUTE_FLOOR_DEPTH == 1 #if RCL_COMPUTE_FLOOR_DEPTH == 1
p.depth = (_RCL_fHorizontalDepthStart - fPosY) * _RCL_horizontalDepthStep; p.depth = (_RCL_fHorizontalDepthStart - fPosY) * _RCL_horizontalDepthStep;
@ -1336,6 +1339,7 @@ void _RCL_columnFunctionComplex(RCL_HitResult *hits, uint16_t hitCount, uint16_t
p.isFloor = 1; p.isFloor = 1;
p.texCoords.x = hit.textureCoord; p.texCoords.x = hit.textureCoord;
p.height = fZ1World + _RCL_camera.height; p.height = fZ1World + _RCL_camera.height;
p.wallHeight = fWallHeight;
// draw floor wall // draw floor wall
@ -1366,6 +1370,7 @@ void _RCL_columnFunctionComplex(RCL_HitResult *hits, uint16_t hitCount, uint16_t
{ {
p.isFloor = 0; p.isFloor = 0;
p.height = cZ1World + _RCL_camera.height; p.height = cZ1World + _RCL_camera.height;
p.wallHeight = cWallHeight;
limit = _RCL_drawWall(cPosY,cZ1Screen,cZ2Screen, limit = _RCL_drawWall(cPosY,cZ1Screen,cZ2Screen,
-1,fPosY - 1, -1,fPosY - 1,
@ -1398,6 +1403,7 @@ void _RCL_columnFunctionSimple(RCL_HitResult *hits, uint16_t hitCount,
RCL_PixelInfo p; RCL_PixelInfo p;
p.position.x = x; p.position.x = x;
p.wallHeight = RCL_UNITS_PER_SQUARE;
if (hitCount > 0) if (hitCount > 0)
{ {