Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

output: remove texture info globals #2403

Merged
merged 4 commits into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/libtrx/game/level/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,14 +382,16 @@ void Level_ReadObjectTextures(
}

for (int32_t i = 0; i < num_textures; i++) {
OBJECT_TEXTURE *const texture = &g_ObjectTextures[base_idx + i];
OBJECT_TEXTURE *const texture = Output_GetObjectTexture(base_idx + i);
texture->draw_type = VFile_ReadU16(file);
texture->tex_page = VFile_ReadU16(file) + base_page_idx;
for (int32_t j = 0; j < 4; j++) {
texture->uv[j].u = VFile_ReadU16(file);
texture->uv[j].v = VFile_ReadU16(file);
}
}

Output_SetObjectTextureCount(base_idx + num_textures);
}

void Level_ReadSpriteTextures(
Expand All @@ -404,7 +406,7 @@ void Level_ReadSpriteTextures(
}

for (int32_t i = 0; i < num_textures; i++) {
SPRITE_TEXTURE *const sprite = &g_SpriteTextures[base_idx + i];
SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(base_idx + i);
sprite->tex_page = VFile_ReadU16(file) + base_page_idx;
sprite->offset = VFile_ReadU16(file);
sprite->width = VFile_ReadU16(file);
Expand Down
39 changes: 31 additions & 8 deletions src/libtrx/game/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ typedef struct {
int32_t shade;
} COMMON_LIGHT;

static int32_t m_ObjectTextureCount = 0;
static OBJECT_TEXTURE m_ObjectTextures[MAX_OBJECT_TEXTURES] = {};
static SPRITE_TEXTURE m_SpriteTextures[MAX_SPRITE_TEXTURES] = {};
static ANIMATED_TEXTURE_RANGE *m_AnimTextureRanges = NULL;
static int32_t m_DynamicLightCount = 0;
static LIGHT m_DynamicLights[MAX_DYNAMIC_LIGHTS] = {};
Expand Down Expand Up @@ -118,17 +121,37 @@ ANIMATED_TEXTURE_RANGE *Output_GetAnimatedTextureRange(const int32_t range_idx)
return &m_AnimTextureRanges[range_idx];
}

void Output_SetObjectTextureCount(const int32_t num_textures)
{
m_ObjectTextureCount = num_textures;
}

int32_t Output_GetObjectTextureCount(void)
{
return m_ObjectTextureCount;
}

OBJECT_TEXTURE *Output_GetObjectTexture(const int32_t texture_idx)
{
return &m_ObjectTextures[texture_idx];
}

SPRITE_TEXTURE *Output_GetSpriteTexture(const int32_t texture_idx)
{
return &m_SpriteTextures[texture_idx];
}

void Output_CycleAnimatedTextures(void)
{
const ANIMATED_TEXTURE_RANGE *range = m_AnimTextureRanges;
for (; range != NULL; range = range->next_range) {
int32_t i = 0;
const OBJECT_TEXTURE temp = g_ObjectTextures[range->textures[i]];
const OBJECT_TEXTURE temp = m_ObjectTextures[range->textures[i]];
for (; i < range->num_textures - 1; i++) {
g_ObjectTextures[range->textures[i]] =
g_ObjectTextures[range->textures[i + 1]];
m_ObjectTextures[range->textures[i]] =
m_ObjectTextures[range->textures[i + 1]];
}
g_ObjectTextures[range->textures[i]] = temp;
m_ObjectTextures[range->textures[i]] = temp;
}

for (int32_t i = 0; i < MAX_STATIC_OBJECTS; i++) {
Expand All @@ -138,12 +161,12 @@ void Output_CycleAnimatedTextures(void)
}

const int16_t frame_count = object->frame_count;
const SPRITE_TEXTURE temp = g_SpriteTextures[object->texture_idx];
const SPRITE_TEXTURE temp = m_SpriteTextures[object->texture_idx];
for (int32_t j = 0; j < frame_count - 1; j++) {
g_SpriteTextures[object->texture_idx + j] =
g_SpriteTextures[object->texture_idx + j + 1];
m_SpriteTextures[object->texture_idx + j] =
m_SpriteTextures[object->texture_idx + j + 1];
}
g_SpriteTextures[object->texture_idx + frame_count - 1] = temp;
m_SpriteTextures[object->texture_idx + frame_count - 1] = temp;
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/libtrx/game/packer.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ static void M_PreparePaletteLUT(void)
static void M_PrepareObject(const int32_t object_index)
{
const OBJECT_TEXTURE *const object_texture =
&g_ObjectTextures[object_index];
Output_GetObjectTexture(object_index);
if (object_texture->tex_page == m_StartPage) {
const RECTANGLE bounds = M_GetObjectBounds(object_texture);
M_FillVirtualData(m_VirtualPages, bounds);
Expand All @@ -129,7 +129,7 @@ static void M_PrepareObject(const int32_t object_index)
static void M_PrepareSprite(const int32_t sprite_index)
{
const SPRITE_TEXTURE *const sprite_texture =
&g_SpriteTextures[sprite_index];
Output_GetSpriteTexture(sprite_index);
if (sprite_texture->tex_page == m_StartPage) {
const RECTANGLE bounds = M_GetSpriteBounds(sprite_texture);
M_FillVirtualData(m_VirtualPages, bounds);
Expand Down Expand Up @@ -373,7 +373,7 @@ static bool M_PackContainerAt(
static void M_MoveObject(
const int32_t index, const RECTANGLE old_bounds, const TEX_POS new_pos)
{
OBJECT_TEXTURE *const texture = &g_ObjectTextures[index];
OBJECT_TEXTURE *const texture = Output_GetObjectTexture(index);
texture->tex_page = new_pos.page;

int32_t x_diff = (new_pos.x - old_bounds.x) << 8;
Expand All @@ -394,7 +394,7 @@ static void M_MoveObject(
static void M_MoveSprite(
const int32_t index, const RECTANGLE old_bounds, const TEX_POS new_pos)
{
SPRITE_TEXTURE *const texture = &g_SpriteTextures[index];
SPRITE_TEXTURE *const texture = Output_GetSpriteTexture(index);
texture->tex_page = new_pos.page;
texture->offset = (new_pos.y << 8) | new_pos.x;
}
Expand Down
5 changes: 4 additions & 1 deletion src/libtrx/include/libtrx/game/output.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

#include "./output/const.h"
#include "./output/types.h"
#include "./output/vars.h"
#include "./rooms.h"

#include <stdint.h>
Expand Down Expand Up @@ -38,6 +37,10 @@ extern void Output_LightRoomVertices(const ROOM *room);

void Output_InitialiseAnimatedTextures(int32_t num_ranges);
ANIMATED_TEXTURE_RANGE *Output_GetAnimatedTextureRange(int32_t range_idx);
void Output_SetObjectTextureCount(int32_t num_textures);
int32_t Output_GetObjectTextureCount(void);
OBJECT_TEXTURE *Output_GetObjectTexture(int32_t texture_idx);
SPRITE_TEXTURE *Output_GetSpriteTexture(int32_t texture_idx);
void Output_CycleAnimatedTextures(void);

void Output_CalculateLight(XYZ_32 pos, int16_t room_num);
Expand Down
8 changes: 0 additions & 8 deletions src/libtrx/include/libtrx/game/output/vars.h

This file was deleted.

2 changes: 1 addition & 1 deletion src/tr1/game/objects/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ void Object_DrawPickupItem(ITEM *item)
// First get the sprite that was to be used,

int16_t spr_num = g_Objects[item->object_id].mesh_idx - item->frame_num;
const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[spr_num];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(spr_num);

// and get the animation bounding box, which is not the mesh one.
int16_t min_y = frame->bounds.min.y;
Expand Down
16 changes: 8 additions & 8 deletions src/tr1/game/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ static void M_DrawTexturedFace3s(const FACE3 *const faces, const int32_t count)
&m_VBuf[face->vertices[2]],
};

OBJECT_TEXTURE *const tex = &g_ObjectTextures[face->texture_idx];
OBJECT_TEXTURE *const tex = Output_GetObjectTexture(face->texture_idx);
S_Output_DrawTexturedTriangle(
vns[0], vns[1], vns[2], tex->tex_page, &tex->uv[0], &tex->uv[1],
&tex->uv[2], tex->draw_type);
Expand All @@ -160,7 +160,7 @@ static void M_DrawTexturedFace4s(const FACE4 *const faces, const int32_t count)
&m_VBuf[face->vertices[3]],
};

OBJECT_TEXTURE *const tex = &g_ObjectTextures[face->texture_idx];
OBJECT_TEXTURE *const tex = Output_GetObjectTexture(face->texture_idx);
S_Output_DrawTexturedQuad(
vns[0], vns[1], vns[2], vns[3], tex->tex_page, &tex->uv[0],
&tex->uv[1], &tex->uv[2], &tex->uv[3], tex->draw_type);
Expand Down Expand Up @@ -220,7 +220,7 @@ static void M_DrawRoomSprites(const ROOM_MESH *const mesh)

const int32_t zv = vbuf->zv;
const SPRITE_TEXTURE *const sprite =
&g_SpriteTextures[room_sprite->texture];
Output_GetSpriteTexture(room_sprite->texture);
const int32_t zp = (zv / g_PhdPersp);
const int32_t x0 =
Viewport_GetCenterX() + (vbuf->xv + (sprite->x0 << W2V_SHIFT)) / zp;
Expand Down Expand Up @@ -841,7 +841,7 @@ void Output_DrawSprite(
g_W2VMatrix._10 * x + g_W2VMatrix._11 * y + g_W2VMatrix._12 * z;
int32_t zp = zv / g_PhdPersp;

const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprnum];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprnum);
const int32_t x0 =
Viewport_GetCenterX() + (xv + (sprite->x0 << W2V_SHIFT)) / zp;
const int32_t y0 =
Expand Down Expand Up @@ -925,7 +925,7 @@ void Output_DrawScreenSprite(
int32_t sx, int32_t sy, int32_t z, int32_t scale_h, int32_t scale_v,
int16_t sprnum, int16_t shade, uint16_t flags)
{
const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprnum];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprnum);
const int32_t x0 = sx + (scale_h * (sprite->x0 >> 3) / PHD_ONE);
const int32_t x1 = sx + (scale_h * (sprite->x1 >> 3) / PHD_ONE);
const int32_t y0 = sy + (scale_v * (sprite->y0 >> 3) / PHD_ONE);
Expand All @@ -941,7 +941,7 @@ void Output_DrawScreenSprite2D(
int32_t sx, int32_t sy, int32_t z, int32_t scale_h, int32_t scale_v,
int32_t sprnum, int16_t shade, uint16_t flags, int32_t page)
{
const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprnum];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprnum);
const int32_t x0 = sx + (scale_h * sprite->x0 / PHD_ONE);
const int32_t x1 = sx + (scale_h * sprite->x1 / PHD_ONE);
const int32_t y0 = sy + (scale_v * sprite->y0 / PHD_ONE);
Expand All @@ -967,7 +967,7 @@ void Output_DrawSpriteRel(
+ g_MatrixPtr->_12 * z + g_MatrixPtr->_13;
int32_t zp = zv / g_PhdPersp;

const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprnum];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprnum);
const int32_t x0 =
Viewport_GetCenterX() + (xv + (sprite->x0 << W2V_SHIFT)) / zp;
const int32_t y0 =
Expand All @@ -988,7 +988,7 @@ void Output_DrawSpriteRel(
void Output_DrawUISprite(
int32_t x, int32_t y, int32_t scale, int16_t sprnum, int16_t shade)
{
const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprnum];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprnum);
const int32_t x0 = x + (scale * sprite->x0 >> 16);
const int32_t x1 = x + (scale * sprite->x1 >> 16);
const int32_t y0 = y + (scale * sprite->y0 >> 16);
Expand Down
3 changes: 0 additions & 3 deletions src/tr1/global/vars.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ int32_t g_PhdTop = 0;
float g_FltResZ;
float g_FltResZBuf;

SPRITE_TEXTURE g_SpriteTextures[MAX_SPRITE_TEXTURES] = {};
OBJECT_TEXTURE g_ObjectTextures[MAX_OBJECT_TEXTURES] = {};

LARA_INFO g_Lara = {};
ITEM *g_LaraItem = NULL;
GAME_INFO g_GameInfo = {};
Expand Down
1 change: 0 additions & 1 deletion src/tr1/global/vars.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

#include <libtrx/game/camera/vars.h>
#include <libtrx/game/inventory_ring/enum.h>
#include <libtrx/game/output/vars.h>

#include <stddef.h>
#include <stdint.h>
Expand Down
2 changes: 1 addition & 1 deletion src/tr1/specific/s_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,7 @@ void S_Output_DrawSprite(

float multiplier = g_Config.visuals.brightness / 16.0f;

const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprnum];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprnum);
float vshade = (8192.0f - shade) * multiplier;
if (vshade >= 256.0f) {
vshade = 255.0f;
Expand Down
26 changes: 3 additions & 23 deletions src/tr2/game/level.c
Original file line number Diff line number Diff line change
Expand Up @@ -312,27 +312,6 @@ static void M_LoadTextures(VFILE *const file)
const int32_t num_textures = VFile_ReadS32(file);
LOG_INFO("object textures: %d", num_textures);
Level_ReadObjectTextures(0, 0, num_textures, file);

// TODO: handle this post-injection/packing
g_ObjectTextureCount = num_textures;
for (int32_t i = 0; i < num_textures; i++) {
uint16_t *const uv = &g_ObjectTextures[i].uv[0].u;
uint8_t byte = 0;
for (int32_t j = 0; j < 8; j++) {
if ((uv[j] & 0x80) != 0) {
uv[j] |= 0xFF;
byte |= 1 << j;
} else {
uv[j] &= 0xFF00;
}
}
g_LabTextureUVFlag[i] = byte;

for (int32_t j = 0; j < 4; j++) {
g_ObjectTextures[i].uv_backup[j] = g_ObjectTextures[i].uv[j];
}
}

Benchmark_End(benchmark, NULL);
}

Expand Down Expand Up @@ -757,7 +736,8 @@ static void M_CompleteSetup(void)
Item_Initialise(i);
}

Render_Reset(RENDER_RESET_PALETTE | RENDER_RESET_TEXTURES);
Render_Reset(
RENDER_RESET_PALETTE | RENDER_RESET_TEXTURES | RENDER_RESET_UVS);

Benchmark_End(benchmark, NULL);
}
Expand Down Expand Up @@ -855,5 +835,5 @@ void Level_Unload(void)
strcpy(g_LevelFileName, "");
memset(g_TexturePageBuffer8, 0, sizeof(uint8_t *) * MAX_TEXTURE_PAGES);
memset(g_TexturePageBuffer16, 0, sizeof(uint16_t *) * MAX_TEXTURE_PAGES);
g_ObjectTextureCount = 0;
Output_SetObjectTextureCount(0);
}
12 changes: 6 additions & 6 deletions src/tr2/game/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ static void M_DrawRoomSprites(const ROOM_MESH *const mesh)
}

