diff --git a/banjo.us.rev0.toml b/banjo.us.rev0.toml index 5467751..17e4893 100644 --- a/banjo.us.rev0.toml +++ b/banjo.us.rev0.toml @@ -13,14 +13,12 @@ manual_funcs = [ ] [patches] -stubs = [ -] renamed = [ "wmemcpy" ] -ignored = [ +stubs = [ # Boot segment libultra duplicates "boot___ll_div", "boot___ll_lshift", diff --git a/include/banjo_render.h b/include/banjo_render.h index b73b48b..36cd718 100644 --- a/include/banjo_render.h +++ b/include/banjo_render.h @@ -27,7 +27,7 @@ namespace banjo { void enable_instant_present() override; void send_dl(const OSTask *task) override; - void update_screen(uint32_t vi_origin) override; + void update_screen() override; void shutdown() override; uint32_t get_display_framerate() const override; float get_resolution_scale() const override; diff --git a/lib/N64ModernRuntime b/lib/N64ModernRuntime index c5e268a..df7e820 160000 --- a/lib/N64ModernRuntime +++ b/lib/N64ModernRuntime @@ -1 +1 @@ -Subproject commit c5e268aa0f71cf06a10a001da981dc3e02e7dff0 +Subproject commit df7e820d8c55e4fcb4616c210cbb2c01b25cd48c diff --git a/lib/rt64 b/lib/rt64 index cf75b17..090d68f 160000 --- a/lib/rt64 +++ b/lib/rt64 @@ -1 +1 @@ -Subproject commit cf75b17fc263a45269d5b9449eaa0dadcb918528 +Subproject commit 090d68f4c4e9a8bac9ce789b87598610b97160f6 diff --git a/patches/actor_patches.c b/patches/actor_patches.c index 27a7c85..5c90005 100644 --- a/patches/actor_patches.c +++ b/patches/actor_patches.c @@ -5,375 +5,116 @@ #include "mem_funcs.h" #include "bk_api.h" -extern ActorArray *suBaddieActorArray; -extern Actor *suLastBaddie; +// Array of handles for ActorMarker instances. +// Normally the game only has at most 0xE0 ActorMarker instances, but this is larger to account for mods increasing +// the ActorMarker count. +u32 marker_handles[0x1000]; -void func_803255FC(Actor *this); -void func_8032B5C0(ActorMarker *arg0, ActorMarker *arg1, struct5Cs *arg2); -s32 func_80326C18(void); -void func_8032FFD4(ActorMarker *this, s32 arg1); -void marker_setModelId(ActorMarker *this, enum asset_e modelIndex); -s32 func_80306DDC(s32 *position); -s32 func_80307258(f32 arg0[3], s32 arg1, s32 arg2); -struct5Bs *func_8034A2C8(void); -void func_8033F738(ActorMarker *arg0); -void func_8034BFF8(ActorMarker *marker); -Struct83s *func_803406B0(void); +extern ActorMarker *D_8036E7C8; +extern u8 D_80383428[0x1C]; +void func_8032F3D4(s32 arg0[3], ActorMarker *marker, s32 arg2); +ActorMarker * func_80332A60(void); -// @recomp Patched to create extension data for the actor. -RECOMP_PATCH Actor *actor_new(s32 position[3], s32 yaw, ActorInfo* actorInfo, u32 flags){ - ActorAnimationInfo * sp54; +// @recomp Patched to reset all extended marker data. +RECOMP_PATCH void func_803329AC(void){ s32 i; - f32 sp44[3]; - if(suBaddieActorArray == NULL){ - // @recomp Reset actor data when suBaddieActorArray is initially allocated. - recomp_clear_all_actor_data(); - suBaddieActorArray = (ActorArray *)malloc(sizeof(ActorArray) + 20*sizeof(Actor)); - suBaddieActorArray->cnt = 0; - suBaddieActorArray->max_cnt = 20; + D_8036E7C8 = (ActorMarker *)malloc(0xE0*sizeof(ActorMarker)); + + for( i = 0; i < 0x1C; i++){ + D_80383428[i] = 0; } - - if(suBaddieActorArray->cnt + 1 > suBaddieActorArray->max_cnt){ - suBaddieActorArray->max_cnt = suBaddieActorArray->cnt + 5; - suBaddieActorArray = (ActorArray *)realloc(suBaddieActorArray, sizeof(ActorArray) + suBaddieActorArray->max_cnt*sizeof(Actor)); + + for(i =0; i<0xE0; i++){ + D_8036E7C8[i].unk5C = 0; } - ++suBaddieActorArray->cnt; - suLastBaddie = &suBaddieActorArray->data[suBaddieActorArray->cnt - 1]; - - suLastBaddie->actor_info = actorInfo; - suLastBaddie->unk10_25 = 0; - suLastBaddie->unk10_18 = 0; - suLastBaddie->state = actorInfo->startAnimation; - suLastBaddie->position_x = (f32)position[0]; - suLastBaddie->position_y = (f32)position[1]; - suLastBaddie->position_z = (f32)position[2]; - suLastBaddie->unkF4_8 = 0; - suLastBaddie->yaw = (f32) yaw; - suLastBaddie->yaw_ideal = (f32) yaw; - suLastBaddie->pitch = 0.0f; - suLastBaddie->roll = 0.0f; - suLastBaddie->unk6C = 0.0f; - suLastBaddie->actor_specific_1_f = 0.0f; - suLastBaddie->unk10_12 = 0; - suLastBaddie->unk38_0 = 0; - suLastBaddie->unk38_31 = 0; - suLastBaddie->unk58_0 = 1; - suLastBaddie->unk40 = 0; - suLastBaddie->unk44_31 = 0; - suLastBaddie->despawn_flag = 0; - suLastBaddie->unk44_14 = -1; - suLastBaddie->unk48 = 0.0f; - suLastBaddie->unk4C = 100.0f; - suLastBaddie->unk10_1 = 1; - suLastBaddie->unkF4_30 = 0; - suLastBaddie->unkF4_29 = 0; - suLastBaddie->scale = 1.0f; - suLastBaddie->unk124_7 = 0; - suLastBaddie->unk124_6 = 1; - suLastBaddie->modelCacheIndex = actorInfo->actorId; - suLastBaddie->unk44_2 = func_80326C18(); - suLastBaddie->marker = marker_init(position, actorInfo->draw_func, (asset_getFlag(actorInfo->modelId) == 1) ? 0 : 1, actorInfo->markerId, (flags & 0x400) ? 1 : 0); - suLastBaddie->marker->unk3E_0 = 1; - suLastBaddie->unk138_28 = 1; - suLastBaddie->unk10_3 = -1; - suLastBaddie->unk10_4 = 0; - suLastBaddie->unk10_8 = 0; - suLastBaddie->unk10_7 = 0; - suLastBaddie->unk10_6 = 0; - suLastBaddie->unk54 = 0.0f; - suLastBaddie->anctrl_asset_id = 0; - suLastBaddie->unk5C = 0.0f; - suLastBaddie->unkF4_31 = 0; - suLastBaddie->unk138_30 = 0; - suLastBaddie->unk138_3 = 0; - suLastBaddie->unk38_21 = 0; - suLastBaddie->unk38_13 = 0; - suLastBaddie->unk78_22 = 0; - suLastBaddie->unk78_31 = 0; - suLastBaddie->unk74 = 0.0f; - suLastBaddie->unk70 = 0.0f; - suLastBaddie->unkF4_24 = 0; - suLastBaddie->unk140 = 0.0f; - suLastBaddie->unk144 = 0.0f; - suLastBaddie->unk44_1 = 0; - suLastBaddie->unk44_0 = 0; - suLastBaddie->initialized = FALSE; - suLastBaddie->volatile_initialized = FALSE; - suLastBaddie->lifetime_value = 0.0f; - suLastBaddie->is_bundle = FALSE; - suLastBaddie->unk104 = NULL; - suLastBaddie->unk100 = NULL; - suLastBaddie->unk158[0] = NULL; - suLastBaddie->unk158[1] = NULL; - suLastBaddie->unk78_13 = 0; - suLastBaddie->unk124_31 = 0; - suLastBaddie->unkF4_20 = 0; - suLastBaddie->sound_timer = 0.0f; - func_8032FFD4(suLastBaddie->marker, suBaddieActorArray->cnt - 1); - marker_setModelId(suLastBaddie->marker, actorInfo->modelId); - marker_setActorUpdateFunc(suLastBaddie->marker, actorInfo->update_func); - marker_setActorUpdate2Func(suLastBaddie->marker, actorInfo->update2_func); - ml_vec3f_clear(suLastBaddie->unk1C); - ml_vec3f_clear(suLastBaddie->velocity); - ml_vec3f_clear(suLastBaddie->spawn_position); - suLastBaddie->stored_anctrl_index = 0; - suLastBaddie->unk58_2 = 1; - suLastBaddie->stored_anctrl_playbackType_ = 0; - suLastBaddie->stored_anctrl_forwards = 0; - suLastBaddie->stored_anctrl_smoothTransistion = 0; - suLastBaddie->stored_anctrl_duration = 0.0f; - suLastBaddie->stored_anctrl_timer = 0.0f; - suLastBaddie->unk138_19 = 0; - suLastBaddie->stored_anctrl_subrangeMin = 0.0f; - suLastBaddie->stored_anctrl_subrangeMax = 1.0f; - suLastBaddie->unkF4_22 = 0; - suLastBaddie->unk58_1 = 0; - suLastBaddie->unk138_29 = 0; - suLastBaddie->unk18 = actorInfo->animations; - suLastBaddie->anctrl = NULL; - suLastBaddie->stored_anctrl_timer = 0.0f; - suLastBaddie->unk130 = 0; - suLastBaddie->unk124_5 = 0; - suLastBaddie->unk124_3 = 0; - suLastBaddie->unk138_9 = 0; - suLastBaddie->unk138_8 = 0; - suLastBaddie->unk138_25 = 0; - suLastBaddie->unk16C_3 = 0; - suLastBaddie->unk16C_2 = 0; - suLastBaddie->unk16C_1 = 0; - suLastBaddie->unk16C_0 = 0; - suLastBaddie->unk17C_31 = 0; - suLastBaddie->unk14C[0] = NULL; - suLastBaddie->unk14C[1] = NULL; - suLastBaddie->unk138_27 = 0; - suLastBaddie->has_met_before = FALSE; - suLastBaddie->unk138_23 = 0; - suLastBaddie->unk138_22 = 0; - suLastBaddie->unk138_21 = 0; - suLastBaddie->unk138_20 = 0; - suLastBaddie->unk174 = 0.0f; - suLastBaddie->unk178 = 0.0f; - if( actorInfo->animations){ - sp54 = &suLastBaddie->unk18[suLastBaddie->state]; - if(sp54->index != 0){ - suLastBaddie->anctrl = anctrl_new(0); - anctrl_reset(suLastBaddie->anctrl); - anctrl_setIndex(suLastBaddie->anctrl, sp54->index); - anctrl_setDuration(suLastBaddie->anctrl, sp54->duration); - anctrl_start(suLastBaddie->anctrl, "subaddie.c", 0x4A5); - } - }//L80327BA8 - suLastBaddie->unk124_11 = 0; - suLastBaddie->alpha_124_19 = 0xff; - suLastBaddie->depth_mode = MODEL_RENDER_DEPTH_FULL; - suLastBaddie->unk124_0 = suLastBaddie->unk138_31 = 1; - for(i = 0; i < 0x10; i++){ - ((s32 *)suLastBaddie->unk7C)[i] = 0; - } - for(i = 0; i < 0x0C; i++){ - ((s32 *)suLastBaddie->unkBC)[i] = 0; - } - if(flags & ACTOR_FLAG_UNKNOWN_0){ - suLastBaddie->unk10_25 = func_80306DDC(position) + 1; - if(suLastBaddie->unk10_25 == 0){ - suLastBaddie->unk10_25 = 0; - }else{ - sp44[0] = (f32)position[0]; - sp44[1] = (f32)position[1]; - sp44[2] = (f32)position[2]; - suLastBaddie->unk10_18 = func_80307258(sp44, suLastBaddie->unk10_25 - 1, 0) + 1; - } - }//L80327D30 - - if(flags & ACTOR_FLAG_UNKNOWN_2){ - suLastBaddie->unk10_1 = 0; - } - - if(flags & ACTOR_FLAG_UNKNOWN_3){ - suLastBaddie->unkF4_30 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_1){ - suLastBaddie->marker->unk44 = (struct5Bs*)1; - } - else if(flags & ACTOR_FLAG_UNKNOWN_6){ - suLastBaddie->marker->unk44 = func_8034A2C8(); - } - - if(flags & ACTOR_FLAG_UNKNOWN_12){ - func_8033F738(suLastBaddie->marker); - func_8034BFF8(suLastBaddie->marker); - } - - suLastBaddie->unk148 = 0; - if(flags & ACTOR_FLAG_UNKNOWN_11){ - suLastBaddie->unk148 = skeletalAnim_new(); - } - - if(flags & ACTOR_FLAG_UNKNOWN_14){ - suLastBaddie->marker->unk50 = (s32)func_803406B0(); - } - - if(flags & ACTOR_FLAG_UNKNOWN_4){ - suLastBaddie->unk124_31 = -1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_7){ - suLastBaddie->unkF4_22 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_19){ - suLastBaddie->unk58_1 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_8){ - suLastBaddie->unk130 = func_803255FC; - } - - if(flags & ACTOR_FLAG_UNKNOWN_9){ - suLastBaddie->marker->unk40_21 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_15){ - suLastBaddie->marker->unk40_20 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_17){ - suLastBaddie->marker->unk40_22 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_22){ - suLastBaddie->marker->unk40_19 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_16){ - suLastBaddie->unk138_9 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_18){ - suLastBaddie->unk138_8 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_21){ - suLastBaddie->unk138_25 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_23){ - suLastBaddie->unk16C_3 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_24){ - suLastBaddie->unk16C_2 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_25){ - suLastBaddie->unk16C_1 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_26){ - suLastBaddie->unk17C_31 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_13){ - suLastBaddie->unk138_29 = 1; - } - - if(flags & ACTOR_FLAG_UNKNOWN_20){ - suLastBaddie->unk58_2 = 0; - } - - suLastBaddie->unk154 = 0x005e0000; - suLastBaddie->marker->unk54 = (void (*)(struct actorMarker_s *, struct actorMarker_s *, u16 *))func_8032B5C0; - - - for(i = 0; i < 3; ++i){ - suLastBaddie->unk164[i] = 0x63; - } - - suLastBaddie->unk170 = -10.0f; - suLastBaddie->unk138_7 = 0; - suLastBaddie->unk3C = flags; - - // @recomp Allocate extension data for this actor and place it in padding. - suLastBaddie->pad17C_30 = recomp_create_actor_data(actorInfo->actorId) & 0x7FFFFFFFU; - - return suLastBaddie; + // @recomp Reset all actor data. + recomp_clear_all_actor_data(); } -void func_8032BB88(Actor *this, s32 arg1, s32 arg2); -void func_8033E7CC(ActorMarker *arg0); -void func_8034A2A8(struct5Bs *this); -void func_8034BF54(ActorMarker *marker); -void func_8033F784(ActorMarker *arg0); -void func_80340690(Struct83s *self); -void func_8032ACA8(Actor *arg0); +// @recomp Patched to create extension data for the marker. +RECOMP_PATCH ActorMarker * marker_init(s32 *pos, MarkerDrawFunc draw_func, int arg2, int marker_id, int arg4){ + ActorMarker * marker = func_80332A60(); + marker->propPtr = NULL; + marker->cubePtr = NULL; + marker->drawFunc = draw_func; + marker->id = marker_id; + marker->unk40_23 = arg4; + func_8032F3D4(pos, marker, arg2); + marker->actrArrayIdx = 0; + marker->unk14_10 = 0; + marker->modelId = 0; + marker->unk3E_1 = 0; + marker->unk14_22 = 0; + marker->unk14_21 = 0; + marker->yaw = 0; + marker->pitch = 0; + marker->roll = 0; + marker->unk2C_2 = 0; + marker->unk2C_1 = 0; + marker->collidable = TRUE; + marker->unk3E_0 = 0; + marker->unk40_22 = 0; + marker->unk40_19 = 0; + marker->unk40_21 = 0; + marker->collisionFunc = NULL; + marker->collision2Func = NULL; + marker->dieFunc = NULL; + marker->unk54 = NULL; + marker->unk58 = 0; + marker->unk18 = 0; + marker->actorUpdateFunc = NULL; + marker->actorFreeFunc = NULL; + marker->unk28 = 0; + marker->actorUpdate2Func = NULL; + marker->unk38[0] = 0; + marker->unk38[1] = 0; + marker->unk38[2] = 0; + marker->unk44 = 0; + marker->unk20 = 0; + marker->unk50 = 0; + marker->unk48 = 0; + marker->unk4C = 0; + marker->unk40_20 = 0; + marker->unk40_31 = 0; -// @recomp Patched to destroy the extended actor data. -RECOMP_PATCH void func_80325FE8(Actor *this) { - ActorMarker *marker; - u8 temp_v0; + // @recomp Set the marker's handle. + u32 index = marker - D_8036E7C8; + marker_handles[index] = recomp_create_actor_data(marker_id); - // @recomp Destroy the extended actor data. - recomp_destroy_actor_data(this->pad17C_30); - - marker = this->marker; - marker->id = 0; - if (this->anctrl != NULL) { - anctrl_free(this->anctrl); - } - temp_v0 = this->unk44_31; - if (temp_v0 != 0) { - sfxsource_freeSfxsourceByIndex(temp_v0); - } - this->anctrl = NULL; - this->unk44_31 = 0; - - if (this->unk138_7 != 0) { - func_8032BB88(this, -1, 8000); - this->unk138_7 = 0; - } - if (marker->actorFreeFunc != NULL) { - marker->actorFreeFunc(this); - marker->actorFreeFunc = NULL; - } - if ((s32)marker->unk44 < 0) { - func_8033E7CC(marker); - func_8034A2A8(marker->unk44); - marker->unk44 = 0; - } - if (marker->unk4C != 0) { - func_8034BF54(this->marker); - marker->unk4C = 0; - } - if (marker->unk48 != 0) { - func_8033F784(marker); - marker->unk48 = 0; - } - if (this->unk148 != NULL) { - skeletalAnim_free(this->unk148); - this->unk148 = NULL; - } - if (marker->unk50 != 0) { - func_80340690((Struct83s *)marker->unk50); - marker->unk50 = 0; - } - func_8032ACA8(this); + return marker; } -RECOMP_EXPORT ActorExtensionId bkrecomp_extend_actor(enum actor_e type, u32 size) { +// @recomp Patched to destroy the marker's extended data. +RECOMP_PATCH void func_80332B2C(ActorMarker * arg0){ + static s32 D_8036E804[8] = {(u8)~(1 << 7), (u8)~(1 << 6), (u8)~(1 << 5), (u8)~(1 << 4), (u8)~(1 << 3), (u8)~(1 << 2), (u8)~(1 << 1), (u8)~(1 << 0)}; + + s32 index = (arg0 - D_8036E7C8); + arg0->unk5C = 0; + D_80383428[index >> 3] = D_80383428[index >> 3] & D_8036E804[index & 7]; + + // @recomp Delete the handle for this marker. + recomp_destroy_actor_data(marker_handles[index]); + marker_handles[index] = 0; +} + +RECOMP_EXPORT MarkerExtensionId bkrecomp_extend_marker(enum marker_e type, u32 size) { return recomp_register_actor_extension(type, size); } -RECOMP_EXPORT ActorExtensionId bkrecomp_extend_actor_all(u32 size) { +RECOMP_EXPORT MarkerExtensionId bkrecomp_extend_marker_all(u32 size) { return recomp_register_actor_extension_generic(size); } -RECOMP_EXPORT void* bkrecomp_get_extended_actor_data(Actor* actor, ActorExtensionId extension) { - return recomp_get_actor_data(actor->pad17C_30, extension, actor->actor_info->actorId); +RECOMP_EXPORT void* bkrecomp_get_extended_marker_data(ActorMarker* marker, MarkerExtensionId extension) { + s32 index = (marker - D_8036E7C8); + u32 handle = marker_handles[index]; + return recomp_get_actor_data(handle, extension, marker->id); } -RECOMP_EXPORT u32 bkrecomp_get_actor_spawn_index(Actor* actor) { - return recomp_get_actor_spawn_index(actor->pad17C_30); +RECOMP_EXPORT u32 bkrecomp_get_marker_spawn_index(ActorMarker* marker) { + s32 index = (marker - D_8036E7C8); + u32 handle = marker_handles[index]; + return recomp_get_actor_spawn_index(handle); } diff --git a/patches/bk_api.h b/patches/bk_api.h index 2f06fb6..4ddfc82 100644 --- a/patches/bk_api.h +++ b/patches/bk_api.h @@ -5,12 +5,12 @@ #include "enums.h" #include "prop.h" -typedef u32 ActorExtensionId; +typedef u32 MarkerExtensionId; -ActorExtensionId bkrecomp_extend_actor(enum actor_e type, u32 size); -ActorExtensionId bkrecomp_extend_actor_all(u32 size); +MarkerExtensionId bkrecomp_extend_marker(enum marker_e type, u32 size); +MarkerExtensionId bkrecomp_extend_marker_all(u32 size); -void* bkrecomp_get_extended_actor_data(Actor* actor, ActorExtensionId extension); -u32 bkrecomp_get_actor_spawn_index(Actor* actor); +void* bkrecomp_get_extended_marker_data(ActorMarker* marker, MarkerExtensionId extension); +u32 bkrecomp_get_marker_spawn_index(ActorMarker* marker); #endif diff --git a/patches/patches.h b/patches/patches.h index 23862b1..9d3aa98 100644 --- a/patches/patches.h +++ b/patches/patches.h @@ -28,6 +28,7 @@ void osWriteBackDCacheAll(void); #define strchr strchr_recomp #define strlen strlen_recomp #define osVirtualToPhysical osVirtualToPhysical_recomp +#define osPiStartDma osPiStartDma_recomp #include "ultra64.h" #pragma GCC diagnostic push diff --git a/patches/required_patches.c b/patches/required_patches.c new file mode 100644 index 0000000..75c5cff --- /dev/null +++ b/patches/required_patches.c @@ -0,0 +1,21 @@ +#include "patches.h" + +// @recomp Patched to just use a normal DMA. +RECOMP_PATCH s32 boot_osPiRawStartDma(s32 direction, u32 devAddr, void *dramAddr, u32 size) { + OSMesgQueue mq; + OSMesg buffer; + OSIoMesg io; + osCreateMesgQueue(&mq, &buffer, 1); + + // Complete the DMA synchronously (the game immediately waits until it's done anyways) + osPiStartDma(&io, OS_MESG_PRI_HIGH, direction, devAddr, dramAddr, size, &mq); + osRecvMesg(&mq, NULL, OS_MESG_BLOCK); + + return 0; +} + +// @recomp Patched to not read hardware registers. +RECOMP_PATCH s32 boot_osPiGetStatus() { + // PI not busy + return 0; +} diff --git a/patches/syms.ld b/patches/syms.ld index 2fc76a3..ea24ce2 100644 --- a/patches/syms.ld +++ b/patches/syms.ld @@ -32,3 +32,4 @@ __udivdi3_recomp = 0x8F00006C; __umoddi3_recomp = 0x8F000070; strlen_recomp = 0x8F000074; osVirtualToPhysical_recomp = 0x8F000078; +osPiStartDma_recomp = 0x8F00007C; diff --git a/patches/title_screen_patches.c b/patches/title_screen_patches.c index 04e3b51..6a42129 100644 --- a/patches/title_screen_patches.c +++ b/patches/title_screen_patches.c @@ -21,6 +21,7 @@ extern Struct_core2_9B180_0 D_8036DE00[]; void func_80322318(Struct_core2_9B180_0*); int map_get(void); +// @recomp Patched to always allow skipping the intro sequence. RECOMP_PATCH void func_80322490(void) { Struct_core2_9B180_0 *i_ptr; diff --git a/patches/transform_ids.h b/patches/transform_ids.h index 3c0503c..a6d0e88 100644 --- a/patches/transform_ids.h +++ b/patches/transform_ids.h @@ -1,8 +1,8 @@ #ifndef __TRANSFORM_IDS_H__ #define __TRANSFORM_IDS_H__ -#define ACTOR_TRANSFORM_ID_COUNT 256 // Number of transform IDs for each actor. +#define MARKER_TRANSFORM_ID_COUNT 256 // Number of transform IDs for each ActorMarker. #define BANJO_TRANSFORM_ID_START 0x01000000 -#define ACTOR_TRANSFORM_ID_START (BANJO_TRANSFORM_ID_START + ACTOR_TRANSFORM_ID_COUNT) +#define MARKER_TRANSFORM_ID_START (BANJO_TRANSFORM_ID_START + MARKER_TRANSFORM_ID_COUNT) #endif diff --git a/patches/transform_tagging.c b/patches/transform_tagging.c index d2c6b62..1a3b905 100644 --- a/patches/transform_tagging.c +++ b/patches/transform_tagging.c @@ -74,7 +74,7 @@ void ml_vec3f_copy(f32 dst[3], f32 src[3]); extern Vp sViewportStack[]; extern s32 sViewportStackIndex; -// @recomp Patched to set up an inverse view matrix for better transform interpolation. +// @recomp Patched to specify the view matrix for better transform interpolation. RECOMP_PATCH void viewport_setRenderPerspectiveMatrix(Gfx **gfx, Mtx **mtx, f32 near, f32 far) { u16 perspNorm; @@ -102,11 +102,11 @@ RECOMP_PATCH void viewport_setRenderPerspectiveMatrix(Gfx **gfx, Mtx **mtx, f32 guTranslate(*mtx, 0.0f, 0.0f, 0.0f); gSPMatrix((*gfx)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - // @recomp Create an inverse matrix for the viewport translation and provide it as the inverse view matrix to counteract the camera translation. - MtxF* invView = (MtxF*)*mtx; + // @recomp Create an isolated view matrix for the viewport translation and provide it as the view matrix to counteract the camera translation. + MtxF* view = (MtxF*)*mtx; (*mtx)++; - guTranslateF(invView->m, -sViewportPosition[0], -sViewportPosition[1], -sViewportPosition[2]); - gEXSetInvViewMatrixFloat((*gfx)++, invView->m); + guTranslateF(view->m, sViewportPosition[0], sViewportPosition[1], sViewportPosition[2]); + gEXSetViewMatrixFloat((*gfx)++, view->m); } float identity_matrix[4][4] = { @@ -116,7 +116,7 @@ float identity_matrix[4][4] = { { 0.0f, 0.0f, 0.0f, 1.0f } }; -// @recomp Patched to set up an identity inverse view matrix to prevent bleeding the perspective projection's inverse view matrix. +// @recomp Patched to set up an identity view matrix to prevent bleeding the perspective projection's view matrix. RECOMP_PATCH void viewport_setRenderViewportAndOrthoMatrix(Gfx **gfx, Mtx **mtx) { gSPViewport((*gfx)++, &sViewportStack[sViewportStackIndex]); @@ -126,8 +126,8 @@ RECOMP_PATCH void viewport_setRenderViewportAndOrthoMatrix(Gfx **gfx, Mtx **mtx) guTranslate(*mtx, 0.0f, 0.0f, 0.0f); gSPMatrix((*gfx)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - // @recomp Set an identity inverse view matrix. - gEXSetInvViewMatrixFloat((*gfx)++, identity_matrix); + // @recomp Set an identity view matrix. + gEXSetViewMatrixFloat((*gfx)++, identity_matrix); } typedef void (*GeoListFunc)(Gfx **, Mtx **, void *); @@ -162,9 +162,9 @@ void func_802ED52C(BKModelUnk20List *arg0, f32 arg1[3], f32 arg2); void func_802E6BD0(BKModelUnk28List *arg0, BKVertexList *arg1, AnimMtxList *mtx_list); void assetCache_free(void *arg0); -Actor* cur_drawn_actor = NULL; -u32 cur_drawn_actor_spawn_index = 0; -u32 cur_drawn_actor_transform_id = 0; +ActorMarker* cur_drawn_marker = NULL; +u32 cur_drawn_marker_spawn_index = 0; +u32 cur_drawn_marker_transform_id = 0; // @recomp Patched to set the current transform ID to banjo's when drawing the player. RECOMP_PATCH void player_draw(Gfx **gfx, Mtx **mtx, Vtx **vtx) { @@ -172,12 +172,12 @@ RECOMP_PATCH void player_draw(Gfx **gfx, Mtx **mtx, Vtx **vtx) { eggShatter_draw(gfx, mtx, vtx); // @recomp Set the current transform ID to banjo's. - cur_drawn_actor_transform_id = BANJO_TRANSFORM_ID_START; + cur_drawn_marker_transform_id = BANJO_TRANSFORM_ID_START; baModel_draw(gfx, mtx, vtx); // @recomp Clear the current transform ID. - cur_drawn_actor_transform_id = 0; + cur_drawn_marker_transform_id = 0; } } @@ -187,13 +187,17 @@ RECOMP_PATCH void __marker_draw(ActorMarker *this, Gfx **gfx, Mtx **mtx, Vtx **v u32 draw_dist; f32 draw_dist_f; f32 percentage; - if(!this->unk3E_0){ - // @recomp Set the current drawn actor to null, as this marker has no actor. - cur_drawn_actor = NULL; - cur_drawn_actor_spawn_index = 0; - cur_drawn_actor_transform_id = 0; + // @recomp Set the current drawn marker. + cur_drawn_marker = this; + cur_drawn_marker_spawn_index = bkrecomp_get_marker_spawn_index(this); + cur_drawn_marker_transform_id = MARKER_TRANSFORM_ID_START + cur_drawn_marker_spawn_index * MARKER_TRANSFORM_ID_COUNT; + if(!this->unk3E_0){ this->drawFunc(this, gfx, mtx, vtx); + // @recomp Set the current drawn marker to null after drawing. + cur_drawn_marker = NULL; + cur_drawn_marker_spawn_index = 0; + cur_drawn_marker_transform_id = 0; return; } actor = marker_getActor(this); @@ -214,29 +218,21 @@ RECOMP_PATCH void __marker_draw(ActorMarker *this, Gfx **gfx, Mtx **mtx, Vtx **v percentage = 1.0f; } func_8033A280(percentage); - - // @recomp Set the current drawn actor. - cur_drawn_actor = actor; - cur_drawn_actor_spawn_index = bkrecomp_get_actor_spawn_index(actor); - cur_drawn_actor_transform_id = ACTOR_TRANSFORM_ID_START + cur_drawn_actor_spawn_index * ACTOR_TRANSFORM_ID_COUNT; - // printf("Drawing actor %02X\n", actor->actor_info->actorId); - this->drawFunc(this, gfx, mtx, vtx); - - // @recomp Clear the current drawn actor after drawing. - cur_drawn_actor = NULL; - cur_drawn_actor_spawn_index = 0; - cur_drawn_actor_transform_id = 0; + // @recomp Set the current drawn marker to null after drawing. + cur_drawn_marker = NULL; + cur_drawn_marker_spawn_index = 0; + cur_drawn_marker_transform_id = 0; }//L8032D300 func_8033A244(30000.0f); func_8033A280(1.0f); } #define gEXMatrixGroupSimpleNormal(cmd, id, push, proj, edit) \ - gEXMatrixGroup(cmd, id, G_EX_INTERPOLATE_SIMPLE, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit) + gEXMatrixGroup(cmd, id, G_EX_INTERPOLATE_SIMPLE, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit, G_EX_ASPECT_AUTO) #define gEXMatrixGroupSimpleVerts(cmd, id, push, proj, edit) \ - gEXMatrixGroup(cmd, id, G_EX_INTERPOLATE_SIMPLE, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit) + gEXMatrixGroup(cmd, id, G_EX_INTERPOLATE_SIMPLE, push, proj, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, edit, G_EX_ASPECT_AUTO) // @recomp Patched to set matrix groups when processing geo bones. RECOMP_PATCH void func_803387F8(Gfx **gfx, Mtx **mtx, void *arg2){ @@ -248,10 +244,10 @@ RECOMP_PATCH void func_803387F8(Gfx **gfx, Mtx **mtx, void *arg2){ mlMtxApply(*mtx); gSPMatrix((*gfx)++, (*mtx)++, G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - if (cur_drawn_actor_transform_id != 0) { + if (cur_drawn_marker_transform_id != 0) { // @recomp Tag the matrix. // gEXMatrixGroupSimpleNormal((*gfx)++, cur_drawn_actor_transform_id + cmd->unk9, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); - gEXMatrixGroupSimpleVerts((*gfx)++, cur_drawn_actor_transform_id + cmd->unk9, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); + gEXMatrixGroupSimpleVerts((*gfx)++, cur_drawn_marker_transform_id + cmd->unk9, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); // gEXMatrixGroupDecomposedNormal((*gfx)++, cur_drawn_actor_transform_id + cmd->unk9 + 1, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } } @@ -264,7 +260,7 @@ RECOMP_PATCH void func_803387F8(Gfx **gfx, Mtx **mtx, void *arg2){ if(D_80370990){ gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW); - if (cur_drawn_actor_transform_id != 0) { + if (cur_drawn_marker_transform_id != 0) { // @recomp Pop the matrix group. gEXPopMatrixGroup((*gfx)++, G_MTX_MODELVIEW); } @@ -625,8 +621,8 @@ RECOMP_PATCH BKModelBin *modelRender_draw(Gfx **gfx, Mtx **mtx, f32 position[3], gSPMatrix((*gfx)++, (*mtx)++, G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW); // @recomp Create a matrix group if a transform id is set. - if (cur_drawn_actor_transform_id != 0) { - gEXMatrixGroupDecomposedVerts((*gfx)++, cur_drawn_actor_transform_id, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); + if (cur_drawn_marker_transform_id != 0) { + gEXMatrixGroupDecomposedVerts((*gfx)++, cur_drawn_marker_transform_id, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW); } modelRenderScale = scale; @@ -643,7 +639,7 @@ RECOMP_PATCH BKModelBin *modelRender_draw(Gfx **gfx, Mtx **mtx, f32 position[3], gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW); // @recomp Pop the matrix group if a transform id is set. - if (cur_drawn_actor_transform_id != 0) { + if (cur_drawn_marker_transform_id != 0) { gEXPopMatrixGroup((*gfx)++, G_MTX_MODELVIEW); } diff --git a/src/game/recomp_actor_api.cpp b/src/game/recomp_actor_api.cpp index 8cbe5a6..759b9a0 100644 --- a/src/game/recomp_actor_api.cpp +++ b/src/game/recomp_actor_api.cpp @@ -79,7 +79,7 @@ extern "C" void recomp_register_actor_extension(uint8_t* rdram, recomp_context* } if (actor_data_sizes.size() <= actor_type) { - actor_data_sizes.resize(2 * actor_type); + actor_data_sizes.resize(actor_type + 1); } // Increase the actor type's extension data size by the provided size (rounded up to a multiple of 16). diff --git a/src/game/recomp_api.cpp b/src/game/recomp_api.cpp index 0469127..182ac0c 100644 --- a/src/game/recomp_api.cpp +++ b/src/game/recomp_api.cpp @@ -180,21 +180,6 @@ extern "C" void recomp_set_right_analog_suppressed(uint8_t* rdram, recomp_contex recomp::set_right_analog_suppressed(suppressed); } -// Function with typo in decomp -extern "C" void osWriteBackDCacheAll(uint8_t* rdram, recomp_context* ctx) {} - -extern "C" void boot_osPiRawStartDma(uint8_t* rdram, recomp_context* ctx) { - uint32_t direction = ctx->r4; - uint32_t device_address = ctx->r5; - gpr rdram_address = ctx->r6; - uint32_t size = ctx->r7; - - assert(direction == 0); // Only reads - - // Complete the DMA synchronously (the game immediately waits until it's done anyways) - recomp::do_rom_read(rdram, rdram_address, device_address + recomp::rom_base, size); -} - constexpr uint32_t k1_to_phys(uint32_t addr) { return addr & 0x1FFFFFFF; } @@ -215,33 +200,10 @@ extern "C" void osPiReadIo_recomp(RDRAM_ARG recomp_context * ctx) { ctx->r2 = 0; } -extern "C" void boot_osPiGetStatus(uint8_t* rdram, recomp_context* ctx) { - // PI not busy - ctx->r2 = 0; -} - extern "C" void osPfsInit_recomp(uint8_t * rdram, recomp_context* ctx) { ctx->r2 = 11; // PFS_ERR_DEVICE } -extern "C" void __ll_lshift_recomp(uint8_t * rdram, recomp_context * ctx) { - uint64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu); - uint64_t b = (ctx->r6 << 32) | ((ctx->r7 << 0) & 0xFFFFFFFFu); - uint64_t ret = a << b; - - ctx->r2 = (int32_t)(ret >> 32); - ctx->r3 = (int32_t)(ret >> 0); -} - -extern "C" void __ull_rshift_recomp(uint8_t * rdram, recomp_context * ctx) { - uint64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu); - uint64_t b = (ctx->r6 << 32) | ((ctx->r7 << 0) & 0xFFFFFFFFu); - uint64_t ret = a >> b; - - ctx->r2 = (int32_t)(ret >> 32); - ctx->r3 = (int32_t)(ret >> 0); -} - // u32 rom_addr, void *ram_addr, u32 size extern "C" void recomp_load_overlays_by_rom(uint8_t* rdram, recomp_context* ctx) { u32 rom_addr = _arg<0, u32>(rdram, ctx); diff --git a/src/main/rt64_render_context.cpp b/src/main/rt64_render_context.cpp index 1dcf2d5..0831f78 100644 --- a/src/main/rt64_render_context.cpp +++ b/src/main/rt64_render_context.cpp @@ -56,21 +56,6 @@ unsigned int DPC_BUFBUSY_REG = 0; unsigned int DPC_PIPEBUSY_REG = 0; unsigned int DPC_TMEM_REG = 0; -unsigned int VI_STATUS_REG = 0; -unsigned int VI_ORIGIN_REG = 0; -unsigned int VI_WIDTH_REG = 0; -unsigned int VI_INTR_REG = 0; -unsigned int VI_V_CURRENT_LINE_REG = 0; -unsigned int VI_TIMING_REG = 0; -unsigned int VI_V_SYNC_REG = 0; -unsigned int VI_H_SYNC_REG = 0; -unsigned int VI_LEAP_REG = 0; -unsigned int VI_H_START_REG = 0; -unsigned int VI_V_START_REG = 0; -unsigned int VI_V_BURST_REG = 0; -unsigned int VI_X_SCALE_REG = 0; -unsigned int VI_Y_SCALE_REG = 0; - void dummy_check_interrupts() {} RT64::UserConfiguration::Antialiasing compute_max_supported_aa(RT64::RenderSampleCounts bits) { @@ -250,20 +235,22 @@ banjo::renderer::RT64Context::RT64Context(uint8_t* rdram, ultramodern::renderer: appCore.DPC_PIPEBUSY_REG = &DPC_PIPEBUSY_REG; appCore.DPC_TMEM_REG = &DPC_TMEM_REG; - appCore.VI_STATUS_REG = &VI_STATUS_REG; - appCore.VI_ORIGIN_REG = &VI_ORIGIN_REG; - appCore.VI_WIDTH_REG = &VI_WIDTH_REG; - appCore.VI_INTR_REG = &VI_INTR_REG; - appCore.VI_V_CURRENT_LINE_REG = &VI_V_CURRENT_LINE_REG; - appCore.VI_TIMING_REG = &VI_TIMING_REG; - appCore.VI_V_SYNC_REG = &VI_V_SYNC_REG; - appCore.VI_H_SYNC_REG = &VI_H_SYNC_REG; - appCore.VI_LEAP_REG = &VI_LEAP_REG; - appCore.VI_H_START_REG = &VI_H_START_REG; - appCore.VI_V_START_REG = &VI_V_START_REG; - appCore.VI_V_BURST_REG = &VI_V_BURST_REG; - appCore.VI_X_SCALE_REG = &VI_X_SCALE_REG; - appCore.VI_Y_SCALE_REG = &VI_Y_SCALE_REG; + ultramodern::renderer::ViRegs* vi_regs = ultramodern::renderer::get_vi_regs(); + + appCore.VI_STATUS_REG = &vi_regs->VI_STATUS_REG; + appCore.VI_ORIGIN_REG = &vi_regs->VI_ORIGIN_REG; + appCore.VI_WIDTH_REG = &vi_regs->VI_WIDTH_REG; + appCore.VI_INTR_REG = &vi_regs->VI_INTR_REG; + appCore.VI_V_CURRENT_LINE_REG = &vi_regs->VI_V_CURRENT_LINE_REG; + appCore.VI_TIMING_REG = &vi_regs->VI_TIMING_REG; + appCore.VI_V_SYNC_REG = &vi_regs->VI_V_SYNC_REG; + appCore.VI_H_SYNC_REG = &vi_regs->VI_H_SYNC_REG; + appCore.VI_LEAP_REG = &vi_regs->VI_LEAP_REG; + appCore.VI_H_START_REG = &vi_regs->VI_H_START_REG; + appCore.VI_V_START_REG = &vi_regs->VI_V_START_REG; + appCore.VI_V_BURST_REG = &vi_regs->VI_V_BURST_REG; + appCore.VI_X_SCALE_REG = &vi_regs->VI_X_SCALE_REG; + appCore.VI_Y_SCALE_REG = &vi_regs->VI_Y_SCALE_REG; // Set up the RT64 application configuration fields. RT64::ApplicationConfiguration appConfig; @@ -338,9 +325,7 @@ void banjo::renderer::RT64Context::send_dl(const OSTask* task) { app->processDisplayLists(app->core.RDRAM, task->t.data_ptr & 0x3FFFFFF, 0, true); } -void banjo::renderer::RT64Context::update_screen(uint32_t vi_origin) { - VI_ORIGIN_REG = vi_origin; - +void banjo::renderer::RT64Context::update_screen() { app->updateScreen(); }