From 2c5e8646c889e2e86655aff959dc84e18b6bc76b Mon Sep 17 00:00:00 2001 From: lahm86 <33758420+lahm86@users.noreply.github.com> Date: Wed, 5 Feb 2025 20:50:11 +0000 Subject: [PATCH] rooms: move room draw tracking to TRX This moves the room draw count and array to TRX. --- src/libtrx/game/rooms/draw.c | 34 ++++++++++++++++++++ src/libtrx/include/libtrx/game/rooms.h | 1 + src/libtrx/include/libtrx/game/rooms/const.h | 1 + src/libtrx/include/libtrx/game/rooms/draw.h | 8 +++++ src/libtrx/meson.build | 1 + src/tr1/game/collide.c | 5 ++- src/tr1/game/cutscene.c | 6 ++-- src/tr1/game/game/game_draw.c | 4 +-- src/tr1/game/room.c | 18 ++--------- src/tr1/game/room_draw.c | 14 +++----- src/tr1/global/const.h | 1 - src/tr1/global/vars.c | 2 -- src/tr1/global/vars.h | 2 -- src/tr2/game/collide.c | 4 +-- src/tr2/game/room.c | 4 +-- src/tr2/game/room_draw.c | 23 +++---------- src/tr2/game/room_draw.h | 1 - src/tr2/global/const.h | 1 - src/tr2/global/vars.c | 3 -- src/tr2/global/vars.h | 3 -- 20 files changed, 68 insertions(+), 68 deletions(-) create mode 100644 src/libtrx/game/rooms/draw.c create mode 100644 src/libtrx/include/libtrx/game/rooms/draw.h diff --git a/src/libtrx/game/rooms/draw.c b/src/libtrx/game/rooms/draw.c new file mode 100644 index 000000000..a120b7d8c --- /dev/null +++ b/src/libtrx/game/rooms/draw.c @@ -0,0 +1,34 @@ +#include "game/rooms.h" + +static int32_t m_DrawCount = 0; +static int16_t m_RoomsToDraw[MAX_ROOMS_TO_DRAW] = {}; + +void Room_DrawReset(void) +{ + m_DrawCount = 0; +} + +void Room_MarkToBeDrawn(const int16_t room_num) +{ + if (m_DrawCount + 1 == MAX_ROOMS_TO_DRAW) { + return; + } + + for (int32_t i = 0; i < m_DrawCount; i++) { + if (m_RoomsToDraw[i] == room_num) { + return; + } + } + + m_RoomsToDraw[m_DrawCount++] = room_num; +} + +int32_t Room_DrawGetCount(void) +{ + return m_DrawCount; +} + +int16_t Room_DrawGetRoom(const int16_t idx) +{ + return m_RoomsToDraw[idx]; +} diff --git a/src/libtrx/include/libtrx/game/rooms.h b/src/libtrx/include/libtrx/game/rooms.h index 33cb40bd9..45d687c74 100644 --- a/src/libtrx/include/libtrx/game/rooms.h +++ b/src/libtrx/include/libtrx/game/rooms.h @@ -2,4 +2,5 @@ #include "rooms/common.h" #include "rooms/const.h" +#include "rooms/draw.h" #include "rooms/enum.h" diff --git a/src/libtrx/include/libtrx/game/rooms/const.h b/src/libtrx/include/libtrx/game/rooms/const.h index 1b12cdb57..64b20a1b3 100644 --- a/src/libtrx/include/libtrx/game/rooms/const.h +++ b/src/libtrx/include/libtrx/game/rooms/const.h @@ -1,6 +1,7 @@ #pragma once #define MAX_ROOMS 1024 +#define MAX_ROOMS_TO_DRAW 100 #define NO_ROOM_NEG (-1) #define NO_ROOM 255 // TODO: merge this with NO_ROOM_NEG diff --git a/src/libtrx/include/libtrx/game/rooms/draw.h b/src/libtrx/include/libtrx/game/rooms/draw.h new file mode 100644 index 000000000..5edff7137 --- /dev/null +++ b/src/libtrx/include/libtrx/game/rooms/draw.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +void Room_DrawReset(void); +void Room_MarkToBeDrawn(int16_t room_num); +int32_t Room_DrawGetCount(void); +int16_t Room_DrawGetRoom(int16_t idx); diff --git a/src/libtrx/meson.build b/src/libtrx/meson.build index 811cc7de1..dc9e57f70 100644 --- a/src/libtrx/meson.build +++ b/src/libtrx/meson.build @@ -158,6 +158,7 @@ sources = [ 'game/phase/phase_stats.c', 'game/random.c', 'game/rooms/common.c', + 'game/rooms/draw.c', 'game/savegame.c', 'game/shell/common.c', 'game/sound.c', diff --git a/src/tr1/game/collide.c b/src/tr1/game/collide.c index d20a78914..b21f04adf 100644 --- a/src/tr1/game/collide.c +++ b/src/tr1/game/collide.c @@ -340,9 +340,8 @@ bool Collide_CollideStaticObjects( Room_GetNearByRooms(x, y, z, coll->radius + 50, height + 50, room_num); - for (int i = 0; i < g_RoomsToDrawCount; i++) { - int16_t room_num = g_RoomsToDraw[i]; - const ROOM *const room = Room_Get(room_num); + for (int32_t i = 0; i < Room_DrawGetCount(); i++) { + const ROOM *const room = Room_Get(Room_DrawGetRoom(i)); for (int32_t j = 0; j < room->num_static_meshes; j++) { const STATIC_MESH *const mesh = &room->static_meshes[j]; diff --git a/src/tr1/game/cutscene.c b/src/tr1/game/cutscene.c index b62883120..c1a377293 100644 --- a/src/tr1/game/cutscene.c +++ b/src/tr1/game/cutscene.c @@ -71,12 +71,10 @@ bool Cutscene_Start(const int32_t level_num) } } - g_RoomsToDrawCount = 0; + Room_DrawReset(); for (int16_t room_num = 0; room_num < room_count; room_num++) { if (!Room_Get(room_num)->bound_active) { - if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) { - g_RoomsToDraw[g_RoomsToDrawCount++] = room_num; - } + Room_MarkToBeDrawn(room_num); } } diff --git a/src/tr1/game/game/game_draw.c b/src/tr1/game/game/game_draw.c index a2d07f364..f2825347a 100644 --- a/src/tr1/game/game/game_draw.c +++ b/src/tr1/game/game/game_draw.c @@ -44,8 +44,8 @@ void Game_Draw(bool draw_overlay) } else { // cinematic scene - for (int i = 0; i < g_RoomsToDrawCount; i++) { - int16_t room_num = g_RoomsToDraw[i]; + for (int32_t i = 0; i < Room_DrawGetCount(); i++) { + const int16_t room_num = Room_DrawGetRoom(i); ROOM *const room = Room_Get(room_num); room->bound_top = 0; room->bound_left = 0; diff --git a/src/tr1/game/room.c b/src/tr1/game/room.c index 9a8fea3a5..b19c991c3 100644 --- a/src/tr1/game/room.c +++ b/src/tr1/game/room.c @@ -195,10 +195,8 @@ int32_t Room_FindGridShift(int32_t src, int32_t dst) void Room_GetNearByRooms( int32_t x, int32_t y, int32_t z, int32_t r, int32_t h, int16_t room_num) { - g_RoomsToDrawCount = 0; - if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) { - g_RoomsToDraw[g_RoomsToDrawCount++] = room_num; - } + Room_DrawReset(); + Room_MarkToBeDrawn(room_num); Room_GetNewRoom(x + r, y, z + r, room_num); Room_GetNewRoom(x - r, y, z + r, room_num); Room_GetNewRoom(x + r, y, z - r, room_num); @@ -212,17 +210,7 @@ void Room_GetNearByRooms( void Room_GetNewRoom(int32_t x, int32_t y, int32_t z, int16_t room_num) { Room_GetSector(x, y, z, &room_num); - - for (int i = 0; i < g_RoomsToDrawCount; i++) { - int16_t drawn_room = g_RoomsToDraw[i]; - if (drawn_room == room_num) { - return; - } - } - - if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) { - g_RoomsToDraw[g_RoomsToDrawCount++] = room_num; - } + Room_MarkToBeDrawn(room_num); } SECTOR *Room_GetPitSector( diff --git a/src/tr1/game/room_draw.c b/src/tr1/game/room_draw.c index 0f6fe0213..83841729e 100644 --- a/src/tr1/game/room_draw.c +++ b/src/tr1/game/room_draw.c @@ -164,9 +164,7 @@ static bool M_SetBounds(const PORTAL *portal, const ROOM *parent) } if (!room->bound_active) { - if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) { - g_RoomsToDraw[g_RoomsToDrawCount++] = portal->room_num; - } + Room_MarkToBeDrawn(portal->room_num); room->bound_active = 1; } return true; @@ -200,14 +198,14 @@ void Room_DrawAllRooms(int16_t base_room, int16_t target_room) g_PhdRight = Viewport_GetMaxX(); g_PhdBottom = Viewport_GetMaxY(); - g_RoomsToDrawCount = 0; + Room_DrawReset(); M_PrepareToDraw(base_room); M_PrepareToDraw(target_room); M_DrawSkybox(); - for (int i = 0; i < g_RoomsToDrawCount; i++) { - Room_DrawSingleRoom(g_RoomsToDraw[i]); + for (int32_t i = 0; i < Room_DrawGetCount(); i++) { + Room_DrawSingleRoom(Room_DrawGetRoom(i)); } Output_SetupAboveWater(false); } @@ -225,9 +223,7 @@ static void M_PrepareToDraw(int16_t room_num) room->bound_bottom = g_PhdBottom; room->bound_active = 1; - if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) { - g_RoomsToDraw[g_RoomsToDrawCount++] = room_num; - } + Room_MarkToBeDrawn(room_num); Matrix_Push(); Matrix_TranslateAbs32(room->pos); diff --git a/src/tr1/global/const.h b/src/tr1/global/const.h index ad2e70f9d..871549ff8 100644 --- a/src/tr1/global/const.h +++ b/src/tr1/global/const.h @@ -11,7 +11,6 @@ #define MAX_FRAMES 10 #define MAX_CD_TRACKS 64 #define MAX_FLIP_MAPS 10 -#define MAX_ROOMS_TO_DRAW 100 #define MAX_ITEMS 10240 #define MAX_SECRETS 16 #define LARA_MAX_HITPOINTS 1000 diff --git a/src/tr1/global/vars.c b/src/tr1/global/vars.c index 5255e83d4..f72c18376 100644 --- a/src/tr1/global/vars.c +++ b/src/tr1/global/vars.c @@ -35,8 +35,6 @@ int16_t *g_GroundZone2[2] = { nullptr }; int16_t *g_FlyZone[2] = { nullptr }; int32_t g_NumberSoundEffects = 0; OBJECT_VECTOR *g_SoundEffectsTable = nullptr; -int16_t g_RoomsToDraw[MAX_ROOMS_TO_DRAW] = { -1 }; -int16_t g_RoomsToDrawCount = 0; INVENTORY_MODE g_InvMode; diff --git a/src/tr1/global/vars.h b/src/tr1/global/vars.h index baf19f55a..a413faf0e 100644 --- a/src/tr1/global/vars.h +++ b/src/tr1/global/vars.h @@ -44,8 +44,6 @@ extern int16_t *g_GroundZone2[2]; extern int16_t *g_FlyZone[2]; extern int32_t g_NumberSoundEffects; extern OBJECT_VECTOR *g_SoundEffectsTable; -extern int16_t g_RoomsToDraw[MAX_ROOMS_TO_DRAW]; -extern int16_t g_RoomsToDrawCount; extern REQUEST_INFO g_SavegameRequester; diff --git a/src/tr2/game/collide.c b/src/tr2/game/collide.c index 8bb47159a..568e1b383 100644 --- a/src/tr2/game/collide.c +++ b/src/tr2/game/collide.c @@ -305,8 +305,8 @@ int32_t Collide_CollideStaticObjects( Room_GetNearbyRooms(x, y, z, coll->radius + 50, height + 50, room_num); - for (int32_t i = 0; i < g_RoomsToDrawCount; i++) { - const ROOM *const room = Room_Get(g_RoomsToDraw[i]); + for (int32_t i = 0; i < Room_DrawGetCount(); i++) { + const ROOM *const room = Room_Get(Room_DrawGetRoom(i)); for (int32_t j = 0; j < room->num_static_meshes; j++) { const STATIC_MESH *const mesh = &room->static_meshes[j]; diff --git a/src/tr2/game/room.c b/src/tr2/game/room.c index 491991fc7..106ebb185 100644 --- a/src/tr2/game/room.c +++ b/src/tr2/game/room.c @@ -457,7 +457,7 @@ void Room_GetNearbyRooms( const int32_t x, const int32_t y, const int32_t z, const int32_t r, const int32_t h, const int16_t room_num) { - g_RoomsToDrawCount = 0; + Room_DrawReset(); Room_MarkToBeDrawn(room_num); Room_GetNewRoom(r + x, y, r + z, room_num); @@ -843,7 +843,7 @@ void Room_InitCinematic(void) room->flags |= RF_OUTSIDE; } - g_RoomsToDrawCount = 0; + Room_DrawReset(); for (int32_t i = 0; i < room_count; i++) { if (!Room_Get(i)->bound_active) { Room_MarkToBeDrawn(i); diff --git a/src/tr2/game/room_draw.c b/src/tr2/game/room_draw.c index 116177eb4..05579be57 100644 --- a/src/tr2/game/room_draw.c +++ b/src/tr2/game/room_draw.c @@ -24,19 +24,6 @@ static int32_t m_BoxLines[12][2] = { { 6, 7 }, { 7, 4 }, { 0, 4 }, { 1, 5 }, { 2, 6 }, { 3, 7 }, }; -void Room_MarkToBeDrawn(const int16_t room_num) -{ - for (int32_t i = 0; i < g_RoomsToDrawCount; i++) { - if (g_RoomsToDraw[i] == room_num) { - return; - } - } - - if (g_RoomsToDrawCount + 1 < MAX_ROOMS_TO_DRAW) { - g_RoomsToDraw[g_RoomsToDrawCount++] = room_num; - } -} - void Room_GetBounds(void) { while (m_BoundStart != m_BoundEnd) { @@ -486,7 +473,7 @@ void Room_DrawAllRooms(const int16_t current_room) m_BoundStart = 0; m_BoundEnd = 1; - g_RoomsToDrawCount = 0; + Room_DrawReset(); m_Outside = room->flags & RF_OUTSIDE; if (m_Outside) { @@ -540,13 +527,13 @@ void Room_DrawAllRooms(const int16_t current_room) Lara_Draw(g_LaraItem); } - for (int32_t i = 0; i < g_RoomsToDrawCount; i++) { - const int16_t room_num = g_RoomsToDraw[i]; + for (int32_t i = 0; i < Room_DrawGetCount(); i++) { + const int16_t room_num = Room_DrawGetRoom(i); Room_DrawSingleRoomGeometry(room_num); } - for (int32_t i = 0; i < g_RoomsToDrawCount; i++) { - const int16_t room_num = g_RoomsToDraw[i]; + for (int32_t i = 0; i < Room_DrawGetCount(); i++) { + const int16_t room_num = Room_DrawGetRoom(i); Room_DrawSingleRoomObjects(room_num); } diff --git a/src/tr2/game/room_draw.h b/src/tr2/game/room_draw.h index 7025e2819..7e8c2841e 100644 --- a/src/tr2/game/room_draw.h +++ b/src/tr2/game/room_draw.h @@ -2,7 +2,6 @@ #include "global/types.h" -void Room_MarkToBeDrawn(int16_t room_num); void Room_GetBounds(void); void Room_SetBounds( const int16_t *obj_ptr, int32_t room_num, const ROOM *parent); diff --git a/src/tr2/global/const.h b/src/tr2/global/const.h index 21152bde3..5b584b121 100644 --- a/src/tr2/global/const.h +++ b/src/tr2/global/const.h @@ -28,7 +28,6 @@ #define MAX_AUDIO_SAMPLE_TRACKS 32 #define MAX_CD_TRACKS 64 #define MAX_PALETTES 16 -#define MAX_ROOMS_TO_DRAW 100 #define MAX_FLIP_MAPS 10 #define MAX_VERTICES 0x2000 #define MAX_BOUND_ROOMS 128 diff --git a/src/tr2/global/vars.c b/src/tr2/global/vars.c index 688931394..6f08d31bb 100644 --- a/src/tr2/global/vars.c +++ b/src/tr2/global/vars.c @@ -8,9 +8,6 @@ const char *g_TRXVersion = "TR2X (non-Docker build)"; #endif -int16_t g_RoomsToDraw[MAX_ROOMS_TO_DRAW] = {}; -int16_t g_RoomsToDrawCount = 0; - const float g_RhwFactor = 0x14000000.p0; SDL_Window *g_SDLWindow = nullptr; diff --git a/src/tr2/global/vars.h b/src/tr2/global/vars.h index 16fa7338a..dddfbd7b7 100644 --- a/src/tr2/global/vars.h +++ b/src/tr2/global/vars.h @@ -8,9 +8,6 @@ #include -extern int16_t g_RoomsToDraw[MAX_ROOMS_TO_DRAW]; -extern int16_t g_RoomsToDrawCount; - extern const float g_RhwFactor; extern SDL_Window *g_SDLWindow;