const SPRITE_TEXTURE *const sprite =
&g_SpriteTextures[room_sprite->texture];
Output_GetSpriteTexture(room_sprite->texture);
const double persp = (double)(vbuf->zv / g_PhdPersp);
const double x0 =
g_PhdWinCenterX + (vbuf->xv + (sprite->x0 << W2V_SHIFT)) / persp;
Expand Down Expand Up @@ -496,7 +496,7 @@ void Output_DrawSprite(
yv = mptr->_13;
}

const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprite_idx];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprite_idx);
int32_t x0 = sprite->x0;
int32_t y0 = sprite->y0;
int32_t x1 = sprite->x1;
Expand Down Expand Up @@ -555,7 +555,7 @@ void Output_DrawPickup(
const int32_t sx, const int32_t sy, const int32_t scale,
const int16_t sprite_idx, const int16_t shade)
{
const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprite_idx];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprite_idx);
const int32_t x0 = sx + ((sprite->x0 * scale) / PHD_ONE);
const int32_t y0 = sy + ((sprite->y0 * scale) / PHD_ONE);
const int32_t x1 = sx + ((sprite->x1 * scale) / PHD_ONE);
Expand All @@ -570,7 +570,7 @@ void Output_DrawScreenSprite2D(
const int32_t scale_v, const int16_t sprite_idx, const int16_t shade,
const uint16_t flags)
{
const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprite_idx];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprite_idx);
const int32_t x0 = sx + ((sprite->x0 * scale_h) / PHD_ONE);
const int32_t y0 = sy + ((sprite->y0 * scale_v) / PHD_ONE);
const int32_t x1 = sx + ((sprite->x1 * scale_h) / PHD_ONE);
Expand All @@ -586,7 +586,7 @@ void Output_DrawScreenSprite(
const int32_t scale_v, const int16_t sprite_idx, const int16_t shade,
const uint16_t flags)
{
const SPRITE_TEXTURE *const sprite = &g_SpriteTextures[sprite_idx];
const SPRITE_TEXTURE *const sprite = Output_GetSpriteTexture(sprite_idx);
const int32_t x0 = sx + (((sprite->x0 / 8) * scale_h) / PHD_ONE);
const int32_t x1 = sx + (((sprite->x1 / 8) * scale_h) / PHD_ONE);
const int32_t y0 = sy + (((sprite->y0 / 8) * scale_v) / PHD_ONE);
Expand Down Expand Up @@ -641,7 +641,7 @@ void Output_LoadBackgroundFromObject(void)
}

