mirror of https://github.com/zeldaret/mm.git
				
				
				
			
		
			
				
	
	
		
			259 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
| #ifndef Z64TRANSITION_H
 | |
| #define Z64TRANSITION_H
 | |
| 
 | |
| #include "ultra64.h"
 | |
| 
 | |
| #include "stdint.h"
 | |
| #include "unk.h"
 | |
| 
 | |
| #include "romfile.h"
 | |
| 
 | |
| #include "overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h"
 | |
| #include "overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h"
 | |
| #include "overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h"
 | |
| #include "overlays/fbdemos/ovl_fbdemo_wipe4/z_fbdemo_wipe4.h"
 | |
| #include "overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.h"
 | |
| 
 | |
| typedef enum TransitionOverlayStatus {
 | |
|     /* -1 */ TRANSITION_OVERLAY_STATUS_FAILED = -1, // failed allocation or null reference
 | |
|     /*  0 */ TRANSITION_OVERLAY_STATUS_LOAD_FREE, // successfully loaded/freed overlay
 | |
|     /*  1 */ TRANSITION_OVERLAY_STATUS_ADD_REMOVAL, // successfully added/removed instance
 | |
|     /*  2 */ TRANSITION_OVERLAY_STATUS_LOADED_NO_INSTANCES, // overlay is loaded but has no instances (?) TODO: Figure out why this exists
 | |
|     /*  3 */ TRANSITION_OVERLAY_STATUS_INTERNAL // internal overlay, so always loaded
 | |
| } TransitionOverlayStatus;
 | |
| 
 | |
| typedef enum TransitionTileState {
 | |
|     /* 0 */ TRANS_TILE_OFF, // Inactive, do nothing
 | |
|     /* 1 */ TRANS_TILE_SETUP, // Save the necessary buffers
 | |
|     /* 2 */ TRANS_TILE_PROCESS, // Initialize the transition
 | |
|     /* 3 */ TRANS_TILE_READY // The transition is ready, so will update and draw each frame
 | |
| } TransitionTileState;
 | |
| 
 | |
| typedef struct TransitionTileVtxData {
 | |
|     /* 0x0 */ f32 x;
 | |
|     /* 0x4 */ f32 y;
 | |
| } TransitionTileVtxData; // size = 0x8
 | |
| 
 | |
| typedef struct TransitionTile {
 | |
|     /* 0x00 */ s32 cols;
 | |
|     /* 0x04 */ s32 rows;
 | |
|     /* 0x08 */ s32 frame;
 | |
|     /* 0x0C */ TransitionTileVtxData* vtxData;
 | |
|     /* 0x10 */ Vtx* vtxFrame1;
 | |
|     /* 0x14 */ Vtx* vtxFrame2;
 | |
|     /* 0x18 */ Mtx projection;
 | |
|     /* 0x58 */ Mtx modelView;
 | |
|     /* 0x98 */ Mtx unk_98;
 | |
|     /* 0xD8 */ Gfx* gfx; // "gfxtbl"
 | |
|     /* 0xDC */ u16* zBuffer;
 | |
| } TransitionTile; // size = 0xE0
 | |
| 
 | |
| 
 | |
| #define TC_SET_PARAMS (1 << 7)
 | |
| 
 | |
| typedef struct TransitionProfile {
 | |
|     /* 0x00 */ void* (*init)(void* transition);
 | |
|     /* 0x04 */ void  (*destroy)(void* transition);
 | |
|     /* 0x08 */ void  (*update)(void* transition, s32 updateRate);
 | |
|     /* 0x0C */ void  (*draw)(void* transition, Gfx** gfxP);
 | |
|     /* 0x10 */ void  (*start)(void* transition);
 | |
|     /* 0x14 */ void  (*setType)(void* transition, s32 type);
 | |
|     /* 0x18 */ void  (*setColor)(void* transition, u32 color);
 | |
|     /* 0x1C */ void  (*setEnvColor)(void* transition, u32 color);
 | |
|     /* 0x20 */ s32   (*isDone)(void* transition);
 | |
| } TransitionProfile; // size = 0x24
 | |
| 
 | |
