From 2ac56bae9cfe733d9c84c7b8a568c189194fed01 Mon Sep 17 00:00:00 2001 From: Unnunu Date: Tue, 20 May 2025 17:34:58 +0300 Subject: [PATCH] Match func_80083098 + minor cleanups across codebase (#581) * make Camera struct * wip * wip * fix gSPMatrix args * gfx macros renamed * wip * document matrix functions * match func_80083098 * update score and format * JP version not matched * build OK * PR suggestions --- README.md | 14 +- include/PR/gbi.h | 79 +----- include/f3ddkr.h | 16 +- include/structs.h | 16 +- src/audio_spatial.c | 8 +- src/audio_spatial.h | 5 +- src/audio_vehicle.c | 32 +-- src/borders.c | 16 +- src/camera.c | 358 +++++++++++++-------------- src/camera.h | 52 ++-- src/game.c | 2 +- src/game_ui.c | 44 ++-- src/hasm/math_util.c | 128 ++++++---- src/hasm/math_util.s | 12 +- src/hasm/obj_shade_fast.s | 2 +- src/math_util.h | 6 +- src/menu.c | 71 +++--- src/menu.h | 5 +- src/object_functions.c | 8 +- src/objects.c | 138 +++++------ src/objects.h | 2 +- src/particles.c | 2 +- src/racer.c | 217 ++++++++-------- src/racer.h | 20 -- src/thread3_main.c | 10 +- src/tracks.c | 105 ++++---- src/waves.c | 7 +- src/weather.c | 24 +- src/weather.h | 5 +- ver/symbols/symbol_addrs.jpn.v79.txt | 34 +-- ver/symbols/symbol_addrs.pal.v77.txt | 34 +-- ver/symbols/symbol_addrs.pal.v80.txt | 34 +-- ver/symbols/symbol_addrs.us.v77.txt | 34 +-- ver/symbols/symbol_addrs.us.v80.txt | 34 +-- 34 files changed, 771 insertions(+), 803 deletions(-) diff --git a/README.md b/README.md index 470afe39..9f9f00d3 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of May 18, 2025, this is our current score: +As of May 19, 2025, this is our current score: -    Decomp progress: 87.92% +    Decomp progress: 88.06%     Documentation progress: 56.98% @@ -117,14 +117,14 @@ s32 is_drumstick_unlocked(void) { ``` -As of May 18, 2025, this is our current score: +As of May 19, 2025, this is our current score: ``` ===================================================================== ADVENTURE ONE (ASM -> C Decompilation) - --------------- 87.92% Complete (89.02% NON_MATCHING) --------------- - # Decompiled functions: 1897 - # GLOBAL_ASM remaining: 54 - # NON_MATCHING functions: 6 + --------------- 88.06% Complete (89.02% NON_MATCHING) --------------- + # Decompiled functions: 1898 + # GLOBAL_ASM remaining: 53 + # NON_MATCHING functions: 5 # NON_EQUIVALENT WIP functions: 16 ---------------------------- Game Status ---------------------------- Balloons: 41/47, Keys: 4/4, Trophies: 4/5 diff --git a/include/PR/gbi.h b/include/PR/gbi.h index 6bb9961d..fd426f64 100644 --- a/include/PR/gbi.h +++ b/include/PR/gbi.h @@ -148,6 +148,12 @@ #define G_SETGEOMETRYMODE (G_IMMFIRST-8) #define G_CLEARGEOMETRYMODE (G_IMMFIRST-9) #define G_LINE3D (G_IMMFIRST-10) +#ifdef F3D_OLD +#define G_PERSPNORM (G_IMMFIRST-11) +#define G_RDPHALF_1 (G_IMMFIRST-12) +#define G_RDPHALF_2 (G_IMMFIRST-13) +#define G_RDPHALF_CONT (G_IMMFIRST-14) +#else #define G_RDPHALF_1 (G_IMMFIRST-11) #define G_RDPHALF_2 (G_IMMFIRST-12) #if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) @@ -158,6 +164,7 @@ #else # define G_RDPHALF_CONT (G_IMMFIRST-13) #endif +#endif /* We are overloading 2 of the immediate commands to keep the byte alignment of dmem the same */ @@ -2798,12 +2805,12 @@ typedef union { { \ Gfx *_g = (Gfx *)(pkt); \ \ - _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \ + _g->words.w0 = _SHIFTL(G_PERSPNORM, 24, 8); \ _g->words.w1 = (s); \ } #define gsSPPerspNormalize(s) \ {{ \ - _SHIFTL(G_RDPHALF_1, 24, 8), \ + _SHIFTL(G_PERSPNORM, 24, 8), \ (s) \ }} #else @@ -4493,72 +4500,6 @@ typedef union { _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ } -#ifdef F3D_OLD -#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ -{ \ - Gfx *_g = (Gfx *)(pkt); \ - \ - _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ - _SHIFTL(yh, 0, 12)); \ - _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ - _SHIFTL(yl, 0, 12)); \ - gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ - gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)));\ -} - -#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ - {{(_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)),\ - (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ - gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ - gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) - -/* like gSPTextureRectangle but accepts negative position arguments */ -# define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ -{ \ - Gfx *_g = (Gfx *)(pkt); \ - \ - _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \ - _SHIFTL(MAX((s16)(xh),0), 12, 12) | \ - _SHIFTL(MAX((s16)(yh),0), 0, 12)); \ - _g->words.w1 = (_SHIFTL((tile), 24, 3) | \ - _SHIFTL(MAX((s16)(xl),0), 12, 12) | \ - _SHIFTL(MAX((s16)(yl),0), 0, 12)); \ - gImmp1(pkt, G_RDPHALF_2, \ - (_SHIFTL(((s) - \ - (((s16)(xl) < 0) ? \ - (((s16)(dsdx) < 0) ? \ - (MAX((((s16)(xl)*(s16)(dsdx))>>7),0)) : \ - (MIN((((s16)(xl)*(s16)(dsdx))>>7),0))) : 0)), \ - 16, 16) | \ - _SHIFTL(((t) - \ - (((yl) < 0) ? \ - (((s16)(dtdy) < 0) ? \ - (MAX((((s16)(yl)*(s16)(dtdy))>>7),0)) : \ - (MIN((((s16)(yl)*(s16)(dtdy))>>7),0))) : 0)), \ - 0, 16))); \ - gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL((dsdx), 16, 16) | \ - _SHIFTL((dtdy), 0, 16))); \ -} - -# define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ - {{(_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \ - _SHIFTL(yh, 0, 12)), \ - (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ - gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ - gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) - -# define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ -{ \ - Gfx *_g = (Gfx *)(pkt); \ - \ - _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) |\ - _SHIFTL(yh, 0, 12)); \ - _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ - _SHIFTL(yl, 0, 12)); \ - gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ - gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \ -} -#else #define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ {{(_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)),\ (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ @@ -4623,7 +4564,7 @@ typedef union { gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \ } -#endif + #define gsDPWord(wordhi, wordlo) \ gsImmp1(G_RDPHALF_1, (unsigned int)(wordhi)), \ gsImmp1(G_RDPHALF_2, (unsigned int)(wordlo)) diff --git a/include/f3ddkr.h b/include/f3ddkr.h index ef57a4f6..a46dfc7c 100644 --- a/include/f3ddkr.h +++ b/include/f3ddkr.h @@ -77,14 +77,11 @@ #define G_TRIN 5 #define G_DMADL 7 -#define G_MTX_DKR_INDEX_0 0x00 -#define G_MTX_DKR_INDEX_1 0x40 -#define G_MTX_DKR_INDEX_2 0x80 +#define G_MTX_DKR_INDEX_0 0 +#define G_MTX_DKR_INDEX_1 1 +#define G_MTX_DKR_INDEX_2 2 #define G_MW_BILLBOARD 0x02 //0x01 = billboarding enabled, 0x00 = disabled -#define G_MW_MVMATRIX 0x0A //Specifies the index of the modelview matrix. - -#define gDkrInsertMatrix(pkt, where, num) \ - gMoveWd(pkt, G_MW_MVMATRIX, where, num) +#define G_MW_MVPMATRIX 0x0A //Specifies the index of the mvp matrix. #define gDkrEnableBillboard(pkt) \ gMoveWd(pkt, G_MW_BILLBOARD, 0, 1) @@ -95,6 +92,11 @@ #define gSPVertexDKR(pkt, v, n, v0) \ gDma1p(pkt, G_VTX, v, (((n) * 8 + (n)) << 1) + 8, ((n)-1)<<3|(((u32)(v) & 6))|(v0)) +#define gSPMatrixDKR(pkt, m, i) \ + gSPMatrix(pkt, m, (i) << 6) +#define gSPSelectMatrixDKR(pkt, num) \ + gMoveWd(pkt, G_MW_MVPMATRIX, 0, (num) << 6) + #define TRIN_DISABLE_TEXTURE 0 #define TRIN_ENABLE_TEXTURE 1 diff --git a/include/structs.h b/include/structs.h index d169f9f0..0fe35c5e 100644 --- a/include/structs.h +++ b/include/structs.h @@ -1772,22 +1772,13 @@ typedef struct SegmentPropertiesObject { /* 0x002C */ s16 unk2C; /* 0x002E */ s16 segmentID; /* 0x0030 */ f32 distanceToCamera; - /* 0x0034 */ s16 cameraSegmentID; - /* 0x0036 */ s16 unk36; + /* 0x0034 */ f32 unk34; /* 0x0038 */ s8 unk38; /* 0x0039 */ u8 opacity; /* 0x003A */ s8 modelIndex; /* 0x003B */ s8 animationID; } SegmentPropertiesObject; -typedef struct SegmentPropertiesCamera { - /* 0x002C */ f32 unk2C; - /* 0x0030 */ f32 distanceToCamera; - /* 0x0034 */ f32 unk34; - /* 0x0038 */ s16 unk38; - /* 0x003A */ s16 unk3A; -} SegmentPropertiesCamera; - /* Size: 0x44 bytes */ typedef struct ObjectSegment { /* 0x0000 */ ObjectTransform trans; @@ -1797,10 +1788,7 @@ typedef struct ObjectSegment { /* 0x0020 */ f32 y_velocity; /* 0x0024 */ f32 z_velocity; /* 0x0028 */ f32 unk28; - union { - SegmentPropertiesObject object; - SegmentPropertiesCamera camera; - }; + /* 0x002C */ SegmentPropertiesObject object; /* 0x003C */ LevelObjectEntry* level_entry; /* 0x0040 */ ObjectHeader *header; } ObjectSegment; diff --git a/src/audio_spatial.c b/src/audio_spatial.c index 0bccc86b..e5a38d26 100644 --- a/src/audio_spatial.c +++ b/src/audio_spatial.c @@ -158,7 +158,7 @@ void audspat_reset(void) { * Official Name: amPlayAudioMap */ void audspat_update_all(Object **objList, s32 numObjects, s32 updateRate) { - s32 viewportCount; + s32 viewportLayout; s32 i; s32 j; s32 k; @@ -182,7 +182,7 @@ void audspat_update_all(Object **objList, s32 numObjects, s32 updateRate) { s32 inverseDistances[29]; s32 sumOfDistances; s32 numCameras; - ObjectSegment *cameras; + Camera *cameras; f32 pitch1; f32 temp; f32 minDistance; @@ -192,8 +192,8 @@ void audspat_update_all(Object **objList, s32 numObjects, s32 updateRate) { f32 pitch3; jingleVolume = 0; - viewportCount = get_viewport_count(); - numCameras = set_active_viewports_and_max(viewportCount); + viewportLayout = cam_get_viewport_layout(); + numCameras = cam_set_layout(viewportLayout); cameras = get_cutscene_camera_segment(); // Update audio points diff --git a/src/audio_spatial.h b/src/audio_spatial.h index 699d0e97..bcc339ce 100644 --- a/src/audio_spatial.h +++ b/src/audio_spatial.h @@ -6,6 +6,7 @@ #include "structs.h" #include "PR/gbi.h" #include "PR/libaudio.h" +#include "camera.h" #define AUDIO_LINE_TYPE_SOUND 0 #define AUDIO_LINE_TYPE_JINGLE 1 @@ -68,7 +69,7 @@ void audspat_line_add_vertex(u8 type, u16 soundBite, f32 x, f32 y, f32 z, u8 arg u8 argA, u8 lineID, u8 vertexIndex); s32 audspat_line_validate(u8 lineID); void audspat_debug_render_line(Gfx **dList, Vertex **verts, Triangle **tris, f32 coords[6], u8 red, u8 green, u8 blue); -void func_80006BFC(Object *obj, ObjectSegment *segment, Object *obj2, s32 updateRate); +void func_80006BFC(Object *obj, Camera *camera, Object *obj2, s32 updateRate); void audspat_point_set_position(AudioPoint *audioPoint, f32 x, f32 y, f32 z); s32 audspat_reverb_validate(u8 reverbLineID); void audspat_init(void); @@ -78,7 +79,7 @@ void audspat_calculate_echo(SoundHandle soundHandle, f32 x, f32 y, f32 z); s32 audspat_distance_to_segment(f32 inX, f32 inY, f32 inZ, f32 coords[6], f32 *outX, f32 *outY, f32 *outZ); void audspat_reset(void); void audspat_update_all(Object **objList, s32 numObjects, s32 updateRate); // Non Matching -void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3, s32 updateRate); // Non Matching +void func_80006FC8(Object **objs, s32 numRacers, Camera *segment, u8 arg3, s32 updateRate); // Non Matching u8 audspat_reverb_get_strength_at_point(ReverbLine *, f32, f32, f32); #endif diff --git a/src/audio_vehicle.c b/src/audio_vehicle.c index f8dd961e..a40889c4 100644 --- a/src/audio_vehicle.c +++ b/src/audio_vehicle.c @@ -546,7 +546,7 @@ void racer_sound_free(Object *obj) { } } -void func_80006BFC(Object *obj, ObjectSegment *segment, Object *obj2, s32 updateRate) { +void func_80006BFC(Object *obj, Camera *camera, Object *obj2, s32 updateRate) { Object_Racer *racer; f32 velocity; f32 xPos; @@ -565,10 +565,10 @@ void func_80006BFC(Object *obj, ObjectSegment *segment, Object *obj2, s32 update racer2 = &obj2->unk64->racer; gRacerSound = (VehicleSoundData *) racer2->vehicleSound; if (gRacerSound != NULL) { - if (segment != NULL) { - xPos = segment[racer->playerIndex].trans.x_position; - yPos = segment[racer->playerIndex].trans.y_position; - zPos = segment[racer->playerIndex].trans.z_position; + if (camera != NULL) { + xPos = camera[racer->playerIndex].trans.x_position; + yPos = camera[racer->playerIndex].trans.y_position; + zPos = camera[racer->playerIndex].trans.z_position; sp1C = 1.0f; } else { xPos = obj->segment.trans.x_position; @@ -622,7 +622,7 @@ void func_80006BFC(Object *obj, ObjectSegment *segment, Object *obj2, s32 update } } -void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3, s32 updateRate) { +void func_80006FC8(Object **objs, s32 numRacers, Camera *camera, u8 arg3, s32 updateRate) { f32 tempxPos; f32 tempyPos; f32 tempzPos; @@ -652,17 +652,17 @@ void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3 if (gRacerSound != NULL && gRacerSound->unk0[0] != 0) { if (racer->raceFinished || check_if_showing_cutscene_camera()) { - tempxPos = objs[loopCount1]->segment.trans.x_position - segment[loopCount1].trans.x_position; - tempyPos = objs[loopCount1]->segment.trans.y_position - segment[loopCount1].trans.y_position; - tempzPos = objs[loopCount1]->segment.trans.z_position - segment[loopCount1].trans.z_position; - func_80006BFC(objs[loopCount1], segment, objs[loopCount1], updateRate); + tempxPos = objs[loopCount1]->segment.trans.x_position - camera[loopCount1].trans.x_position; + tempyPos = objs[loopCount1]->segment.trans.y_position - camera[loopCount1].trans.y_position; + tempzPos = objs[loopCount1]->segment.trans.z_position - camera[loopCount1].trans.z_position; + func_80006BFC(objs[loopCount1], camera, objs[loopCount1], updateRate); gRacerSound->unk84 = sqrtf((tempxPos * tempxPos) + (tempyPos * tempyPos) + (tempzPos * tempzPos)); if (gRacerSound->unk84 < 1500.0f) { var_f26 = 2250000.0f; //(1500.0f * 1500.0f) var_f26 = (var_f26 - (gRacerSound->unk84 * gRacerSound->unk84)) / var_f26; var_f26 *= var_f26; gRacerSound->unk91[0] = audspat_calculate_spatial_pan( - tempxPos, tempzPos, segment[loopCount1].trans.rotation.y_rotation); + tempxPos, tempzPos, camera[loopCount1].trans.rotation.y_rotation); } else { var_f26 = 0.0f; } @@ -760,9 +760,9 @@ void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3 gRacerSound = objs[loopCount2]->unk64->racer.vehicleSound; if (gRacerSound != 0) { if (racer->raceFinished != 0) { - tempxPos = objs[loopCount2]->segment.trans.x_position - segment[loopCount1].trans.x_position; - tempyPos = objs[loopCount2]->segment.trans.y_position - segment[loopCount1].trans.y_position; - tempzPos = objs[loopCount2]->segment.trans.z_position - segment[loopCount1].trans.z_position; + tempxPos = objs[loopCount2]->segment.trans.x_position - camera[loopCount1].trans.x_position; + tempyPos = objs[loopCount2]->segment.trans.y_position - camera[loopCount1].trans.y_position; + tempzPos = objs[loopCount2]->segment.trans.z_position - camera[loopCount1].trans.z_position; } else { tempxPos = objs[loopCount2]->segment.trans.x_position - objs[loopCount1]->segment.trans.x_position; @@ -783,9 +783,9 @@ void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3 if (gRacerSound->unk88 < v0) { gRacerSound->unk88 = v0; gRacerSound->unk91[0] = - audspat_calculate_spatial_pan(tempxPos, tempzPos, segment->trans.rotation.y_rotation); + audspat_calculate_spatial_pan(tempxPos, tempzPos, camera->trans.rotation.y_rotation); if (racer->raceFinished != 0) { - func_80006BFC(objs[loopCount1], segment, objs[loopCount2], updateRate); + func_80006BFC(objs[loopCount1], camera, objs[loopCount2], updateRate); } else { func_80006BFC(objs[loopCount1], NULL, objs[loopCount2], updateRate); } diff --git a/src/borders.c b/src/borders.c index 730dc5a1..03e6008f 100644 --- a/src/borders.c +++ b/src/borders.c @@ -27,20 +27,20 @@ void divider_draw(Gfx **dList) { yOffset = height / 128; gDPSetCycleType((*dList)++, G_CYC_FILL); gDPSetFillColor((*dList)++, GPACK_RGBA5551(0, 0, 0, 1) << 16 | GPACK_RGBA5551(0, 0, 0, 1)); // Black fill color - switch (get_viewport_count()) { - case VIEWPORTS_COUNT_2_PLAYERS: + switch (cam_get_viewport_layout()) { + case VIEWPORT_LAYOUT_2_PLAYERS: // Draws a solid horizontal black line in the middle of the screen. y = (height >> 1) - yOffset; gDPFillRectangle((*dList)++, height * 0, y, width, y + yOffset); break; - case VIEWPORTS_COUNT_3_PLAYERS: + case VIEWPORT_LAYOUT_3_PLAYERS: levelHeader = get_current_level_header(); // Draw black square in the bottom-right corner. if (hud_setting() || (levelHeader->race_type & RACETYPE_CHALLENGE)) { gDPFillRectangle((*dList)++, width >> 1, height >> 1, width, height); } // There is no break statement here. This is intentional. - case VIEWPORTS_COUNT_4_PLAYERS: + case VIEWPORT_LAYOUT_4_PLAYERS: x = (width >> 1) - xOffset; // Draws 2 black lines in the middle of the screen. One vertical, another horizontal. gDPFillRectangle((*dList)++, height * 0, (height >> 1) - yOffset, width, @@ -72,13 +72,13 @@ void divider_clear_coverage(Gfx **dList) { gDPSetCombineMode((*dList)++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); gDPSetRenderMode((*dList)++, G_RM_XLU_SURF, G_RM_XLU_SURF2); gDPSetPrimColor((*dList)++, 0, 0, 0, 0, 0, 0); - switch (get_viewport_count()) { - case VIEWPORTS_COUNT_2_PLAYERS: + switch (cam_get_viewport_layout()) { + case VIEWPORT_LAYOUT_2_PLAYERS: tempY = (screenHeight / 2) - (height / 2); gDPFillRectangle((*dList)++, 0, tempY, screenWidth, tempY + height); break; - case VIEWPORTS_COUNT_3_PLAYERS: - case VIEWPORTS_COUNT_4_PLAYERS: + case VIEWPORT_LAYOUT_3_PLAYERS: + case VIEWPORT_LAYOUT_4_PLAYERS: tempY = (screenHeight / 2) - (height / 2); tempX = (screenWidth / 2) - (width / 2); gDPFillRectangle((*dList)++, 0, tempY, screenWidth, tempY + height); diff --git a/src/camera.c b/src/camera.c index 30d18701..59fcc07f 100644 --- a/src/camera.c +++ b/src/camera.c @@ -79,10 +79,10 @@ u8 gCameraZoomLevels[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; /************ .bss ************/ -ObjectSegment gCameraSegment[8]; -s32 gNumberOfViewports; +Camera gCameras[8]; +s32 gViewportLayout; s32 gActiveCameraID; -s32 gViewportCap; +s32 gNumCameras; UNUSED s32 D_80120CEC; ObjectTransform gCameraTransform; s32 gMatrixType; @@ -100,7 +100,7 @@ f32 gModelMatrixViewZ[5]; u16 perspNorm; Matrix *gModelMatrixF[6]; MatrixS *gModelMatrixS[6]; -Matrix *D_80120DA0[10][8]; // Not sure why, but gModelMatrixF is populated from here, even though this is never set. +f32 D_80120DA0[5 * 16]; Matrix gPerspectiveMatrixF; Matrix gViewMatrixF; Matrix gCameraMatrixF; @@ -116,14 +116,13 @@ Matrix gCurrentModelMatrixS; * Official Name: camInit */ extern s32 D_B0000578; -void camera_init(void) { +void cam_init(void) { s32 i; s32 j; u32 stat; // clang-format off - // This section is highly suspicous to be undefined behaviour as we have it defined right now. - for (i = 0; i < 5; i++) { gModelMatrixF[i] = (Matrix *) &D_80120DA0[(i << 1)]; } + for (i = 0; i < 5; i++) { gModelMatrixF[i] = (Matrix*)&D_80120DA0[i << 4]; } // clang-format on for (j = 0; j < 8; j++) { @@ -135,10 +134,10 @@ void camera_init(void) { gActiveCameraID = 0; gModelMatrixStackPos = 0; gCameraMatrixPos = 0; - gNumberOfViewports = 0; + gViewportLayout = 0; gSpriteAnimOff = FALSE; - D_80120D18 = 0; - gAdjustViewportHeight = 0; + D_80120D18 = FALSE; + gAdjustViewportHeight = FALSE; gAntiPiracyViewport = FALSE; WAIT_ON_IOBUSY(stat); @@ -154,10 +153,10 @@ void camera_init(void) { gCurCamFOV = CAMERA_DEFAULT_FOV; } -void func_80066060(s32 cameraID, s32 zoomLevel) { - if (cameraID >= 0 && cameraID < 4) { +void cam_set_zoom(s32 cameraID, s32 zoomLevel) { + if (cameraID >= 0 && cameraID <= 3) { gCameraZoomLevels[cameraID] = zoomLevel; - gCameraSegment[cameraID].object.animationID = zoomLevel; + gCameras[cameraID].zoom = zoomLevel; } } @@ -165,25 +164,25 @@ void func_80066060(s32 cameraID, s32 zoomLevel) { * Set gAdjustViewportHeight to PAL mode if necessary, if setting is 1. * Otherwise, set it to 0, regardless of TV type. */ -void set_viewport_tv_type(s8 setting) { +void enable_pal_viewport_height_adjust(s8 setting) { if (osTvType == OS_TV_TYPE_PAL) { gAdjustViewportHeight = setting; } } void func_800660C0(void) { - D_80120D18 = 1; + D_80120D18 = TRUE; } void func_800660D0(void) { - D_80120D18 = 0; + D_80120D18 = FALSE; } /** * Unused function that will return the current camera's FoV. * Official Name: camGetFOV */ -UNUSED f32 get_current_camera_fov(void) { +UNUSED f32 cam_get_fov(void) { return gCurCamFOV; } @@ -191,7 +190,7 @@ UNUSED f32 get_current_camera_fov(void) { * Set the FoV of the viewspace, then recalculate the perspective matrix. * Official Name: camSetFOV */ -void update_camera_fov(f32 camFieldOfView) { +void cam_set_fov(f32 camFieldOfView) { if (CAMERA_MIN_FOV < camFieldOfView && camFieldOfView < CAMERA_MAX_FOV && camFieldOfView != gCurCamFOV) { gCurCamFOV = camFieldOfView; guPerspectiveF(gPerspectiveMatrixF, &perspNorm, camFieldOfView, CAMERA_ASPECT, CAMERA_NEAR, CAMERA_FAR, @@ -203,7 +202,7 @@ void update_camera_fov(f32 camFieldOfView) { /** * Unused function that recalculates the perspective matrix. */ -UNUSED void calculate_camera_perspective(void) { +UNUSED void cam_reset_fov(void) { guPerspectiveF(gPerspectiveMatrixF, &perspNorm, CAMERA_DEFAULT_FOV, CAMERA_ASPECT, CAMERA_NEAR, CAMERA_FAR, CAMERA_SCALE); f32_matrix_to_s16_matrix(&gPerspectiveMatrixF, &gProjectionMatrixS); @@ -219,8 +218,8 @@ UNUSED Matrix *matrix_get_model_s16(void) { /** * Returns the number of active viewports. */ -s32 get_viewport_count(void) { - return gNumberOfViewports; +s32 cam_get_viewport_layout(void) { + return gViewportLayout; } /** @@ -236,7 +235,7 @@ s32 get_current_viewport(void) { * Initialises the camera object for the tracks menu. */ void camera_init_tracks_menu(Gfx **dList, MatrixS **mtxS) { - ObjectSegment *cam; + Camera *cam; s16 angleY; s16 angleX; s16 angleZ; @@ -245,26 +244,26 @@ void camera_init_tracks_menu(Gfx **dList, MatrixS **mtxS) { f32 posY; f32 posZ; - set_active_viewports_and_max(0); + cam_set_layout(VIEWPORT_LAYOUT_1_PLAYER); set_active_camera(0); - cam = get_active_camera_segment(); + cam = cam_get_active_camera(); angleY = cam->trans.rotation.y_rotation; angleX = cam->trans.rotation.x_rotation; angleZ = cam->trans.rotation.z_rotation; posX = cam->trans.x_position; posY = cam->trans.y_position; posZ = cam->trans.z_position; - sp24 = cam->camera.unk38; + sp24 = cam->pitch; cam->trans.rotation.z_rotation = 0; cam->trans.rotation.x_rotation = 0; cam->trans.rotation.y_rotation = -0x8000; - cam->camera.unk38 = 0; + cam->pitch = 0; cam->trans.x_position = 0.0f; cam->trans.y_position = 0.0f; cam->trans.z_position = 0.0f; update_envmap_position(0.0f, 0.0f, -1.0f); viewport_main(dList, mtxS); - cam->camera.unk38 = sp24; + cam->pitch = sp24; cam->trans.rotation.y_rotation = angleY; cam->trans.rotation.x_rotation = angleX; cam->trans.rotation.z_rotation = angleZ; @@ -286,9 +285,9 @@ f32 get_distance_to_active_camera(f32 xPos, f32 yPos, f32 zPos) { index += 4; } - dz = zPos - gCameraSegment[index].trans.z_position; - dx = xPos - gCameraSegment[index].trans.x_position; - dy = yPos - gCameraSegment[index].trans.y_position; + dz = zPos - gCameras[index].trans.z_position; + dx = xPos - gCameras[index].trans.x_position; + dy = yPos - gCameras[index].trans.y_position; return sqrtf((dz * dz) + ((dx * dx) + (dy * dy))); } @@ -297,19 +296,19 @@ f32 get_distance_to_active_camera(f32 xPos, f32 yPos, f32 zPos) { * Also sets the other properties of the camera to a default. */ void camera_reset(s32 xPos, s32 yPos, s32 zPos, s32 angleZ, s32 angleX, s32 angleY) { - gCameraSegment[gActiveCameraID].trans.rotation.z_rotation = (s16) (angleZ * 0xB6); - gCameraSegment[gActiveCameraID].trans.x_position = (f32) xPos; - gCameraSegment[gActiveCameraID].trans.y_position = (f32) yPos; - gCameraSegment[gActiveCameraID].trans.z_position = (f32) zPos; - gCameraSegment[gActiveCameraID].trans.rotation.x_rotation = (s16) (angleX * 0xB6); - gCameraSegment[gActiveCameraID].camera.unk38 = 0; - gCameraSegment[gActiveCameraID].z_velocity = 0.0f; - gCameraSegment[gActiveCameraID].unk28 = 0.0f; - gCameraSegment[gActiveCameraID].camera.unk2C = 0.0f; - gCameraSegment[gActiveCameraID].camera.distanceToCamera = 0.0f; - gCameraSegment[gActiveCameraID].x_velocity = 160.0f; - gCameraSegment[gActiveCameraID].trans.rotation.y_rotation = (s16) (angleY * 0xB6); - gCameraSegment[gActiveCameraID].object.animationID = gCameraZoomLevels[gActiveCameraID]; + gCameras[gActiveCameraID].trans.rotation.z_rotation = angleZ * (0x7FFF / 180); + gCameras[gActiveCameraID].trans.x_position = xPos; + gCameras[gActiveCameraID].trans.y_position = yPos; + gCameras[gActiveCameraID].trans.z_position = zPos; + gCameras[gActiveCameraID].trans.rotation.x_rotation = angleX * (0x7FFF / 180); + gCameras[gActiveCameraID].pitch = 0; + gCameras[gActiveCameraID].x_velocity = 0.0f; + gCameras[gActiveCameraID].y_velocity = 0.0f; + gCameras[gActiveCameraID].z_velocity = 0.0f; + gCameras[gActiveCameraID].shakeMagnitude = 0.0f; + gCameras[gActiveCameraID].boomLength = 160.0f; + gCameras[gActiveCameraID].trans.rotation.y_rotation = angleY * (0x7FFF / 180); + gCameras[gActiveCameraID].zoom = gCameraZoomLevels[gActiveCameraID]; } /** @@ -319,14 +318,14 @@ void camera_reset(s32 xPos, s32 yPos, s32 zPos, s32 angleZ, s32 angleX, s32 angl */ void write_to_object_render_stack(s32 stackPos, f32 xPos, f32 yPos, f32 zPos, s16 arg4, s16 arg5, s16 arg6) { stackPos += 4; - gCameraSegment[stackPos].camera.unk38 = 0; - gCameraSegment[stackPos].trans.x_position = xPos; - gCameraSegment[stackPos].trans.y_position = yPos; - gCameraSegment[stackPos].trans.z_position = zPos; - gCameraSegment[stackPos].trans.rotation.y_rotation = arg4; - gCameraSegment[stackPos].trans.rotation.x_rotation = arg5; - gCameraSegment[stackPos].trans.rotation.z_rotation = arg6; - gCameraSegment[stackPos].object.cameraSegmentID = get_level_segment_index_from_position(xPos, yPos, zPos); + gCameras[stackPos].pitch = 0; + gCameras[stackPos].trans.x_position = xPos; + gCameras[stackPos].trans.y_position = yPos; + gCameras[stackPos].trans.z_position = zPos; + gCameras[stackPos].trans.rotation.y_rotation = arg4; + gCameras[stackPos].trans.rotation.x_rotation = arg5; + gCameras[stackPos].trans.rotation.z_rotation = arg6; + gCameras[stackPos].cameraSegmentID = get_level_segment_index_from_position(xPos, yPos, zPos); gCutsceneCameraActive = TRUE; } @@ -346,34 +345,33 @@ void disable_cutscene_camera(void) { } /** - * Sets the cap for the viewports. Usually reflecting how many there are. - * If the number passed is within 1-4, then the stack cap is set to - * how many active viewports there are. + * Sets the current layout and returns the number of active cameras for that layout. + * The layoutID argument must be from the ViewportCount enumeration. */ -s32 set_active_viewports_and_max(s32 num) { - if (num >= 0 && num < 4) { - gNumberOfViewports = num; +s32 cam_set_layout(s32 layoutID) { + if (layoutID >= VIEWPORT_LAYOUT_1_PLAYER && layoutID <= VIEWPORT_LAYOUT_4_PLAYERS) { + gViewportLayout = layoutID; } else { - gNumberOfViewports = 0; + gViewportLayout = VIEWPORT_LAYOUT_1_PLAYER; } - switch (gNumberOfViewports) { - case VIEWPORTS_COUNT_1_PLAYER: - gViewportCap = 1; + switch (gViewportLayout) { + case VIEWPORT_LAYOUT_1_PLAYER: + gNumCameras = 1; break; - case VIEWPORTS_COUNT_2_PLAYERS: - gViewportCap = 2; + case VIEWPORT_LAYOUT_2_PLAYERS: + gNumCameras = 2; break; - case VIEWPORTS_COUNT_3_PLAYERS: - gViewportCap = 3; + case VIEWPORT_LAYOUT_3_PLAYERS: + gNumCameras = 3; break; - case VIEWPORTS_COUNT_4_PLAYERS: - gViewportCap = 4; + case VIEWPORT_LAYOUT_4_PLAYERS: + gNumCameras = 4; break; } - if (gActiveCameraID >= gViewportCap) { + if (gActiveCameraID >= gNumCameras) { gActiveCameraID = 0; } - return gViewportCap; + return gNumCameras; } /** @@ -410,6 +408,7 @@ void copy_viewports_to_stack(void) { gScreenViewports[i].flags |= VIEWPORT_EXTRA_BG; } gScreenViewports[i].flags &= ~(VIEWPORT_UNK_02 | VIEWPORT_UNK_04); + if (gScreenViewports[i].flags & VIEWPORT_EXTRA_BG) { if (!(gScreenViewports[i].flags & VIEWPORT_X_CUSTOM)) { xPos = (((gScreenViewports[i].x2 - gScreenViewports[i].x1) + 1) << 1) + (gScreenViewports[i].x1 * 4); @@ -627,7 +626,7 @@ void viewport_main(Gfx **dlist, MatrixS **mats) { originalCameraID = gActiveCameraID; savedCameraID = gActiveCameraID; - if (func_8000E184() && gNumberOfViewports == VIEWPORTS_COUNT_1_PLAYER) { + if (func_8000E184() && gViewportLayout == VIEWPORT_LAYOUT_1_PLAYER) { gActiveCameraID = 1; savedCameraID = 0; } @@ -649,9 +648,9 @@ void viewport_main(Gfx **dlist, MatrixS **mats) { return; } - viewports = gNumberOfViewports; - if (viewports == VIEWPORTS_COUNT_3_PLAYERS) { - viewports = VIEWPORTS_COUNT_4_PLAYERS; + viewports = gViewportLayout; + if (viewports == VIEWPORT_LAYOUT_3_PLAYERS) { + viewports = VIEWPORT_LAYOUT_4_PLAYERS; } x = videoWidth >> 1; sp54_width = x; @@ -663,7 +662,7 @@ void viewport_main(Gfx **dlist, MatrixS **mats) { } switch (viewports) { - case VIEWPORTS_COUNT_1_PLAYER: + case VIEWPORT_LAYOUT_1_PLAYER: posX = sp54_width; posY = sp58_height; if (osTvType == OS_TV_TYPE_PAL) { @@ -671,7 +670,7 @@ void viewport_main(Gfx **dlist, MatrixS **mats) { } gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, 0, 0, videoWidth, videoHeight); break; - case VIEWPORTS_COUNT_2_PLAYERS: + case VIEWPORT_LAYOUT_2_PLAYERS: // 2 players = split screen horizontally // first player has top half posX = sp54_width; @@ -694,7 +693,7 @@ void viewport_main(Gfx **dlist, MatrixS **mats) { break; // this is probably never reached because of an if above that sets the viewport to 4 players if its currently 3 // players - case VIEWPORTS_COUNT_3_PLAYERS: + case VIEWPORT_LAYOUT_3_PLAYERS: posY = sp58_height; // 3 player splits screen in 4 parts, first player = top left, second = top right, third = bottom left and // bottom right has map of race track @@ -709,7 +708,7 @@ void viewport_main(Gfx **dlist, MatrixS **mats) { gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, tempX, 0, videoWidth - (videoWidth >> 8), videoHeight); } break; - case VIEWPORTS_COUNT_4_PLAYERS: + case VIEWPORT_LAYOUT_4_PLAYERS: sp58_height >>= 1; sp54_width >>= 1; tempY = 0; @@ -748,7 +747,7 @@ void viewport_main(Gfx **dlist, MatrixS **mats) { posY = tempX + sp58_height; posX = tempY + sp54_width; if (osTvType == OS_TV_TYPE_PAL) { - if (gActiveCameraID < 2) { + if (gActiveCameraID <= 1) { posY -= 20; } else { posY -= 6; @@ -788,11 +787,11 @@ void viewport_scissor(Gfx **dList) { size = fb_size(); height = (u16) GET_VIDEO_HEIGHT(size); width = (u16) size; - numViewports = gNumberOfViewports; + numViewports = gViewportLayout; - if (numViewports != 0) { - if (numViewports == VIEWPORTS_COUNT_3_PLAYERS) { - numViewports = VIEWPORTS_COUNT_4_PLAYERS; + if (numViewports != VIEWPORT_LAYOUT_1_PLAYER) { + if (numViewports == VIEWPORT_LAYOUT_3_PLAYERS) { + numViewports = VIEWPORT_LAYOUT_4_PLAYERS; } lrx = ulx = 0; lry = uly = 0; @@ -855,9 +854,9 @@ void viewport_scissor(Gfx **dList) { break; } gDPSetScissor((*dList)++, 0, ulx, uly, lrx, lry); - return; + } else { + gDPSetScissor((*dList)++, 0, 0, 0, width, height); } - gDPSetScissor((*dList)++, 0, 0, 0, width, height); } // Official Name: camGetPlayerProjMtx / camSetProjMtx - ?? @@ -871,32 +870,32 @@ void func_80067D3C(Gfx **dList, UNUSED MatrixS **mats) { gActiveCameraID += 4; } - gCameraTransform.rotation.y_rotation = 0x8000 + gCameraSegment[gActiveCameraID].trans.rotation.y_rotation; + gCameraTransform.rotation.y_rotation = 0x8000 + gCameras[gActiveCameraID].trans.rotation.y_rotation; gCameraTransform.rotation.x_rotation = - gCameraSegment[gActiveCameraID].trans.rotation.x_rotation + gCameraSegment[gActiveCameraID].camera.unk38; - gCameraTransform.rotation.z_rotation = gCameraSegment[gActiveCameraID].trans.rotation.z_rotation; + gCameras[gActiveCameraID].trans.rotation.x_rotation + gCameras[gActiveCameraID].pitch; + gCameraTransform.rotation.z_rotation = gCameras[gActiveCameraID].trans.rotation.z_rotation; - gCameraTransform.x_position = -gCameraSegment[gActiveCameraID].trans.x_position; - gCameraTransform.y_position = -gCameraSegment[gActiveCameraID].trans.y_position; - if (D_80120D18 != 0) { - gCameraTransform.y_position -= gCameraSegment[gActiveCameraID].camera.distanceToCamera; + gCameraTransform.x_position = -gCameras[gActiveCameraID].trans.x_position; + gCameraTransform.y_position = -gCameras[gActiveCameraID].trans.y_position; + if (D_80120D18) { + gCameraTransform.y_position -= gCameras[gActiveCameraID].shakeMagnitude; } - gCameraTransform.z_position = -gCameraSegment[gActiveCameraID].trans.z_position; + gCameraTransform.z_position = -gCameras[gActiveCameraID].trans.z_position; - object_transform_to_matrix_2(gCameraMatrixF, &gCameraTransform); + object_inverse_transform_to_matrix(gCameraMatrixF, &gCameraTransform); f32_matrix_mult(&gCameraMatrixF, &gPerspectiveMatrixF, &gViewMatrixF); - gCameraTransform.rotation.y_rotation = -0x8000 - gCameraSegment[gActiveCameraID].trans.rotation.y_rotation; + gCameraTransform.rotation.y_rotation = -0x8000 - gCameras[gActiveCameraID].trans.rotation.y_rotation; gCameraTransform.rotation.x_rotation = - -(gCameraSegment[gActiveCameraID].trans.rotation.x_rotation + gCameraSegment[gActiveCameraID].camera.unk38); - gCameraTransform.rotation.z_rotation = -gCameraSegment[gActiveCameraID].trans.rotation.z_rotation; + -(gCameras[gActiveCameraID].trans.rotation.x_rotation + gCameras[gActiveCameraID].pitch); + gCameraTransform.rotation.z_rotation = -gCameras[gActiveCameraID].trans.rotation.z_rotation; gCameraTransform.scale = 1.0f; - gCameraTransform.x_position = gCameraSegment[gActiveCameraID].trans.x_position; - gCameraTransform.y_position = gCameraSegment[gActiveCameraID].trans.y_position; - if (D_80120D18 != 0) { - gCameraTransform.y_position += gCameraSegment[gActiveCameraID].camera.distanceToCamera; + gCameraTransform.x_position = gCameras[gActiveCameraID].trans.x_position; + gCameraTransform.y_position = gCameras[gActiveCameraID].trans.y_position; + if (D_80120D18) { + gCameraTransform.y_position += gCameras[gActiveCameraID].shakeMagnitude; } - gCameraTransform.z_position = gCameraSegment[gActiveCameraID].trans.z_position; + gCameraTransform.z_position = gCameras[gActiveCameraID].trans.z_position; object_transform_to_matrix(gProjectionMatrixF, &gCameraTransform); f32_matrix_to_s16_matrix(&gProjectionMatrixF, &gUnusedProjectionMatrixS); @@ -933,7 +932,7 @@ void set_ortho_matrix_view(Gfx **dList, MatrixS **mtx) { gViewportStack[gActiveCameraID + 5].vp.vtrans[0] = width * 2; gViewportStack[gActiveCameraID + 5].vp.vtrans[1] = height * 2; gSPViewport((*dList)++, OS_K0_TO_PHYSICAL(&gViewportStack[gActiveCameraID + 5])); - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_0); gModelMatrixStackPos = 0; gMatrixType = G_MTX_DKR_INDEX_0; @@ -949,12 +948,12 @@ void set_ortho_matrix_view(Gfx **dList, MatrixS **mtx) { // Official Name: camStandardPersp? void func_8006807C(Gfx **dList, MatrixS **mtx) { - object_transform_to_matrix_2(gCurrentModelMatrixF, &D_800DD288); + object_inverse_transform_to_matrix(gCurrentModelMatrixF, &D_800DD288); f32_matrix_mult(&gCurrentModelMatrixF, &gPerspectiveMatrixF, &gViewMatrixF); - object_transform_to_matrix_2((float(*)[4]) gModelMatrixF[0], &D_800DD2A0); + object_inverse_transform_to_matrix((float (*)[4]) gModelMatrixF[0], &D_800DD2A0); f32_matrix_mult(gModelMatrixF[0], &gViewMatrixF, &gCurrentModelMatrixF); f32_matrix_to_s16_matrix(&gCurrentModelMatrixF, *mtx); - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_0); gModelMatrixStackPos = 0; gMatrixType = G_MTX_DKR_INDEX_0; } @@ -964,23 +963,23 @@ void func_8006807C(Gfx **dList, MatrixS **mtx) { * Viewports have a centre position and a scale factor, rather than a standard four corners. * Official Name: camSetViewport */ -void viewport_rsp_set(Gfx **dList, s32 width, s32 height, s32 posX, s32 posY) { - s32 tempWidth = (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) ? -width : width; +void viewport_rsp_set(Gfx **dList, s32 halfWidth, s32 halfHeight, s32 centerX, s32 centerY) { + s32 tempWidth = (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) ? -halfWidth : halfWidth; #ifdef ANTI_TAMPER // Antipiracy measure. Flips the screen upside down. if (gAntiPiracyViewport) { - height = -height; - tempWidth = -width; + halfHeight = -halfHeight; + tempWidth = -halfWidth; } #endif if (!(gScreenViewports[gActiveCameraID].flags & VIEWPORT_EXTRA_BG)) { - gViewportStack[gActiveCameraID].vp.vtrans[0] = posX * 4; - gViewportStack[gActiveCameraID].vp.vtrans[1] = posY * 4; + gViewportStack[gActiveCameraID].vp.vtrans[0] = centerX * 4; + gViewportStack[gActiveCameraID].vp.vtrans[1] = centerY * 4; gViewportStack[gActiveCameraID].vp.vscale[0] = tempWidth * 4; - gViewportStack[gActiveCameraID].vp.vscale[1] = height * 4; - gSPViewport((*dList)++, OS_PHYSICAL_TO_K0(&gViewportStack[gActiveCameraID])); + gViewportStack[gActiveCameraID].vp.vscale[1] = halfHeight * 4; + gSPViewport((*dList)++, OS_K0_TO_PHYSICAL(&gViewportStack[gActiveCameraID])); } else { - gSPViewport((*dList)++, OS_PHYSICAL_TO_K0(&gViewportStack[gActiveCameraID + 10 + (gViewportWithBG * 5)])); + gSPViewport((*dList)++, OS_K0_TO_PHYSICAL(&gViewportStack[gActiveCameraID + 10 + (gViewportWithBG * 5)])); } } @@ -1017,7 +1016,7 @@ void matrix_world_origin(Gfx **dList, MatrixS **mtx) { f32_matrix_mult(gModelMatrixF[gModelMatrixStackPos], &gViewMatrixF, &gCurrentModelMatrixF); f32_matrix_to_s16_matrix(&gCurrentModelMatrixF, *mtx); gModelMatrixS[gModelMatrixStackPos] = *mtx; - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), gMatrixType << 6); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), gMatrixType); } /** @@ -1097,7 +1096,7 @@ s32 render_sprite_billboard(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Obj f32_matrix_mult(gModelMatrixF[gModelMatrixStackPos], &gViewMatrixF, &gCurrentModelMatrixF); f32_matrix_to_s16_matrix(&gCurrentModelMatrixF, *mtx); gModelMatrixS[gModelMatrixStackPos] = *mtx; - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_2); gSPVertexDKR((*dList)++, OS_K0_TO_PHYSICAL(&gVehiclePartVertex), 1, 0); } else { v = *vertexList; @@ -1108,14 +1107,13 @@ s32 render_sprite_billboard(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Obj v->g = 255; v->b = 255; v->a = 255; - gSPVertexDKR((*dList)++, OS_PHYSICAL_TO_K0(*vertexList), 1, 0); + gSPVertexDKR((*dList)++, OS_K0_TO_PHYSICAL(*vertexList), 1, 0); (*vertexList)++; - if (gCutsceneCameraActive == 0) { - angleDiff = - gCameraSegment[gActiveCameraID].trans.rotation.z_rotation + obj->segment.trans.rotation.z_rotation; + if (!gCutsceneCameraActive) { + angleDiff = gCameras[gActiveCameraID].trans.rotation.z_rotation + obj->segment.trans.rotation.z_rotation; } else { angleDiff = - gCameraSegment[gActiveCameraID + 4].trans.rotation.z_rotation + obj->segment.trans.rotation.z_rotation; + gCameras[gActiveCameraID + 4].trans.rotation.z_rotation + obj->segment.trans.rotation.z_rotation; } textureFrame = obj->segment.animFrame; gModelMatrixStackPos++; @@ -1123,7 +1121,7 @@ s32 render_sprite_billboard(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Obj obj->segment.trans.scale, gVideoAspectRatio); f32_matrix_to_s16_matrix(gModelMatrixF[gModelMatrixStackPos], *mtx); gModelMatrixS[gModelMatrixStackPos] = *mtx; - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_2); gDkrEnableBillboard((*dList)++); } if (gSpriteAnimOff == FALSE) { @@ -1141,11 +1139,11 @@ s32 render_sprite_billboard(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Obj gSPDisplayList((*dList)++, arg4->gfx[textureFrame + 1]); gModelMatrixStackPos--; if (gModelMatrixStackPos == 0) { - textureFrame = 0; + textureFrame = G_MTX_DKR_INDEX_0; } else { - textureFrame = 1; + textureFrame = G_MTX_DKR_INDEX_1; } - gDkrInsertMatrix((*dList)++, 0, textureFrame << 6); + gSPSelectMatrixDKR((*dList)++, textureFrame); gDkrDisableBillboard((*dList)++); return result; } @@ -1172,14 +1170,14 @@ void render_ortho_triangle_image(Gfx **dList, MatrixS **mtx, Vertex **vtx, Objec temp_v1->g = 255; temp_v1->b = 255; temp_v1->a = 255; - gSPVertexDKR((*dList)++, OS_PHYSICAL_TO_K0(*vtx), 1, 0); + gSPVertexDKR((*dList)++, OS_K0_TO_PHYSICAL(*vtx), 1, 0); (*vtx)++; // Can't be done in the macro? index = segment->animFrame; gModelMatrixStackPos++; gCameraTransform.rotation.y_rotation = -segment->trans.rotation.y_rotation; gCameraTransform.rotation.x_rotation = -segment->trans.rotation.x_rotation; gCameraTransform.rotation.z_rotation = - gCameraSegment[gActiveCameraID].trans.rotation.z_rotation + segment->trans.rotation.z_rotation; + gCameras[gActiveCameraID].trans.rotation.z_rotation + segment->trans.rotation.z_rotation; gCameraTransform.x_position = 0.0f; gCameraTransform.y_position = 0.0f; gCameraTransform.z_position = 0.0f; @@ -1192,11 +1190,11 @@ void render_ortho_triangle_image(Gfx **dList, MatrixS **mtx, Vertex **vtx, Objec scale = segment->trans.scale; f32_matrix_from_scale(gCurrentModelMatrixF, scale, scale, 1.0f); } - object_transform_to_matrix_2(aspectMtxF, &gCameraTransform); + object_inverse_transform_to_matrix(aspectMtxF, &gCameraTransform); f32_matrix_mult(&gCurrentModelMatrixF, &aspectMtxF, gModelMatrixF[gModelMatrixStackPos]); f32_matrix_to_s16_matrix(gModelMatrixF[gModelMatrixStackPos], *mtx); gModelMatrixS[gModelMatrixStackPos] = *mtx; - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_2); gDkrEnableBillboard((*dList)++); if (gSpriteAnimOff == FALSE) { index = (((u8) index) * sprite->baseTextureId) >> 8; @@ -1207,11 +1205,11 @@ void render_ortho_triangle_image(Gfx **dList, MatrixS **mtx, Vertex **vtx, Objec } gSPDisplayList((*dList)++, sprite->unkC.ptr[index]); if (--gModelMatrixStackPos == 0) { - index = 0; + index = G_MTX_DKR_INDEX_0; } else { - index = 1; + index = G_MTX_DKR_INDEX_1; } - gDkrInsertMatrix((*dList)++, 0, index << 6); + gSPSelectMatrixDKR((*dList)++, index); gDkrDisableBillboard((*dList)++); } } @@ -1317,13 +1315,13 @@ void apply_object_shear_matrix(Gfx **dList, MatrixS **mtx, Object *arg2, Object f32_matrix_mult(&matrix_mult, &gViewMatrixF, &gCurrentModelMatrixS); f32_matrix_to_s16_matrix(&gCurrentModelMatrixS, *mtx); - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_1); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_1); } /** * Official Name: camPushModelMtx */ -s32 camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scale, f32 scaleY) { +s32 cam_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scaleY, f32 offsetY) { f32 tempX; f32 tempY; f32 tempZ; @@ -1331,11 +1329,11 @@ s32 camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f3 f32 scaleFactor; object_transform_to_matrix(gCurrentModelMatrixF, trans); - if (scaleY != 0.0f) { - f32_matrix_y_scale(&gCurrentModelMatrixF, scaleY); + if (offsetY != 0.0f) { + f32_matrix_translate_y_axis(&gCurrentModelMatrixF, offsetY); } - if (scale != 1.0f) { - f32_matrix_scale(&gCurrentModelMatrixF, scale); + if (scaleY != 1.0f) { + f32_matrix_scale_y_axis(&gCurrentModelMatrixF, scaleY); } f32_matrix_mult(&gCurrentModelMatrixF, gModelMatrixF[gModelMatrixStackPos], gModelMatrixF[gModelMatrixStackPos + 1]); @@ -1348,15 +1346,15 @@ s32 camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f3 } if (1) {} if (1) {}; // Fakematch - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_1); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_1); guMtxXFMF(*gModelMatrixF[gModelMatrixStackPos], 0.0f, 0.0f, 0.0f, &tempX, &tempY, &tempZ); index = gActiveCameraID; if (gCutsceneCameraActive) { index += 4; } - tempX = gCameraSegment[index].trans.x_position - tempX; - tempY = gCameraSegment[index].trans.y_position - tempY; - tempZ = gCameraSegment[index].trans.z_position - tempZ; + tempX = gCameras[index].trans.x_position - tempX; + tempY = gCameras[index].trans.y_position - tempY; + tempZ = gCameras[index].trans.z_position - tempZ; gCameraTransform.rotation.y_rotation = -trans->rotation.y_rotation; gCameraTransform.rotation.x_rotation = -trans->rotation.x_rotation; gCameraTransform.rotation.z_rotation = -trans->rotation.z_rotation; @@ -1364,7 +1362,7 @@ s32 camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f3 gCameraTransform.y_position = 0.0f; gCameraTransform.z_position = 0.0f; gCameraTransform.scale = 1.0f; - object_transform_to_matrix_2(gCurrentModelMatrixF, &gCameraTransform); + object_inverse_transform_to_matrix(gCurrentModelMatrixF, &gCameraTransform); guMtxXFMF(gCurrentModelMatrixF, tempX, tempY, tempZ, &tempX, &tempY, &tempZ); scaleFactor = 1.0f / trans->scale; tempX *= scaleFactor; @@ -1421,8 +1419,8 @@ void apply_head_turning_matrix(Gfx **dList, MatrixS **mtx, Object_68 *objGfx, s1 headMtxF[3][3] = 1.0f; f32_matrix_mult(&headMtxF, &gCurrentModelMatrixS, &rotationMtxF); f32_matrix_to_s16_matrix(&rotationMtxF, *mtx); - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); - gDkrInsertMatrix((*dList)++, G_MWO_MATRIX_XX_XY_I, G_MTX_DKR_INDEX_1); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_2); + gSPSelectMatrixDKR((*dList)++, G_MTX_DKR_INDEX_1); } /** @@ -1453,9 +1451,9 @@ void apply_matrix_from_stack(Gfx **dList) { } // Fakematch if (gModelMatrixStackPos > 0) { - gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0(gModelMatrixS[gModelMatrixStackPos]), G_MTX_DKR_INDEX_1); + gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL(gModelMatrixS[gModelMatrixStackPos]), G_MTX_DKR_INDEX_1); } else { - gDkrInsertMatrix((*dList)++, G_MWO_MATRIX_XX_XY_I, G_MTX_DKR_INDEX_0); + gSPSelectMatrixDKR((*dList)++, G_MTX_DKR_INDEX_0); } } @@ -1464,12 +1462,12 @@ void apply_matrix_from_stack(Gfx **dList) { * Also recalculates which block it's in. */ UNUSED void translate_camera_segment(f32 x, f32 y, f32 z) { - gCameraSegment[gActiveCameraID].trans.x_position += x; - gCameraSegment[gActiveCameraID].trans.y_position += y; - gCameraSegment[gActiveCameraID].trans.z_position += z; - gCameraSegment[gActiveCameraID].object.cameraSegmentID = get_level_segment_index_from_position( - gCameraSegment[gActiveCameraID].trans.x_position, gCameraSegment[gActiveCameraID].trans.y_position, - gCameraSegment[gActiveCameraID].trans.z_position); + gCameras[gActiveCameraID].trans.x_position += x; + gCameras[gActiveCameraID].trans.y_position += y; + gCameras[gActiveCameraID].trans.z_position += z; + gCameras[gActiveCameraID].cameraSegmentID = get_level_segment_index_from_position( + gCameras[gActiveCameraID].trans.x_position, gCameras[gActiveCameraID].trans.y_position, + gCameras[gActiveCameraID].trans.z_position); } /** @@ -1477,54 +1475,50 @@ UNUSED void translate_camera_segment(f32 x, f32 y, f32 z) { * Also recalculates which block it's in. */ UNUSED void transform_camera_segment(f32 x, UNUSED f32 y, f32 z) { - gCameraSegment[gActiveCameraID].trans.x_position -= - x * coss_f(gCameraSegment[gActiveCameraID].trans.rotation.y_rotation); - gCameraSegment[gActiveCameraID].trans.z_position -= - x * sins_f(gCameraSegment[gActiveCameraID].trans.rotation.y_rotation); - gCameraSegment[gActiveCameraID].trans.x_position -= - z * sins_f(gCameraSegment[gActiveCameraID].trans.rotation.y_rotation); - gCameraSegment[gActiveCameraID].trans.z_position += - z * coss_f(gCameraSegment[gActiveCameraID].trans.rotation.y_rotation); - gCameraSegment[gActiveCameraID].object.cameraSegmentID = get_level_segment_index_from_position( - gCameraSegment[gActiveCameraID].trans.x_position, gCameraSegment[gActiveCameraID].trans.y_position, - gCameraSegment[gActiveCameraID].trans.z_position); + gCameras[gActiveCameraID].trans.x_position -= x * coss_f(gCameras[gActiveCameraID].trans.rotation.y_rotation); + gCameras[gActiveCameraID].trans.z_position -= x * sins_f(gCameras[gActiveCameraID].trans.rotation.y_rotation); + gCameras[gActiveCameraID].trans.x_position -= z * sins_f(gCameras[gActiveCameraID].trans.rotation.y_rotation); + gCameras[gActiveCameraID].trans.z_position += z * coss_f(gCameras[gActiveCameraID].trans.rotation.y_rotation); + gCameras[gActiveCameraID].cameraSegmentID = get_level_segment_index_from_position( + gCameras[gActiveCameraID].trans.x_position, gCameras[gActiveCameraID].trans.y_position, + gCameras[gActiveCameraID].trans.z_position); } /** * Rotate the camera with the given angles. */ UNUSED void rotate_camera_segment(s32 angleX, s32 angleY, s32 angleZ) { - gCameraSegment[gActiveCameraID].trans.rotation.y_rotation += angleX; - gCameraSegment[gActiveCameraID].trans.rotation.x_rotation += angleY; - gCameraSegment[gActiveCameraID].trans.rotation.z_rotation += angleZ; + gCameras[gActiveCameraID].trans.rotation.y_rotation += angleX; + gCameras[gActiveCameraID].trans.rotation.x_rotation += angleY; + gCameras[gActiveCameraID].trans.rotation.z_rotation += angleZ; } /** * Returns the segment data of the active camera, but won't apply the offset for cutscenes. */ -ObjectSegment *get_active_camera_segment_no_cutscenes(void) { - return &gCameraSegment[gActiveCameraID]; +Camera *cam_get_active_camera_no_cutscenes(void) { + return &gCameras[gActiveCameraID]; } /** * Returns the segment data of the active camera. */ -ObjectSegment *get_active_camera_segment(void) { +Camera *cam_get_active_camera(void) { if (gCutsceneCameraActive) { - return &gCameraSegment[gActiveCameraID + 4]; + return &gCameras[gActiveCameraID + 4]; } - return &gCameraSegment[gActiveCameraID]; + return &gCameras[gActiveCameraID]; } /** * Returns the segment data of the active cutscene camera. * If no cutscene is active, return player 1's camera. */ -ObjectSegment *get_cutscene_camera_segment(void) { +Camera *get_cutscene_camera_segment(void) { if (gCutsceneCameraActive) { - return &gCameraSegment[4]; + return &gCameras[4]; } - return &gCameraSegment[PLAYER_ONE]; + return &gCameras[PLAYER_ONE]; } /** @@ -1569,13 +1563,13 @@ void set_camera_shake_by_distance(f32 x, f32 y, f32 z, f32 dist, f32 magnitude) f32 diffY; s32 i; - for (i = 0; i <= gNumberOfViewports; i++) { - diffX = x - gCameraSegment[i].trans.x_position; - diffY = y - gCameraSegment[i].trans.y_position; - diffZ = z - gCameraSegment[i].trans.z_position; + for (i = 0; i <= gViewportLayout; i++) { + diffX = x - gCameras[i].trans.x_position; + diffY = y - gCameras[i].trans.y_position; + diffZ = z - gCameras[i].trans.z_position; distance = sqrtf(((diffX * diffX) + (diffY * diffY)) + (diffZ * diffZ)); if (distance < dist) { - gCameraSegment[i].camera.distanceToCamera = ((dist - distance) * magnitude) / dist; + gCameras[i].shakeMagnitude = ((dist - distance) * magnitude) / dist; } } } @@ -1585,8 +1579,8 @@ void set_camera_shake_by_distance(f32 x, f32 y, f32 z, f32 dist, f32 magnitude) */ void set_camera_shake(f32 magnitude) { s32 i; - for (i = 0; i <= gNumberOfViewports; i++) { - gCameraSegment[i].camera.distanceToCamera = magnitude; + for (i = 0; i <= gViewportLayout; i++) { + gCameras[i].shakeMagnitude = magnitude; } } diff --git a/src/camera.h b/src/camera.h index 765e8f6c..fa10bbd5 100644 --- a/src/camera.h +++ b/src/camera.h @@ -38,10 +38,10 @@ #define VIEWPORT_AUTO 0x8000 enum ViewportCount { - VIEWPORTS_COUNT_1_PLAYER, - VIEWPORTS_COUNT_2_PLAYERS, - VIEWPORTS_COUNT_3_PLAYERS, - VIEWPORTS_COUNT_4_PLAYERS + VIEWPORT_LAYOUT_1_PLAYER, + VIEWPORT_LAYOUT_2_PLAYERS, + VIEWPORT_LAYOUT_3_PLAYERS, + VIEWPORT_LAYOUT_4_PLAYERS }; enum ViewPortFlags { @@ -54,6 +54,28 @@ enum ViewPortFlags { VIEWPORT_HEIGHT_CUSTOM = 0x0040 }; +/* Size: 0x44 bytes */ +typedef struct Camera { + /* 0x0000 */ ObjectTransform trans; + /* 0x0018 */ f32 cam_unk_18; + /* 0x001C */ f32 boomLength; + /* 0x0020 */ f32 cam_unk_20; + /* 0x0024 */ f32 x_velocity; + /* 0x0028 */ f32 y_velocity; + /* 0x002C */ f32 z_velocity; + /* 0x0030 */ f32 shakeMagnitude; + /* 0x0034 */ s16 cameraSegmentID; + /* 0x0036 */ s16 mode; + /* 0x0038 */ s16 pitch; + /* 0x003A */ s8 shakeTimer; + /* 0x003B */ u8 zoom; + /* 0x003C */ u8 unk3C; + /* 0x003D */ u8 unk3D; + /* 0x003E */ u8 unk3E; + /* 0x003F */ u8 unk3F; + /* 0x0040 */ ObjectHeader *header; + } Camera; + /* Size: 0x34 bytes. */ typedef struct ScreenViewport { /* 0x00 */ s32 x1; @@ -71,14 +93,14 @@ typedef struct ScreenViewport { /* 0x30 */ s32 flags; } ScreenViewport; -void func_80066060(s32 cameraID, s32 zoomLevel); -void set_viewport_tv_type(s8 setting); +void cam_set_zoom(s32 cameraID, s32 zoomLevel); +void enable_pal_viewport_height_adjust(s8 setting); void func_800660C0(void); void func_800660D0(void); -UNUSED f32 get_current_camera_fov(void); -void update_camera_fov(f32 camFieldOfView); +UNUSED f32 cam_get_fov(void); +void cam_set_fov(f32 camFieldOfView); Matrix *matrix_get_model_s16(void); -s32 get_viewport_count(void); +s32 cam_get_viewport_layout(void); s32 get_current_viewport(void); void camera_init_tracks_menu(Gfx **dList, MatrixS **mtxS); f32 get_distance_to_active_camera(f32 xPos, f32 yPos, f32 zPos); @@ -86,7 +108,7 @@ void camera_reset(s32 xPos, s32 yPos, s32 zPos, s32 angleZ, s32 angleX, s32 angl void write_to_object_render_stack(s32 stackPos, f32 xPos, f32 yPos, f32 zPos, s16 arg4, s16 arg5, s16 arg6); void disable_cutscene_camera(void); s8 check_if_showing_cutscene_camera(void); -s32 set_active_viewports_and_max(s32 num); +s32 cam_set_layout(s32 layoutID); void set_active_camera(s32 num); void camEnableUserView(s32 viewPortIndex, s32 arg1); void camDisableUserView(s32 viewPortIndex, s32 arg1); @@ -103,9 +125,9 @@ void viewport_rsp_set(Gfx **dList, s32 width, s32 height, s32 posX, s32 posY); void viewport_reset(Gfx **dList); void matrix_world_origin(Gfx **dList, MatrixS **mtx); void sprite_anim_off(s32 setting); -ObjectSegment *get_active_camera_segment_no_cutscenes(void); -ObjectSegment *get_active_camera_segment(void); -ObjectSegment *get_cutscene_camera_segment(void); +Camera *cam_get_active_camera_no_cutscenes(void); +Camera *cam_get_active_camera(void); +Camera *get_cutscene_camera_segment(void); Matrix *get_projection_matrix_f32(void); MatrixS *get_projection_matrix_s16(void); Matrix *get_camera_matrix(void); @@ -115,13 +137,13 @@ void set_camera_shake(f32 magnitude); void func_80067D3C(Gfx **dList, MatrixS **mats); void render_ortho_triangle_image(Gfx **dList, MatrixS **mtx, Vertex **vtx, ObjectSegment *segment, Sprite *sprite, s32 flags); s32 render_sprite_billboard(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, Sprite *arg4, s32 flags); -s32 camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scale, f32 scaleY); +s32 cam_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scaleY, f32 offsetY); void viewport_scissor(Gfx **dList); void apply_matrix_from_stack(Gfx **dList); void copy_viewports_to_stack(void); void apply_head_turning_matrix(Gfx **dList, MatrixS **mtx, Object_68 *objGfx, s16 headAngle); void apply_object_shear_matrix(Gfx **dList, MatrixS **mtx, Object *arg2, Object *arg3, f32 shear); -void camera_init(void); +void cam_init(void); void viewport_main(Gfx **dlist, MatrixS **mats); #endif diff --git a/src/game.c b/src/game.c index a840ef67..135910e8 100644 --- a/src/game.c +++ b/src/game.c @@ -585,7 +585,7 @@ void load_level(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicl (PulsatingLightData *) get_misc_asset((s32) gCurrentLevelHeader->pulseLightData); init_pulsating_light_data(gCurrentLevelHeader->pulseLightData); } - update_camera_fov(gCurrentLevelHeader->cameraFOV); + cam_set_fov(gCurrentLevelHeader->cameraFOV); bgdraw_primcolour(gCurrentLevelHeader->bgColorRed, gCurrentLevelHeader->bgColorGreen, gCurrentLevelHeader->bgColorBlue); video_delta_reset(); diff --git a/src/game_ui.c b/src/game_ui.c index 4d385c5c..b415416e 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -319,8 +319,8 @@ void hud_init(UNUSED s32 viewportCount) { s32 i; s32 playerCount; - gHUDNumPlayers = get_viewport_count(); - gNumActivePlayers = set_active_viewports_and_max(gHUDNumPlayers); + gHUDNumPlayers = cam_get_viewport_layout(); + gNumActivePlayers = cam_set_layout(gHUDNumPlayers); gHudSettings = get_settings(); gHudSilverCoinRace = check_if_silver_coin_race(); gAssetHudElementIds = (s16 *) load_asset_section_from_rom(ASSET_HUD_ELEMENT_IDS); @@ -839,7 +839,7 @@ void hud_render_player(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object * sprite_anim_off(TRUE); if (is_in_time_trial()) { hud_time_trial_finish(racer, updateRate); - } else if (get_viewport_count() == VIEWPORTS_COUNT_1_PLAYER && racer->finishPosition == 1) { + } else if (cam_get_viewport_layout() == VIEWPORT_LAYOUT_1_PLAYER && racer->finishPosition == 1) { if (is_in_two_player_adventure()) { if (get_current_level_race_type() == RACETYPE_BOSS) { goto showFinishRace; @@ -1437,7 +1437,7 @@ void hud_main_hub(Object *obj, s32 updateRate) { Object_Racer *racer; HudElement *portrait; - if (get_viewport_count() == PLAYER_ONE) { + if (cam_get_viewport_layout() == PLAYER_ONE) { racer = (Object_Racer *) obj->unk64; sprite_anim_off(TRUE); hud_balloons(racer); @@ -1936,7 +1936,7 @@ void hud_race_start(s32 countdown, s32 updateRate) { if (gCurrentHud->entry[HUD_RACE_START_GO].raceStartGo.musicStartTimer[gHudCurrentViewport] >= 60) { if (gRaceStartShowHudStep == 4) { // Mute background music in 3/4 player. - if (get_viewport_count() > TWO_PLAYERS) { + if (cam_get_viewport_layout() > TWO_PLAYERS) { music_play(SEQUENCE_NONE); } else { start_level_music(1.0f); @@ -1998,9 +1998,9 @@ void hud_bananas(Object_Racer *racer, s32 updateRate) { } if (prevSprite == 0) { sprite_opaque(TRUE); - set_viewport_tv_type(OS_TV_TYPE_NTSC); + enable_pal_viewport_height_adjust(TRUE); hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC]); - set_viewport_tv_type(OS_TV_TYPE_PAL); + enable_pal_viewport_height_adjust(FALSE); sprite_opaque(FALSE); gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].spriteOffset = prevSprite; if (gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].bananaCountSparkle.sparkleCounter) { @@ -2014,18 +2014,18 @@ void hud_bananas(Object_Racer *racer, s32 updateRate) { gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].spriteOffset++; } } - set_viewport_tv_type(OS_TV_TYPE_NTSC); + enable_pal_viewport_height_adjust(TRUE); hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE]); - set_viewport_tv_type(OS_TV_TYPE_PAL); + enable_pal_viewport_height_adjust(FALSE); } } else { gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].spriteOffset = prevSprite + 128; sprite_anim_off(FALSE); sprite_opaque(TRUE); - set_viewport_tv_type(OS_TV_TYPE_NTSC); + enable_pal_viewport_height_adjust(TRUE); hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN]); sprite_opaque(FALSE); - set_viewport_tv_type(OS_TV_TYPE_PAL); + enable_pal_viewport_height_adjust(FALSE); sprite_anim_off(TRUE); gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].spriteOffset -= 128; } @@ -2984,13 +2984,13 @@ void hud_balloons(UNUSED Object_Racer *racer) { gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_1].spriteOffset = balloonCount % 10; } hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_1]); - set_viewport_tv_type(OS_TV_TYPE_NTSC); + enable_pal_viewport_height_adjust(TRUE); if (osTvType == OS_TV_TYPE_PAL) { sprite_opaque(TRUE); } hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BALLOON_COUNT_ICON]); sprite_opaque(FALSE); - set_viewport_tv_type(OS_TV_TYPE_PAL); + enable_pal_viewport_height_adjust(FALSE); hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BALLOON_COUNT_X]); } @@ -3034,7 +3034,7 @@ void hud_weapon(Object *obj, s32 updateRate) { racer = (Object_Racer *) obj->unk64; if (racer->raceFinished == FALSE) { - set_viewport_tv_type(OS_TV_TYPE_NTSC); + enable_pal_viewport_height_adjust(TRUE); temp_a0 = (racer->balloon_type * 3) + (racer->balloon_level); if (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.prevLevel != racer->balloon_level) { if (racer->balloon_level == 0) { @@ -3109,7 +3109,7 @@ void hud_weapon(Object *obj, s32 updateRate) { } } gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); - set_viewport_tv_type(OS_TV_TYPE_PAL); + enable_pal_viewport_height_adjust(FALSE); } } @@ -3347,7 +3347,7 @@ void hud_render_general(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 updateRate s32 sp144; s32 racerCount; UNUSED s32 pad2; - ObjectSegment *someObjSeg; + Camera *someObjSeg; Object **racerGroup; s32 spBC; s32 temp_s0_2; @@ -3606,7 +3606,7 @@ void hud_render_general(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 updateRate if (lvlMdl == NULL) { return; } - someObjSeg = get_active_camera_segment(); + someObjSeg = cam_get_active_camera(); sprite_anim_off(TRUE); minimap = (Sprite *) lvlMdl->minimapSpriteIndex; switch (gHUDNumPlayers) { @@ -3815,7 +3815,7 @@ void hud_element_render(Gfx **dList, MatrixS **mtx, Vertex **vtxList, HudElement TextureHeader **textureHeader3; TextureHeader *textureHeader2; TextureHeader *textureHeader; - ObjectSegment *objSegment; + Camera *camera; LevelObjectEntry_Hud objEntry; UNUSED s32 pad1; Object *tempObject; @@ -3954,11 +3954,11 @@ void hud_element_render(Gfx **dList, MatrixS **mtx, Vertex **vtxList, HudElement rendermode_reset(&gHudDL); } } else if (gAssetHudElementIds[spriteID] & ASSET_MASK_SPRITE) { - objSegment = get_active_camera_segment(); + camera = cam_get_active_camera(); sprite = gAssetHudElements->entry[hud->spriteID]; - hud->rotation.z -= objSegment->trans.rotation.z; + hud->rotation.z -= camera->trans.rotation.z; render_ortho_triangle_image(&gHudDL, &gHudMtx, &gHudVtx, (ObjectSegment *) hud, sprite, 0); - hud->rotation.z += objSegment->trans.rotation.z; + hud->rotation.z += camera->trans.rotation.z; } else if (gAssetHudElementIds[spriteID] & ASSET_MASK_OBJECT) { tempObject = gAssetHudElements->entry[spriteID]; tempObject->segment.trans.rotation.x = hud->rotation.x; @@ -3972,7 +3972,7 @@ void hud_element_render(Gfx **dList, MatrixS **mtx, Vertex **vtxList, HudElement tempObject->segment.object.opacity = 0xFF; render_object(&gHudDL, &gHudMtx, &gHudVtx, tempObject); } else { - camera_push_model_mtx(&gHudDL, &gHudMtx, (ObjectTransform *) hud, 1.0f, 0.0f); + cam_push_model_mtx(&gHudDL, &gHudMtx, (ObjectTransform *) hud, 1.0f, 0.0f); if (0) {} textureHeader3 = gAssetHudElements->entry[hud->spriteID]; hud_draw_model((ObjectModel *) *textureHeader3); diff --git a/src/hasm/math_util.c b/src/hasm/math_util.c index ec3eb0c8..dc195d81 100644 --- a/src/hasm/math_util.c +++ b/src/hasm/math_util.c @@ -163,7 +163,7 @@ GLOBAL_ASM("asm/math_util/f32_matrix_mult.s") #ifdef NON_MATCHING /* Official name: mathMtxF2L */ void f32_matrix_to_s16_matrix(Matrix *input, MatrixS *output) { - guMtxF2L((float(*)[4]) input, (Mtx *) output); + guMtxF2L((float (*)[4]) input, (Mtx *) output); } #else GLOBAL_ASM("asm/math_util/f32_matrix_to_s16_matrix.s") @@ -267,7 +267,16 @@ void s16_vec3_mult_by_s32_matrix(MatrixS input, Vec3s *output) { GLOBAL_ASM("asm/math_util/s16_vec3_mult_by_s32_matrix.s") #endif -#ifdef NON_EQUIVALENT +#ifdef NON_MATCHING +/** + * Converts an ObjectTransform into a transformation matrix and writes it to `mtx`. + * The matrix is built by applying the following operations in order: + * 1. Scaling + * 2. Rotation around Z axis (roll) + * 3. Rotation around X axis (pitch) + * 4. Rotation around Y axis (yaw) + * 5. Translation + */ void object_transform_to_matrix(Matrix mtx, ObjectTransform *trans) { f32 yRotSine; f32 yRotCosine; @@ -277,30 +286,30 @@ void object_transform_to_matrix(Matrix mtx, ObjectTransform *trans) { f32 zRotCosine; f32 scale; - yRotSine = sins_s16(trans->rotation.y_rotation) * 0.000015f; - yRotCosine = coss_s16(trans->rotation.y_rotation) * 0.000015f; - xRotSine = sins_s16(trans->rotation.x_rotation) * 0.000015f; - xRotCosine = coss_s16(trans->rotation.x_rotation) * 0.000015f; - zRotSine = sins_s16(trans->rotation.z_rotation) * 0.000015f; - zRotCosine = coss_s16(trans->rotation.z_rotation) * 0.000015f; - scale = trans->scale * 0.000015f; + yRotSine = sins_s16(trans->rotation.y_rotation) * (1.0f / 0x10000); + yRotCosine = coss_s16(trans->rotation.y_rotation) * (1.0f / 0x10000); + xRotSine = sins_s16(trans->rotation.x_rotation) * (1.0f / 0x10000); + xRotCosine = coss_s16(trans->rotation.x_rotation) * (1.0f / 0x10000); + zRotSine = sins_s16(trans->rotation.z_rotation) * (1.0f / 0x10000); + zRotCosine = coss_s16(trans->rotation.z_rotation) * (1.0f / 0x10000); + scale = trans->scale; - mtx[0][0] = ((xRotSine * yRotSine * zRotSine) + (scale * yRotCosine)) * scale; - mtx[0][1] = (zRotSine * xRotCosine * scale); - mtx[0][2] = (((xRotSine * yRotCosine * zRotSine) - (scale * yRotSine)) * scale); + mtx[0][0] = (xRotSine * yRotSine * zRotSine + zRotCosine * yRotCosine) * scale; + mtx[0][1] = (zRotSine * xRotCosine) * scale; + mtx[0][2] = (xRotSine * yRotCosine * zRotSine - zRotCosine * yRotSine) * scale; mtx[0][3] = 0; - mtx[1][0] = (((xRotSine * yRotSine * scale) - (zRotSine * yRotCosine)) * scale); - mtx[1][1] = (scale * xRotCosine * scale); - mtx[1][2] = (((xRotSine * yRotCosine * scale) + (zRotSine * yRotSine)) * scale); + mtx[1][0] = (xRotSine * yRotSine * zRotCosine - zRotSine * yRotCosine) * scale; + mtx[1][1] = (zRotCosine * xRotCosine) * scale; + mtx[1][2] = (xRotSine * yRotCosine * zRotCosine + zRotSine * yRotSine) * scale; mtx[1][3] = 0; - mtx[2][0] = (xRotCosine * yRotSine * scale); + mtx[2][0] = (xRotCosine * yRotSine) * scale; mtx[2][1] = -(xRotSine * scale); - mtx[2][2] = (xRotCosine * yRotCosine * scale); + mtx[2][2] = (xRotCosine * yRotCosine) * scale; mtx[2][3] = 0; mtx[3][0] = trans->x_position; mtx[3][1] = trans->y_position; - mtx[3][2] = 1.0f; - mtx[3][3] = trans->z_position; + mtx[3][2] = trans->z_position; + mtx[3][3] = 1.0f; } #else GLOBAL_ASM("asm/math_util/object_transform_to_matrix.s") @@ -308,57 +317,68 @@ GLOBAL_ASM("asm/math_util/object_transform_to_matrix.s") #ifdef NON_MATCHING /* Official name: mathSquashY */ -void f32_matrix_scale(Matrix *input, f32 scale) { +void f32_matrix_scale_y_axis(Matrix *input, f32 scale) { input[0][1][0] *= scale; input[0][1][1] *= scale; input[0][1][2] *= scale; } #else -GLOBAL_ASM("asm/math_util/f32_matrix_scale.s") +GLOBAL_ASM("asm/math_util/f32_matrix_scale_y_axis.s") #endif #ifdef NON_MATCHING /* Official name: mathTransY */ -void f32_matrix_y_scale(Matrix *input, f32 scale) { - input[0][3][0] += input[0][1][0] * scale; - input[0][3][1] += input[0][1][1] * scale; - input[0][3][2] += input[0][1][2] * scale; +void f32_matrix_translate_y_axis(Matrix *input, f32 offset) { + input[0][3][0] += input[0][1][0] * offset; + input[0][3][1] += input[0][1][1] * offset; + input[0][3][2] += input[0][1][2] * offset; } #else -GLOBAL_ASM("asm/math_util/f32_matrix_y_scale.s") +GLOBAL_ASM("asm/math_util/f32_matrix_translate_y_axis.s") #endif #ifdef NON_EQUIVALENT +/** + * Writes an inverse transformation matrix to `mtx` based on a pre-inverted `ObjectTransform`. + * This is used to convert world-space coordinates to local object-space coordinates. + * Unlike the standard transform, this version: + * - Omits scaling + * - Applies the transformation steps in reverse order + * - Assumes that the translation and rotation values in `trans` are already negated + * + * Operation order: + * 1. Translate (negative offset) + * 2. Rotate Y (negative yaw) + * 3. Rotate X (negative pitch) + * 4. Rotate Z (negative roll) + */ /* Official Name: mathRpyXyzMtx */ -void object_transform_to_matrix_2(Matrix mtx, ObjectTransform *trans) { +void object_inverse_transform_to_matrix(Matrix mtx, ObjectTransform *trans) { f32 yRotSine; f32 yRotCosine; f32 xRotSine; f32 xRotCosine; f32 zRotSine; f32 zRotCosine; - f32 scale; - yRotCosine = coss_s16(trans->rotation.y_rotation) * 0.000015f; - yRotSine = sins_s16(trans->rotation.y_rotation) * 0.000015f; - xRotCosine = coss_s16(trans->rotation.x_rotation) * 0.000015f; - xRotSine = sins_s16(trans->rotation.x_rotation) * 0.000015f; - zRotCosine = coss_s16(trans->rotation.z_rotation) * 0.000015f; - zRotSine = sins_s16(trans->rotation.z_rotation) * 0.000015f; + yRotCosine = coss_s16(trans->rotation.y_rotation) * (1.0f / 0x10000); + yRotSine = sins_s16(trans->rotation.y_rotation) * (1.0f / 0x10000); + xRotCosine = coss_s16(trans->rotation.x_rotation) * (1.0f / 0x10000); + xRotSine = sins_s16(trans->rotation.x_rotation) * (1.0f / 0x10000); + zRotCosine = coss_s16(trans->rotation.z_rotation) * (1.0f / 0x10000); + zRotSine = sins_s16(trans->rotation.z_rotation) * (1.0f / 0x10000); - scale = trans->scale * 0.000015f; - - mtx[0][0] = (yRotSine * scale) - (xRotCosine * zRotCosine * yRotCosine); - mtx[0][1] = (xRotCosine * scale * yRotCosine) + (yRotSine * zRotCosine); - mtx[0][2] = -(yRotCosine * xRotSine); + mtx[0][0] = yRotCosine * zRotCosine - xRotSine * zRotSine * yRotSine; + mtx[0][1] = xRotSine * zRotCosine * yRotSine + yRotCosine * zRotSine; + mtx[0][2] = -(yRotSine * xRotCosine); mtx[0][3] = 0; - mtx[1][0] = -(xRotSine * zRotCosine); - mtx[1][1] = xRotSine * scale; - mtx[1][2] = xRotCosine; + mtx[1][0] = -(xRotCosine * zRotSine); + mtx[1][1] = xRotCosine * zRotCosine; + mtx[1][2] = xRotSine; mtx[1][3] = 0; - mtx[2][0] = (xRotCosine * zRotCosine * yRotSine) + (yRotCosine * scale); - mtx[2][1] = (yRotCosine * zRotCosine) - (xRotCosine * scale * yRotSine); - mtx[2][2] = yRotSine * xRotSine; + mtx[2][0] = xRotSine * zRotSine * yRotCosine + yRotSine * zRotCosine; + mtx[2][1] = yRotSine * zRotSine - xRotSine * zRotCosine * yRotCosine; + mtx[2][2] = yRotCosine * xRotCosine; mtx[2][3] = 0; mtx[3][0] = (mtx[0][0] * trans->x_position) + (mtx[1][0] * trans->y_position) + (mtx[2][0] * trans->z_position); mtx[3][1] = (mtx[0][1] * trans->x_position) + (mtx[1][1] * trans->y_position) + (mtx[2][1] * trans->z_position); @@ -366,28 +386,28 @@ void object_transform_to_matrix_2(Matrix mtx, ObjectTransform *trans) { mtx[3][3] = 1.0f; } #else -GLOBAL_ASM("asm/math_util/object_transform_to_matrix_2.s") +GLOBAL_ASM("asm/math_util/object_inverse_transform_to_matrix.s") #endif GLOBAL_ASM("asm/math_util/func_80070058.s") #ifdef NON_MATCHING -void f32_matrix_from_rotation_and_scale(Matrix mtx, s32 angle, f32 arg2, f32 arg3) { +void f32_matrix_from_rotation_and_scale(Matrix mtx, s32 angle, f32 scale, f32 scaleY) { f32 cosine, sine; - cosine = sins_s16(angle) * 0.000015f; - sine = coss_s16(angle) * 0.000015f; - mtx[0][0] = sine * arg2; - mtx[0][1] = cosine * arg2; + sine = sins_s16(angle) * (1.0f / 0x10000); + cosine = coss_s16(angle) * (1.0f / 0x10000); + mtx[0][0] = cosine * scale; + mtx[0][1] = sine * scale; mtx[0][2] = 0; mtx[0][3] = 0; - mtx[1][0] = -cosine * arg2; - mtx[1][1] = (sine * arg2) * arg3; + mtx[1][0] = -sine * scale; + mtx[1][1] = (cosine * scale) * scaleY; mtx[1][2] = 0; mtx[1][3] = 0; mtx[2][0] = 0; mtx[2][1] = 0; - mtx[2][2] = arg2; + mtx[2][2] = scale; mtx[2][3] = 0; mtx[3][0] = 0; mtx[3][1] = 0; diff --git a/src/hasm/math_util.s b/src/hasm/math_util.s index 87e7d1f2..406526a3 100644 --- a/src/hasm/math_util.s +++ b/src/hasm/math_util.s @@ -680,7 +680,7 @@ leaf object_transform_to_matrix .end object_transform_to_matrix /* Official Name: mathSquashY */ -leaf f32_matrix_scale +leaf f32_matrix_scale_y_axis /* 70A04 8006FE04 44859000 */ mtc1 $a1, $f18 /* 70A08 8006FE08 C4900010 */ lwc1 $f16, 0x10($a0) /* 70A0C 8006FE0C 46128402 */ mul.s $f16, $f16, $f18 @@ -692,10 +692,10 @@ leaf f32_matrix_scale /* 70A24 8006FE24 46128402 */ mul.s $f16, $f16, $f18 /* 70A28 8006FE28 03E00008 */ jr $ra /* 70A2C 8006FE2C E4900018 */ swc1 $f16, 0x18($a0) -.end f32_matrix_scale +.end f32_matrix_scale_y_axis /* Official Name: mathTransY */ -leaf f32_matrix_y_scale +leaf f32_matrix_translate_y_axis /* 70A30 8006FE30 44858000 */ mtc1 $a1, $f16 /* 70A34 8006FE34 C4800010 */ lwc1 $f0, 0x10($a0) /* 70A38 8006FE38 C4840014 */ lwc1 $f4, 0x14($a0) @@ -713,10 +713,10 @@ leaf f32_matrix_y_scale /* 70A68 8006FE68 E4840034 */ swc1 $f4, 0x34($a0) /* 70A6C 8006FE6C 03E00008 */ jr $ra /* 70A70 8006FE70 E4880038 */ swc1 $f8, 0x38($a0) -.end f32_matrix_y_scale +.end f32_matrix_translate_y_axis /* Official Name: mathRpyXyzMtx */ -leaf object_transform_to_matrix_2 +leaf object_inverse_transform_to_matrix /* 70A74 8006FE74 27BDFFF8 */ addiu $sp, $sp, -0x8 /* 70A78 8006FE78 3C013780 */ lui $at, (0x37800000 >> 16) /* 70A7C 8006FE7C FFBF0000 */ sd $ra, 0x0($sp) @@ -838,7 +838,7 @@ leaf object_transform_to_matrix_2 /* 70C4C 8007004C 27BD0008 */ addiu $sp, $sp, 0x8 /* 70C50 80070050 03E00008 */ jr $ra /* 70C54 80070054 00000000 */ nop -.end object_transform_to_matrix_2 +.end object_inverse_transform_to_matrix leaf func_80070058 /* 70C58 80070058 27BDFFF8 */ addiu $sp, $sp, -0x8 diff --git a/src/hasm/obj_shade_fast.s b/src/hasm/obj_shade_fast.s index 584f6c38..418939e7 100644 --- a/src/hasm/obj_shade_fast.s +++ b/src/hasm/obj_shade_fast.s @@ -158,7 +158,7 @@ leaf calc_dynamic_lighting_for_object_2 /* 25408 80024808 A70A0004 */ sh $t2, 0x4($t8) /* 2540C 8002480C AF030010 */ sw $v1, 0x10($t8) /* 25410 80024810 AF030014 */ sw $v1, 0x14($t8) -/* 25414 80024814 0C01BF9D */ jal object_transform_to_matrix_2 +/* 25414 80024814 0C01BF9D */ jal object_inverse_transform_to_matrix /* 25418 80024818 03002825 */ or $a1, $t8, $zero /* 2541C 8002481C 27A50010 */ addiu $a1, $sp, 0x10 /* 25420 80024820 27A40034 */ addiu $a0, $sp, 0x34 diff --git a/src/math_util.h b/src/math_util.h index 490d5ff8..2f02839b 100644 --- a/src/math_util.h +++ b/src/math_util.h @@ -45,9 +45,9 @@ void f32_matrix_to_s16_matrix(Matrix *input, MatrixS *output); void s16_matrix_rotate(s16 *arg0[4][4], s16 arg1[4][4]); void s16_vec3_mult_by_s32_matrix(MatrixS input, Vec3s *output); void object_transform_to_matrix(Matrix mtx, ObjectTransform *trans); -void f32_matrix_scale(Matrix *input, f32 scale); -void f32_matrix_y_scale(Matrix *input, f32 scale); -void object_transform_to_matrix_2(Matrix mtx, ObjectTransform *trans); +void f32_matrix_scale_y_axis(Matrix *input, f32 scale); +void f32_matrix_translate_y_axis(Matrix *input, f32 offset); +void object_inverse_transform_to_matrix(Matrix mtx, ObjectTransform *trans); void f32_matrix_from_rotation_and_scale(Matrix mtx, s32 angle, f32 arg2, f32 arg3); void s16_vec3_apply_object_rotation(ObjectTransform *trans, s16 *vec3Arg); void f32_vec3_apply_object_rotation(ObjectTransform *trans, f32 *vec3_f32); diff --git a/src/menu.c b/src/menu.c index f7697a91..2d7e403b 100644 --- a/src/menu.c +++ b/src/menu.c @@ -177,7 +177,6 @@ f32 gTitleAudioCounter; s8 *sTitleScreenDemoIds; // Misc Asset 66 - title_screen_demo_ids.bin - 12 or 13 values. s16 gTitleDemoTimer; unk80126878 D_80126878[8]; -u8 D_80126E78[0x20]; // NEW BSS, or BIGGER D_80126878? f32 D_801268D8; UNUSED s32 D_801268DC; // Set to 0 during the title screen, never read. s32 gOpeningNameID; @@ -395,9 +394,6 @@ s32 gTitleRevealTimer; f32 gTitleAudioCounter; s8 *sTitleScreenDemoIds; // Misc Asset 66 - title_screen_demo_ids.bin - 12 or 13 values. unk80126878 D_80126878[8]; -#if VERSION >= VERSION_79 -u8 D_80126E78[0x20]; // NEW BSS, or BIGGER D_80126878? -#endif f32 D_801268D8; UNUSED s32 D_801268DC; // Set to 0 during the title screen, never read. s32 gOpeningNameID; @@ -718,11 +714,11 @@ char *D_800E142C_E202C[] = { D_800E13A4_E1FA4, D_800E13B0_E1FB0, D_800E13BC_E1FB s32 gTitleCinematicTextColourCount = 0; // Colours used for the Character Names during the title screen cinematic -MenuColour gTitleCinematicTextColours[] = { - { 255, 255, 0, 255, 204 }, // Yellow - { 0, 255, 0, 255, 153 }, // Green - { 0, 255, 255, 255, 102 }, // Cyan - { 0, 0, 255, 255, 51 } // Blue +u8 gTitleCinematicTextColours[] = { + 255, 255, 0, 255, 204, // Yellow + 0, 255, 0, 255, 153, // Green + 0, 255, 255, 255, 102, // Cyan + 0, 0, 255, 255, 51 // Blue }; UNUSED u8 unused_800DFA0C[] = { 0, 0, 15, 120 }; @@ -3205,18 +3201,18 @@ void init_title_screen_variables(void) { load_menu_text(get_language()); } -#ifdef NON_MATCHING -// Differs in v80 -// Single regswap diff void func_80083098(f32 updateRateF) { f32 temp; f32 temp2; s32 didUpdate; s32 xPos; s32 yPos; - s32 i; // s1 + s32 i; s32 j; char *text; +#if REGION == REGION_JP + char *text2; +#endif unk800DF83C *introCharData; didUpdate = FALSE; @@ -3229,21 +3225,32 @@ void func_80083098(f32 updateRateF) { } introCharData = &gTitleCinematicText[gOpeningNameID]; +#if REGION == REGION_JP + text2 = D_800E142C_E202C[gOpeningNameID]; +#endif D_801268D8 += updateRateF; set_text_font(ASSET_FONTS_BIGFONT); set_text_background_colour(0, 0, 0, 0); i = 0; while (i < gTitleCinematicTextColourCount) { - j = D_80126878[i].colourIndex; - set_text_colour(gTitleCinematicTextColours[j].red, gTitleCinematicTextColours[j].green, - gTitleCinematicTextColours[j].blue, gTitleCinematicTextColours[j].alpha, - gTitleCinematicTextColours[j].opacity); + j = 5 * D_80126878[i].colourIndex; + set_text_colour(gTitleCinematicTextColours[j + 0], gTitleCinematicTextColours[j + 1], + gTitleCinematicTextColours[j + 2], gTitleCinematicTextColours[j + 3], + gTitleCinematicTextColours[j + 4]); draw_text(&sMenuCurrDisplayList, D_80126878[i].x, D_80126878[i].y, D_80126878[i].text, ALIGN_MIDDLE_CENTER); +#if REGION == REGION_JP + set_text_font(ASSET_FONTS_FUNFONT); + draw_text(&sMenuCurrDisplayList, D_80126878[i].x, D_80126878[i].y - 24, D_80126878[i].text2, ALIGN_MIDDLE_CENTER); + set_text_font(ASSET_FONTS_BIGFONT); +#endif D_80126878[i].colourIndex++; if (D_80126878[i].colourIndex >= 4) { gTitleCinematicTextColourCount--; for (j = i; j < gTitleCinematicTextColourCount; j++) { D_80126878[j].text = D_80126878[j + 1].text; +#if REGION == REGION_JP + D_80126878[j].text2 = D_80126878[j + 1].text2; +#endif D_80126878[j].x = D_80126878[j + 1].x; D_80126878[j].y = D_80126878[j + 1].y; D_80126878[j].colourIndex = D_80126878[j + 1].colourIndex; @@ -3278,8 +3285,6 @@ void func_80083098(f32 updateRateF) { } } - if (gTitleCinematicTextColours) {} - if (!didUpdate) { return; } @@ -3287,16 +3292,20 @@ void func_80083098(f32 updateRateF) { if (gTitleCinematicTextColourCount < 4) { D_80126878[gTitleCinematicTextColourCount].colourIndex = 0; D_80126878[gTitleCinematicTextColourCount].text = text; +#if REGION == REGION_JP + D_80126878[gTitleCinematicTextColourCount].text2 = text2; +#endif D_80126878[gTitleCinematicTextColourCount].x = xPos; D_80126878[gTitleCinematicTextColourCount].y = yPos; gTitleCinematicTextColourCount++; } set_text_colour(255, 255, 255, 0, 255); draw_text(&sMenuCurrDisplayList, xPos, yPos, text, ALIGN_MIDDLE_CENTER); -} -#else -#pragma GLOBAL_ASM("asm/nonmatchings/menu/func_80083098.s") +#if REGION == REGION_JP + set_text_font(ASSET_FONTS_FUNFONT); + draw_text(&sMenuCurrDisplayList, xPos, yPos - 24, text2, ALIGN_MIDDLE_CENTER); #endif +} /** * Initialise the title screen menu. @@ -3411,10 +3420,10 @@ s32 menu_title_screen_loop(s32 updateRate) { s8 *demo; s32 contrIndex; f32 updateRateF; - ObjectSegment *sp18; + Camera *sp18; s8 playerCount; - sp18 = get_active_camera_segment(); + sp18 = cam_get_active_camera(); gOptionBlinkTimer = (gOptionBlinkTimer + updateRate) & 0x3F; menu_input(); if (osTvType == OS_TV_TYPE_PAL) { @@ -3479,7 +3488,7 @@ s32 menu_title_screen_loop(s32 updateRate) { gTitleRevealTimer += updateRate; if (gTitleRevealTimer >= 32) { gTitleRevealTimer = 32; - sp18->object.distanceToCamera = 8.0f; + sp18->shakeMagnitude = 8.0f; sound_play(SOUND_EXPLOSION, NULL); } } else { @@ -6835,7 +6844,7 @@ void charselect_render_text(UNUSED s32 updateRate) { #endif } rendermode_reset(&sMenuCurrDisplayList); - update_camera_fov(40.0f); + cam_set_fov(40.0f); } } @@ -10420,7 +10429,7 @@ void postrace_start(s32 finishState, s32 worldID) { header = get_current_level_header(); gPostraceFinishState = finishState; if (is_in_two_player_adventure()) { - set_scene_viewport_num(VIEWPORTS_COUNT_1_PLAYER); + set_scene_viewport_num(VIEWPORT_LAYOUT_1_PLAYER); } gPostRace1Player = FALSE; if (gNumberOfActivePlayers == 1 && gTrophyRaceWorldId == 0) { @@ -13351,7 +13360,7 @@ void credits_free(void) { * Write the original coordinates back once done. */ void menu_camera_centre(void) { - ObjectSegment *cam; + Camera *cam; s16 angleY; s16 angleX; s16 angleZ; @@ -13359,10 +13368,10 @@ void menu_camera_centre(void) { f32 posY; f32 posZ; - set_active_viewports_and_max(0); + cam_set_layout(VIEWPORT_LAYOUT_1_PLAYER); set_active_camera(0); - cam = get_active_camera_segment(); + cam = cam_get_active_camera(); angleY = cam->trans.rotation.y_rotation; angleX = cam->trans.rotation.x_rotation; @@ -13849,7 +13858,7 @@ void menu_element_render(s32 elementID) { gDPSetPrimColor(sMenuCurrDisplayList++, 0, 0, 255, 255, 255, 255); }; gDPSetEnvColor(sMenuCurrDisplayList++, 255, 255, 255, 0); - camera_push_model_mtx(&sMenuCurrDisplayList, &sMenuCurrHudMat, + cam_push_model_mtx(&sMenuCurrDisplayList, &sMenuCurrHudMat, (ObjectTransform *) (&gMenuImages[elementID]), gTrackSelectWoodFrameHeightScale, 0); model = ((ObjectModel **) gMenuAssets[gMenuImages[elementID].spriteID]); diff --git a/src/menu.h b/src/menu.h index 29c62a9b..4ad3476e 100644 --- a/src/menu.h +++ b/src/menu.h @@ -416,9 +416,12 @@ typedef struct SaveFileData { /* 0x0C */ u32 fileSize; // Game Data File Size } SaveFileData; -// Size: 12 bytes +// Size: 12 or 16 bytes typedef struct unk80126878 { /* 0x00 */ char *text; +#if VERSION >= VERSION_79 + /* 0x00 */ char *text2; +#endif /* 0x04 */ s16 x; /* 0x06 */ s16 y; /* 0x08 */ s32 colourIndex; diff --git a/src/object_functions.c b/src/object_functions.c index 0c9935a1..f24f52f4 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -1162,7 +1162,7 @@ void try_to_collect_egg(Object *obj, Object_CollectEgg *egg) { transF.x_position = -interactedObj->segment.trans.x_position; transF.y_position = -interactedObj->segment.trans.y_position; transF.z_position = -interactedObj->segment.trans.z_position; - object_transform_to_matrix_2(mat, &transF); + object_inverse_transform_to_matrix(mat, &transF); guMtxXFMF(mat, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, &obj->segment.trans.x_position, &obj->segment.trans.y_position, &obj->segment.trans.z_position); @@ -1542,7 +1542,7 @@ void obj_loop_fish(Object *fishObj, s32 updateRate) { Vertex *verts; s32 randNumber; - if (get_viewport_count() > 0) { + if (cam_get_viewport_layout() > 0) { free_object(fishObj); return; } @@ -2151,7 +2151,7 @@ void obj_loop_animcamera(Object *obj, s32 updateRate) { obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; camera = &obj->unk64->animation; if (temp_v0 == 0) { - if (get_viewport_count() == VIEWPORTS_COUNT_1_PLAYER) { + if (cam_get_viewport_layout() == VIEWPORT_LAYOUT_1_PLAYER) { updateCam = func_800210CC(camera->unk44); } else { updateCam = TRUE; @@ -2560,7 +2560,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { u32 buttonsPressed; s8 spawnSmoke; LevelHeader *levelHeader; - ObjectSegment *temp_v0_22; + Camera *temp_v0_22; f32 var_f2; s32 arctan; s32 temp; diff --git a/src/objects.c b/src/objects.c index fb3fe080..48d1446f 100644 --- a/src/objects.c +++ b/src/objects.c @@ -1011,7 +1011,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { s32 spB4[8]; s32 sp94[8]; LevelHeader *levelHeader; - ObjectSegment *cutsceneCameraSegment; // sp74 + Camera *cutsceneCameraSegment; // sp74 s16 objectId; s8 sp127; u8 raceType; @@ -1050,8 +1050,8 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { cutsceneID = -1; if (is_time_trial_enabled() && raceType == RACETYPE_DEFAULT) { cutsceneCameraSegment = get_cutscene_camera_segment(); - cutsceneID = (u8) cutsceneCameraSegment->object.animationID; - cutsceneCameraSegment->object.animationID = 1; + cutsceneID = (u8) cutsceneCameraSegment->zoom; + cutsceneCameraSegment->zoom = 1; } gameMode = get_game_mode(); settings = get_settings(); @@ -1458,7 +1458,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { } *D_8011AD24 = 1; if (cutsceneID >= 0) { - cutsceneCameraSegment->object.animationID = cutsceneID; + cutsceneCameraSegment->zoom = cutsceneID; } if (func_8000E148() != 0) { rumble_init(FALSE); @@ -1805,7 +1805,7 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 arg1) { curObj->objectID = objType; func_800245B4(objType); curObj->segment.trans.scale = curObj->segment.header->scale; - curObj->segment.camera.unk34 = curObj->segment.header->unk50 * curObj->segment.trans.scale; + curObj->segment.object.unk34 = curObj->segment.header->unk50 * curObj->segment.trans.scale; curObj->segment.object.opacity = 0xFF; sp50 = obj_init_property_flags(curObj->segment.header->behaviorId); curObj->segment.header->unk52++; @@ -2789,9 +2789,9 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { * A much simpler, faster way to render an object model as opposed to render_3d_model */ void render_misc_model(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, - TextureHeader *tex, u32 flags, u32 texOffset, f32 scale) { + TextureHeader *tex, u32 flags, u32 texOffset, f32 scaleY) { s32 hasTexture = FALSE; - camera_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, scale, 0.0f); + cam_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, scaleY, 0.0f); gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); if (tex != NULL) { @@ -2807,7 +2807,7 @@ void render_misc_model(Object *obj, Vertex *verts, u32 numVertices, Triangle *tr * A few objects use unconventional means to render. They are handled here. */ void render_3d_misc(Object *obj) { - f32 scale; + f32 scaleY; Object_64 *objData; switch (obj->behaviorId) { @@ -2827,10 +2827,10 @@ void render_3d_misc(Object *obj) { break; case BHV_FISH: objData = obj->unk64; - scale = obj->segment.level_entry->fish.unkD; - scale *= 0.01f; + scaleY = obj->segment.level_entry->fish.unkD; + scaleY *= 0.01f; render_misc_model(obj, &objData->fish.vertices[objData->fish.unkFC * 6], 6, objData->fish.triangles, 8, - objData->fish.texture, RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_CUTOUT, 0, scale); + objData->fish.texture, RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_CUTOUT, 0, scaleY); break; case BHV_BOOST: if (obj->properties.common.unk0 && (obj->unk64->boost.unk70 > 0 || obj->unk64->boost.unk74 > 0.0f)) { @@ -3005,7 +3005,7 @@ void render_3d_model(Object *obj) { racerObj->playerIndex == PLAYER_COMPUTER) { flags = FALSE; } - if (get_viewport_count() != VIEWPORTS_COUNT_1_PLAYER) { + if (cam_get_viewport_layout() != VIEWPORT_LAYOUT_1_PLAYER) { flags = FALSE; } obj->curVertData = (Vertex *) obj68->vertices[obj68->animationTaskNum]; @@ -3033,7 +3033,7 @@ void render_3d_model(Object *obj) { func_80011134(obj, objModel->unk52); obj68->objModel->unk52 = 0; } - camera_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, D_8011AD28, 0); + cam_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, D_8011AD28, 0); spB0 = FALSE; if (racerObj != NULL) { object_undo_player_tumble(obj); @@ -3131,7 +3131,7 @@ void render_3d_model(Object *obj) { render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, loopObj, (Sprite *) something, flags); if (var_v0_2) { - gDkrInsertMatrix(gObjectCurrDisplayList++, 0, 0); + gSPSelectMatrixDKR(gObjectCurrDisplayList++, G_MTX_DKR_INDEX_0); func_80012CE8(&gObjectCurrDisplayList); } } @@ -3329,7 +3329,7 @@ void func_80012F94(Object *obj) { } batchNum = 0; bossAsset = (u8 *) get_misc_asset(var_t0); // 40 bytes of data u8[8][5]? - bossAsset = &bossAsset[(get_viewport_count() * 10)]; + bossAsset = &bossAsset[(cam_get_viewport_layout() * 10)]; var_a1 = bossAsset; if (get_current_viewport() != objRacer->playerIndex) { var_a1 += 5; @@ -3492,7 +3492,7 @@ void func_800135B8(Object *boostObj) { asset = (Object_Boost *) get_misc_asset(ASSET_MISC_20); asset = &asset[D_8011B058[idx]]; object_do_player_tumble((Object *) boostObj->properties.common.unk0); - camera_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, + cam_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, (ObjectTransform *) boostObj->properties.common.unk0, 1.0f, 0.0f); object_undo_player_tumble((Object *) boostObj->properties.common.unk0); objTransform.trans.x_position = boostData->position.x; @@ -3538,14 +3538,14 @@ void render_bubble_trap(ObjectTransform *trans, Object_68 *gfxData, Object *obj, f32 x; f32 y; f32 z; - ObjectSegment *cameraSegment; + Camera *cameraSegment; f32 dist; f32_vec3_apply_object_rotation(trans, &obj->segment.trans.x_position); obj->segment.trans.x_position += trans->x_position; obj->segment.trans.y_position += trans->y_position; obj->segment.trans.z_position += trans->z_position; - cameraSegment = get_active_camera_segment(); + cameraSegment = cam_get_active_camera(); x = cameraSegment->trans.x_position - obj->segment.trans.x_position; y = cameraSegment->trans.y_position - obj->segment.trans.y_position; z = cameraSegment->trans.z_position - obj->segment.trans.z_position; @@ -3625,7 +3625,7 @@ void render_racer_shield(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o } apply_object_shear_matrix(&gObjectCurrDisplayList, &gObjectCurrMatrix, gShieldEffectObject, obj, shear); render_mesh(mdl, gShieldEffectObject, 0, RENDER_SEMI_TRANSPARENT, 0); - gDkrInsertMatrix(gObjectCurrDisplayList++, 0, G_MTX_DKR_INDEX_0); + gSPSelectMatrixDKR(gObjectCurrDisplayList++, G_MTX_DKR_INDEX_0); if (racer->shieldTimer < 64) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); } @@ -3688,7 +3688,7 @@ void render_racer_magnet(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o gObjectTexAnim = TRUE; render_mesh(mdl, gMagnetEffectObject, 0, RENDER_SEMI_TRANSPARENT, 0); gObjectTexAnim = FALSE; - gDkrInsertMatrix(gObjectCurrDisplayList++, 0, G_MTX_DKR_INDEX_0); + gSPSelectMatrixDKR(gObjectCurrDisplayList++, G_MTX_DKR_INDEX_0); gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); rendermode_reset(&gObjectCurrDisplayList); *dList = gObjectCurrDisplayList; @@ -3790,14 +3790,14 @@ s32 render_mesh(ObjectModel *objModel, Object *obj, s32 startIndex, s32 flags, s } else { if (offsetStartVertex > 0) { gSPVertexDKR(dList++, OS_K0_TO_PHYSICAL(vtx), offsetStartVertex, 0); - gDkrInsertMatrix(dList++, 0, G_MTX_DKR_INDEX_2); + gSPSelectMatrixDKR(dList++, G_MTX_DKR_INDEX_2); gSPVertexDKR(dList++, OS_K0_TO_PHYSICAL(&vtx[offsetStartVertex]), (numVertices - offsetStartVertex), 1); } else { - gDkrInsertMatrix(dList++, 0, G_MTX_DKR_INDEX_2); + gSPSelectMatrixDKR(dList++, G_MTX_DKR_INDEX_2); gSPVertexDKR(dList++, OS_K0_TO_PHYSICAL(vtx), numVertices, 0); } - gDkrInsertMatrix(dList++, 0, G_MTX_DKR_INDEX_1); + gSPSelectMatrixDKR(dList++, G_MTX_DKR_INDEX_1); } gSPPolygon(dList++, OS_K0_TO_PHYSICAL(tris), numTris, texEnabled); } @@ -3902,11 +3902,11 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { case 0: while (arg1 >= arg0) { while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.x_position - - gObjPtrList[arg0]->segment.camera.unk34) < arg2)) { + gObjPtrList[arg0]->segment.object.unk34) < arg2)) { arg0++; } while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.x_position - - gObjPtrList[arg1]->segment.camera.unk34))) { + gObjPtrList[arg1]->segment.object.unk34))) { arg1--; } if (arg0 < arg1) { @@ -3921,11 +3921,11 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { case 1: while (arg1 >= arg0) { while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.y_position - - gObjPtrList[arg0]->segment.camera.unk34) < arg2)) { + gObjPtrList[arg0]->segment.object.unk34) < arg2)) { arg0++; } while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.y_position - - gObjPtrList[arg1]->segment.camera.unk34))) { + gObjPtrList[arg1]->segment.object.unk34))) { arg1--; } if (arg0 < arg1) { @@ -3940,11 +3940,11 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { case 2: while (arg1 >= arg0) { while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.z_position - - gObjPtrList[arg0]->segment.camera.unk34) < arg2)) { + gObjPtrList[arg0]->segment.object.unk34) < arg2)) { arg0++; } while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.z_position - - gObjPtrList[arg1]->segment.camera.unk34))) { + gObjPtrList[arg1]->segment.object.unk34))) { arg1--; } if (arg0 < arg1) { @@ -3959,11 +3959,11 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { case 8: while (arg1 >= arg0) { while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.x_position + - gObjPtrList[arg0]->segment.camera.unk34) < arg2)) { + gObjPtrList[arg0]->segment.object.unk34) < arg2)) { arg0++; } while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.x_position + - gObjPtrList[arg1]->segment.camera.unk34))) { + gObjPtrList[arg1]->segment.object.unk34))) { arg1--; } if (arg0 < arg1) { @@ -3978,11 +3978,11 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { case 9: while (arg1 >= arg0) { while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.y_position + - gObjPtrList[arg0]->segment.camera.unk34) < arg2)) { + gObjPtrList[arg0]->segment.object.unk34) < arg2)) { arg0++; } while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.y_position + - gObjPtrList[arg1]->segment.camera.unk34))) { + gObjPtrList[arg1]->segment.object.unk34))) { arg1--; } if (arg0 < arg1) { @@ -3997,11 +3997,11 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { case 10: while (arg1 >= arg0) { while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.z_position + - gObjPtrList[arg0]->segment.camera.unk34) < arg2)) { + gObjPtrList[arg0]->segment.object.unk34) < arg2)) { arg0++; } while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.z_position + - gObjPtrList[arg1]->segment.camera.unk34))) { + gObjPtrList[arg1]->segment.object.unk34))) { arg1--; } if (arg0 < arg1) { @@ -4155,9 +4155,9 @@ void process_object_interactions(void) { #pragma GLOBAL_ASM("asm/nonmatchings/objects/func_800159C8.s") void func_80016500(Object *obj, Object_Racer *racer) { - s32 sp3C; + s32 shakeMagnitude; + s32 volume; s32 angle; - UNUSED s32 pad; f32 startVelocity; f32 cosAngle; f32 sinAngle; @@ -4175,37 +4175,37 @@ void func_80016500(Object *obj, Object_Racer *racer) { racer->lateral_velocity = (obj->segment.x_velocity * cosAngle) + (obj->segment.z_velocity * sinAngle); racer->velocity = (-obj->segment.x_velocity * sinAngle) + (obj->segment.z_velocity * cosAngle); if (racer->playerIndex != PLAYER_COMPUTER) { - angle = (startVelocity - racer->velocity) * 14.0f; - if (angle < 0) { - angle = -angle; + volume = (startVelocity - racer->velocity) * 14.0f; + if (volume < 0) { + volume = -volume; } - angle += 35; - if (angle >= 128) { - angle = 127; + volume += 35; + if (volume > 127) { + volume = 127; } if (racer->unk1F6 == 0) { sound_play(SOUND_CRASH_CHARACTER, &racer->unk220); - sound_volume_set_relative(SOUND_CRASH_CHARACTER, racer->unk220, angle); + sound_volume_set_relative(SOUND_CRASH_CHARACTER, racer->unk220, volume); } - if (racer->unk1F6 == 0 && angle >= 56) { + if (racer->unk1F6 == 0 && volume > 55) { if (!racer->raceFinished) { rumble_set(racer->playerIndex, RUMBLE_TYPE_18); } racer->unk1F3 |= 8; } - if (angle >= 56) { + if (volume > 55) { play_random_character_voice(obj, SOUND_VOICE_CHARACTER_NEGATIVE, 8, 1); } - sp3C = (startVelocity - racer->velocity); - if (sp3C < 0) { - sp3C = -sp3C; + shakeMagnitude = (startVelocity - racer->velocity); + if (shakeMagnitude < 0) { + shakeMagnitude = -shakeMagnitude; } - if (sp3C >= 4) { - sp3C = 3; + if (shakeMagnitude > 3) { + shakeMagnitude = 3; } racer->unk1F6 = 30; set_active_camera(racer->playerIndex); - get_active_camera_segment()->object.distanceToCamera = sp3C; + cam_get_active_camera()->shakeMagnitude = shakeMagnitude; } } @@ -4241,12 +4241,12 @@ void func_80016748(Object *obj0, Object *obj1) { if (!((objModel->unk3C + 50.0) < sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)))) { obj0Interact = obj0->interactObj; obj1Interact = obj1->interactObj; - object_transform_to_matrix((float(*)[4]) obj1TransformMtx, &obj1->segment.trans); + object_transform_to_matrix((float (*)[4]) obj1TransformMtx, &obj1->segment.trans); for (i = 0; i < objModel->unk20; i += 2) { xDiff = obj1->curVertData[objModel->unk1C[i]].x; yDiff = obj1->curVertData[objModel->unk1C[i]].y; zDiff = obj1->curVertData[objModel->unk1C[i]].z; - guMtxXFMF((float(*)[4]) obj1TransformMtx, xDiff, yDiff, zDiff, &xDiff, &yDiff, &zDiff); + guMtxXFMF((float (*)[4]) obj1TransformMtx, xDiff, yDiff, zDiff, &xDiff, &yDiff, &zDiff); temp = (((f32) objModel->unk1C[i + 1] / 64) * obj1->segment.trans.scale) * 50.0; xDiff -= obj0->segment.trans.x_position; yDiff -= obj0->segment.trans.y_position; @@ -4413,7 +4413,7 @@ void func_8001709C(Object *obj) { sp78.x_position = -obj->segment.trans.x_position; sp78.y_position = -obj->segment.trans.y_position; sp78.z_position = -obj->segment.trans.z_position; - object_transform_to_matrix_2((float(*)[4]) sp6C, (ObjectTransform *) &sp78); + object_inverse_transform_to_matrix((float (*)[4]) sp6C, (ObjectTransform *) &sp78); inverseScale = 1.0 / obj->segment.trans.scale; i = 0; while (i < 16) { @@ -4663,7 +4663,7 @@ void race_transition_adventure(s32 updateRate) { sndp_stop_all_looped(); if (is_in_two_player_adventure()) { set_scene_viewport_num(0); - set_active_viewports_and_max(0); + cam_set_layout(VIEWPORT_LAYOUT_1_PLAYER); prevRacer0Obj = (*gRacers)[0]; prevPort0Racer = gRacersByPort[0]; racer = &prevRacer0Obj->unk64->racer; @@ -6199,9 +6199,9 @@ void func_8001F23C(Object *obj, LevelObjectEntry_Animation *animEntry) { if (newObj->segment.header->behaviorId == BHV_CAMERA_ANIMATION) { camera = &newObj->unk64->anim_camera; camera->unk44 = D_8011AD3E; - viewportCount = get_viewport_count(); + viewportCount = cam_get_viewport_layout(); if (is_two_player_adventure_race()) { - viewportCount = VIEWPORTS_COUNT_2_PLAYERS; + viewportCount = VIEWPORT_LAYOUT_2_PLAYERS; } for (i = 0; i < viewportCount;) { newObj = spawn_object(&newObjEntry, 1); @@ -6262,7 +6262,7 @@ s32 func_800210CC(s8 arg0) { } void func_80021104(Object *obj, Object_Animation *animObj, LevelObjectEntry_Animation *entry) { - ObjectSegment *seg; + Camera *camera; ObjectTransform *animObjTrans; animObjTrans = (ObjectTransform *) animObj->unk1C; @@ -6272,16 +6272,16 @@ void func_80021104(Object *obj, Object_Animation *animObj, LevelObjectEntry_Anim } if (entry->unk22 == 18) { set_active_camera(animObj->cameraID); - seg = get_active_camera_segment_no_cutscenes(); - animObjTrans->x_position = seg->trans.x_position; - animObjTrans->y_position = seg->trans.y_position; - animObjTrans->z_position = seg->trans.z_position; - animObjTrans->rotation.y_rotation = (0x8000 - seg->trans.rotation.y_rotation); - animObjTrans->rotation.x_rotation = -seg->trans.rotation.x_rotation; - animObjTrans->rotation.z_rotation = seg->trans.rotation.z_rotation; + camera = cam_get_active_camera_no_cutscenes(); + animObjTrans->x_position = camera->trans.x_position; + animObjTrans->y_position = camera->trans.y_position; + animObjTrans->z_position = camera->trans.z_position; + animObjTrans->rotation.y_rotation = (0x8000 - camera->trans.rotation.y_rotation); + animObjTrans->rotation.x_rotation = -camera->trans.rotation.x_rotation; + animObjTrans->rotation.z_rotation = camera->trans.rotation.z_rotation; } if ((entry->unk22 >= 10) && (entry->unk22 < 18)) { - seg = &(*gRacers)[entry->unk22 - 10]->segment; + ObjectSegment *seg = &(*gRacers)[entry->unk22 - 10]->segment; if (seg != NULL) { animObjTrans->x_position = seg->trans.x_position; animObjTrans->y_position = seg->trans.y_position; @@ -6664,7 +6664,7 @@ void mode_end_taj_race(s32 reason) { CheckpointNode *func_800230D0(Object *obj, Object_Racer *racer) { CheckpointNode *lastCheckpointNode; - ObjectSegment *activeCameraSegment; + Camera *activeCameraSegment; s32 yOutCount; f32 yOut[9]; Object *ptrList; @@ -6733,7 +6733,7 @@ CheckpointNode *func_800230D0(Object *obj, Object_Racer *racer) { racer->vehicleID = racer->vehicleIDPrev; if (racer->playerIndex != -1) { set_active_camera(racer->playerIndex); - activeCameraSegment = get_active_camera_segment_no_cutscenes(); + activeCameraSegment = cam_get_active_camera_no_cutscenes(); activeCameraSegment->trans.x_position = obj->segment.trans.x_position; activeCameraSegment->trans.y_position = obj->segment.trans.y_position; activeCameraSegment->trans.z_position = obj->segment.trans.z_position; diff --git a/src/objects.h b/src/objects.h index 3d0312d6..f05ebe35 100644 --- a/src/objects.h +++ b/src/objects.h @@ -448,7 +448,7 @@ s32 init_object_water_effect(Object *obj, WaterEffect *waterEffect); s32 timetrial_load_staff_ghost(s32 mapId); void render_3d_billboard(Object *obj); void render_misc_model(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, - TextureHeader *tex, u32 flags, u32 texOffset, f32 scale); + TextureHeader *tex, u32 flags, u32 texOffset, f32 scaleY); void racerfx_free(void); void func_80016BC4(Object *obj); s32 ainode_register(Object *obj); diff --git a/src/particles.c b/src/particles.c index c37b79e6..a5267cd8 100644 --- a/src/particles.c +++ b/src/particles.c @@ -2415,7 +2415,7 @@ void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vt } else { model = particle->model; if (model->texture) { - camera_push_model_mtx(dList, mtx, &particle->trans, 1.0f, 0.0f); + cam_push_model_mtx(dList, mtx, &particle->trans, 1.0f, 0.0f); material_set(dList, model->texture, renderFlags, particle->textureFrame << 8); gSPVertexDKR((*dList)++, OS_K0_TO_PHYSICAL(model->vertices), model->vertexCount, 0); gSPPolygon((*dList)++, OS_K0_TO_PHYSICAL(model->triangles), model->triangleCount, TRIN_ENABLE_TEXTURE); diff --git a/src/racer.c b/src/racer.c index 0d4ec679..c825dceb 100644 --- a/src/racer.c +++ b/src/racer.c @@ -122,7 +122,7 @@ UNUSED const char gRacerBackString[] = "Back\n"; f32 gCurrentCourseHeight; Vec3f gCurrentRacerWaterPos; s8 gRacerWaveType; -ObjectCamera *gCameraObject; +Camera *gCameraObject; UNUSED s32 D_8011D50C; ObjectTransform gCurrentRacerTransform; u32 gCurrentRacerInput; @@ -1547,7 +1547,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; - object_transform_to_matrix_2(transformedMtx, &gCurrentRacerTransform); + object_inverse_transform_to_matrix(transformedMtx, &gCurrentRacerTransform); guMtxXFMF(transformedMtx, obj->segment.x_velocity, obj->segment.y_velocity, obj->segment.z_velocity, &racer->lateral_velocity, (f32 *) &racer->unk34, &racer->velocity); if (racer->groundedWheels == 0 && racer->waterTimer == 0) { @@ -1698,7 +1698,7 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) sp24 = 0x400; tempUpdateRate = (s32) updateRate; // Place the camera a bit closer with 2+ players to help visibility. - numViewports = get_viewport_count(); + numViewports = cam_get_viewport_layout(); if (numViewports == 1) { phi_f14 = 200.0f; phi_f18 = 51.0f; @@ -1744,7 +1744,7 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) WRAP(tempAngle, -0x8000, 0x8000); gCameraObject->trans.rotation.x_rotation += (tempAngle * tempUpdateRate) >> 4; } - get_viewport_count(); + cam_get_viewport_layout(); if (racer->velocity < 0.0) { yVel = -(racer->velocity * brakeVar) * 6.0f; if (racer->velocity) {} // Fakematch @@ -1762,16 +1762,16 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) } } if (gRaceStartTimer > 80) { - gCameraObject->unk1C = phi_f14; - gCameraObject->unk20 = phi_f18; + gCameraObject->boomLength = phi_f14; + gCameraObject->cam_unk_20 = phi_f18; } - gCameraObject->unk1C += (phi_f14 - gCameraObject->unk1C) * 0.125; //!@Delta - gCameraObject->unk20 += (phi_f18 - gCameraObject->unk20) * 0.125; //!@Delta + gCameraObject->boomLength += (phi_f14 - gCameraObject->boomLength) * 0.125; //!@Delta + gCameraObject->cam_unk_20 += (phi_f18 - gCameraObject->cam_unk_20) * 0.125; //!@Delta sp34 = sins_f(gCameraObject->trans.rotation.x_rotation - sp24); phi_f18 = coss_f(gCameraObject->trans.rotation.x_rotation - sp24); - phi_f18 = (gCameraObject->unk1C * sp34) + (gCameraObject->unk20 * phi_f18); - xVel = sins_f(-racer->cameraYaw + 0x8000) * gCameraObject->unk1C; - zVel = coss_f(-racer->cameraYaw + 0x8000) * gCameraObject->unk1C; + phi_f18 = (gCameraObject->boomLength * sp34) + (gCameraObject->cam_unk_20 * phi_f18); + xVel = sins_f(-racer->cameraYaw + 0x8000) * gCameraObject->boomLength; + zVel = coss_f(-racer->cameraYaw + 0x8000) * gCameraObject->boomLength; yVel = (1.0 - (gDialogueCameraAngle / 10240.0f)); // Goes between 0-1 xVel -= racer->ox1 * 10.0f * yVel; zVel -= racer->oz1 * 10.0f * yVel; @@ -1804,7 +1804,7 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) segmentIndex = get_level_segment_index_from_position( gCameraObject->trans.x_position, gCameraObject->trans.y_position, gCameraObject->trans.z_position); if (segmentIndex != SEGMENT_NONE) { - gCameraObject->segmentIndex = segmentIndex; + gCameraObject->cameraSegmentID = segmentIndex; } } @@ -1840,7 +1840,7 @@ f32 rotate_racer_in_water(Object *obj, Object_Racer *racer, Vec3f *pos, s8 arg3, gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; - object_transform_to_matrix_2(mtxF, &gCurrentRacerTransform); + object_inverse_transform_to_matrix(mtxF, &gCurrentRacerTransform); guMtxXFMF(mtxF, pos->x, pos->y, pos->z, &pos->x, &pos->y, &pos->z); angle = -((s16) (u16) arctan2_f(pos->x, pos->y)) * velocity; angle = (u16) (angle - (arg5 << 6)) - (u16) racer->x_rotation_vel; @@ -1980,7 +1980,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { if (temp_f16 > 200.0f) { temp_f16 = 200.0f; } - numViewports = get_viewport_count(); + numViewports = cam_get_viewport_layout(); if (numViewports == 1) { baseFloat2 = 180.0f; baseFloat1 = 50.0f; @@ -2044,7 +2044,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { gCameraObject->trans.rotation.x_rotation += ((angle * delta) >> 4); brakeVar = racer->brake; baseSpeed = racer->forwardVel; - switch (gCameraObject->zoom) { + switch (gCameraObject->mode) { case 1: baseFloat2 += 35.0f; break; @@ -2085,17 +2085,17 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { } } if (gRaceStartTimer > 80) { - gCameraObject->unk1C = phi_f14; - gCameraObject->unk20 = baseFloat1; + gCameraObject->boomLength = phi_f14; + gCameraObject->cam_unk_20 = baseFloat1; } - gCameraObject->unk1C += (phi_f14 - gCameraObject->unk1C) * 0.125; - gCameraObject->unk20 += (baseFloat1 - gCameraObject->unk20) * 0.125; + gCameraObject->boomLength += (phi_f14 - gCameraObject->boomLength) * 0.125; + gCameraObject->cam_unk_20 += (baseFloat1 - gCameraObject->cam_unk_20) * 0.125; phi_f14 = sins_f(gCameraObject->trans.rotation.x_rotation - 0x400); xOffset = coss_f(gCameraObject->trans.rotation.x_rotation - 0x400); baseFloat3 = phi_f14; - baseFloat2 = (gCameraObject->unk1C * baseFloat3) - (gCameraObject->unk20 * xOffset); - baseFloat1 = ((gCameraObject->unk1C) * (gCameraObject->unk1C)); - baseFloat1 += (gCameraObject->unk20 * baseFloat3); + baseFloat2 = (gCameraObject->boomLength * baseFloat3) - (gCameraObject->cam_unk_20 * xOffset); + baseFloat1 = ((gCameraObject->boomLength) * (gCameraObject->boomLength)); + baseFloat1 += (gCameraObject->cam_unk_20 * baseFloat3); xOffset = sins_f(0x8000 - racer->cameraYaw) * baseFloat2; zOffset = coss_f(0x8000 - racer->cameraYaw) * baseFloat2; yVel = sins_f(racer->cameraYaw + 0x4000) * 3.0f; @@ -2150,7 +2150,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { segmentIndex = get_level_segment_index_from_position(tempVel, gCameraObject->trans.y_position, gCameraObject->trans.z_position); if (segmentIndex != -1) { - gCameraObject->segmentIndex = segmentIndex; + gCameraObject->cameraSegmentID = segmentIndex; } racer->cameraYaw = gCameraObject->trans.rotation.y_rotation; } @@ -2170,31 +2170,32 @@ void update_camera_loop(f32 updateRateF, Object *obj, Object_Racer *racer) { UNUSED f32 pad; s32 segmentIndex; s32 angle; - f32 zoom; - f32 xVel; - f32 yVel; - f32 zVel; + f32 targetBoomLength; + f32 deltaX; + f32 deltaY; + f32 deltaZ; Matrix mtx; s32 angleDiff; UpdateRate = (s32) updateRateF; - zoom = 120.0f; + targetBoomLength = 120.0f; if (gRaceStartTimer > 60) { - zoom += ((f32) (gRaceStartTimer - 60) * 4.0f); + targetBoomLength += (gRaceStartTimer - 60) * 4.0f; } racer->cameraYaw = 0x8000 - racer->steerVisualRotation; - if (get_viewport_count() == 1) { - zoom = 160.0f; + if (cam_get_viewport_layout() == VIEWPORT_LAYOUT_2_PLAYERS) { + targetBoomLength = 160.0f; } // A little bit of indecisiveness. if (gCameraObject->zoom == ZOOM_FAR) { - zoom += 35.0f; + targetBoomLength += 35.0f; } if (gCameraObject->zoom == ZOOM_FAR) { - zoom -= 35.0f; + targetBoomLength -= 35.0f; } - gCameraObject->unk1C += (zoom - gCameraObject->unk1C) * 0.125; - gCurrentRacerTransform.rotation.y_rotation = -gCameraObject->trans.rotation.y_rotation + 0x8000; + gCameraObject->boomLength += (targetBoomLength - gCameraObject->boomLength) * 0.125; + + gCurrentRacerTransform.rotation.y_rotation = 0x8000 - gCameraObject->trans.rotation.y_rotation; gCurrentRacerTransform.rotation.x_rotation = -gCameraObject->trans.rotation.x_rotation; gCurrentRacerTransform.rotation.z_rotation = 0; gCurrentRacerTransform.x_position = 0.0f; @@ -2202,14 +2203,17 @@ void update_camera_loop(f32 updateRateF, Object *obj, Object_Racer *racer) { gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; object_transform_to_matrix(mtx, &gCurrentRacerTransform); - guMtxXFMF(mtx, 0.0f, 0.0f, gCameraObject->unk1C, &xVel, &yVel, &zVel); - gCameraObject->trans.x_position = obj->segment.trans.x_position + xVel; - gCameraObject->trans.y_position = obj->segment.trans.y_position + yVel; - gCameraObject->trans.z_position = obj->segment.trans.z_position + zVel; - guMtxXFMF(mtx, 0.0f, sins_f(0x800) * gCameraObject->unk1C, 0.0f, &xVel, &yVel, &zVel); - gCameraObject->trans.x_position += xVel; - gCameraObject->trans.y_position += yVel; - gCameraObject->trans.z_position += zVel; + + guMtxXFMF(mtx, 0.0f, 0.0f, gCameraObject->boomLength, &deltaX, &deltaY, &deltaZ); + gCameraObject->trans.x_position = obj->segment.trans.x_position + deltaX; + gCameraObject->trans.y_position = obj->segment.trans.y_position + deltaY; + gCameraObject->trans.z_position = obj->segment.trans.z_position + deltaZ; + + guMtxXFMF(mtx, 0.0f, sins_f(0x800) * gCameraObject->boomLength, 0.0f, &deltaX, &deltaY, &deltaZ); + gCameraObject->trans.x_position += deltaX; + gCameraObject->trans.y_position += deltaY; + gCameraObject->trans.z_position += deltaZ; + angleDiff = (u16) (-obj->segment.trans.rotation.z_rotation); angle = angleDiff - ((u16) gCameraObject->trans.rotation.z_rotation); WRAP(angle, -0x8000, 0x8000); @@ -2222,12 +2226,12 @@ void update_camera_loop(f32 updateRateF, Object *obj, Object_Racer *racer) { segmentIndex = get_level_segment_index_from_position( gCameraObject->trans.x_position, gCameraObject->trans.y_position, gCameraObject->trans.z_position); if (segmentIndex != SEGMENT_NONE) { - gCameraObject->segmentIndex = segmentIndex; + gCameraObject->cameraSegmentID = segmentIndex; } racer->cameraYaw = gCameraObject->trans.rotation.y_rotation; - gCameraObject->trans.x_position += gCameraObject->offsetX; - gCameraObject->trans.y_position += gCameraObject->offsetY; - gCameraObject->trans.z_position += gCameraObject->offsetZ; + gCameraObject->trans.x_position += gCameraObject->x_velocity; + gCameraObject->trans.y_position += gCameraObject->y_velocity; + gCameraObject->trans.z_position += gCameraObject->z_velocity; } /** @@ -2328,7 +2332,7 @@ void obj_init_racer(Object *obj, LevelObjectEntry_Racer *racer) { tempRacer->unk21C = NULL; if (tempRacer->playerIndex != PLAYER_COMPUTER && gTajInteractStatus == TAJ_WANDER) { set_active_camera(player); - gCameraObject = (ObjectCamera *) get_active_camera_segment_no_cutscenes(); + gCameraObject = cam_get_active_camera_no_cutscenes(); gCameraObject->trans.rotation.z_rotation = 0; gCameraObject->trans.rotation.x_rotation = 0x400; gCameraObject->trans.rotation.y_rotation = tempRacer->cameraYaw; @@ -2337,7 +2341,7 @@ void obj_init_racer(Object *obj, LevelObjectEntry_Racer *racer) { gCameraObject->unk3D = 0xFF; gCameraObject->unk3E = 0xFF; gCameraObject->unk3F = 0xFF; - gCameraObject->unk18 = 0.0f; + gCameraObject->cam_unk_18 = 0.0f; update_player_camera(obj, tempRacer, 1.0f); } if (gTajInteractStatus == TAJ_WANDER) { @@ -2395,7 +2399,7 @@ void update_player_racer(Object *obj, s32 updateRate) { s32 i; struct LevelObjectEntryCommon newObject; - gNumViewports = get_viewport_count() + 1; + gNumViewports = cam_get_viewport_layout() + 1; gCurrentSurfaceType = SURFACE_DEFAULT; gRaceStartTimer = get_race_countdown(); updateRateF = updateRate; @@ -2528,7 +2532,7 @@ void update_player_racer(Object *obj, s32 updateRate) { } } set_active_camera(tempRacer->playerIndex); - gCameraObject = (ObjectCamera *) get_active_camera_segment_no_cutscenes(); + gCameraObject = cam_get_active_camera_no_cutscenes(); tempRacer->miscAnimCounter++; //!@Delta gCurrentPlayerIndex = tempRacer->playerIndex; if (tempRacer->raceFinished == TRUE || context == GAMEMODE_MENU) { @@ -2618,7 +2622,7 @@ void update_player_racer(Object *obj, s32 updateRate) { } // Assign a camera to human players. if (gCurrentPlayerIndex != PLAYER_COMPUTER) { - gCameraObject = (ObjectCamera *) get_active_camera_segment_no_cutscenes(); + gCameraObject = cam_get_active_camera_no_cutscenes(); } gRacerWaveCount = func_8002B0F4(obj->segment.object.segmentID, obj->segment.trans.x_position, obj->segment.trans.z_position, &gRacerCurrentWave); @@ -3128,7 +3132,7 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; - object_transform_to_matrix_2(sp60, &gCurrentRacerTransform); + object_inverse_transform_to_matrix(sp60, &gCurrentRacerTransform); guMtxXFMF(sp60, racer->lateral_velocity, 0.0f, racer->velocity, &racerObj->segment.x_velocity, &spBC, &racerObj->segment.z_velocity); } @@ -3184,7 +3188,7 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; - object_transform_to_matrix_2(sp60, &gCurrentRacerTransform); + object_inverse_transform_to_matrix(sp60, &gCurrentRacerTransform); guMtxXFMF(sp60, spB8, 0.0f, spB4, &spAC, &spBC, &spB0); if (racer->unk1D2 != 0) { racer->unk1D2 -= updateRate; @@ -3238,7 +3242,7 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac if (racer->vehicleID < VEHICLE_BOSSES) { update_vehicle_particles(racerObj, updateRate); } - second_racer_camera_update(racerObj, racer, 0, updateRateF); + second_racer_camera_update(racerObj, racer, CAMERA_CAR, updateRateF); if (gNumViewports == 1 && racer->velocity > -3.0 && get_settings()->courseId != ASSET_LEVEL_WIZPIG1) { set_anti_aliasing(TRUE); } @@ -3692,7 +3696,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } else { racer->unk1EE = 0; } - if (get_viewport_count() < THREE_PLAYERS) { + if (cam_get_viewport_layout() < THREE_PLAYERS) { if ((sp60 != 0 && racer->velocity < -2.0) || sp58 != 0 || racer->unk1FB != 0) { if (racer->wheel_surfaces[2] < SURFACE_NONE) { obj->particleEmittersEnabled |= gSurfaceFlagTable[racer->wheel_surfaces[2]]; @@ -4111,7 +4115,7 @@ void racer_spinout_car(Object *obj, Object_Racer *racer, s32 updateRate, f32 upd } angleVel = racer->y_rotation_vel; if (gCurrentPlayerIndex > PLAYER_COMPUTER) { - if (gNumViewports < VIEWPORTS_COUNT_4_PLAYERS) { + if (gNumViewports < VIEWPORT_LAYOUT_4_PLAYERS) { obj->particleEmittersEnabled |= 0x4FC00; } else { if (racer->wheel_surfaces[2] < SURFACE_NONE) { @@ -4325,7 +4329,7 @@ void func_800535C4(Object *obj, Object_Racer *racer) { gCurrentRacerTransform.y_position = 0; gCurrentRacerTransform.z_position = 0; gCurrentRacerTransform.scale = 1; - object_transform_to_matrix_2(mf, &gCurrentRacerTransform); + object_inverse_transform_to_matrix(mf, &gCurrentRacerTransform); guMtxXFMF(mf, 0.0f, -1.0f, 0.0f, &racer->roll, &racer->yaw, &racer->pitch); } @@ -4638,7 +4642,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; - object_transform_to_matrix_2(mtx, &gCurrentRacerTransform); + object_inverse_transform_to_matrix(mtx, &gCurrentRacerTransform); guMtxXFMF(mtx, racer->lateral_velocity, 0.0f, racer->velocity, &obj->segment.x_velocity, &tempVel, &obj->segment.z_velocity); } @@ -4681,7 +4685,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; - object_transform_to_matrix_2(mtx, &gCurrentRacerTransform); + object_inverse_transform_to_matrix(mtx, &gCurrentRacerTransform); guMtxXFMF(mtx, xVel, 0.0f, zVel, &hVel, &tempVel, &yVel); if (racer->unk1D2 != 0) { racer->unk1D2 -= updateRate; @@ -4793,7 +4797,7 @@ void update_car_velocity_ground(Object *obj, Object_Racer *racer, s32 updateRate } else { racer->unk1EE = 0; } - if (get_viewport_count() < 2 && sp38 && racer->velocity < -2.0) { + if (cam_get_viewport_layout() < 2 && sp38 && racer->velocity < -2.0) { if (racer->wheel_surfaces[2] < SURFACE_NONE) { obj->particleEmittersEnabled |= 1 << (racer->wheel_surfaces[2] * 2); } @@ -4957,7 +4961,7 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { if (sp178 > 4.0) { racer->unk1F3 |= 8; if (gCurrentPlayerIndex != PLAYER_COMPUTER) { - gCameraObject->unk30 = 3.0f; + gCameraObject->shakeMagnitude = 3.0f; } racer->unk1D2 = 7; if (racer->playerIndex != PLAYER_COMPUTER) { @@ -5022,7 +5026,7 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { gCurrentRacerTransform.x_position = -racerObj->segment.trans.x_position; gCurrentRacerTransform.y_position = -racerObj->segment.trans.y_position; gCurrentRacerTransform.z_position = -racerObj->segment.trans.z_position; - object_transform_to_matrix_2(sp60, &gCurrentRacerTransform); + object_inverse_transform_to_matrix(sp60, &gCurrentRacerTransform); for (i = 0; i < 4; i++) { guMtxXFMF(sp60, ((f32 *) &racer->unkD8)[i * 3 + 0], ((f32 *) &racer->unkD8)[i * 3 + 1], ((f32 *) &racer->unkD8)[i * 3 + 2], &sp11C[i], &sp108[i], &spF4[i]); @@ -5926,7 +5930,7 @@ void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRateF) { gCameraObject->zoom = ZOOM_MEDIUM; } if (racer->playerIndex != PLAYER_COMPUTER) { - func_80066060(racer->playerIndex, gCameraObject->zoom); + cam_set_zoom(racer->playerIndex, gCameraObject->zoom); } switch (gCameraObject->zoom) { case ZOOM_MEDIUM: @@ -5981,23 +5985,25 @@ void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRateF) { update_camera_finish_race(updateRateF, obj, racer); break; } + dialogueAngle = gDialogueCameraAngle / 10240.0f; // Goes between 0-1 - gCameraObject->offsetX = (((obj->segment.trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - - gCameraObject->trans.x_position) * - dialogueAngle); - gCameraObject->offsetZ = (((obj->segment.trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - - gCameraObject->trans.z_position) * - dialogueAngle); - gCameraObject->offsetY = (((get_npc_pos_y() + 48.5) - gCameraObject->trans.y_position) * dialogueAngle); - gCameraObject->pitchOffset = -gCameraObject->trans.rotation.x_rotation * dialogueAngle; - gCameraObject->trans.x_position += gCameraObject->offsetX; - gCameraObject->trans.y_position += gCameraObject->offsetY + gCameraObject->unk30; - gCameraObject->trans.z_position += gCameraObject->offsetZ; - if (!gRaceStartTimer && !gDialogueCameraAngle) { - gCameraObject->offsetX *= 0.95; - gCameraObject->offsetY *= 0.95; - gCameraObject->offsetZ *= 0.95; + gCameraObject->x_velocity = (((obj->segment.trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - + gCameraObject->trans.x_position) * + dialogueAngle); + gCameraObject->z_velocity = (((obj->segment.trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - + gCameraObject->trans.z_position) * + dialogueAngle); + gCameraObject->y_velocity = (((get_npc_pos_y() + 48.5) - gCameraObject->trans.y_position) * dialogueAngle); + gCameraObject->pitch = -gCameraObject->trans.rotation.x_rotation * dialogueAngle; + gCameraObject->trans.x_position += gCameraObject->x_velocity; + gCameraObject->trans.y_position += gCameraObject->y_velocity + gCameraObject->shakeMagnitude; + gCameraObject->trans.z_position += gCameraObject->z_velocity; + if (gRaceStartTimer == 0 && gDialogueCameraAngle == 0) { + gCameraObject->x_velocity *= 0.95; + gCameraObject->y_velocity *= 0.95; + gCameraObject->z_velocity *= 0.95; } + angle = gDialogueCameraAngle; if (angle > 0x1400) { angle = 0x2800 - gDialogueCameraAngle; @@ -6008,21 +6014,22 @@ void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRateF) { angle = ((angle >> 4) + 4); tempUpdateRateF = updateRateF; if (gRacerDialogueCamera) { - gDialogueCameraAngle += (tempUpdateRateF * angle); + gDialogueCameraAngle += tempUpdateRateF * angle; if (gDialogueCameraAngle > 0x2800) { gDialogueCameraAngle = 0x2800; } } else { - gDialogueCameraAngle -= (tempUpdateRateF * angle); + gDialogueCameraAngle -= tempUpdateRateF * angle; if (gDialogueCameraAngle < 0) { gDialogueCameraAngle = 0; } } gCameraObject->trans.rotation.y_rotation -= gDialogueCameraAngle; - gCameraObject->unk3A -= tempUpdateRateF; - while (gCameraObject->unk3A < 0) { - gCameraObject->unk3A += 5; - gCameraObject->unk30 = -gCameraObject->unk30 * 0.75; + + gCameraObject->shakeTimer -= tempUpdateRateF; + while (gCameraObject->shakeTimer < 0) { + gCameraObject->shakeTimer += 5; + gCameraObject->shakeMagnitude = -gCameraObject->shakeMagnitude * 0.75; } } @@ -6041,9 +6048,9 @@ void second_racer_camera_update(Object *obj, Object_Racer *racer, s32 mode, f32 gCameraObject->mode = mode; update_player_camera(obj, racer, updateRateF); if (gRaceStartTimer == 0 && gTajInteractStatus == TAJ_WANDER) { - gCameraObject->offsetX = xPos - gCameraObject->trans.x_position; - gCameraObject->offsetY = yPos - (gCameraObject->trans.y_position + gCameraObject->unk30); - gCameraObject->offsetZ = zPos - gCameraObject->trans.z_position; + gCameraObject->x_velocity = xPos - gCameraObject->trans.x_position; + gCameraObject->y_velocity = yPos - (gCameraObject->trans.y_position + gCameraObject->shakeMagnitude); + gCameraObject->z_velocity = zPos - gCameraObject->trans.z_position; } } } @@ -6074,7 +6081,7 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { s32 tempAngle; s32 delta = (s32) updateRate; - numViewports = get_viewport_count(); + numViewports = cam_get_viewport_layout(); if (numViewports == 1) { baseDistance = 192.0f; baseAngle = 0x200; @@ -6174,16 +6181,16 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { } } if (gRaceStartTimer > 80) { - gCameraObject->unk1C = baseDistance; - gCameraObject->unk20 = yVel; + gCameraObject->boomLength = baseDistance; + gCameraObject->cam_unk_20 = yVel; } - gCameraObject->unk1C += (baseDistance - gCameraObject->unk1C) * 0.125; - gCameraObject->unk20 += (yVel - gCameraObject->unk20) * 0.125; + gCameraObject->boomLength += (baseDistance - gCameraObject->boomLength) * 0.125; + gCameraObject->cam_unk_20 += (yVel - gCameraObject->cam_unk_20) * 0.125; cosOffset = sins_f(gCameraObject->trans.rotation.x_rotation - baseAngle); sineOffset = coss_f(gCameraObject->trans.rotation.x_rotation - baseAngle); - lateralOffset = gCameraObject->unk1C; - lateralOffset = (lateralOffset * sineOffset) - (gCameraObject->unk20 * cosOffset); - yVel = (gCameraObject->unk1C * cosOffset) + (gCameraObject->unk20 * sineOffset); + lateralOffset = gCameraObject->boomLength; + lateralOffset = (lateralOffset * sineOffset) - (gCameraObject->cam_unk_20 * cosOffset); + yVel = (gCameraObject->boomLength * cosOffset) + (gCameraObject->cam_unk_20 * sineOffset); sineOffset = sins_f(-racer->cameraYaw + 0x8000) * lateralOffset; cosOffset = coss_f(-racer->cameraYaw + 0x8000) * lateralOffset; baseDistance = 0.0f; @@ -6245,7 +6252,7 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { segmentIndex = get_level_segment_index_from_position(lateralOffset, gCameraObject->trans.y_position, gCameraObject->trans.z_position); if (segmentIndex != -1) { - gCameraObject->segmentIndex = segmentIndex; + gCameraObject->cameraSegmentID = segmentIndex; } racer->cameraYaw = gCameraObject->trans.rotation.y_rotation; } @@ -6268,9 +6275,9 @@ void update_camera_finish_challenge(UNUSED f32 updateRate, Object *obj, Object_R if (1) {} // Fakematch gCameraObject->trans.rotation.x_rotation = 0x400; gCameraObject->trans.rotation.z_rotation = 0; - gCameraObject->unk1C = 150.0f; - xOffset = sins_f(0x8000 - gCameraObject->trans.rotation.y_rotation) * gCameraObject->unk1C; - zOffset = coss_f(0x8000 - gCameraObject->trans.rotation.y_rotation) * gCameraObject->unk1C; + gCameraObject->boomLength = 150.0f; + xOffset = sins_f(0x8000 - gCameraObject->trans.rotation.y_rotation) * gCameraObject->boomLength; + zOffset = coss_f(0x8000 - gCameraObject->trans.rotation.y_rotation) * gCameraObject->boomLength; gCameraObject->trans.x_position = obj->segment.trans.x_position + xOffset; temp_f12 = (gCameraObject->trans.y_position - (obj->segment.trans.y_position + 45.0f)) * 0.25; if (temp_f12 < -2.0) { @@ -6283,7 +6290,7 @@ void update_camera_finish_challenge(UNUSED f32 updateRate, Object *obj, Object_R segmentIndex = get_level_segment_index_from_position( gCameraObject->trans.x_position, gCameraObject->trans.y_position, gCameraObject->trans.z_position); if (segmentIndex != SEGMENT_NONE) { - gCameraObject->segmentIndex = segmentIndex; + gCameraObject->cameraSegmentID = segmentIndex; } racer->cameraYaw = gCameraObject->trans.rotation.y_rotation; } @@ -6317,8 +6324,8 @@ void update_camera_finish_race(UNUSED f32 updateRate, Object *obj, Object_Racer gCameraObject->trans.rotation.y_rotation = 0x8000 - atan2s(diffX, diffZ); gCameraObject->trans.rotation.x_rotation = atan2s((s32) diffY, (s32) distance); gCameraObject->trans.rotation.z_rotation = 0; - gCameraObject->segmentIndex = get_level_segment_index_from_position(gCameraObject->trans.x_position, racer->oy1, - gCameraObject->trans.z_position); + gCameraObject->cameraSegmentID = get_level_segment_index_from_position(gCameraObject->trans.x_position, racer->oy1, + gCameraObject->trans.z_position); } /** @@ -6335,8 +6342,8 @@ void update_camera_fixed(f32 updateRate, Object *obj, Object_Racer *racer) { gCameraObject->trans.rotation.y_rotation += ((((-atan2s(diffX, diffZ)) - gCameraObject->trans.rotation.y_rotation) + 0x8000) * updateRateF) >> 4; gCameraObject->trans.rotation.z_rotation -= ((s32) (gCameraObject->trans.rotation.z_rotation * updateRateF)) >> 4; - gCameraObject->segmentIndex = get_level_segment_index_from_position(gCameraObject->trans.x_position, racer->oy1, - gCameraObject->trans.z_position); + gCameraObject->cameraSegmentID = get_level_segment_index_from_position(gCameraObject->trans.x_position, racer->oy1, + gCameraObject->trans.z_position); } /** diff --git a/src/racer.h b/src/racer.h index 788b868f..fc92c734 100644 --- a/src/racer.h +++ b/src/racer.h @@ -131,26 +131,6 @@ typedef enum TajInteraction { #define AI_MIN_STEP 2 #define AI_MAX_STEP 3 -typedef struct ObjectCamera { - /* 0x0014 */ ObjectTransform trans; - /* 0x0018 */ f32 unk18; - /* 0x001C */ f32 unk1C; - /* 0x0020 */ f32 unk20; - /* 0x0024 */ f32 offsetX; - /* 0x0028 */ f32 offsetY; - /* 0x002C */ f32 offsetZ; - /* 0x0030 */ f32 unk30; - /* 0x0034 */ s16 segmentIndex; - /* 0x0036 */ s16 mode; - /* 0x0038 */ s16 pitchOffset; - /* 0x003A */ s8 unk3A; - /* 0x003B */ u8 zoom; - /* 0x003C */ u8 unk3C; - /* 0x003D */ u8 unk3D; - /* 0x003E */ u8 unk3E; - /* 0x003F */ u8 unk3F; -} ObjectCamera; - typedef struct AIBehaviourTable { f32 unk0; f32 unk4; diff --git a/src/thread3_main.c b/src/thread3_main.c index a11081a3..f1f43874 100644 --- a/src/thread3_main.c +++ b/src/thread3_main.c @@ -385,10 +385,10 @@ void load_next_ingame_level(s32 numPlayers, s32 trackID, Vehicle vehicle) { void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicleId) { alloc_displaylist_heap(numberOfPlayers); mempool_free_timer(0); - camera_init(); + cam_init(); load_game_text_table(); load_level(levelId, numberOfPlayers, entranceId, vehicleId, gGameCurrentCutscene); - hud_init(get_viewport_count()); + hud_init(cam_get_viewport_layout()); init_particle_buffers(8, 16, 150, 100, 50, 0); ainode_update(); osSetTime(0); @@ -831,7 +831,7 @@ void load_menu_with_level_background(s32 menuId, s32 levelId, s32 cutsceneId) { sndp_set_group_volume(0, 32767); sndp_set_group_volume(1, 32767); sndp_set_group_volume(2, 32767); - camera_init(); + cam_init(); if (!gIsLoading) { gIsLoading = FALSE; @@ -876,10 +876,10 @@ Vehicle get_level_default_vehicle(void) { */ void load_level_menu(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicleId, s32 cutsceneId) { mempool_free_timer(0); - camera_init(); + cam_init(); load_game_text_table(); load_level(levelId, numberOfPlayers, entranceId, vehicleId, cutsceneId); - hud_init(get_viewport_count()); + hud_init(cam_get_viewport_layout()); init_particle_buffers(4, 4, 110, 48, 32, 0); ainode_update(); osSetTime(0); diff --git a/src/tracks.c b/src/tracks.c index 329ef470..ef59e071 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -70,7 +70,7 @@ MatrixS *gSceneCurrMatrix; Vertex *gSceneCurrVertexList; Triangle *gSceneCurrTriList; -ObjectSegment *gSceneActiveCamera; +Camera *gSceneActiveCamera; s32 gSceneCurrentPlayerID; Object *gSkydomeSegment; @@ -240,7 +240,7 @@ void init_track(u32 geometry, u32 skybox, s32 numberOfPlayers, Vehicle vehicle, func_800B82B4(gCurrentLevelModel, gCurrentLevelHeader2, i); } - set_active_viewports_and_max(numberOfPlayers); + cam_set_layout(numberOfPlayers); spawn_skydome(skybox); D_8011B110 = 0; D_8011B114 = 0x10000; @@ -256,7 +256,7 @@ void init_track(u32 geometry, u32 skybox, s32 numberOfPlayers, Vehicle vehicle, } else { transition_begin(&gFullFadeToBlack); } - set_active_viewports_and_max(gScenePlayerViewports); + cam_set_layout(gScenePlayerViewports); numberOfPlayers = gScenePlayerViewports; gAntiAliasing = FALSE; @@ -304,7 +304,7 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, Triangle **tris, s32 gDisableShadows = FALSE; D_8011B0C0 = 0; gIsNearCurrBBox = FALSE; - numViewports = set_active_viewports_and_max(gScenePlayerViewports); + numViewports = cam_set_layout(gScenePlayerViewports); if (is_game_paused()) { tempUpdateRate = 0; } else { @@ -398,8 +398,8 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, Triangle **tris, s32 weather_update(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, &gSceneCurrTriList, tempUpdateRate); } - lensflare_override(get_active_camera_segment()); - lensflare_render(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, get_active_camera_segment()); + lensflare_override(cam_get_active_camera()); + lensflare_render(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, cam_get_active_camera()); hud_render_player(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, get_racer_object_by_port(gSceneCurrentPlayerID), updateRate); } @@ -425,9 +425,8 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, Triangle **tris, s32 gDPPipeSync(gSceneCurrDisplayList++); initialise_player_viewport_vars(updateRate); weather_clip_planes(-1, -512); - lensflare_override(get_active_camera_segment()); - lensflare_render(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, - get_active_camera_segment()); + lensflare_override(cam_get_active_camera()); + lensflare_render(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, cam_get_active_camera()); set_text_font(FONT_COLOURFUL); if (osTvType == OS_TV_TYPE_PAL) { posX = SCREEN_WIDTH_HALF + 6; @@ -1109,8 +1108,8 @@ s32 func_80027568(void) { if (numRacers == 0) { return FALSE; } - if ((check_if_showing_cutscene_camera() != 0) || (gSceneActiveCamera->object.unk36 >= 5) || - (gSceneActiveCamera->object.unk36 == 3)) { + if ((check_if_showing_cutscene_camera() != 0) || (gSceneActiveCamera->mode >= 5) || + (gSceneActiveCamera->mode == 3)) { return FALSE; } curViewport = get_current_viewport(); @@ -1193,7 +1192,7 @@ void func_800278E8(s32 updateRate) { f32 yDelta; f32 zDelta; f32 xzSqr; - ObjectSegment *segment; + Camera *camera; Object *thisObject; Object **racerGroup; Object *lastObject; @@ -1204,7 +1203,7 @@ void func_800278E8(s32 updateRate) { s32 numRacers; s32 i; s32 cameraId; - Object *camera; + Object *camObj; racerGroup = get_racer_objects(&numRacers); lastRacer = NULL; @@ -1236,46 +1235,46 @@ void func_800278E8(s32 updateRate) { currentRacer = racerFirstPlace; thisObject = objectFirstPlace; } - camera = spectate_object(currentRacer->cameraIndex); + camObj = spectate_object(currentRacer->cameraIndex); if (D_8011B104 != currentRacer->cameraIndex) { D_8011B108 = 0; } else if (D_8011B100 != currentRacer->playerIndex) { D_8011B108 = 180; D_8011B100 = currentRacer->playerIndex; } - if (camera != NULL) { - segment = get_active_camera_segment_no_cutscenes(); - segment->trans.x_position = camera->segment.trans.x_position; - segment->trans.y_position = camera->segment.trans.y_position; - segment->trans.z_position = camera->segment.trans.z_position; - xDelta = segment->trans.x_position - thisObject->segment.trans.x_position; - yDelta = segment->trans.y_position - thisObject->segment.trans.y_position; - zDelta = segment->trans.z_position - thisObject->segment.trans.z_position; + if (camObj != NULL) { + camera = cam_get_active_camera_no_cutscenes(); + camera->trans.x_position = camObj->segment.trans.x_position; + camera->trans.y_position = camObj->segment.trans.y_position; + camera->trans.z_position = camObj->segment.trans.z_position; + xDelta = camera->trans.x_position - thisObject->segment.trans.x_position; + yDelta = camera->trans.y_position - thisObject->segment.trans.y_position; + zDelta = camera->trans.z_position - thisObject->segment.trans.z_position; xzSqr = sqrtf((xDelta * xDelta) + (zDelta * zDelta)); if (D_8011B108 != 0) { - angleDiff = ((s32) (-atan2s(xDelta, zDelta) - segment->trans.rotation.y_rotation) + 0x8000); + angleDiff = ((s32) (-atan2s(xDelta, zDelta) - camera->trans.rotation.y_rotation) + 0x8000); //!@bug Never true, since angleDiff is signed. Should be >=. if (angleDiff > 0x8000) { angleDiff = -(0xFFFF - angleDiff); } - segment->trans.rotation.y_rotation += ((s32) (angleDiff / (16.0f * (D_8011B108 / 180.0f)))) & 0xFFFF; - angleDiff = atan2s(yDelta, xzSqr) - segment->trans.rotation.x_rotation; + camera->trans.rotation.y_rotation += ((s32) (angleDiff / (16.0f * (D_8011B108 / 180.0f)))) & 0xFFFF; + angleDiff = atan2s(yDelta, xzSqr) - camera->trans.rotation.x_rotation; //!@bug Never true, since angleDiff is signed. Should be >=. if (angleDiff > 0x8000) { angleDiff = -(0xFFFF - angleDiff); } - segment->trans.rotation.x_rotation += ((s32) (angleDiff / (16.0f * (D_8011B108 / 180.0f)))) & 0xFFFF; + camera->trans.rotation.x_rotation += ((s32) (angleDiff / (16.0f * (D_8011B108 / 180.0f)))) & 0xFFFF; D_8011B108 -= updateRate; if (D_8011B108 < 0) { D_8011B108 = 0; } } else { - segment->trans.rotation.y_rotation = 0x8000 - atan2s(xDelta, zDelta); - segment->trans.rotation.x_rotation = atan2s(yDelta, xzSqr); + camera->trans.rotation.y_rotation = 0x8000 - atan2s(xDelta, zDelta); + camera->trans.rotation.x_rotation = atan2s(yDelta, xzSqr); } - segment->trans.rotation.z_rotation = 0; - segment->object.cameraSegmentID = get_level_segment_index_from_position( - segment->trans.x_position, currentRacer->oy1, segment->trans.z_position); + camera->trans.rotation.z_rotation = 0; + camera->cameraSegmentID = get_level_segment_index_from_position(camera->trans.x_position, currentRacer->oy1, + camera->trans.z_position); D_8011B104 = currentRacer->cameraIndex; } } @@ -1367,7 +1366,7 @@ void func_80028050(void) { f32 xCos; f32 xSin; // sp10C f32 pad_sp108; - ObjectSegment *objSegment; + Camera *camera; f32 pad_sp100; f32 xPositions[9]; // spDC f32 zPositions[9]; // spB8 @@ -1392,12 +1391,12 @@ void func_80028050(void) { verts = gSceneCurrVertexList; tris = gSceneCurrTriList; - objSegment = get_active_camera_segment(); + camera = cam_get_active_camera(); texHeader = gCurrentLevelHeader2->unkA4; uCoordMask = (texHeader->width << 5) - 1; vCoordMask = (texHeader->height << 5) - 1; - xSin = sins_f(-objSegment->trans.rotation.x); - xCos = coss_f(-objSegment->trans.rotation.x); + xSin = sins_f(-camera->trans.rotation.x); + xCos = coss_f(-camera->trans.rotation.x); scaledXSin = xSin * 1280.0f; scaledXCos = xCos * 1280.0f; @@ -1428,9 +1427,9 @@ void func_80028050(void) { var_a2 = texHeader->height * 16 * gCurrentLevelHeader2->unkA1; var_v0 = - ((s32) (objSegment->trans.x_position * (var_f14 / var_a1)) + (gCurrentLevelHeader2->unkA8 >> 4)) & uCoordMask; + ((s32) (camera->trans.x_position * (var_f14 / var_a1)) + (gCurrentLevelHeader2->unkA8 >> 4)) & uCoordMask; var_v1 = - ((s32) (objSegment->trans.z_position * (var_f14 / var_a2)) + (gCurrentLevelHeader2->unkAA >> 4)) & vCoordMask; + ((s32) (camera->trans.z_position * (var_f14 / var_a2)) + (gCurrentLevelHeader2->unkAA >> 4)) & vCoordMask; var_f14 = var_a1 * xCos; pos.z = var_a1 * xCos; @@ -1495,11 +1494,11 @@ void func_80028050(void) { } rendermode_reset(&gSceneCurrDisplayList); - vertY = objSegment->trans.y_position + 192.0f; + vertY = camera->trans.y_position + 192.0f; for (i = 0; i < 9; i++) { - verts->x = xPositions[i] + objSegment->trans.x_position; + verts->x = xPositions[i] + camera->trans.x_position; verts->y = vertY; - verts->z = zPositions[i] + objSegment->trans.z_position; + verts->z = zPositions[i] + camera->trans.z_position; verts->r = 0xFF; verts->g = 0xFF; verts->b = 0xFF; @@ -1573,7 +1572,7 @@ void draw_gradient_background(void) { y0 = -150; y1 = 150; } - if (get_viewport_count() == TWO_PLAYERS) { + if (cam_get_viewport_layout() == TWO_PLAYERS) { y0 >>= 1; y1 >>= 1; } @@ -1645,12 +1644,12 @@ void draw_gradient_background(void) { * Sets the position to the current camera's position then renders the skydome if set to be visible. */ void render_skydome(void) { - ObjectSegment *cam; + Camera *cam; if (gSkydomeSegment == NULL) { return; } - cam = get_active_camera_segment(); + cam = cam_get_active_camera(); if (gCurrentLevelHeader2->skyDome == 0) { gSkydomeSegment->segment.trans.x_position = cam->trans.x_position; gSkydomeSegment->segment.trans.y_position = cam->trans.y_position; @@ -1675,12 +1674,12 @@ void initialise_player_viewport_vars(s32 updateRate) { s32 segmentIndex; Object_Racer *racer; - gSceneActiveCamera = get_active_camera_segment(); + gSceneActiveCamera = cam_get_active_camera(); viewportID = get_current_viewport(); compute_scene_camera_transform_matrix(); update_envmap_position(gScenePerspectivePos.x / 65536.0f, gScenePerspectivePos.y / 65536.0f, gScenePerspectivePos.z / 65536.0f); - segmentIndex = gSceneActiveCamera->object.cameraSegmentID; + segmentIndex = gSceneActiveCamera->cameraSegmentID; if (segmentIndex > -1 && (segmentIndex < gCurrentLevelModel->numberOfSegments)) { gSceneStartSegment = gCurrentLevelModel->segments[segmentIndex].unk28; } else { @@ -1692,7 +1691,7 @@ void initialise_player_viewport_vars(s32 updateRate) { if (gWaveBlockCount != 0) { func_800B8B8C(); racers = get_racer_objects(&numRacers); - if (gSceneActiveCamera->object.unk36 != 7 && numRacers > 0 && !check_if_showing_cutscene_camera()) { + if (gSceneActiveCamera->mode != CAMERA_FINISH_RACE && numRacers > 0 && !check_if_showing_cutscene_camera()) { i = -1; do { i++; @@ -1784,7 +1783,7 @@ void render_level_geometry_and_objects(void) { visible = 0; } if (obj != NULL && visible == 255 && check_if_in_draw_range(obj) && - (objectsVisible[obj->segment.object.segmentID + 1] || obj->segment.camera.unk34 > 1000.0)) { + (objectsVisible[obj->segment.object.segmentID + 1] || obj->segment.object.unk34 > 1000.0)) { if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) { render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); continue; @@ -2389,7 +2388,7 @@ s32 check_if_in_draw_range(Object *obj) { w = D_8011D0F8[i].w; y = D_8011D0F8[i].y; accum = (x * obj->segment.trans.x_position) + (y * obj->segment.trans.y_position) + - (z * obj->segment.trans.z_position) + w + obj->segment.camera.unk34; + (z * obj->segment.trans.z_position) + w + obj->segment.object.unk34; if (accum < 0.0f) { return FALSE; } @@ -3459,7 +3458,7 @@ void shadow_update(s32 group, s32 waterGroup, s32 updateRate) { gShadowTail = 0; gNewShadowTriCount = 0; gNewShadowVtxCount = 0; - numViewports = get_viewport_count(); + numViewports = cam_get_viewport_layout(); objects = objGetObjList(&objIndex, &objectCount); while (objIndex < objectCount) { obj = objects[objIndex]; @@ -3649,7 +3648,7 @@ void shadow_generate(Object *obj, s32 isWater) { gNewShadowTexture = set_animated_texture_header(obj->waterEffect->texture, obj->waterEffect->textureFrame << 8); gNewShadowY2 = obj->segment.header->shadowTop + yPos; gNewShadowY1 = obj->segment.header->shadowBottom + yPos; - if (gWaveBlockCount == 0 || get_viewport_count() < VIEWPORTS_COUNT_2_PLAYERS) { + if (gWaveBlockCount == 0 || cam_get_viewport_layout() < VIEWPORT_LAYOUT_2_PLAYERS) { D_8011D0C8 = 0; } gNewShadowScale = (obj->waterEffect->scale * character_scale); @@ -4359,7 +4358,7 @@ void obj_loop_fogchanger(Object *obj) { Object_Racer *racer; UNUSED s32 pad2; FogData *fog; - ObjectSegment *camera; + Camera *camera; racers = NULL; fogChanger = (LevelObjectEntry_FogChanger *) obj->segment.level_entry; @@ -4367,7 +4366,7 @@ void obj_loop_fogchanger(Object *obj) { if (check_if_showing_cutscene_camera()) { camera = get_cutscene_camera_segment(); - views = get_viewport_count() + 1; + views = cam_get_viewport_layout() + 1; } else { racers = get_racer_objects(&views); } @@ -4470,7 +4469,7 @@ void slowly_change_fog(s32 fogIdx, s32 red, s32 green, s32 blue, s32 near, s32 f * Updates the stored perspective of the camera, as well as the envmap values derived from it. */ UNUSED void update_perspective_and_envmap(void) { - gSceneActiveCamera = get_active_camera_segment(); + gSceneActiveCamera = cam_get_active_camera(); compute_scene_camera_transform_matrix(); update_envmap_position((f32) gScenePerspectivePos.x / 65536.0f, (f32) gScenePerspectivePos.y / 65536.0f, (f32) gScenePerspectivePos.z / 65536.0f); diff --git a/src/waves.c b/src/waves.c index 74f35f77..25fd1467 100644 --- a/src/waves.c +++ b/src/waves.c @@ -955,7 +955,8 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { wave_load_material(tex1, 1); wave_load_material(tex2, 0); gDPSetCombineMode(gWaveDL++, DKR_CC_UNK14, DKR_CC_UNK15); - if (TEX_FORMAT(tex1->format) == TEX_FORMAT_RGBA32 && get_viewport_count() <= VIEWPORTS_COUNT_1_PLAYER) { + if (TEX_FORMAT(tex1->format) == TEX_FORMAT_RGBA32 && + cam_get_viewport_layout() <= VIEWPORT_LAYOUT_1_PLAYER) { gDPSetOtherMode(gWaveDL++, DKR_OMH_2CYC_BILERP, DKR_OML_COMMON | G_RM_AA_ZB_XLU_INTER2); } else { gDPSetOtherMode(gWaveDL++, DKR_OMH_2CYC_BILERP, DKR_OML_COMMON | G_RM_AA_ZB_OPA_SURF2); @@ -1003,7 +1004,7 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { for (sp11C = 0; sp11C < 2; sp11C++) { spE4.x_position = spE0->unk4; for (var_fp = 0; var_fp < 2; var_fp++) { - camera_push_model_mtx(&gWaveDL, &D_80129FC4, &spE4, 1.0f, 0.0f); + cam_push_model_mtx(&gWaveDL, &D_80129FC4, &spE4, 1.0f, 0.0f); if (sp104 & 0xFF) { numTris = D_80129FC8.unk0 << 1; numVerts = D_80129FC8.unk0 + 1; @@ -1029,7 +1030,7 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { spE4.z_position += D_8012A0A4 * 0.5f; } } else { - camera_push_model_mtx(&gWaveDL, &D_80129FC4, &spE4, 1.0f, 0.0f); + cam_push_model_mtx(&gWaveDL, &D_80129FC4, &spE4, 1.0f, 0.0f); numTris = D_80129FC8.unk0 << 1; numVerts = D_80129FC8.unk0 + 1; var_t0 = ((sp104 & 0xFF) - 1) * numVerts * numVerts; diff --git a/src/weather.c b/src/weather.c index 4a48dc37..8e42c184 100644 --- a/src/weather.c +++ b/src/weather.c @@ -135,7 +135,7 @@ Gfx *gCurrWeatherDisplayList; MatrixS *gCurrWeatherMatrix; Vertex *gCurrWeatherVertexList; Triangle *gCurrWeatherTriList; -ObjectSegment *gWeatherCamera; +Camera *gWeatherCamera; Matrix *gWeatherCameraMatrix; LensFlareData *gLensFlareSet1; LensFlareData *gLensFlareSet2; @@ -402,7 +402,7 @@ void weather_update(Gfx **currDisplayList, MatrixS **currHudMat, Vertex **currHu gCurrWeatherMatrix = *currHudMat; gCurrWeatherVertexList = *currHudVerts; gCurrWeatherTriList = *currHudTris; - gWeatherCamera = get_active_camera_segment(); + gWeatherCamera = cam_get_active_camera(); gWeatherCameraMatrix = get_camera_matrix(); if (gWeatherType != WEATHER_SNOW) { rain_update(updateRate); @@ -525,8 +525,8 @@ void snow_render(void) { if (gSnowVertCount >= 4) { i = 0; mtx = (u32) get_projection_matrix_s16(); - gSPMatrix(gCurrWeatherDisplayList++, OS_PHYSICAL_TO_K0(mtx ^ 0), G_MTX_DKR_INDEX_0); - gDkrInsertMatrix(gCurrWeatherDisplayList++, G_MTX_DKR_INDEX_0, 0); + gSPMatrixDKR(gCurrWeatherDisplayList++, OS_PHYSICAL_TO_K0(mtx ^ 0), G_MTX_DKR_INDEX_0); + gSPSelectMatrixDKR(gCurrWeatherDisplayList++, G_MTX_DKR_INDEX_0); material_set_no_tex_offset(&gCurrWeatherDisplayList, gSnowGfx.texture, RENDER_Z_COMPARE); while (i + gSnowVertOffset < gSnowVertCount) { vtx = (u32) &gSnowVerts[i]; @@ -634,7 +634,7 @@ void lensflare_init(Object *obj) { * Based on face direction, start rendering lens flare effects on screen. * Each element is shifted based on the preset to create the effect of the sun shining in your face. */ -void lensflare_render(Gfx **dList, MatrixS **mats, Vertex **verts, ObjectSegment *segment) { +void lensflare_render(Gfx **dList, MatrixS **mats, Vertex **verts, Camera *camera) { u16 height; f32 mag2; UNUSED s32 pad; @@ -650,7 +650,7 @@ void lensflare_render(Gfx **dList, MatrixS **mats, Vertex **verts, ObjectSegment s32 i; if (gLensFlare != NULL && gLensFlareOff == 0) { - if (get_viewport_count() == 0) { + if (cam_get_viewport_layout() == 0) { lensFlareEntry = &gLensFlare->segment.level_entry->lensFlare; pos[1].x = 0.0f; pos[1].y = 0.0f; @@ -660,9 +660,9 @@ void lensflare_render(Gfx **dList, MatrixS **mats, Vertex **verts, ObjectSegment if (magnitude > 0.0f) { viewport_main(dList, mats); matrix_world_origin(dList, mats); - pos[0].x = (gLensFlarePos.x * 256.0f) + segment->trans.x_position; - pos[0].y = (gLensFlarePos.y * 256.0f) + segment->trans.y_position; - pos[0].z = (gLensFlarePos.z * 256.0f) + segment->trans.z_position; + pos[0].x = (gLensFlarePos.x * 256.0f) + camera->trans.x_position; + pos[0].y = (gLensFlarePos.y * 256.0f) + camera->trans.y_position; + pos[0].z = (gLensFlarePos.z * 256.0f) + camera->trans.z_position; magSquared = magnitude * magnitude; magSquareSquared = magSquared * magSquared; trans.rotation.y_rotation = 0; @@ -766,7 +766,7 @@ void lensflare_override_remove(Object *obj) { * Check if the camera is inside the radius of a lens flare override. * If so, disable the lens flare effect while it remains inside. */ -void lensflare_override(ObjectSegment *cameraSegment) { +void lensflare_override(Camera *cameraSegment) { LevelObjectEntry_LensFlareSwitch *lensFlare; f32 xDiff; f32 zDiff; @@ -856,7 +856,7 @@ void rain_set(s32 lightningFrequency, s32 opacity, f32 time) { */ void rain_fog(void) { s32 a, b; - if (gWeatherType != WEATHER_SNOW && get_viewport_count() == VIEWPORTS_COUNT_1_PLAYER) { + if (gWeatherType != WEATHER_SNOW && cam_get_viewport_layout() == VIEWPORT_LAYOUT_1_PLAYER) { a = ((gLightningFrequency * -38) >> 16) + 1018; b = ((gLightningFrequency * -20) >> 16) + 1023; set_fog(0, a, b, 28, 15, 36); @@ -877,7 +877,7 @@ UNUSED void rain_opacity_set(s32 opacity) { void rain_update(s32 updateRate) { s32 i; - if (get_viewport_count() == VIEWPORTS_COUNT_1_PLAYER && gWeatherType != WEATHER_SNOW) { + if (cam_get_viewport_layout() == VIEWPORT_LAYOUT_1_PLAYER && gWeatherType != WEATHER_SNOW) { if (gRainHiddenTimer > 0) { if (updateRate < gRainHiddenTimer) { gRainHiddenTimer -= updateRate; diff --git a/src/weather.h b/src/weather.h index 40070deb..e30580ba 100644 --- a/src/weather.h +++ b/src/weather.h @@ -4,6 +4,7 @@ #include "types.h" #include "textures_sprites.h" #include "audio.h" +#include "camera.h" typedef enum WeatherType { WEATHER_SNOW, @@ -115,14 +116,14 @@ void weather_update(Gfx **currDisplayList, MatrixS **currHudMat, Vertex **currHu void snow_render(void); void weather_free(void); void weather_set(s32 velX, s32 velY, s32 velZ, s32 intensity, s32 opacity, s32 time); -void lensflare_override(ObjectSegment *cameraSegment); +void lensflare_override(Camera *cameraSegment); void snow_update(s32 updateRate); void snow_init(void); void rain_init(s32 intensity, s32 opacity); void weather_init(void); void snow_vertices(void); void lensflare_init(Object *); -void lensflare_render(Gfx**, MatrixS**, Vertex**, ObjectSegment*); +void lensflare_render(Gfx**, MatrixS**, Vertex**, Camera*); void weather_reset(s32 weatherType, s32 density, s32 velX, s32 velY, s32 velZ, s32 intensity, s32 opacity); #endif diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index 01586b7f..7e1f8232 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -876,16 +876,16 @@ thread1_main = 0x80065E68; thread3_verify_stack = 0x80065F00; // camera.c .text -camera_init = 0x80065F70; -func_80066060 = 0x80066130; -set_viewport_tv_type = 0x80066168; +cam_init = 0x80065F70; +cam_set_zoom = 0x80066130; +enable_pal_viewport_height_adjust = 0x80066168; func_800660C0 = 0x80066190; func_800660D0 = 0x800661A0; -get_current_camera_fov = 0x800661AC; -update_camera_fov = 0x800661BC; -calculate_camera_perspective = 0x80066264; +cam_get_fov = 0x800661AC; +cam_set_fov = 0x800661BC; +cam_reset_fov = 0x80066264; matrix_get_model_s16 = 0x800662D4; -get_viewport_count = 0x800662E0; +cam_get_viewport_layout = 0x800662E0; get_current_viewport = 0x800662F0; camera_init_tracks_menu = 0x80066300; get_distance_to_active_camera = 0x80066418; @@ -893,7 +893,7 @@ camera_reset = 0x800664AC; write_to_object_render_stack = 0x80066558; check_if_showing_cutscene_camera = 0x800665E0; disable_cutscene_camera = 0x800665F0; -set_active_viewports_and_max = 0x800665FC; +cam_set_layout = 0x800665FC; set_active_camera = 0x800666B8; copy_viewports_to_stack = 0x800666E0; camEnableUserView = 0x800668E8; @@ -917,15 +917,15 @@ sprite_anim_off = 0x800685D8; render_sprite_billboard = 0x800685E4; render_ortho_triangle_image = 0x80068CC4; apply_object_shear_matrix = 0x80069078; -camera_push_model_mtx = 0x80069554; +cam_push_model_mtx = 0x80069554; apply_head_turning_matrix = 0x80069860; get_modelmatrix_vector = 0x80069AB4; apply_matrix_from_stack = 0x80069B10; translate_camera_segment = 0x80069B9C; transform_camera_segment = 0x80069C40; rotate_camera_segment = 0x80069D84; -get_active_camera_segment_no_cutscenes = 0x80069DCC; -get_active_camera_segment = 0x80069DF0; +cam_get_active_camera_no_cutscenes = 0x80069DCC; +cam_get_active_camera = 0x80069DF0; get_cutscene_camera_segment = 0x80069E4C; get_projection_matrix_f32 = 0x80069E74; get_projection_matrix_s16 = 0x80069E80; @@ -1066,9 +1066,9 @@ s16_matrix_to_s32_matrix = 0x8006FB20; s16_vec3_mult_by_s32_matrix_full = 0x8006FB58; s16_vec3_mult_by_s32_matrix = 0x8006FC40; object_transform_to_matrix = 0x8006FD10; -f32_matrix_scale = 0x8006FEE4; -f32_matrix_y_scale = 0x8006FF10; -object_transform_to_matrix_2 = 0x8006FF54; +f32_matrix_scale_y_axis = 0x8006FEE4; +f32_matrix_translate_y_axis = 0x8006FF10; +object_inverse_transform_to_matrix = 0x8006FF54; func_80070058 = 0x80070138; f32_matrix_from_rotation_and_scale = 0x80070210; s16_vec3_apply_object_rotation = 0x800702C4; @@ -3935,10 +3935,10 @@ gThread3 = 0x80121380; entrypointThreadStack = 0x80121530; // camera .bss -gCameraSegment = 0x80122530; -gNumberOfViewports = 0x80122750; +gCameras = 0x80122530; +gViewportLayout = 0x80122750; gActiveCameraID = 0x80122754; -gViewportCap = 0x80122758; +gNumCameras = 0x80122758; D_80120CEC = 0x8012275C; gCameraTransform = 0x80122760; gMatrixType = 0x80122778; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index d50f9e13..690edc17 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -874,16 +874,16 @@ thread1_main = 0x80065D98; thread3_verify_stack = 0x80065E30; // camera.c .text -camera_init = 0x80065EA0; -func_80066060 = 0x80066060; -set_viewport_tv_type = 0x80066098; +cam_init = 0x80065EA0; +cam_set_zoom = 0x80066060; +enable_pal_viewport_height_adjust = 0x80066098; func_800660C0 = 0x800660C0; func_800660D0 = 0x800660D0; -get_current_camera_fov = 0x800660DC; -update_camera_fov = 0x800660EC; -calculate_camera_perspective = 0x80066194; +cam_get_fov = 0x800660DC; +cam_set_fov = 0x800660EC; +cam_reset_fov = 0x80066194; matrix_get_model_s16 = 0x80066204; -get_viewport_count = 0x80066210; +cam_get_viewport_layout = 0x80066210; get_current_viewport = 0x80066220; camera_init_tracks_menu = 0x80066230; get_distance_to_active_camera = 0x80066348; @@ -891,7 +891,7 @@ camera_reset = 0x800663DC; write_to_object_render_stack = 0x80066488; check_if_showing_cutscene_camera = 0x80066510; disable_cutscene_camera = 0x80066520; -set_active_viewports_and_max = 0x8006652C; +cam_set_layout = 0x8006652C; set_active_camera = 0x800665E8; copy_viewports_to_stack = 0x80066610; camEnableUserView = 0x80066818; @@ -915,15 +915,15 @@ sprite_anim_off = 0x80068508; render_sprite_billboard = 0x80068514; render_ortho_triangle_image = 0x80068BF4; apply_object_shear_matrix = 0x80068FA8; -camera_push_model_mtx = 0x80069484; +cam_push_model_mtx = 0x80069484; apply_head_turning_matrix = 0x80069790; get_modelmatrix_vector = 0x800699E4; apply_matrix_from_stack = 0x80069A40; translate_camera_segment = 0x80069ACC; transform_camera_segment = 0x80069B70; rotate_camera_segment = 0x80069CB4; -get_active_camera_segment_no_cutscenes = 0x80069CFC; -get_active_camera_segment = 0x80069D20; +cam_get_active_camera_no_cutscenes = 0x80069CFC; +cam_get_active_camera = 0x80069D20; get_cutscene_camera_segment = 0x80069D7C; get_projection_matrix_f32 = 0x80069DA4; get_projection_matrix_s16 = 0x80069DB0; @@ -1064,9 +1064,9 @@ s16_matrix_to_s32_matrix = 0x8006FA40; s16_vec3_mult_by_s32_matrix_full = 0x8006FA78; s16_vec3_mult_by_s32_matrix = 0x8006FB60; object_transform_to_matrix = 0x8006FC30; -f32_matrix_scale = 0x8006FE04; -f32_matrix_y_scale = 0x8006FE30; -object_transform_to_matrix_2 = 0x8006FE74; +f32_matrix_scale_y_axis = 0x8006FE04; +f32_matrix_translate_y_axis = 0x8006FE30; +object_inverse_transform_to_matrix = 0x8006FE74; func_80070058 = 0x80070058; f32_matrix_from_rotation_and_scale = 0x80070130; s16_vec3_apply_object_rotation = 0x800701E4; @@ -3645,10 +3645,10 @@ gThread3Stack = 0x8011D7E8; gThread1 = 0x8011F7F0; gThread3 = 0x8011F9A0; entrypointThreadStack = 0x8011FB50; -gCameraSegment = 0x80120B50; -gNumberOfViewports = 0x80120D70; +gCameras = 0x80120B50; +gViewportLayout = 0x80120D70; gActiveCameraID = 0x80120D74; -gViewportCap = 0x80120D78; +gNumCameras = 0x80120D78; D_80120CEC = 0x80120D7C; gCameraTransform = 0x80120D80; gMatrixType = 0x80120D98; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index d163fbd9..569bedf1 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -820,16 +820,16 @@ alSynStartVoiceParams = 0x80065E78; mainproc = 0x80065F80; thread1_main = 0x80065FD8; thread3_verify_stack = 0x80066070; -camera_init = 0x800660E0; -func_80066060 = 0x800662A0; -set_viewport_tv_type = 0x800662D8; +cam_init = 0x800660E0; +cam_set_zoom = 0x800662A0; +enable_pal_viewport_height_adjust = 0x800662D8; func_800660C0 = 0x80066300; func_800660D0 = 0x80066310; -get_current_camera_fov = 0x8006631C; -update_camera_fov = 0x8006632C; -calculate_camera_perspective = 0x800663D4; +cam_get_fov = 0x8006631C; +cam_set_fov = 0x8006632C; +cam_reset_fov = 0x800663D4; matrix_get_model_s16 = 0x80066444; -get_viewport_count = 0x80066450; +cam_get_viewport_layout = 0x80066450; get_current_viewport = 0x80066460; camera_init_tracks_menu = 0x80066470; get_distance_to_active_camera = 0x80066588; @@ -837,7 +837,7 @@ camera_reset = 0x8006661C; write_to_object_render_stack = 0x800666C8; check_if_showing_cutscene_camera = 0x80066750; disable_cutscene_camera = 0x80066760; -set_active_viewports_and_max = 0x8006676C; +cam_set_layout = 0x8006676C; set_active_camera = 0x80066828; copy_viewports_to_stack = 0x80066850; camEnableUserView = 0x80066A58; @@ -861,15 +861,15 @@ sprite_anim_off = 0x80068748; render_sprite_billboard = 0x80068754; render_ortho_triangle_image = 0x80068E34; apply_object_shear_matrix = 0x800691E8; -camera_push_model_mtx = 0x800696C4; +cam_push_model_mtx = 0x800696C4; apply_head_turning_matrix = 0x800699D0; get_modelmatrix_vector = 0x80069C24; apply_matrix_from_stack = 0x80069C80; translate_camera_segment = 0x80069D0C; transform_camera_segment = 0x80069DB0; rotate_camera_segment = 0x80069EF4; -get_active_camera_segment_no_cutscenes = 0x80069F3C; -get_active_camera_segment = 0x80069F60; +cam_get_active_camera_no_cutscenes = 0x80069F3C; +cam_get_active_camera = 0x80069F60; get_cutscene_camera_segment = 0x80069FBC; get_projection_matrix_f32 = 0x80069FE4; get_projection_matrix_s16 = 0x80069FF0; @@ -1002,9 +1002,9 @@ s16_matrix_to_s32_matrix = 0x8006FC80; s16_vec3_mult_by_s32_matrix_full = 0x8006FCB8; s16_vec3_mult_by_s32_matrix = 0x8006FDA0; object_transform_to_matrix = 0x8006FE70; -f32_matrix_scale = 0x80070044; -f32_matrix_y_scale = 0x80070070; -object_transform_to_matrix_2 = 0x800700B4; +f32_matrix_scale_y_axis = 0x80070044; +f32_matrix_translate_y_axis = 0x80070070; +object_inverse_transform_to_matrix = 0x800700B4; func_80070058 = 0x80070298; f32_matrix_from_rotation_and_scale = 0x80070370; s16_vec3_apply_object_rotation = 0x80070424; @@ -3575,10 +3575,10 @@ gThread3Stack = 0x8011DD68; gThread1 = 0x8011FD70; gThread3 = 0x8011FF20; entrypointThreadStack = 0x801200D0; -gCameraSegment = 0x801210D0; -gNumberOfViewports = 0x801212F0; +gCameras = 0x801210D0; +gViewportLayout = 0x801212F0; gActiveCameraID = 0x801212F4; -gViewportCap = 0x801212F8; +gNumCameras = 0x801212F8; D_80120CEC = 0x801212FC; gCameraTransform = 0x80121300; gMatrixType = 0x80121318; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index aceaf63b..9e77ed46 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -874,16 +874,16 @@ thread1_main = 0x80065D98; thread3_verify_stack = 0x80065E30; // camera.c .text -camera_init = 0x80065EA0; -func_80066060 = 0x80066060; -set_viewport_tv_type = 0x80066098; +cam_init = 0x80065EA0; +cam_set_zoom = 0x80066060; +enable_pal_viewport_height_adjust = 0x80066098; func_800660C0 = 0x800660C0; func_800660D0 = 0x800660D0; -get_current_camera_fov = 0x800660DC; -update_camera_fov = 0x800660EC; -calculate_camera_perspective = 0x80066194; +cam_get_fov = 0x800660DC; +cam_set_fov = 0x800660EC; +cam_reset_fov = 0x80066194; matrix_get_model_s16 = 0x80066204; -get_viewport_count = 0x80066210; +cam_get_viewport_layout = 0x80066210; get_current_viewport = 0x80066220; camera_init_tracks_menu = 0x80066230; get_distance_to_active_camera = 0x80066348; @@ -891,7 +891,7 @@ camera_reset = 0x800663DC; write_to_object_render_stack = 0x80066488; check_if_showing_cutscene_camera = 0x80066510; disable_cutscene_camera = 0x80066520; -set_active_viewports_and_max = 0x8006652C; +cam_set_layout = 0x8006652C; set_active_camera = 0x800665E8; copy_viewports_to_stack = 0x80066610; camEnableUserView = 0x80066818; @@ -915,15 +915,15 @@ sprite_anim_off = 0x80068508; render_sprite_billboard = 0x80068514; render_ortho_triangle_image = 0x80068BF4; apply_object_shear_matrix = 0x80068FA8; -camera_push_model_mtx = 0x80069484; +cam_push_model_mtx = 0x80069484; apply_head_turning_matrix = 0x80069790; get_modelmatrix_vector = 0x800699E4; apply_matrix_from_stack = 0x80069A40; translate_camera_segment = 0x80069ACC; transform_camera_segment = 0x80069B70; rotate_camera_segment = 0x80069CB4; -get_active_camera_segment_no_cutscenes = 0x80069CFC; -get_active_camera_segment = 0x80069D20; +cam_get_active_camera_no_cutscenes = 0x80069CFC; +cam_get_active_camera = 0x80069D20; get_cutscene_camera_segment = 0x80069D7C; get_projection_matrix_f32 = 0x80069DA4; get_projection_matrix_s16 = 0x80069DB0; @@ -1064,9 +1064,9 @@ s16_matrix_to_s32_matrix = 0x8006FA40; s16_vec3_mult_by_s32_matrix_full = 0x8006FA78; s16_vec3_mult_by_s32_matrix = 0x8006FB60; object_transform_to_matrix = 0x8006FC30; -f32_matrix_scale = 0x8006FE04; -f32_matrix_y_scale = 0x8006FE30; -object_transform_to_matrix_2 = 0x8006FE74; +f32_matrix_scale_y_axis = 0x8006FE04; +f32_matrix_translate_y_axis = 0x8006FE30; +object_inverse_transform_to_matrix = 0x8006FE74; func_80070058 = 0x80070058; f32_matrix_from_rotation_and_scale = 0x80070130; s16_vec3_apply_object_rotation = 0x800701E4; @@ -4050,10 +4050,10 @@ gThread3 = 0x8011F910; entrypointThreadStack = 0x8011FAC0; // camera .bss -gCameraSegment = 0x80120AC0; -gNumberOfViewports = 0x80120CE0; +gCameras = 0x80120AC0; +gViewportLayout = 0x80120CE0; gActiveCameraID = 0x80120CE4; -gViewportCap = 0x80120CE8; +gNumCameras = 0x80120CE8; D_80120CEC = 0x80120CEC; gCameraTransform = 0x80120CF0; gMatrixType = 0x80120D08; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index 1a8d0653..c2b47567 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -820,16 +820,16 @@ alSynStartVoiceParams = 0x80065E78; mainproc = 0x80065F80; thread1_main = 0x80065FD8; thread3_verify_stack = 0x80066070; -camera_init = 0x800660E0; -func_80066060 = 0x800662A0; -set_viewport_tv_type = 0x800662D8; +cam_init = 0x800660E0; +cam_set_zoom = 0x800662A0; +enable_pal_viewport_height_adjust = 0x800662D8; func_800660C0 = 0x80066300; func_800660D0 = 0x80066310; -get_current_camera_fov = 0x8006631C; -update_camera_fov = 0x8006632C; -calculate_camera_perspective = 0x800663D4; +cam_get_fov = 0x8006631C; +cam_set_fov = 0x8006632C; +cam_reset_fov = 0x800663D4; matrix_get_model_s16 = 0x80066444; -get_viewport_count = 0x80066450; +cam_get_viewport_layout = 0x80066450; get_current_viewport = 0x80066460; camera_init_tracks_menu = 0x80066470; get_distance_to_active_camera = 0x80066588; @@ -837,7 +837,7 @@ camera_reset = 0x8006661C; write_to_object_render_stack = 0x800666C8; check_if_showing_cutscene_camera = 0x80066750; disable_cutscene_camera = 0x80066760; -set_active_viewports_and_max = 0x8006676C; +cam_set_layout = 0x8006676C; set_active_camera = 0x80066828; copy_viewports_to_stack = 0x80066850; camEnableUserView = 0x80066A58; @@ -861,15 +861,15 @@ sprite_anim_off = 0x80068748; render_sprite_billboard = 0x80068754; render_ortho_triangle_image = 0x80068E34; apply_object_shear_matrix = 0x800691E8; -camera_push_model_mtx = 0x800696C4; +cam_push_model_mtx = 0x800696C4; apply_head_turning_matrix = 0x800699D0; get_modelmatrix_vector = 0x80069C24; apply_matrix_from_stack = 0x80069C80; translate_camera_segment = 0x80069D0C; transform_camera_segment = 0x80069DB0; rotate_camera_segment = 0x80069EF4; -get_active_camera_segment_no_cutscenes = 0x80069F3C; -get_active_camera_segment = 0x80069F60; +cam_get_active_camera_no_cutscenes = 0x80069F3C; +cam_get_active_camera = 0x80069F60; get_cutscene_camera_segment = 0x80069FBC; get_projection_matrix_f32 = 0x80069FE4; get_projection_matrix_s16 = 0x80069FF0; @@ -1002,9 +1002,9 @@ s16_matrix_to_s32_matrix = 0x8006FC80; s16_vec3_mult_by_s32_matrix_full = 0x8006FCB8; s16_vec3_mult_by_s32_matrix = 0x8006FDA0; object_transform_to_matrix = 0x8006FE70; -f32_matrix_scale = 0x80070044; -f32_matrix_y_scale = 0x80070070; -object_transform_to_matrix_2 = 0x800700B4; +f32_matrix_scale_y_axis = 0x80070044; +f32_matrix_translate_y_axis = 0x80070070; +object_inverse_transform_to_matrix = 0x800700B4; func_80070058 = 0x80070298; f32_matrix_from_rotation_and_scale = 0x80070370; s16_vec3_apply_object_rotation = 0x80070424; @@ -3571,10 +3571,10 @@ gThread3Stack = 0x8011DCD8; gThread1 = 0x8011FCE0; gThread3 = 0x8011FE90; entrypointThreadStack = 0x80120040; -gCameraSegment = 0x80121040; -gNumberOfViewports = 0x80121260; +gCameras = 0x80121040; +gViewportLayout = 0x80121260; gActiveCameraID = 0x80121264; -gViewportCap = 0x80121268; +gNumCameras = 0x80121268; D_80120CEC = 0x8012126C; gCameraTransform = 0x80121270; gMatrixType = 0x80121288;