const int32_t texture_idx = mesh->tex_face4s[0].texture_idx;
const OBJECT_TEXTURE *const texture = &g_ObjectTextures[texture_idx];
const OBJECT_TEXTURE *const texture = Output_GetObjectTexture(texture_idx);
Render_LoadBackgroundFromTexture(texture, 8, 6);
return;
}
Expand Down
3 changes: 3 additions & 0 deletions src/tr2/game/render/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,9 @@ void Render_Reset(const RENDER_RESET_FLAGS reset_flags)

r->Reset(r, reset_flags);

if (reset_flags & (RENDER_RESET_PARAMS | RENDER_RESET_UVS)) {
Render_ResetTextureUVs();
}
if (reset_flags & (RENDER_RESET_PARAMS | RENDER_RESET_TEXTURES)) {
Render_AdjustTextureUVs(reset_flags & RENDER_RESET_TEXTURES);
M_ReuploadBackground();
Expand Down
1 change: 1 addition & 0 deletions src/tr2/game/render/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ typedef enum {
RENDER_RESET_PALETTE = 1 << 1,
RENDER_RESET_TEXTURES = 1 << 2,
RENDER_RESET_PARAMS = 1 << 3,
RENDER_RESET_UVS = 1 << 4,
RENDER_RESET_ALL = INT32_MAX,
// clang-format on
} RENDER_RESET_FLAGS;
Expand Down
Loading
Loading