| typedef struct TransitionOverlay {
 | |
|     union {
 | |
|         struct {
 | |
|     /* 0x00 */ u32 count : 8;
 | |
|     /* 0x00 */ uintptr_t addr : 24;
 | |
|         };
 | |
|     /* 0x00 */ u32 word;
 | |
|     } loadInfo;
 | |
|     /* 0x04 */ void* vramStart;
 | |
|     /* 0x08 */ void* vramEnd;
 | |
|     /* 0x0C */ RomFile file;
 | |
|     /* 0x14 */ TransitionProfile* profile;
 | |
|     /* 0x18 */ size_t size;
 | |
| } TransitionOverlay;
 | |
| 
 | |
| typedef enum {
 | |
|     /* 1 */ TRANS_INSTANCE_TYPE_FILL_OUT = 1,
 | |
|     /* 2 */ TRANS_INSTANCE_TYPE_FILL_IN
 | |
| } TransitionInstanceType;
 | |
| 
 | |
| #define TRANS_INSTANCE_TYPE_FADE_FLASH 3
 | |
| 
 | |
| typedef struct TransitionFade {
 | |
|     /* 0x0 */ u8 type; // TransitionFadeType enum
 | |
|     /* 0x1 */ u8 isDone;
 | |
|     /* 0x2 */ u8 direction;
 | |
|     /* 0x4 */ Color_RGBA8_u32 color;
 | |
|     /* 0x8 */ u16 timer;
 | |
| } TransitionFade; // size = 0xC
 | |
| 
 | |
| #define FBDEMO_CIRCLE_GET_MASK_TYPE(type) ((type) & 1)
 | |
| 
 | |
| typedef struct TransitionCircle {
 | |
|     /* 0x00 */ Color_RGBA8_u32 color;
 | |
|     /* 0x04 */ f32 referenceRadius; // Reference for where to transition to
 | |
|     /* 0x08 */ f32 stepValue; // How fast the Transition is 
 | |
|     /* 0x0C */ f32 startingRadius; // Radius value where transition will begin
 | |
|     /* 0x10 */ f32 targetRadius; // Final radius of transition circle
 | |
|     /* 0x14 */ u8 direction; // Direction the circle is transitioning ( In / Out )
 | |
|     /* 0x15 */ u8 maskType; // Positive / Negative mask type. Value of 0 will create a black circle
 | |
|     /* 0x16 */ u8 isDone; // Signals when Transition is done updating
 | |
|     /* 0x18 */ void const* texture;
 | |
|     /* 0x1C */ u8 masks;
 | |
|     /* 0x1D */ u8 maskt;
 | |
|     /* 0x1E */ s8 unk_1E; // Set to 4 and never used
 | |
|     /* 0x1F */ s8 unk_1F; // Set to 0 and never used
 | |
| } TransitionCircle; // size = 0x20
 | |
| 
 | |
| #define TRANS_TRIGGER_OFF 0 // transition is not active
 | |
| #define TRANS_TRIGGER_START 20 // start transition (exiting an area)
 | |
| #define TRANS_TRIGGER_END -20 // transition is ending (arriving in a new area)
 | |
| 
 | |
| typedef enum TransitionMode {
 | |
|     /*  0 */ TRANS_MODE_OFF,
 | |
|     /*  1 */ TRANS_MODE_SETUP,
 | |
|     /*  2 */ TRANS_MODE_INSTANCE_INIT,
 | |
|     /*  3 */ TRANS_MODE_INSTANCE_RUNNING,
 | |
|     /*  4 */ TRANS_MODE_FILL_WHITE_INIT,
 | |
|     /*  5 */ TRANS_MODE_FILL_IN,
 | |
|     /*  6 */ TRANS_MODE_FILL_OUT,
 | |
|     /*  7 */ TRANS_MODE_FILL_BROWN_INIT,
 | |
|     /*  8 */ TRANS_MODE_08, // unused
 | |
|     /*  9 */ TRANS_MODE_09, // unused
 | |
|     /* 10 */ TRANS_MODE_INSTANT,
 | |
|     /* 11 */ TRANS_MODE_INSTANCE_WAIT,
 | |
|     /* 12 */ TRANS_MODE_SANDSTORM_INIT,
 | |
|     /* 13 */ TRANS_MODE_SANDSTORM,
 | |
|     /* 14 */ TRANS_MODE_SANDSTORM_END_INIT,
 | |
|     /* 15 */ TRANS_MODE_SANDSTORM_END,
 | |
|     /* 16 */ TRANS_MODE_CS_BLACK_FILL_INIT,
 | |
|     /* 17 */ TRANS_MODE_CS_BLACK_FILL
 | |
| } TransitionMode;
 | |
