diff --git a/include/geo_commands.h b/include/geo_commands.h index c611619b..759303cc 100644 --- a/include/geo_commands.h +++ b/include/geo_commands.h @@ -10,17 +10,11 @@ #include "game/mario_misc.h" #include "game/mario_actions_cutscene.h" -// sky background params -#define BACKGROUND_OCEAN_SKY 0 -#define BACKGROUND_FLAMING_SKY 1 -#define BACKGROUND_UNDERWATER_CITY 2 -#define BACKGROUND_BELOW_CLOUDS 3 -#define BACKGROUND_SNOW_MOUNTAINS 4 -#define BACKGROUND_DESERT 5 -#define BACKGROUND_HAUNTED 6 -#define BACKGROUND_GREEN_SKY 7 -#define BACKGROUND_ABOVE_CLOUDS 8 -#define BACKGROUND_PURPLE_SKY 9 +enum SkyBackgroundParams { +#define SKYBOX_ENUM +#include "skyboxes.h" +#undef SKYBOX_ENUM +}; // geo layout macros diff --git a/include/segment_symbols.h b/include/segment_symbols.h index 2909ec88..c274d552 100644 --- a/include/segment_symbols.h +++ b/include/segment_symbols.h @@ -65,16 +65,9 @@ DECLARE_LEVEL_SEGMENT(ending) DECLARE_SEGMENT(segment2_mio0) -DECLARE_SEGMENT(water_skybox_mio0) -DECLARE_SEGMENT(ccm_skybox_mio0) -DECLARE_SEGMENT(clouds_skybox_mio0) -DECLARE_SEGMENT(bitfs_skybox_mio0) -DECLARE_SEGMENT(wdw_skybox_mio0) -DECLARE_SEGMENT(cloud_floor_skybox_mio0) -DECLARE_SEGMENT(ssl_skybox_mio0) -DECLARE_SEGMENT(bbh_skybox_mio0) -DECLARE_SEGMENT(bidw_skybox_mio0) -DECLARE_SEGMENT(bits_skybox_mio0) +#define SKYBOX_SYMBOLS_ROM +#include "skyboxes.h" +#undef SKYBOX_SYMBOLS_ROM DECLARE_SEGMENT(fire_mio0) DECLARE_SEGMENT(spooky_mio0) diff --git a/include/skyboxes.h b/include/skyboxes.h new file mode 100644 index 00000000..1b143e9b --- /dev/null +++ b/include/skyboxes.h @@ -0,0 +1,40 @@ +#ifdef SKYBOX_SYMBOLS +#define DEFINE_SKYBOX(symbol, enumeration) extern SkyboxTexture symbol##_skybox_ptrlist; +#endif + +#ifdef SKYBOX_SYMBOLS_REFERENCE +#define DEFINE_SKYBOX(symbol, enumeration) &symbol##_skybox_ptrlist, +#endif + +#ifdef SKYBOX_SYMBOLS_ROM +#define DEFINE_SKYBOX(symbol, enumeration) \ + DECLARE_SEGMENT(symbol##_skybox_mio0) +#endif + +#ifdef SKYBOX_ENUM +#define DEFINE_SKYBOX(symbol, enumeration) enumeration, +#endif + +#ifdef SKYBOX_LD +#define DEFINE_SKYBOX(symbol, enumeration) MIO0_SEG(symbol##_skybox, 0x0A000000) +#endif + +/** + * @brief Defines skybox properties. + * + * @param symbol - Filename of the skybox used for symbol generation. + * @param enumeration - Name used for the enum. + */ + +DEFINE_SKYBOX(water, BACKGROUND_OCEAN_SKY) +DEFINE_SKYBOX(bitfs, BACKGROUND_FLAMING_SKY) +DEFINE_SKYBOX(wdw, BACKGROUND_UNDERWATER_CITY) +DEFINE_SKYBOX(cloud_floor, BACKGROUND_BELOW_CLOUDS) +DEFINE_SKYBOX(ccm, BACKGROUND_SNOW_MOUNTAINS) +DEFINE_SKYBOX(ssl, BACKGROUND_DESERT) +DEFINE_SKYBOX(bbh, BACKGROUND_HAUNTED) +DEFINE_SKYBOX(bidw, BACKGROUND_GREEN_SKY) +DEFINE_SKYBOX(clouds, BACKGROUND_ABOVE_CLOUDS) +DEFINE_SKYBOX(bits, BACKGROUND_PURPLE_SKY) + +#undef DEFINE_SKYBOX diff --git a/sm64.ld b/sm64.ld index d10fca81..584f7af1 100755 --- a/sm64.ld +++ b/sm64.ld @@ -200,11 +200,8 @@ SECTIONS BUILD_DIR/src/menu*.o(.text); BUILD_DIR/libgoddard.a:*.o(.text); BUILD_DIR/libgoddard.a:dynlist_proc.o(.text); - - /* data, rodata, per file */ BUILD_DIR/src/menu*.o(.data*); BUILD_DIR/src/menu*.o(.rodata*); - /* goddard subsystem data */ BUILD_DIR/libgoddard.a:*.o(.data*); BUILD_DIR/libgoddard.a:dynlist_proc.o(.data*); BUILD_DIR/libgoddard.a:*.o(.rodata*); @@ -221,7 +218,6 @@ SECTIONS } END_NOLOAD(goddard) - /* 0x268020 0x268020-0 [0] */ BEGIN_SEG(intro, 0x14000000) { BUILD_DIR/levels/intro/script.o(.data); @@ -259,16 +255,9 @@ SECTIONS } END_SEG(scripts) - MIO0_SEG(water_skybox, 0x0A000000) - MIO0_SEG(ccm_skybox, 0x0A000000) - MIO0_SEG(clouds_skybox, 0x0A000000) - MIO0_SEG(bitfs_skybox, 0x0A000000) - MIO0_SEG(wdw_skybox, 0x0A000000) - MIO0_SEG(cloud_floor_skybox, 0x0A000000) - MIO0_SEG(ssl_skybox, 0x0A000000) - MIO0_SEG(bbh_skybox, 0x0A000000) - MIO0_SEG(bidw_skybox, 0x0A000000) - MIO0_SEG(bits_skybox, 0x0A000000) +#define SKYBOX_LD +#include "skyboxes.h" +#undef SKYBOX_LD // Texture bins MIO0_SEG(fire, 0x09000000) @@ -293,7 +282,6 @@ SECTIONS #undef STUB_LEVEL #undef DEFINE_LEVEL - /* 4E9FA0-? [?] */ BEGIN_SEG(assets, __romPos) { BUILD_DIR/assets/mario_anim_data.o(.data); diff --git a/src/game/skybox.c b/src/game/skybox.c index 7b89b439..46cb42c2 100644 --- a/src/game/skybox.c +++ b/src/game/skybox.c @@ -62,28 +62,14 @@ struct Skybox sSkyBoxInfo[2]; typedef const u8 *const SkyboxTexture[80]; -extern SkyboxTexture bbh_skybox_ptrlist; -extern SkyboxTexture bidw_skybox_ptrlist; -extern SkyboxTexture bitfs_skybox_ptrlist; -extern SkyboxTexture bits_skybox_ptrlist; -extern SkyboxTexture ccm_skybox_ptrlist; -extern SkyboxTexture cloud_floor_skybox_ptrlist; -extern SkyboxTexture clouds_skybox_ptrlist; -extern SkyboxTexture ssl_skybox_ptrlist; -extern SkyboxTexture water_skybox_ptrlist; -extern SkyboxTexture wdw_skybox_ptrlist; +#define SKYBOX_SYMBOLS +#include "skyboxes.h" +#undef SKYBOX_SYMBOLS -SkyboxTexture *sSkyboxTextures[10] = { - &water_skybox_ptrlist, - &bitfs_skybox_ptrlist, - &wdw_skybox_ptrlist, - &cloud_floor_skybox_ptrlist, - &ccm_skybox_ptrlist, - &ssl_skybox_ptrlist, - &bbh_skybox_ptrlist, - &bidw_skybox_ptrlist, - &clouds_skybox_ptrlist, - &bits_skybox_ptrlist, +SkyboxTexture *sSkyboxTextures[] = { +#define SKYBOX_SYMBOLS_REFERENCE +#include "skyboxes.h" +#undef SKYBOX_SYMBOLS_REFERENCE }; /**