summaryrefslogtreecommitdiff
path: root/src/main.h
blob: 80871e65345aeefe782556c1ae7a9fa03aa00ee0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#ifndef MAIN_H
#define MAIN_H

#include "mk64.h"
#include "common_structs.h"

// Message IDs
#define MESG_SP_COMPLETE 100
#define MESG_DP_COMPLETE 101
#define MESG_VI_VBLANK 102
#define MESG_START_GFX_SPTASK 103
#define MESG_NMI_REQUEST 104

#define MTX_HUD_POOL_SIZE 1600

#ifdef AVOID_UB
#define MTX_HUD_POOL_SIZE_MAX MTX_HUD_POOL_SIZE
#else
#define MTX_HUD_POOL_SIZE_MAX MTX_HUD_POOL_SIZE - 50
#endif

#define MTX_OBJECT_POOL_SIZE 512

//! @todo Verify with proper documentation
// functions called by mtxShadow multiply by 8
// 8 Kart AI Players * 4 real players in coop
#define MTX_SHADOW_POOL_SIZE 8 * 4

//! @todo Verify with proper documentation
// functions called by mtxKart multiply by 8
// 8 Kart AI Players * 4 real players in coop
#define MTX_KART_POOL_SIZE 8 * 4

#define MTX_EFFECT_POOL_SIZE 660

// func_80095BD0 sets an OOB pool size max check (760)
#ifdef AVOID_UB
#define MTX_EFFECT_POOL_SIZE_MAX MTX_EFFECT_POOL_SIZE
#else
#define MTX_EFFECT_POOL_SIZE_MAX MTX_EFFECT_POOL_SIZE + 100
#endif

#define GFX_POOL_SIZE 15000

struct GfxPool {
    /* 0x00000 */ Mtx mtxScreen;                       // Matrix for skybox and startup logo
    /* 0x00040 */ Mtx mtxPersp[4];                     // Matrix for perspective screen modes
    /* 0x00140 */ Mtx mtxOrtho;                        // Matrix for ortho hud screen modes
    /* 0x00180 */ Mtx mtxUnk;                          // Matrix unused
    /* 0x001C0 */ Mtx mtxLookAt[4];                    // Matrix for lookat screen modes
    /* 0x002C0 */ Mtx mtxHud[MTX_HUD_POOL_SIZE];       // Matrix hud elements and 2D related effects
    /* 0x0CAC0 */ Mtx mtxObject[MTX_OBJECT_POOL_SIZE]; // Matrix course objects
    /* 0x0EAC0 */ Mtx mtxShadow[MTX_SHADOW_POOL_SIZE]; // Matrix shadow characters
    /* 0x0F2C0 */ Mtx mtxKart[MTX_KART_POOL_SIZE];     // Matrix kart characters
    /* 0x0FAC0 */ Mtx mtxEffect[MTX_EFFECT_POOL_SIZE]; // Matrix misc effects
    /* 0x19FC0 */ Mtx mtxArr[4];                       // Matrix unused array
    /* 0x1A0C0 */ Gfx gfxPool[GFX_POOL_SIZE];
    /* 0x28B20 */ struct SPTask spTask;
}; // size = 0x28B70

typedef struct {
    u16 triangle; // Index for gCollisionIndices which has indexes for gCollisionMesh
    u16 numTriangles;
} CollisionGrid;

void create_thread(OSThread*, OSId, void (*entry)(void*), void*, void*, OSPri);
void main_func(void);
void thread1_idle(void*);
void setup_mesg_queues(void);
void start_sptask(s32);
void create_gfx_task_structure(void);
void init_controllers(void);
void update_controller(s32);
void read_controllers(void);
void func_80000BEC(void);
void dispatch_audio_sptask(struct SPTask*);
void exec_display_list(struct SPTask*);
void init_rcp(void);
void end_master_display_list(void);
void* clear_framebuffer(s32);
void rendering_init(void);
void config_gfx_pool(void);
void display_and_vsync(void);
void init_segment_ending_sequences(void);
void init_segment_racing(void);
void dma_copy(u8*, u8*, size_t);
void setup_game_memory(void);
void game_init_clear_framebuffer(void);
void race_logic_loop(void);
void game_state_handler(void);
void interrupt_gfx_sptask(void);
void receive_new_tasks(void);
void set_vblank_handler(s32, struct VblankHandler*, OSMesgQueue*, OSMesg*);
void start_gfx_sptask(void);
void handle_vblank(void);
void handle_dp_complete(void);
void handle_sp_complete(void);
void thread3_video(void*);
void func_800025D4(void);
void func_80002600(void);
void func_8000262C(void);
void func_80002658(void);
void update_gamestate(void);
void thread5_game_loop(void);
void thread5_iteration(void);
void thread4_audio(void*);
extern f32 gDeltaTime;

extern struct VblankHandler* gVblankHandler1;
extern struct VblankHandler* gVblankHandler2;