| 
 | |
| #define TRANS_TYPE_WIPE4 (1 << 5)
 | |
| #define TRANS_TYPE_WIPE3 (1 << 6)
 | |
| #define TRANS_TYPE_SET_PARAMS (1 << 7)
 | |
| 
 | |
| typedef enum TransitionType {
 | |
|     /*  0 */ TRANS_TYPE_WIPE,
 | |
|     /*  1 */ TRANS_TYPE_TRIFORCE,
 | |
|     /*  2 */ TRANS_TYPE_FADE_BLACK,
 | |
|     /*  3 */ TRANS_TYPE_FADE_WHITE,
 | |
|     /*  4 */ TRANS_TYPE_FADE_BLACK_FAST,
 | |
|     /*  5 */ TRANS_TYPE_FADE_WHITE_FAST,
 | |
|     /*  6 */ TRANS_TYPE_FADE_BLACK_SLOW,
 | |
|     /*  7 */ TRANS_TYPE_FADE_WHITE_SLOW,
 | |
|     /*  8 */ TRANS_TYPE_WIPE_FAST,
 | |
|     /*  9 */ TRANS_TYPE_FILL_WHITE_FAST, // Not actually fast due to bug in Play_UpdateTransition
 | |
|     /* 10 */ TRANS_TYPE_FILL_WHITE,
 | |
|     /* 11 */ TRANS_TYPE_INSTANT,
 | |
|     /* 12 */ TRANS_TYPE_FILL_BROWN,
 | |
|     /* 13 */ TRANS_TYPE_FADE_WHITE_CS_DELAYED,
 | |
|     /* 14 */ TRANS_TYPE_SANDSTORM_PERSIST,
 | |
|     /* 15 */ TRANS_TYPE_SANDSTORM_END,
 | |
|     /* 16 */ TRANS_TYPE_CS_BLACK_FILL,
 | |
|     /* 17 */ TRANS_TYPE_FADE_WHITE_INSTANT,
 | |
|     /* 18 */ TRANS_TYPE_FADE_GREEN,
 | |
|     /* 19 */ TRANS_TYPE_FADE_BLUE,
 | |
|     /* 20 */ TRANS_TYPE_FADE_DYNAMIC, // Chooses Black or White based on time of day
 | |
|     /* 21 */ TRANS_TYPE_CIRCLE,
 | |
|     /* 22 */ TRANS_TYPE_WIPE5,
 | |
|     // transition types 23 - 31 are unused
 | |
|     // transition types 32 - 39 are Wipe4 TODO needs macro
 | |
|     /* 38 */ TRANS_TYPE_38 = 38,
 | |
|     // transition types 40 - 63 are unused
 | |
|     // transition types 64 - 127 are Wipe3 TODO needs macro
 | |
|     /* 64 */ TRANS_TYPE_64 = 64,
 | |
|     /* 70 */ TRANS_TYPE_70 = 70,
 | |
|     /* 72 */ TRANS_TYPE_72 = 72,
 | |
|     /* 73 */ TRANS_TYPE_73,
 | |
|     /* 80 */ TRANS_TYPE_80 = 80,
 | |
|     /* 86 */ TRANS_TYPE_86 = 86
 | |
| } TransitionType;
 | |
| 
 | |
| #define DEFINE_TRANSITION(enumValue, _structName, _instanceName, _name) enumValue,
 | |
| #define DEFINE_TRANSITION_INTERNAL(enumValue, _structName, _instanceName) enumValue,
 | |
| 
 | |
| typedef enum FbDemoType {
 | |
|     #include "tables/transition_table.h"
 | |
|     /* 7 */ FBDEMO_MAX
 | |
| } FbDemoType;
 | |
| 
 | |
| #undef DEFINE_TRANSITION
 | |
| #undef DEFINE_TRANSITION_INTERNAL
 | |
| 
 | |
| #define TRANS_NEXT_TYPE_DEFAULT 0xFF
 | |
| 
 | |
| #define DEFINE_TRANSITION(_enumValue, structName, instanceName, _name) structName instanceName;
 | |
