Update to latest runtime and RT64, switch actor API to use ActorMarkers instead

This commit is contained in:
Mr-Wiseguy
2025-08-23 02:42:23 -04:00
parent 07998cb006
commit 212374cdba
15 changed files with 178 additions and 472 deletions
+1 -3
View File
@@ -13,14 +13,12 @@ manual_funcs = [
]
[patches]
stubs = [
]
renamed = [
"wmemcpy"
]
ignored = [
stubs = [
# Boot segment libultra duplicates
"boot___ll_div",
"boot___ll_lshift",
+1 -1
View File
@@ -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;
+91 -350
View File
@@ -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);
}
+5 -5
View File
@@ -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
+1
View File
@@ -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
+21
View File
@@ -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;
}
+1
View File
@@ -32,3 +32,4 @@ __udivdi3_recomp = 0x8F00006C;
__umoddi3_recomp = 0x8F000070;
strlen_recomp = 0x8F000074;
osVirtualToPhysical_recomp = 0x8F000078;
osPiStartDma_recomp = 0x8F00007C;
+1
View File
@@ -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;
+2 -2
View File
@@ -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
+34 -38
View File
@@ -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);
}
+1 -1
View File
@@ -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).
-38
View File
@@ -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);
+17 -32
View File
@@ -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();
}