extern struct SPTask* gActiveSPTask;
extern struct SPTask* sCurrentAudioSPTask;
extern struct SPTask* sCurrentDisplaySPTask;
extern struct SPTask* sNextAudioSPTask;
extern struct SPTask* sNextDisplaySPTask;

extern struct Controller gControllers[];
extern struct Controller* gControllerOne;
extern struct Controller* gControllerTwo;
extern struct Controller* gControllerThree;
extern struct Controller* gControllerFour;
extern struct Controller* gControllerFive;
extern struct Controller* gControllerSix;
extern struct Controller* gControllerSeven;
extern struct Controller* gControllerEight;

extern Player gPlayers[];
extern Player* gPlayerOne;
extern Player* gPlayerTwo;
extern Player* gPlayerThree;
extern Player* gPlayerFour;
extern Player* gPlayerFive;
extern Player* gPlayerSix;
extern Player* gPlayerSeven;
extern Player* gPlayerEight;

extern Player* gPlayerOneCopy;
extern Player* gPlayerTwoCopy;

extern struct GfxPool gGfxPools[];
extern struct GfxPool* gGfxPool;

extern struct VblankHandler gGameVblankHandler;
extern struct VblankHandler sSoundVblankHandler;
extern OSMesgQueue gDmaMesgQueue, gGameVblankQueue, gGfxVblankQueue, unused_gMsgQueue, gIntrMesgQueue, gSPTaskMesgQueue;
extern OSMesgQueue sSoundMesgQueue;
extern OSMesg sSoundMesgBuf[1];
extern OSMesg gDmaMesgBuf[1], gGameMesgBuf;
extern OSMesg gGfxMesgBuf[];
extern OSMesg gIntrMesgBuf[16], gSPTaskMesgBuf[16];
extern OSMesg gMainReceivedMesg;
extern OSIoMesg gDmaIoMesg;
extern OSMesgQueue gSIEventMesgQueue;
extern OSMesg gSIEventMesgBuf[3];

extern OSContStatus gControllerStatuses[];

extern OSContPad gControllerPads[];
extern u8 gControllerBits;

extern CollisionGrid gCollisionGrid[];
extern u16 gNumActors;
extern u16 gMatrixObjectCount;
extern s32 gTickLogic;
extern s32 gTickVisuals;
extern f32 D_80150118;
extern u16 wasSoftReset;
extern u16 D_8015011E;

extern s32 D_80150120;
extern s32 gGotoMode;
extern f32 gCameraZoom[];

extern f32 gScreenAspect;
extern f32 D_8015014C;
extern f32 D_80150150;

extern struct D_80150158 gD_80150158[];
extern uintptr_t gSegmentTable[];
extern Gfx* gDisplayListHead;
extern struct SPTask* gGfxSPTask;
extern s32 D_801502A0;
extern s32 D_801502A4;
extern u16* gPhysicalFramebuffers[];
extern u16 gPortFramebuffers[3][SCREEN_WIDTH * SCREEN_HEIGHT];
extern uintptr_t gPhysicalZBuffer;
extern Mat4 sBillBoardMtx;

extern s32 padding[];

extern u16 D_80152300[];
extern u16 D_80152308;

extern OSThread gIdleThread;
extern u8 gIdleThreadStack[];
extern OSThread gVideoThread;
extern u8 gVideoThreadStack[];
extern OSThread gGameLoopThread;
extern u8 gGameLoopThreadStack[];
extern OSThread gAudioThread;
extern u8 gAudioThreadStack[];

extern u8 gGfxSPTaskYieldBuffer[];
extern u32 gGfxSPTaskStack[];
extern OSMesg gPIMesgBuf[];
extern OSMesgQueue gPIMesgQueue;
void race_logic_loop(void);
extern s32 gGamestate;
#ifndef gRaceState_AS_U16
// Prevent overlapping writes in gcc
// Whether gRaceState was intended to be a separate variable in main.c from the rest of the game is unknown
#ifdef GCC
extern u16 gRaceState;
#else
extern s32 gRaceState;
#endif
#endif

extern u16 D_800DC514;
extern u16 creditsRenderMode;
extern u16 gDemoMode;
extern u16 gEnableDebugMode;
extern s32 gGamestateNext;
extern s32 gActiveScreenMode;
extern s32 gScreenModeSelection;
extern s32 gPlayerCountSelection1;

extern s32 gModeSelection;
extern s32 D_800DC540;
extern s32 D_800DC544;
extern s32 gCCSelection;
extern s32 gGlobalTimer;
extern u16 sRenderedFramebuffer;
extern u16 sRenderingFramebuffer;
extern s32 D_800DC568;
extern s32 D_800DC56C[];
extern s16 sNumVBlanks;
extern f32 gVBlankTimer;
extern f32 gCourseTimer;

// end of definition of main.c variables

#endif