| #define DEFINE_TRANSITION_INTERNAL(_enumValue, structName, instanceName) structName instanceName;
 | |
| 
 | |
| typedef union TransitionInstance {
 | |
|     #include "tables/transition_table.h"
 | |
| } TransitionInstance; // size = 0x218
 | |
| 
 | |
| #undef DEFINE_TRANSITION
 | |
| #undef DEFINE_TRANSITION_INTERNAL
 | |
| 
 | |
| typedef struct TransitionContext {
 | |
|     /* 0x000 */ s16 transitionType;
 | |
|     /* 0x002 */ s8 fbdemoType;
 | |
|     /* 0x003 */ UNK_TYPE1 unk_003[0x5];
 | |
|     /* 0x008 */ TransitionInstance instanceData;
 | |
|     /* 0x220 */ UNK_TYPE1 unk_220[0x10];
 | |
|     /* 0x230 */ void* (*init)(void* transition);
 | |
|     /* 0x234 */ void  (*destroy)(void* transition);
 | |
|     /* 0x238 */ void  (*update)(void* transition, s32 updateRate);
 | |
|     /* 0x23C */ void  (*draw)(void* transition, Gfx** gfxP);
 | |
|     /* 0x240 */ void  (*start)(void* transition);
 | |
|     /* 0x244 */ void  (*setType)(void* transition, s32 type);
 | |
|     /* 0x248 */ void  (*setColor)(void* transition, u32 color);
 | |
|     /* 0x24C */ void  (*setEnvColor)(void* transition, u32 color);
 | |
|     /* 0x250 */ s32   (*isDone)(void* transition);
 | |
|     /* 0x254 */ UNK_TYPE1 unk_254[0x4];
 | |
| } TransitionContext; // size = 0x258
 | |
| 
 | |
| 
 | |
| // z_dbdemo_dlftbls.c
 | |
| 
 | |
| void Transition_Init(TransitionContext* transitionCtx);
 | |
| void Transition_Destroy(TransitionContext* transitionCtx);
 | |
| 
 | |
| // z_fbdemo.c
 | |
| 
 | |
| void TransitionTile_Destroy(TransitionTile* this);
 | |
| TransitionTile* TransitionTile_Init(TransitionTile* this, s32 cols, s32 rows);
 | |
| void TransitionTile_Draw(TransitionTile* this, Gfx** gfxP);
 | |
| void TransitionTile_Update(TransitionTile* this);
 | |
| 
 | |
| // z_fbdemo_fade.c
 | |
| 
 | |
| void TransitionFade_Start(void* thisx);
 | |
| void* TransitionFade_Init(void* thisx);
 | |
| void TransitionFade_Destroy(void* thisx);
 | |
| void TransitionFade_Update(void* thisx, s32 updateRate);
 | |
| void TransitionFade_Draw(void* thisx, Gfx** gfxP);
 | |
| s32 TransitionFade_IsDone(void* thisx);
 | |
| void TransitionFade_SetColor(void* thisx, u32 color);
 | |
| void TransitionFade_SetType(void* thisx, s32 type);
 | |
| 
 | |
| // z_fbdemo_circle.c
 | |
| 
 | |
| void TransitionCircle_LoadAndSetTexture(Gfx** gfxP, void const* texture, s32 fmt, s32 arg3, s32 masks, s32 maskt, f32 arg6);
 | |
| 
 | |
| // z_overlay.c
 | |
| 
 | |
| void* TransitionOverlay_VramToRam(TransitionOverlay* overlayEntry, void* vramAddr);
 | |
| void TransitionOverlay_VramToRamArray(TransitionOverlay *overlayEntry, void** vramAddrs, s32 count);
 | |
| TransitionOverlayStatus TransitionOverlay_Load(TransitionOverlay *overlayEntry);
 | |
| TransitionOverlayStatus TransitionOverlay_Free(TransitionOverlay *overlayEntry);
 | |
| void TransitionOverlay_ClearLoadInfo(TransitionOverlay *overlayEntry);
 | |
| void TransitionOverlay_SetSegment(TransitionOverlay *overlayEntry, void* vramStart, void* vramEnd, uintptr_t vromStart, uintptr_t vromEnd);
 | |
| 
 | |
| #endif
 |