diff --git a/CHANGELOG.md b/CHANGELOG.md index b0fe774d3..6406cecb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - fixed console not retaining changed user settings across game relaunches (#1318) - fixed passport inventory item not being animated in 60 FPS (#1314) - fixed compass needle being too fast in 60 FPS (#1316, regression from 4.0) +- fixed black screen flickers that can occur in 60 FPS (#1295) ## [4.0.3](https://github.com/LostArtefacts/TR1X/compare/4.0.2...4.0.3) - 2024-04-14 - fixed flickering sprite pickups (#1298) diff --git a/src/game/game/game_draw.c b/src/game/game/game_draw.c index c48f31bfd..14d4e5a76 100644 --- a/src/game/game/game_draw.c +++ b/src/game/game/game_draw.c @@ -19,7 +19,8 @@ void Game_DrawScene(bool draw_overlay) Camera_Apply(); if (g_Objects[O_LARA].loaded) { - Room_DrawAllRooms(g_Camera.interp.room_num); + Room_DrawAllRooms( + g_Camera.interp.room_num, g_Camera.target.room_number); if (draw_overlay) { Overlay_DrawGameInfo(); } else { diff --git a/src/game/room_draw.c b/src/game/room_draw.c index da96d7e1f..88dbcd020 100644 --- a/src/game/room_draw.c +++ b/src/game/room_draw.c @@ -15,6 +15,7 @@ static int32_t m_RoomNumStack[MAX_ROOMS_TO_DRAW] = { 0 }; static int32_t m_RoomNumStackIdx = 0; static void Room_PrintDrawStack(void); +static void Room_PrepareToDraw(int16_t room_num); static void Room_PrintDrawStack(void) { @@ -184,28 +185,49 @@ void Room_GetBounds(int16_t room_num) m_RoomNumStackIdx--; } -void Room_DrawAllRooms(int16_t room_num) +void Room_DrawAllRooms(int16_t base_room, int16_t target_room) { g_PhdLeft = Viewport_GetMinX(); g_PhdTop = Viewport_GetMinY(); g_PhdRight = Viewport_GetMaxX(); g_PhdBottom = Viewport_GetMaxY(); + g_RoomsToDrawCount = 0; + + Room_PrepareToDraw(base_room); + Room_PrepareToDraw(target_room); + + for (int i = 0; i < g_RoomsToDrawCount; i++) { + Room_DrawSingleRoom(g_RoomsToDraw[i]); + } + + if (g_Objects[O_LARA].loaded) { + if (g_RoomInfo[g_LaraItem->room_number].flags & RF_UNDERWATER) { + Output_SetupBelowWater(g_Camera.underwater); + } else { + Output_SetupAboveWater(g_Camera.underwater); + } + Lara_Draw(g_LaraItem); + } +} + +static void Room_PrepareToDraw(int16_t room_num) +{ ROOM_INFO *r = &g_RoomInfo[room_num]; + if (r->bound_active) { + return; + } + r->left = g_PhdLeft; r->top = g_PhdTop; r->right = g_PhdRight; r->bottom = g_PhdBottom; r->bound_active = 1; - g_RoomsToDrawCount = 0; if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) { g_RoomsToDraw[g_RoomsToDrawCount++] = room_num; } - bool camera_underwater = - g_RoomInfo[g_Camera.pos.room_number].flags & RF_UNDERWATER; - Matrix_Push(); Matrix_TranslateAbs(r->x, r->y, r->z); if (r->doors) { @@ -217,19 +239,6 @@ void Room_DrawAllRooms(int16_t room_num) } } Matrix_Pop(); - - for (int i = 0; i < g_RoomsToDrawCount; i++) { - Room_DrawSingleRoom(g_RoomsToDraw[i]); - } - - if (g_Objects[O_LARA].loaded) { - if (g_RoomInfo[g_LaraItem->room_number].flags & RF_UNDERWATER) { - Output_SetupBelowWater(camera_underwater); - } else { - Output_SetupAboveWater(camera_underwater); - } - Lara_Draw(g_LaraItem); - } } void Room_DrawSingleRoom(int16_t room_num) diff --git a/src/game/room_draw.h b/src/game/room_draw.h index 7a7524354..7845384ad 100644 --- a/src/game/room_draw.h +++ b/src/game/room_draw.h @@ -7,5 +7,5 @@ bool Room_SetBounds(int16_t *objptr, int16_t room_num, ROOM_INFO *parent); void Room_GetBounds(int16_t room_num); -void Room_DrawAllRooms(int16_t room_num); +void Room_DrawAllRooms(int16_t base_room, int16_t target_room); void Room_DrawSingleRoom(int16_t room_num);