Merge branch 'port' of https://github.com/Phnod/perfect_dark into zoom-hud-fov

# Conflicts:
#	src/include/data.h
This commit is contained in:
Phnod committed 2023-09-02 19:05:12 -04:00
commit d033a7fa02
27 files changed
+638 -170

No files matched your search

+1 -1
View File
@@ -130,7 +130,7 @@ G_DIR := src/generated/$(ROMID)
ifneq (,$(findstring windows,$(TARGET_PLATFORM)))
TARGET_CFLAGS := $(shell pkg-config sdl2 --cflags-only-I)
TARGET_LDFLAGS := $(shell pkg-config sdl2 --libs) -lz -lopengl32 -static-libstdc++
TARGET_LDFLAGS := $(shell pkg-config sdl2 --libs) -lz -lopengl32 -static-libstdc++ -ldbghelp
# on windows/mingw we need this to be built with a 32-bit compiler so it finds the correct libs
TOOLCHAIN ?= i686-w64-mingw32-
else # assume *nix
+125 -138
View File
@@ -145,6 +145,19 @@ struct RawTexMetadata {
float h_byte_scale = 1, v_pixel_scale = 1;
};
struct LoadedTexture {
const uint8_t* addr;
uint32_t orig_size_bytes;
uint32_t full_size_bytes; // full_image_line_size_bytes * height
uint32_t size_bytes; // line_size_bytes * height
uint32_t full_image_line_size_bytes;
uint32_t line_size_bytes;
uint32_t tex_flags;
struct RawTexMetadata raw_tex_metadata;
bool masked;
bool blended;
};
static struct RDP {
uint16_t palette[256];
const uint8_t* palette_addrs[2];
@@ -156,18 +169,6 @@ static struct RDP {
uint32_t tex_flags;
struct RawTexMetadata raw_tex_metadata;
} texture_to_load;
struct {
const uint8_t* addr;
uint32_t orig_size_bytes;
uint32_t full_size_bytes; // full_image_line_size_bytes * height
uint32_t size_bytes; // line_size_bytes * height
uint32_t full_image_line_size_bytes;
uint32_t line_size_bytes;
uint32_t tex_flags;
struct RawTexMetadata raw_tex_metadata;
bool masked;
bool blended;
} loaded_texture[8];
struct {
uint8_t fmt;
uint8_t siz;
@@ -178,8 +179,8 @@ static struct RDP {
uint16_t tmem; // 0-511, in 64-bit word units
uint32_t line_size_bytes;
uint8_t palette;
uint8_t tmem_index; // 0 or 1 for offset 0 kB or offset 2 kB, respectively
} texture_tile[8];
LoadedTexture loaded_texture[512]; // for each tmem location
bool textures_changed[2];
uint8_t first_tile_index;
@@ -579,13 +580,13 @@ static void gfx_texture_cache_delete(const uint8_t* orig_addr) {
}
}
static void import_texture_rgba16(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_rgba16(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
const uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
// SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes);
// TODO: this trips in some places with a garbage size in full_image_line_size_bytes
// probably wherever framebuffer effects are used
@@ -607,16 +608,16 @@ static void import_texture_rgba16(int tile, bool importReplacement) {
const uint32_t height = size_bytes / rdp.texture_tile[tile].line_size_bytes;
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
// DumpTexture(rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].otr_path, rgba32_buf, width, height);
// DumpTexture(loaded_texture.otr_path, rgba32_buf, width, height);
}
static void import_texture_rgba32(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_rgba32(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
const uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes);
uint32_t *dest = (uint32_t *)tex_upload_buffer;
@@ -628,16 +629,16 @@ static void import_texture_rgba32(int tile, bool importReplacement) {
const uint32_t width = rdp.texture_tile[tile].line_size_bytes / 2;
const uint32_t height = (size_bytes / 2) / rdp.texture_tile[tile].line_size_bytes;
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
// DumpTexture(rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].otr_path, addr, width, height);
// DumpTexture(loaded_texture.otr_path, addr, width, height);
}
static void import_texture_ia4(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_ia4(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
const uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes);
uint8_t *dest = tex_upload_buffer;
@@ -657,16 +658,16 @@ static void import_texture_ia4(int tile, bool importReplacement) {
const uint32_t height = size_bytes / rdp.texture_tile[tile].line_size_bytes;
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
// DumpTexture(rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].otr_path, rgba32_buf, width, height);
// DumpTexture(loaded_texture.otr_path, rgba32_buf, width, height);
}
static void import_texture_ia8(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_ia8(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
const uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes);
uint8_t *dest = tex_upload_buffer;
@@ -683,16 +684,16 @@ static void import_texture_ia8(int tile, bool importReplacement) {
const uint32_t height = size_bytes / rdp.texture_tile[tile].line_size_bytes;
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
// DumpTexture(rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].otr_path, rgba32_buf, width, height);
// DumpTexture(loaded_texture.otr_path, rgba32_buf, width, height);
}
static void import_texture_ia16(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_ia16(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
const uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes);
uint8_t *dest = tex_upload_buffer;
@@ -709,16 +710,16 @@ static void import_texture_ia16(int tile, bool importReplacement) {
const uint32_t height = size_bytes / rdp.texture_tile[tile].line_size_bytes;
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
// DumpTexture(rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].otr_path, rgba32_buf, width, height);
// DumpTexture(loaded_texture.otr_path, rgba32_buf, width, height);
}
static void import_texture_i4(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_i4(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
const uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes);
uint8_t *dest = tex_upload_buffer;
@@ -736,16 +737,16 @@ static void import_texture_i4(int tile, bool importReplacement) {
const uint32_t height = size_bytes / rdp.texture_tile[tile].line_size_bytes;
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
// DumpTexture(rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].otr_path, rgba32_buf, width, height);
// DumpTexture(loaded_texture.otr_path, rgba32_buf, width, height);
}
static void import_texture_i8(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_i8(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes);
uint8_t *dest = tex_upload_buffer;
@@ -761,7 +762,7 @@ static void import_texture_i8(int tile, bool importReplacement) {
const uint32_t height = size_bytes / rdp.texture_tile[tile].line_size_bytes;
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
// DumpTexture(rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].otr_path, rgba32_buf, width, height);
// DumpTexture(loaded_texture.otr_path, rgba32_buf, width, height);
}
static inline void palette_to_rgba32(const uint16_t palentry, uint8_t *rgba32_buf) {
@@ -785,13 +786,13 @@ static inline void palette_to_rgba32(const uint16_t palentry, uint8_t *rgba32_bu
}
}
static void import_texture_ci4(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_ci4(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
const uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
const uint32_t pal_idx = rdp.texture_tile[tile].palette; // 0-15
const uint16_t* palette = (const uint16_t *)(rdp.palette + pal_idx * 16); // 16 pixel entries, 16 bits each
SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes);
@@ -813,13 +814,13 @@ static void import_texture_ci4(int tile, bool importReplacement) {
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
}
static void import_texture_ci8(int tile, bool importReplacement) {
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* addr = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr;
const uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes;
static void import_texture_ci8(int tile, const LoadedTexture& loaded_texture, bool importReplacement) {
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* addr = loaded_texture.addr;
const uint32_t size_bytes = loaded_texture.size_bytes;
const uint32_t full_image_line_size_bytes =
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes;
const uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes;
loaded_texture.full_image_line_size_bytes;
const uint32_t line_size_bytes = loaded_texture.line_size_bytes;
for (uint32_t i = 0, j = 0; i < size_bytes; j += full_image_line_size_bytes - line_size_bytes) {
for (uint32_t k = 0; k < line_size_bytes; i++, k++, j++) {
@@ -837,28 +838,28 @@ static void import_texture_ci8(int tile, bool importReplacement) {
const uint32_t height = size_bytes / result_line_size;
gfx_rapi->upload_texture(tex_upload_buffer, width, height);
// DumpTexture(rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].otr_path, rgba32_buf, width, height);
// DumpTexture(loaded_texture.otr_path, rgba32_buf, width, height);
}
static void import_texture(int i, int tile, bool importReplacement) {
LoadedTexture& loaded_texture = rdp.loaded_texture[rdp.texture_tile[tile].tmem];
const uint8_t fmt = rdp.texture_tile[tile].fmt;
const uint8_t siz = rdp.texture_tile[tile].siz;
const uint32_t texFlags = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].tex_flags;
const uint32_t tmem_index = rdp.texture_tile[tile].tmem_index;
const uint32_t tex_flags = loaded_texture.tex_flags;
const uint8_t palette_index = rdp.texture_tile[tile].palette;
if (rdp.tex_lod || !rdp.loaded_texture[tmem_index].addr) {
if (rdp.tex_lod || !loaded_texture.addr) {
// set up miplevel 0; also acts as a catch-all for when .addr is NULL because my texture loader sucks
rdp.loaded_texture[tmem_index].line_size_bytes = rdp.texture_tile[tile].line_size_bytes;
rdp.loaded_texture[tmem_index].full_image_line_size_bytes = rdp.texture_tile[tile].line_size_bytes;
rdp.loaded_texture[tmem_index].full_size_bytes = rdp.loaded_texture[tmem_index].full_image_line_size_bytes * rdp.texture_tile[tile].height;
rdp.loaded_texture[tmem_index].size_bytes = rdp.loaded_texture[tmem_index].line_size_bytes * rdp.texture_tile[tile].height;
rdp.loaded_texture[tmem_index].orig_size_bytes = rdp.loaded_texture[tmem_index].size_bytes;
rdp.loaded_texture[tmem_index].addr = rdp.texture_to_load.addr;
loaded_texture.line_size_bytes = rdp.texture_tile[tile].line_size_bytes;
loaded_texture.full_image_line_size_bytes = rdp.texture_tile[tile].line_size_bytes;
loaded_texture.full_size_bytes = loaded_texture.full_image_line_size_bytes * rdp.texture_tile[tile].height;
loaded_texture.size_bytes = loaded_texture.line_size_bytes * rdp.texture_tile[tile].height;
loaded_texture.orig_size_bytes = loaded_texture.size_bytes;
loaded_texture.addr = rdp.texture_to_load.addr;
}
const RawTexMetadata* metadata = &rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata;
const uint8_t* orig_addr = rdp.loaded_texture[tmem_index].addr;
const RawTexMetadata* metadata = &loaded_texture.raw_tex_metadata;
const uint8_t* orig_addr = loaded_texture.addr;
SUPPORT_CHECK(orig_addr);
TextureCacheKey key;
@@ -874,35 +875,35 @@ static void import_texture(int i, int tile, bool importReplacement) {
if (fmt == G_IM_FMT_RGBA) {
if (siz == G_IM_SIZ_16b) {
import_texture_rgba16(tile, importReplacement);
import_texture_rgba16(tile, loaded_texture, importReplacement);
} else if (siz == G_IM_SIZ_32b) {
import_texture_rgba32(tile, importReplacement);
import_texture_rgba32(tile, loaded_texture, importReplacement);
} else {
sysFatalError("Bad size for RGBA texture in tile %d: %02x", tile, siz);
}
} else if (fmt == G_IM_FMT_IA) {
if (siz == G_IM_SIZ_4b) {
import_texture_ia4(tile, importReplacement);
import_texture_ia4(tile, loaded_texture, importReplacement);
} else if (siz == G_IM_SIZ_8b) {
import_texture_ia8(tile, importReplacement);
import_texture_ia8(tile, loaded_texture, importReplacement);
} else if (siz == G_IM_SIZ_16b) {
import_texture_ia16(tile, importReplacement);
import_texture_ia16(tile, loaded_texture, importReplacement);
} else {
sysFatalError("Bad size for IA texture in tile %d: %02x", tile, siz);
}
} else if (fmt == G_IM_FMT_CI) {
if (siz == G_IM_SIZ_4b) {
import_texture_ci4(tile, importReplacement);
import_texture_ci4(tile, loaded_texture, importReplacement);
} else if (siz == G_IM_SIZ_8b) {
import_texture_ci8(tile, importReplacement);
import_texture_ci8(tile, loaded_texture, importReplacement);
} else {
sysFatalError("Bad size for CI texture in tile %d: %02x", tile, siz);
}
} else if (fmt == G_IM_FMT_I) {
if (siz == G_IM_SIZ_4b) {
import_texture_i4(tile, importReplacement);
import_texture_i4(tile, loaded_texture, importReplacement);
} else if (siz == G_IM_SIZ_8b) {
import_texture_i8(tile, importReplacement);
import_texture_i8(tile, loaded_texture, importReplacement);
} else {
sysFatalError("Bad size for I texture in tile %d: %02x", tile, siz);
}
@@ -1182,9 +1183,11 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo
// if (rand()%2) return;
if (v1->clip_rej & v2->clip_rej & v3->clip_rej) {
// The whole triangle lies outside the visible area
return;
if ((rsp.extra_geometry_mode & G_NO_CLIPPING_EXT) == 0) {
if (v1->clip_rej & v2->clip_rej & v3->clip_rej) {
// The whole triangle lies outside the visible area
return;
}
}
if ((rsp.geometry_mode & G_CULL_BOTH) != 0) {
@@ -1298,18 +1301,6 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo
if (use_grayscale) {
cc_options |= (uint64_t)SHADER_OPT_GRAYSCALE;
}
if (rdp.loaded_texture[0].masked) {
cc_options |= (uint64_t)SHADER_OPT_TEXEL0_MASK;
}
if (rdp.loaded_texture[1].masked) {
cc_options |= (uint64_t)SHADER_OPT_TEXEL1_MASK;
}
if (rdp.loaded_texture[0].blended) {
cc_options |= (uint64_t)SHADER_OPT_TEXEL0_BLEND;
}
if (rdp.loaded_texture[1].blended) {
cc_options |= (uint64_t)SHADER_OPT_TEXEL1_BLEND;
}
// If we are not using alpha, clear the alpha components of the combiner as they have no effect
if (!use_alpha) {
@@ -1338,7 +1329,7 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo
uint8_t cms = rdp.texture_tile[tile].cms;
uint8_t cmt = rdp.texture_tile[tile].cmt;
uint32_t tex_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].orig_size_bytes;
uint32_t tex_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem].orig_size_bytes;
uint32_t line_size = rdp.texture_tile[tile].line_size_bytes;
if (line_size == 0) {
@@ -1837,10 +1828,8 @@ static void gfx_dp_set_tile(uint8_t fmt, uint32_t siz, uint32_t line, uint32_t t
rdp.texture_tile[tile].shifts = shifts;
rdp.texture_tile[tile].shiftt = shiftt;
rdp.texture_tile[tile].line_size_bytes = line * 8;
// assume one texture is loaded at address 0 and another texture at any other address
rdp.texture_tile[tile].tmem = tmem;
rdp.texture_tile[tile].tmem_index = (rdp.tex_lod && tile < 6) ? tile : 6 + (tmem > 0);
rdp.textures_changed[0] = true;
rdp.textures_changed[1] = true;
}
@@ -1906,18 +1895,18 @@ static void gfx_dp_load_block(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t
size_bytes *= rdp.texture_to_load.raw_tex_metadata.h_byte_scale;
size_bytes *= rdp.texture_to_load.raw_tex_metadata.v_pixel_scale;
}
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].orig_size_bytes = orig_size_bytes;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes = size_bytes;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_size_bytes = size_bytes;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes = size_bytes;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes = size_bytes;
// assert(size_bytes <= 4096 && "bug: too big texture");
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].tex_flags = rdp.texture_to_load.tex_flags;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata = rdp.texture_to_load.raw_tex_metadata;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr = rdp.texture_to_load.addr;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].masked = false;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].blended = false;
LoadedTexture& loaded_texture = rdp.loaded_texture[rdp.texture_tile[tile].tmem];
loaded_texture.orig_size_bytes = orig_size_bytes;
loaded_texture.size_bytes = size_bytes;
loaded_texture.full_size_bytes = size_bytes;
loaded_texture.line_size_bytes = size_bytes;
loaded_texture.full_image_line_size_bytes = size_bytes;
loaded_texture.tex_flags = rdp.texture_to_load.tex_flags;
loaded_texture.raw_tex_metadata = rdp.texture_to_load.raw_tex_metadata;
loaded_texture.addr = rdp.texture_to_load.addr;
loaded_texture.masked = false;
loaded_texture.blended = false;
rdp.textures_changed[0] = rdp.textures_changed[1] = true;
}
@@ -1949,19 +1938,17 @@ static void gfx_dp_load_tile(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t
tile_line_size_bytes *= h_byte_scale;
}
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].orig_size_bytes = orig_size_bytes;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes = size_bytes;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_size_bytes = full_image_line_size_bytes * tile_height;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes = full_image_line_size_bytes;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes = tile_line_size_bytes;
// assert(size_bytes <= 4096 && "bug: too big texture");
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].tex_flags = rdp.texture_to_load.tex_flags;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].raw_tex_metadata = rdp.texture_to_load.raw_tex_metadata;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].addr = rdp.texture_to_load.addr + start_offset_bytes;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].masked = false;
rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].blended = false;
LoadedTexture& loaded_texture = rdp.loaded_texture[rdp.texture_tile[tile].tmem];
loaded_texture.orig_size_bytes = orig_size_bytes;
loaded_texture.size_bytes = size_bytes;
loaded_texture.full_size_bytes = full_image_line_size_bytes * tile_height;
loaded_texture.full_image_line_size_bytes = full_image_line_size_bytes;
loaded_texture.line_size_bytes = tile_line_size_bytes;
loaded_texture.tex_flags = rdp.texture_to_load.tex_flags;
loaded_texture.raw_tex_metadata = rdp.texture_to_load.raw_tex_metadata;
loaded_texture.addr = rdp.texture_to_load.addr + start_offset_bytes;
loaded_texture.masked = false;
loaded_texture.blended = false;
rdp.texture_tile[tile].uls = uls;
rdp.texture_tile[tile].ult = ult;
+3
View File
@@ -31,6 +31,9 @@ void *sysMemAlloc(const u32 size);
void *sysMemZeroAlloc(const u32 size);
void sysMemFree(void *ptr);
void crashInit(void);
void crashShutdown(void);
#ifdef __cplusplus
}
#endif
+1
View File
@@ -19,6 +19,7 @@ s32 videoGetNativeHeight(void);
s32 videoGetWidth(void);
s32 videoGetHeight(void);
f32 videoGetAspect(void);
u32 videoGetTextureFilter2D(void);
s32 videoCreateFramebuffer(u32 w, u32 h);
void videoSetFramebuffer(s32 target);
+298 -15
View File
@@ -1,40 +1,323 @@
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <SDL.h>
#include <PR/ultratypes.h>
#include "system.h"
#include "platform.h"
#define CRASH_MAX_MSG 4096
#define CRASH_MAX_SYM 256
#define CRASH_MAX_FRAMES 32
#define CRASH_MSG(...) \
if (msglen < CRASH_MAX_MSG) msglen += snprintf(msg + msglen, CRASH_MAX_MSG - msglen, __VA_ARGS__)
#if defined(PLATFORM_WIN32)
#include <windows.h>
#include <dbghelp.h>
#include <inttypes.h>
#include <excpt.h>
// NOTE: game builds with gcc, which means we have no PDBs for the windows version
// this means that you generally won't get any symbol names in the main executable
static LPTOP_LEVEL_EXCEPTION_FILTER prevExFilter;
static void crashStackTrace(char *msg, PEXCEPTION_POINTERS exinfo)
{
CONTEXT context = *exinfo->ContextRecord;
HANDLE process = GetCurrentProcess();
HANDLE thread = GetCurrentThread();
SymSetOptions(SymGetOptions() | SYMOPT_DEBUG | SYMOPT_LOAD_LINES);
SymInitialize(process, NULL, TRUE);
STACKFRAME64 stackframe;
memset(&stackframe, 0, sizeof(stackframe));
DWORD image;
#ifdef PLATFORM_X86
image = IMAGE_FILE_MACHINE_I386;
stackframe.AddrPC.Offset = context.Eip;
stackframe.AddrPC.Mode = AddrModeFlat;
stackframe.AddrFrame.Offset = context.Ebp;
stackframe.AddrFrame.Mode = AddrModeFlat;
stackframe.AddrStack.Offset = context.Esp;
stackframe.AddrStack.Mode = AddrModeFlat;
#elif defined(PLATFORM_X86_64)
image = IMAGE_FILE_MACHINE_AMD64;
stackframe.AddrPC.Offset = context.Rip;
stackframe.AddrPC.Mode = AddrModeFlat;
stackframe.AddrFrame.Offset = context.Rsp;
stackframe.AddrFrame.Mode = AddrModeFlat;
stackframe.AddrStack.Offset = context.Rsp;
stackframe.AddrStack.Mode = AddrModeFlat;
#else
snprintf(msg, CRASH_MAX_MSG, "no stack trace available on this arch\n");
return;
#endif
DWORD disp = 0;
DWORD64 disp64 = 0;
IMAGEHLP_LINE64 line;
DWORD msglen = 0;
CRASH_MSG("EXCEPTION: 0x%08lx\n", exinfo->ExceptionRecord->ExceptionCode);
CRASH_MSG("PC: %p", exinfo->ExceptionRecord->ExceptionAddress);
if (SymGetLineFromAddr64(process, (uintptr_t)exinfo->ExceptionRecord->ExceptionAddress, &disp, &line)) {
CRASH_MSG(": %s:%lu+%lu", line.FileName, line.LineNumber, disp);
}
CRASH_MSG("\n\nBACKTRACE:\n");
char symbuf[sizeof(SYMBOL_INFO) + CRASH_MAX_SYM * sizeof(TCHAR)];
PSYMBOL_INFO sym = (PSYMBOL_INFO)symbuf;
sym->SizeOfStruct = sizeof(*sym);
sym->MaxNameLen = CRASH_MAX_SYM;
s32 i;
for (i = 0; i < CRASH_MAX_FRAMES; ++i) {
const BOOL res = StackWalk64(image, process, thread, &stackframe, &context, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL);
if (!res) {
break;
}
CRASH_MSG("#%02d: %p", i, (void *)(uintptr_t)stackframe.AddrPC.Offset);
if (SymFromAddr(process, stackframe.AddrPC.Offset, &disp64, sym)) {
CRASH_MSG(": %s+%llu", sym->Name, disp64);
}
if(SymGetLineFromAddr64(process, stackframe.AddrPC.Offset, &disp, &line)) {
CRASH_MSG(" (%s:%lu+%lu)", line.FileName, line.LineNumber, disp);
}
CRASH_MSG("\n");
}
if (i <= 1) {
CRASH_MSG("no information\n");
} else if (i == CRASH_MAX_FRAMES) {
CRASH_MSG("...\n");
}
SymCleanup(process);
}
static long __stdcall crashHandler(PEXCEPTION_POINTERS exinfo)
{
char msg[CRASH_MAX_MSG + 1] = { 0 };
if (IsDebuggerPresent()) {
if (prevExFilter) {
return prevExFilter(exinfo);
}
return EXCEPTION_CONTINUE_EXECUTION;
}
sysLogPrintf(LOG_ERROR, "FATAL: Crashed: PC=%p CODE=0x%08lx", exinfo->ExceptionRecord->ExceptionAddress, exinfo->ExceptionRecord->ExceptionCode);
fflush(stderr);
fflush(stdout);
crashStackTrace(msg, exinfo);
sysFatalError("Crash!\n\n%s", msg);
return EXCEPTION_CONTINUE_EXECUTION;
}
#elif defined(PLATFORM_LINUX)
#include <ucontext.h>
#include <signal.h>
#include <execinfo.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/fcntl.h>
static struct sigaction prevSigAction;
static s32 crashIsDebuggerPresent(void)
{
static s32 result = -1;
if (result >= 0) {
return result;
}
char buf[4096] = { 0 };
int fd = open("/proc/self/status", O_RDONLY);
if (fd < 0) {
result = 0;
return 0;
}
int rx = read(fd, buf, sizeof(buf) - 1);
close(fd);
if (rx <= 0) {
result = 0;
return 0;
}
buf[rx] = 0;
char *str = strstr(buf, "TracerPid:");
if (!str) {
result = 0;
return 0;
}
str += 10;
while (*str && !isdigit(*str)) {
if (*str == '\n') {
result = 0;
return 0;
}
++str;
}
result = (atoi(str) != 0);
return result;
}
static void crashStackTrace(char *msg, s32 sig, void *pc)
{
u32 msglen = 0;
void *frames[CRASH_MAX_FRAMES] = { NULL };
const s32 nframes = backtrace(frames, CRASH_MAX_FRAMES);
if (nframes <= 0) {
CRASH_MSG("no information\n");
return;
}
char **strings = backtrace_symbols(frames, nframes);
CRASH_MSG("SIGNAL: %d\n", sig);
CRASH_MSG("PC: ");
if (pc) {
CRASH_MSG("%p\n", pc);
} else if (strings) {
CRASH_MSG("%s\n", strings[0]);
} else {
CRASH_MSG("%p\n", frames[0]);
}
CRASH_MSG("\nBACKTRACE:\n");
s32 i;
for (i = 0; i < nframes; ++i) {
CRASH_MSG("#%02d: ", i);
if (strings && strings[i]) {
CRASH_MSG("%s\n", strings[i]);
} else {
CRASH_MSG("%p\n", frames[i]);
}
}
if (i == CRASH_MAX_FRAMES) {
CRASH_MSG("...\n");
} else if (i <= 1) {
CRASH_MSG("no information\n");
}
free(strings);
}
static void crashHandler(s32 sig, siginfo_t *siginfo, void *ctx)
{
char msg[CRASH_MAX_MSG + 1] = { 0 };
if (crashIsDebuggerPresent()) {
return;
}
void *pc = NULL;
if (ctx) {
ucontext_t *ucontext = (ucontext_t *)ctx;
#ifdef PLATFORM_X86
pc = (void *)ucontext->uc_mcontext.gregs[REG_EIP];
#elif defined(PLATFORM_X86_64)
pc = (void *)ucontext->uc_mcontext.gregs[REG_RIP];
#elif defined(PLATFORM_ARM) && defined(PLATFORM_64BIT)
pc = (void *)ucontext->uc_mcontext.pc;
#elif defined(PLATFORM_ARM)
pc = (void *)ucontext->uc_mcontext.arm_pc;
#endif
}
sysLogPrintf(LOG_ERROR, "FATAL: Crashed: PC=%p SIGNAL=%d", pc, sig);
fflush(stderr);
fflush(stdout);
crashStackTrace(msg, sig, pc);
sysFatalError("Crash!\n\n%s", msg);
}
#endif
u8 g_CrashHasMessage = 0;
s32 g_CrashEnabled = 0;
static char crashMsg[1024];
void crashInit(void)
{
#ifdef PLATFORM_WIN32
SetErrorMode(SEM_FAILCRITICALERRORS);
prevExFilter = SetUnhandledExceptionFilter(crashHandler);
g_CrashEnabled = 1;
#elif defined(PLATFORM_LINUX)
struct sigaction sigact = { 0 };
sigact.sa_flags = SA_SIGINFO | SA_ONSTACK;
sigact.sa_sigaction = crashHandler;
sigaction(SIGSEGV, &sigact, &prevSigAction);
sigaction(SIGABRT, &sigact, &prevSigAction);
sigaction(SIGBUS, &sigact, &prevSigAction);
sigaction(SIGILL, &sigact, &prevSigAction);
g_CrashEnabled = 1;
#endif
}
void crashShutdown(void)
{
#ifdef PLATFORM_WIN32
if (prevExFilter) {
SetUnhandledExceptionFilter(prevExFilter);
}
#elif defined(PLATFORM_LINUX)
sigaction(SIGSEGV, &prevSigAction, NULL);
sigaction(SIGABRT, &prevSigAction, NULL);
sigaction(SIGBUS, &prevSigAction, NULL);
sigaction(SIGILL, &prevSigAction, NULL);
#endif
g_CrashEnabled = 0;
}
void crashCreateThread(void)
{
// TODO: install a crash handler of some sort
}
void crashSetMessage(char *string)
{
strncpy(crashMsg, string, sizeof(crashMsg) - 1);
sysLogPrintf(LOG_ERROR, "crashSetMessage: %s", crashMsg);
g_CrashHasMessage = 1;
}
void crashReset(void)
{
crashMsg[0] = 0;
g_CrashHasMessage = 0;
}
void crashAppendChar(char c)
{
g_CrashHasMessage = 1;
for (u32 i = 0; i < sizeof(crashMsg) - 1; ++i) {
if (crashMsg[i] == '\0') {
crashMsg[i] = c;
crashMsg[i + 1] = '\0';
break;
}
}
}
+1 -1
View File
@@ -156,7 +156,7 @@ void inputSetDefaultKeyBinds(void)
};
static const u32 joybinds[][2] = {
{ CK_B, SDL_CONTROLLER_BUTTON_A },
{ CK_A, SDL_CONTROLLER_BUTTON_A },
{ CK_X, SDL_CONTROLLER_BUTTON_X },
{ CK_Y, SDL_CONTROLLER_BUTTON_Y },
{ CK_DPAD_L, SDL_CONTROLLER_BUTTON_B, },
+2
View File
@@ -60,6 +60,7 @@ static void cleanup(void)
sysLogPrintf(LOG_NOTE, "shutdown");
inputSaveConfig();
configSave(CONFIG_FNAME);
crashShutdown();
// TODO: actually shut down all subsystems
}
@@ -77,6 +78,7 @@ static void gameLoadConfig(void)
int main(int argc, const char **argv)
{
crashInit();
sysInit(argc, argv);
fsInit();
configInit();
+8
View File
@@ -112,8 +112,16 @@ void sysLogPrintf(s32 level, const char *fmt, ...)
void sysFatalError(const char *fmt, ...)
{
static s32 alreadyCrashed = 0;
if (alreadyCrashed) {
abort();
}
char errmsg[2048] = { 0 };
alreadyCrashed = 1;
va_list ap;
va_start(ap, fmt);
vsnprintf(errmsg, sizeof(errmsg), fmt, ap);
+8
View File
@@ -20,6 +20,7 @@ static u32 dlcount = 0;
static u32 frames = 0;
static u32 framesPerSec = 0;
static f64 startTime, endTime, fpsTime;
static u32 texFilter2D = 1;
s32 videoInit(void)
{
@@ -46,6 +47,8 @@ s32 videoInit(void)
if (filter > FILTER_THREE_POINT) filter = FILTER_THREE_POINT;
renderingAPI->set_texture_filter((enum FilteringMode)filter);
texFilter2D = configGetIntClamped("Video.TextureFilter2D", 1, 0, 1);
initDone = true;
return 0;
}
@@ -134,6 +137,11 @@ f32 videoGetAspect(void)
return gfx_current_dimensions.aspect_ratio;
}
u32 videoGetTextureFilter2D(void)
{
return texFilter2D;
}
s32 videoCreateFramebuffer(u32 w, u32 h)
{
return gfx_create_framebuffer(w, h);
+11 -4
View File
@@ -1295,12 +1295,19 @@ void bmoveProcessInput(bool allowc1x, bool allowc1y, bool allowc1buttons, bool i
movedata.aimturnleftspeed = (g_Vars.currentplayer->swivelpos[0] - -0.9f) / -0.1f;
movedata.aimturnrightspeed = 0.f;
}
f32 vertaup = 0.f, vertadown = 0.f;
if (g_Vars.currentplayer->swivelpos[1] > 0.9f) {
movedata.speedvertaup = (g_Vars.currentplayer->swivelpos[1] - 0.9f) / 0.1f;
movedata.speedvertadown = 0.f;
vertaup = (g_Vars.currentplayer->swivelpos[1] - 0.9f) / 0.1f;
} else if (g_Vars.currentplayer->swivelpos[1] < -0.9f) {
movedata.speedvertadown = (g_Vars.currentplayer->swivelpos[1] - -0.9f) / -0.1f;
movedata.speedvertaup = 0.f;
vertadown = (g_Vars.currentplayer->swivelpos[1] - -0.9f) / -0.1f;
}
// Uninvert pitch if needed
if (movedata.invertpitch) {
movedata.speedvertaup = vertadown;
movedata.speedvertadown = vertaup;
} else {
movedata.speedvertaup = vertaup;
movedata.speedvertadown = vertadown;
}
} else {
// Reset mouse aim position when not mouse aiming
+20 -2
View File
@@ -211,7 +211,7 @@ Gfx *bviewPrepareStaticRgba16(Gfx *gdl, u32 colour, u32 alpha)
gDPSetTexturePersp(gdl++, G_TP_NONE);
gDPSetColorDither(gdl++, G_CD_DISABLE);
gDPSetAlphaDither(gdl++, G_AD_NOISE);
gDPSetRenderMode(gdl++, G_RM_CLD_SURF, G_RM_NOOP2);
gDPSetRenderMode(gdl++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
return gdl;
}
@@ -245,7 +245,7 @@ Gfx *bviewPrepareStaticI8(Gfx *gdl, u32 colour, u32 alpha)
gDPSetTexturePersp(gdl++, G_TP_NONE);
gDPSetColorDither(gdl++, G_CD_DISABLE);
gDPSetAlphaDither(gdl++, G_AD_NOISE);
gDPSetRenderMode(gdl++, G_RM_CLD_SURF, G_RM_NOOP2);
gDPSetRenderMode(gdl++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
return gdl;
}
@@ -1952,6 +1952,9 @@ Gfx *bviewDrawNvLens(Gfx *gdl)
s32 viewbottom = viewtop + viewheight;
s32 brightness;
s32 y;
#ifdef AVOID_UB
u32 mpindex = g_Vars.currentplayerstats->mpindex % MAX_PLAYERS;
#endif
var8007f840++;
@@ -1973,9 +1976,15 @@ Gfx *bviewDrawNvLens(Gfx *gdl)
skySetOverexposure(brightness, brightness, brightness);
}
#ifdef AVOID_UB
if (g_Menus[mpindex].curdialog == NULL) {
gdl = bviewDrawMotionBlur(gdl, 0x00ff0000, 0x60);
}
#else
if (g_Menus[g_Vars.currentplayerstats->mpindex].curdialog == NULL) {
gdl = bviewDrawMotionBlur(gdl, 0x00ff0000, 0x60);
}
#endif
gDPPipeSync(gdl++);
@@ -2034,6 +2043,9 @@ Gfx *bviewDrawIrLens(Gfx *gdl)
s32 viewcentrey;
f32 viewheightf;
s32 a0;
#ifdef AVOID_UB
u32 mpindex = g_Vars.currentplayerstats->mpindex % MAX_PLAYERS;
#endif
#if VERSION < VERSION_NTSC_1_0
static s32 fsscanline = 0;
@@ -2198,9 +2210,15 @@ Gfx *bviewDrawIrLens(Gfx *gdl)
#endif
}
#ifdef AVOID_UB
if (g_Menus[mpindex].curdialog == NULL) {
gdl = bviewDrawMotionBlur(gdl, 0xff000000, 0x40);
}
#else
if (g_Menus[g_Vars.currentplayerstats->mpindex].curdialog == NULL) {
gdl = bviewDrawMotionBlur(gdl, 0xff000000, 0x40);
}
#endif
return gdl;
}
+9
View File
@@ -1,4 +1,5 @@
#include <ultra64.h>
#include <string.h>
#include "constants.h"
#include "game/atan2f.h"
#include "game/camera.h"
@@ -600,6 +601,9 @@ bool camIsPosInFovAndVisibleRoom(RoomNum *rooms, struct coord *pos, f32 arg2)
RoomNum room;
bool hasdata = false;
struct drawslot *thisthing;
#ifdef AVOID_UB
static struct drawslot dslot;
#endif
struct screenbox box;
for (i = 0, room = rooms[i]; room != -1; i++, room = rooms[i]) {
@@ -637,5 +641,10 @@ bool camIsPosInFovAndVisibleRoom(RoomNum *rooms, struct coord *pos, f32 arg2)
return false;
}
#ifdef AVOID_UB
memcpy(&dslot.box, &box, sizeof(box));
return camIsPosInScreenBox(pos, arg2, &dslot);
#else
return camIsPosInScreenBox(pos, arg2, (struct drawslot *) &(((u8 *) &box)[-((uintptr_t) &(((struct drawslot *)0)->box))]));
#endif
}
+10
View File
@@ -585,6 +585,16 @@ struct menuitem g_MainMenu4MbMenuItems[] = {
0,
(void *)&g_ChangeAgentMenuDialog,
},
#ifndef PLATFORM_N64
{
MENUITEMTYPE_SELECTABLE,
0,
MENUITEMFLAG_SELECTABLE_OPENSDIALOG | MENUITEMFLAG_BIGFONT,
L_OPTIONS_110, // "Exit Game"
0x00000007,
(void *)&g_ExitGameMenuDialog,
},
#endif
{ MENUITEMTYPE_END },
};
+2 -2
View File
@@ -394,7 +394,7 @@ Gfx *text0f153628(Gfx *gdl)
}
#endif
else {
gDPSetTextureFilter(gdl++, G_TF_BILERP);
gDPSetTextureFilter(gdl++, TEX_FILTER_2D);
}
return gdl;
@@ -1790,7 +1790,7 @@ Gfx *text0f15568c(Gfx *gdl, s32 *x, s32 *y, struct fontchar *curchar, struct fon
(*x + curchar->width) * 4 + var8007fadc,
G_TX_RENDERTILE,
var8007fae8 + 32,
((curchar->height - 1) << 5) + var8007fae4 + 32,
((curchar->height) << 5) + var8007fae4 + 32,
1024,
65536 - 1024 / var8007fad0);
} else {
+4
View File
@@ -329,7 +329,11 @@ void gfxReplaceGbiCommands(Gfx *startgdl, Gfx *endgdl, s32 type)
void gfxReplaceGbiCommandsRecursively(struct roomblock *block, s32 type)
{
#ifndef AVOID_UB
// Sometimes block is NULL when this is called.
// If UBSan is being used, this will crash in this instance.
if (block->type == ROOMBLOCKTYPE_PARENT);
#endif
while (true) {
if (!block) {
+4
View File
@@ -2525,6 +2525,7 @@ struct menuitem g_VideoOptionsMenuItems[] = {
0,
menuhandlerScreenSize,
},
#ifdef PLATFORM_N64
{
MENUITEMTYPE_DROPDOWN,
0,
@@ -2541,6 +2542,7 @@ struct menuitem g_VideoOptionsMenuItems[] = {
0,
menuhandlerHiRes,
},
#endif
#if PAL
{
MENUITEMTYPE_DROPDOWN,
@@ -2587,6 +2589,7 @@ struct menuitem g_VideoOptionsMenuItems[] = {
};
struct menuitem g_2PMissionVideoOptionsMenuItems[] = {
#ifdef PLATFORM_N64
{
MENUITEMTYPE_DROPDOWN,
0,
@@ -2603,6 +2606,7 @@ struct menuitem g_2PMissionVideoOptionsMenuItems[] = {
0,
menuhandlerHiRes,
},
#endif
#if PAL
{
MENUITEMTYPE_DROPDOWN,
+25 -4
View File
@@ -3011,7 +3011,7 @@ Gfx *dialogRender(Gfx *gdl, struct menudialog *dialog, struct menu *menu, bool l
textMeasure(&textheight, &textwidth, title, g_CharsHandelGothicXs, g_FontHandelGothicXs, 0);
x = dialogleft - 1;
x = dialogleft - 2;
y = (dialogtop + dialogbottom) / 2 - textwidth - 3;
if (y < dialogtop) {
@@ -3411,8 +3411,14 @@ void menuClose(void)
void func0f0f8120(void)
{
#ifdef AVOID_UB
u32 mpindex = g_MpPlayerNum % MAX_PLAYERS;
struct menudialog *prev = g_Menus[mpindex].curdialog;
s32 i;
#else
struct menudialog *prev = g_Menus[g_MpPlayerNum].curdialog;
s32 i;
#endif
if (g_MenuData.unk66e > 0) {
for (i = g_MenuData.unk66e; i >= 0; i--) {
@@ -3420,11 +3426,22 @@ void func0f0f8120(void)
}
}
#ifdef AVOID_UB
mpindex = g_MpPlayerNum;
if (mpindex >= MAX_PLAYERS)
mpindex -= MAX_PLAYERS;
if (g_Menus[mpindex].curdialog == prev) {
while (g_Menus[mpindex].depth > 0) {
menuPopDialog();
}
}
#else
if (g_Menus[g_MpPlayerNum].curdialog == prev) {
while (g_Menus[g_MpPlayerNum].depth > 0) {
menuPopDialog();
}
}
#endif
}
void func0f0f820c(struct menudialogdef *dialogdef, s32 root)
@@ -4338,7 +4355,11 @@ void dialogTick(struct menudialog *dialog, struct menuinputs *inputs, u32 tickfl
}
// Apply default navigational behaviour if requested
#ifdef AVOID_UB
if (usedefaultbehaviour && (tickflags & MENUTICKFLAG_DIALOGISCURRENT) && !dialog->dimmed && g_Menus[g_MpPlayerNum].depth >= 1) {
#else
if (usedefaultbehaviour && (tickflags & MENUTICKFLAG_DIALOGISCURRENT) && !dialog->dimmed) {
#endif
struct menulayer *layer = &g_Menus[g_MpPlayerNum].layers[g_Menus[g_MpPlayerNum].depth - 1];
if (layer->numsiblings <= 1) {
@@ -4603,11 +4624,11 @@ void menuProcessInput(void)
if (buttonsnow & BUTTON_RADIAL) {
inputs.select = 1;
}
// this will naturally feel nice w/ a switch layout
// with the default mapping for weapon-back
if (buttonsnow & BUTTON_WPNBACK) {
inputs.select = 1;
inputs.back = 1;
}
#endif
if (buttonsnow & B_BUTTON) {
inputs.back = 1;
+4
View File
@@ -296,7 +296,11 @@ s32 optionsGetScreenRatio(void)
void optionsSetScreenRatio(s32 ratio)
{
#ifdef PLATFORM_N64
g_ScreenRatio = ratio;
#else
g_ScreenRatio = SCREENRATIO_NORMAL;
#endif
}
u8 optionsGetScreenSplit(void)
+4
View File
@@ -2794,7 +2794,11 @@ void playerResetLoResIf4Mb(void)
void playerSetHiResEnabled(bool enable)
{
#ifdef PLATFORM_N64
g_HiResEnabled = enable;
#else
g_HiResEnabled = false;
#endif
}
s16 playerGetFbWidth(void)
+75
View File
@@ -15,6 +15,7 @@
#include "data.h"
#include "types.h"
#ifndef PLATFORM_N64
#include "game/gfxmemory.h"
#include "game/game_13c510.h"
#include "game/player.h"
#endif
@@ -826,6 +827,7 @@ Gfx *skyRender(Gfx *gdl)
gDPSetRenderMode(gdl++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
#ifdef PLATFORM_N64
if (numvertices == 4) {
gdl = skyRenderTri(gdl, &watervertices2d[0], &watervertices2d[1], &watervertices2d[3], 130.0f, true);
@@ -846,6 +848,42 @@ Gfx *skyRender(Gfx *gdl)
// 1 corner is on the ground
gdl = skyRenderTri(gdl, &watervertices2d[0], &watervertices2d[1], &watervertices2d[2], 130.0f, true);
}
#else
Vtx *verts = gfxAllocateVertices(5);
Col *cols = gfxAllocateColours(5);
Mtxf *mtx = gfxAllocateMatrix();
mtx4MultMtx4(camGetWorldToScreenMtxf(), &g_SkyMtx, mtx);
mtxF2L(mtx, mtx);
gSPSetExtraGeometryModeEXT(gdl++, G_NO_CLIPPING_EXT);
gSPMatrix(gdl++, osVirtualToPhysical(mtx), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_PUSH);
gSPColor(gdl++, osVirtualToPhysical(cols), numvertices);
gSPVertex(gdl++, osVirtualToPhysical(verts), numvertices, 0);
for (s32 i = 0; i < numvertices; ++i) {
verts[i].x = watervertices3d[i].x;
verts[i].y = watervertices3d[i].y;
verts[i].z = watervertices3d[i].z;
verts[i].s = skyClamp(watervertices3d[i].s, -32768.f, 32767.f);
verts[i].t = skyClamp(watervertices3d[i].t, -32768.f, 32767.f);
verts[i].colour = i * 4;
cols[i].r = watervertices3d[i].r;
cols[i].g = watervertices3d[i].g;
cols[i].b = watervertices3d[i].b;
cols[i].a = watervertices3d[i].a;
}
if (numvertices == 4) {
gSPTri2(gdl++, 0, 1, 3, 3, 2, 0);
} else if (numvertices == 5) {
gSPTri3(gdl++, 0, 1, 2, 0, 2, 3, 0, 3, 4);
} else if (numvertices == 3) {
gSPTri1(gdl++, 0, 1, 2);
}
gSPPopMatrix(gdl++, G_MTX_MODELVIEW);
gSPClearExtraGeometryModeEXT(gdl++, G_NO_CLIPPING_EXT);
#endif
}
}
@@ -1252,6 +1290,7 @@ Gfx *skyRender(Gfx *gdl)
skyvertices2d[i].y = skyClamp(skyvertices2d[i].y, camGetScreenTop() * 4.0f, (camGetScreenTop() + camGetScreenHeight()) * 4.0f - 1.0f);
}
#ifdef PLATFORM_N64
if (numvertices == 4) {
if (cornerstate == CORNERSTATE_TOP) {
if (sp548 < sp54c) {
@@ -1292,6 +1331,42 @@ Gfx *skyRender(Gfx *gdl)
// One corner is in the sky
gdl = skyRenderTri(gdl, &skyvertices2d[0], &skyvertices2d[1], &skyvertices2d[2], 130.0f, true);
}
#else
Vtx *verts = gfxAllocateVertices(5);
Col *cols = gfxAllocateColours(5);
Mtxf *mtx = gfxAllocateMatrix();
mtx4MultMtx4(camGetWorldToScreenMtxf(), &g_SkyMtx, mtx);
mtxF2L(mtx, mtx);
gSPSetExtraGeometryModeEXT(gdl++, G_NO_CLIPPING_EXT);
gSPMatrix(gdl++, osVirtualToPhysical(mtx), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_PUSH);
gSPColor(gdl++, osVirtualToPhysical(cols), numvertices);
gSPVertex(gdl++, osVirtualToPhysical(verts), numvertices, 0);
for (s32 i = 0; i < numvertices; ++i) {
verts[i].x = skyvertices3d[i].x;
verts[i].y = skyvertices3d[i].y;
verts[i].z = skyvertices3d[i].z;
verts[i].s = skyClamp(skyvertices3d[i].s, -32768.f, 32767.f);
verts[i].t = skyClamp(skyvertices3d[i].t, -32768.f, 32767.f);
verts[i].colour = i * 4;
cols[i].r = skyvertices3d[i].r;
cols[i].g = skyvertices3d[i].g;
cols[i].b = skyvertices3d[i].b;
cols[i].a = skyvertices3d[i].a;
}
if (numvertices == 4) {
gSPTri2(gdl++, 0, 1, 3, 3, 2, 0);
} else if (numvertices == 5) {
gSPTri3(gdl++, 0, 1, 2, 0, 2, 3, 0, 3, 4);
} else if (numvertices == 3) {
gSPTri1(gdl++, 0, 1, 2);
}
gSPPopMatrix(gdl++, G_MTX_MODELVIEW);
gSPClearExtraGeometryModeEXT(gdl++, G_NO_CLIPPING_EXT);
#endif
}
return gdl;
+1 -1
View File
@@ -335,7 +335,7 @@ Gfx *sparksRender(Gfx *gdl)
gDPSetCycleType(gdl++, G_CYC_1CYCLE);
gDPSetColorDither(gdl++, G_CD_DISABLE);
gDPSetRenderMode(gdl++, G_RM_AA_ZB_XLU_SURF, G_RM_NOOP2);
gDPSetRenderMode(gdl++, G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2);
gDPSetAlphaCompare(gdl++, G_AC_NONE);
gDPSetTextureLOD(gdl++, G_TL_TILE);
gDPSetTextureConvert(gdl++, G_TC_FILT);
+3
View File
@@ -39,6 +39,9 @@ s32 g_TexLutMode;
u32 var800ab5b4;
struct tilestate g_TexTileStates[8];
struct tilesize g_TexTileSizes[8];
#ifndef PLATFORM_N64
u32 g_TexFilter2D = G_TF_BILERP;
#endif
// Default
u16 g_SurfaceTypeDefaultSounds[] = { SFX_HIT_STONE_8087, SFX_HIT_STONE_8088 };
+3
View File
@@ -136,6 +136,9 @@ void texReset(void)
// reset backend texture cache
videoResetTextureCache();
// get backend texture settings
g_TexFilter2D = videoGetTextureFilter2D() ? G_TF_BILERP : G_TF_POINT;
#endif
g_TexWords = mempAlloc(ALIGN16(g_TexNumConfigs * 4), MEMPOOL_STAGE);
+2 -2
View File
@@ -823,7 +823,7 @@ Gfx *weatherRenderRain(Gfx *gdl, struct weatherdata *weather, s32 arg2)
gDPSetCycleType(gdl++, G_CYC_1CYCLE);
gDPSetColorDither(gdl++, G_CD_DISABLE);
gDPSetRenderMode(gdl++, G_RM_AA_ZB_XLU_SURF, G_RM_NOOP2);
gDPSetRenderMode(gdl++, G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2);
gDPSetAlphaCompare(gdl++, G_AC_NONE);
gDPSetTextureLOD(gdl++, G_TL_TILE);
gDPSetTextureConvert(gdl++, G_TC_FILT);
@@ -2902,7 +2902,7 @@ Gfx *weatherRenderSnow(Gfx *gdl, struct weatherdata *weather, s32 arg2)
gDPSetCycleType(gdl++, G_CYC_1CYCLE);
gDPSetColorDither(gdl++, G_CD_DISABLE);
gDPSetRenderMode(gdl++, G_RM_AA_ZB_XLU_SURF, G_RM_NOOP2);
gDPSetRenderMode(gdl++, G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2);
gDPSetAlphaCompare(gdl++, G_AC_NONE);
gDPSetTextureLOD(gdl++, G_TL_TILE);
gDPSetTextureConvert(gdl++, G_TC_FILT);
+10
View File
@@ -528,7 +528,9 @@ extern struct menudialogdef g_HtDetailsMenuDialog;
extern struct menudialogdef g_HtFailedMenuDialog;
extern struct menudialogdef g_HtCompletedMenuDialog;
extern struct menudialogdef g_HangarListMenuDialog;
#ifndef PLATFORM_N64
extern f32 g_PlayerCrosshairSway;
extern f32 g_PlayerDefaultFovY;
extern s32 g_PlayerMouseAimMode;
@@ -536,6 +538,14 @@ extern f32 g_PlayerMouseAimSpeedX;
extern f32 g_PlayerMouseAimSpeedY;
extern s32 g_PlayerFovAffectsZoom;
extern f32 g_PlayerFovZoomMultiplier;
extern u32 g_TexFilter2D;
#define TEX_FILTER_2D g_TexFilter2D
#else
#define TEX_FILTER_2D G_TF_BILERP
#endif
#ifdef PLATFORM_N64
+3
View File
@@ -10,6 +10,9 @@ extern struct menudialogdef g_AcceptMissionMenuDialog;
extern struct menudialogdef g_PreAndPostMissionBriefingMenuDialog;
extern struct menudialogdef g_RetryMissionMenuDialog;
extern struct menudialogdef g_NextMissionMenuDialog;
#ifndef PLATFORM_N64
extern struct menudialogdef g_ExitGameMenuDialog;
#endif
char *menuTextCurrentStageName(struct menuitem *item);
char *soloMenuTextDifficulty(struct menuitem *item);
+1
View File
@@ -201,6 +201,7 @@
#define G_ASPECT_RIGHT_EXT 0x00000020
#define G_ASPECT_CENTER_EXT (G_ASPECT_LEFT_EXT | G_ASPECT_RIGHT_EXT)
#define G_ASPECT_MODE_EXT G_ASPECT_CENTER_EXT
#define G_NO_CLIPPING_EXT 0x00000040
/* Extended command macros */