Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/engine/HM_Intro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ void HarbourMastersIntro::HM_TickIntro() {
gFadeModeSelection = FADE_MODE_LOGO;
}

find_and_set_tile_size((uintptr_t) ((void*)mat_water_water1), 0, _water);
find_and_set_tile_size((uintptr_t) ((void*)mat_water_water2), _water, 0);;
scroll_texture_interpolated(scroll, (const char*)mat_water_water1, 0, 1);
scroll_texture_interpolated(scroll2, (const char*)mat_water_water2, 1, 0);
}

void HarbourMastersIntro::Bob(FVector& pos, IRotator& rot, f32 bobAmp, f32 bobSpeed, f32 tiltAmp, f32 tiltSpeed, f32 rollAmp, f32 rollSpeed) {
Expand Down
2 changes: 2 additions & 0 deletions src/engine/HM_Intro.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ class HarbourMastersIntro {
void HM_TickIntro();
void HM_DrawIntro();
private:
Gfx scroll[3];
Gfx scroll2[3];
void Setup();
void Sync();
void Bob(FVector& pos, IRotator& rot, f32 bobAmp, f32 bobSpeed, f32 tiltAmp, f32 tiltSpeed, f32 rollAmp, f32 rollSpeed);
Expand Down
10 changes: 1 addition & 9 deletions src/engine/tracks/BansheeBoardwalk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ void BansheeBoardwalk::Load() {
parse_track_displaylists((TrackSections*) LOAD_ASSET_RAW(d_course_banshee_boardwalk_track_sections));
func_80295C6C();
find_vtx_and_set_colours((Gfx*) d_course_banshee_boardwalk_packed_dl_878, 128, 0, 0, 0);
scroll_texture_interpolated(scroll, d_course_banshee_boardwalk_dl_B278, 0, 2);
}

void BansheeBoardwalk::BeginPlay() {
Expand Down Expand Up @@ -307,15 +308,6 @@ void BansheeBoardwalk::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*) (d_course_banshee_boardwalk_dl_B308));
}

void BansheeBoardwalk::ScrollingTextures() {
D_802B87BC++;

if (D_802B87BC >= 0x100) {
D_802B87BC = 0;
}
find_and_set_tile_size((uintptr_t) LOAD_ASSET_RAW(d_course_banshee_boardwalk_dl_B278), 0, D_802B87BC);
}

void BansheeBoardwalk::Waypoints(Player* player, int8_t playerId) {
s16 waypoint = gNearestPathPointByPlayerId[playerId];
if ((waypoint >= 0x12C) && (waypoint < 0x13C)) {
Expand Down
3 changes: 2 additions & 1 deletion src/engine/tracks/BansheeBoardwalk.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@ class BansheeBoardwalk : public Track {
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
virtual void Draw(ScreenContext*) override;
virtual void DrawCredits() override;
virtual void ScrollingTextures() override;
virtual void Waypoints(Player*, int8_t) override;
virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
private:
Gfx scroll[3];
};
29 changes: 9 additions & 20 deletions src/engine/tracks/DKJungle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,15 @@ void DKJungle::Load() {
func_80295C6C();
// d_course_dks_jungle_parkway_packed_dl_3FA8
find_vtx_and_set_colours((Gfx*) d_course_dks_jungle_parkway_packed_dl_3FA8, 120, 255, 255, 255);

// These can share the same writableGfx because they use the same settings
scroll_texture_interpolated(scroll, d_course_dks_jungle_parkway_packed_dl_3DD0, 0, 4);
scroll_texture_interpolated(scroll, d_course_dks_jungle_parkway_packed_dl_3E40, 0, 4);
scroll_texture_interpolated(scroll, d_course_dks_jungle_parkway_packed_dl_3EB0, 0, 4);
scroll_texture_interpolated(scroll, d_course_dks_jungle_parkway_packed_dl_3F30, 0, 4);
scroll_texture_interpolated(scroll, d_course_dks_jungle_parkway_packed_dl_36A8, 0, 4);

scroll_texture_interpolated(scroll2, d_course_dks_jungle_parkway_packed_dl_9880, 0, -40);
}

f32 DKJungle::GetWaterLevel(FVector pos, Collision* collision) {
Expand Down Expand Up @@ -302,26 +311,6 @@ void DKJungle::Waypoints(Player* player, int8_t playerId) {
}

void DKJungle::ScrollingTextures() {
D_802B87BC += 2;
if (D_802B87BC > 255) {
D_802B87BC = 0;
}
// d_course_dks_jungle_parkway_packed_dl_3DD0
find_and_set_tile_size((uintptr_t) (Gfx*) d_course_dks_jungle_parkway_packed_dl_3DD0, 0, D_802B87BC);
// d_course_dks_jungle_parkway_packed_dl_3E40
find_and_set_tile_size((uintptr_t) (Gfx*) d_course_dks_jungle_parkway_packed_dl_3E40, 0, D_802B87BC);
// d_course_dks_jungle_parkway_packed_dl_3EB0
find_and_set_tile_size((uintptr_t) (Gfx*) d_course_dks_jungle_parkway_packed_dl_3EB0, 0, D_802B87BC);
// d_course_dks_jungle_parkway_packed_dl_3F30
find_and_set_tile_size((uintptr_t) (Gfx*) d_course_dks_jungle_parkway_packed_dl_3F30, 0, D_802B87BC);
// d_course_dks_jungle_parkway_packed_dl_36A8
find_and_set_tile_size((uintptr_t) (Gfx*) d_course_dks_jungle_parkway_packed_dl_36A8, 0, D_802B87BC);
D_802B87C4 -= 20;
if (D_802B87C4 < 0) {
D_802B87C4 = 0xFF;
}
// d_course_dks_jungle_parkway_packed_dl_9880
find_and_set_tile_size((uintptr_t) (Gfx*) d_course_dks_jungle_parkway_packed_dl_9880, 0, D_802B87C4);
evaluate_collision_players_palm_trees();
}

Expand Down
3 changes: 3 additions & 0 deletions src/engine/tracks/DKJungle.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,7 @@ class DKJungle : public Track {
virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
private:
Gfx scroll[3];
Gfx scroll2[3];
};
24 changes: 8 additions & 16 deletions src/engine/tracks/KoopaTroopaBeach.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,12 @@ void KoopaTroopaBeach::Load() {
find_vtx_and_set_colours((Gfx*) d_course_koopa_troopa_beach_packed_dl_A540, 150, 255, 255, 255);
find_vtx_and_set_colours((Gfx*) d_course_koopa_troopa_beach_packed_dl_9E70, 150, 255, 255, 255);
find_vtx_and_set_colours((Gfx*) d_course_koopa_troopa_beach_packed_dl_358, 150, 255, 255, 255);

// waterfall animation
scroll_texture_interpolated(scroll, d_course_koopa_troopa_beach_packed_dl_9D58, 0, 18);
scroll_texture_interpolated(scroll2, d_course_koopa_troopa_beach_packed_dl_9CD0, 0, 6);
// Waterfall bubbling effect?
scroll_texture_interpolated(scroll3, d_course_koopa_troopa_beach_packed_dl_2E8, 0, 0);
}

void KoopaTroopaBeach::BeginPlay() {
Expand Down Expand Up @@ -261,29 +267,15 @@ void KoopaTroopaBeach::ScrollingTextures() {
// clang-format on
Props.WaterLevel += gWaterVelocity;

D_802B87BC += 9;
if (D_802B87BC > 255) {
D_802B87BC = 0;
}
D_802B87C4 += 3;
if (D_802B87C4 > 255) {
D_802B87C4 = 0;
}
// waterfall animation
// d_course_koopa_troopa_beach_packed_dl_9D58
find_and_set_tile_size((uintptr_t) d_course_koopa_troopa_beach_packed_dl_9D58, 0, D_802B87BC);
// d_course_koopa_troopa_beach_packed_dl_9CD0
find_and_set_tile_size((uintptr_t) d_course_koopa_troopa_beach_packed_dl_9CD0, 0, D_802B87C4);
D_802B87CC = random_int(300) / 40;
if (D_802B87C8 < 0) {
D_802B87C8 = random_int(300) / 40;
} else {
D_802B87C8 = -(random_int(300) / 40);
}
// Waterfall bubbling effect? (unused)
// d_course_koopa_troopa_beach_packed_dl_2E8
find_and_set_tile_size((uintptr_t) d_course_koopa_troopa_beach_packed_dl_2E8, D_802B87C8, D_802B87CC);

// Waterfall bubbling effect?
scroll3[0].words.w1 = ((uintptr_t) (uint32_t) D_802B87C8 << 32) | (uint32_t)D_802B87CC;
}

void KoopaTroopaBeach::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
Expand Down
4 changes: 4 additions & 0 deletions src/engine/tracks/KoopaTroopaBeach.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,8 @@ class KoopaTroopaBeach : public Track {
virtual void ScrollingTextures() override;
virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
virtual void Destroy() override;
private:
Gfx scroll[3];
Gfx scroll2[3];
Gfx scroll3[3];
};
12 changes: 2 additions & 10 deletions src/engine/tracks/RoyalRaceway.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ void RoyalRaceway::Load() {
}
parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_royal_raceway_addr));
func_80295C6C();
scroll_texture_interpolated(scroll, d_course_royal_raceway_packed_dl_A6A8, 0, -40);
scroll_texture_interpolated(scroll2, d_course_royal_raceway_packed_dl_A648, 0, -40);
}

void RoyalRaceway::BeginPlay() {
Expand Down Expand Up @@ -241,13 +243,3 @@ void RoyalRaceway::Waypoints(Player* player, int8_t playerId) {
}
}

void RoyalRaceway::ScrollingTextures() {
D_802B87BC -= 20;
if (D_802B87BC < 0) {
D_802B87BC = 0xFF;
}
// d_course_royal_raceway_packed_dl_A6A8
find_and_set_tile_size((uintptr_t) d_course_royal_raceway_packed_dl_A6A8, 0, D_802B87BC);
// d_course_royal_raceway_packed_dl_A648
find_and_set_tile_size((uintptr_t) d_course_royal_raceway_packed_dl_A648, 0, D_802B87BC);
}
4 changes: 3 additions & 1 deletion src/engine/tracks/RoyalRaceway.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class RoyalRaceway : public Track {
virtual void SetStaffGhost() override;
virtual void Draw(ScreenContext*) override;
virtual void DrawCredits() override;
virtual void ScrollingTextures() override;
virtual void Waypoints(Player* player, int8_t playerId) override;
private:
Gfx scroll[3];
Gfx scroll2[3];
};
7 changes: 7 additions & 0 deletions src/port/Engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -405,10 +405,17 @@
wnd->HandleEvents();

interpreter->mInterpolationIndex = 0;
interpreter->mTargetFps = CVarGetInteger("gInterpolationFPS", 30);

Check failure on line 408 in src/port/Engine.cpp

View workflow job for this annotation

GitHub Actions / build (Debug)

no member named 'mTargetFps' in 'Fast::Interpreter'
interpreter->mInterpolationCount = mtx_replacements.size();

Check failure on line 409 in src/port/Engine.cpp

View workflow job for this annotation

GitHub Actions / build (Debug)

no member named 'mInterpolationCount' in 'Fast::Interpreter'; did you mean 'mInterpolationIndex'?

for (const auto& m : mtx_replacements) {
wnd->DrawAndRunGraphicsCommands(Commands, m);
interpreter->mInterpolationIndex++;
interpreter->mFpsIndex++;

Check failure on line 414 in src/port/Engine.cpp

View workflow job for this annotation

GitHub Actions / build (Debug)

no member named 'mFpsIndex' in 'Fast::Interpreter'
}

if (interpreter->mFpsIndex >= interpreter->mTargetFps) {

Check failure on line 417 in src/port/Engine.cpp

View workflow job for this annotation

GitHub Actions / build (Debug)

no member named 'mTargetFps' in 'Fast::Interpreter'

Check failure on line 417 in src/port/Engine.cpp

View workflow job for this annotation

GitHub Actions / build (Debug)

no member named 'mFpsIndex' in 'Fast::Interpreter'
interpreter->mFpsIndex = 0;

Check failure on line 418 in src/port/Engine.cpp

View workflow job for this annotation

GitHub Actions / build (Debug)

no member named 'mFpsIndex' in 'Fast::Interpreter'
}

bool curAltAssets = CVarGetInteger("gEnhancements.Mods.AlternateAssets", 0);
Expand Down
44 changes: 28 additions & 16 deletions src/racing/collision.c
Original file line number Diff line number Diff line change
Expand Up @@ -2161,27 +2161,39 @@ bool is_cull_box(const char* filePath) {
}

/**
* Search for G_SETTILESIZE and set its args.
* This function finds a G_SETTILESIZE command and hooks it.
* Then writes the interpolation command into the provided gfx array
* The game continues as normal after leaving the writableDList
*
* @arg gfxAsset the model needing interpolated scrolling textures
* @arg writableDList - Provide Gfx myGfx[3]. This memory MUST stay alive for the lifetime of the object
*/
void find_and_set_tile_size(uintptr_t addr, s32 uls, s32 ult) {
Gfx* gfx = (Gfx*) addr;
void scroll_texture_interpolated(Gfx* writableDList, const char* gfxAsset, s32 stepX, s32 stepY) {
int8_t opcode = 0;
if ((NULL == writableDList) || (NULL == gfxAsset)) {
return;
}

Gfx* gfx = (Gfx*) gfxAsset;
if (GameEngine_OTRSigCheck(gfx)) {
gfx = (Gfx*) ResourceGetDataByName(gfx);
}
u32 opcode;

uls = (uls << 12) & 0xFFF000;
ult &= 0xFFF;

while (true) {

opcode = GFX_GET_OPCODE(gfx->words.w0);

if (opcode == (u32) G_ENDDL << 24) {
break;
} else if (opcode == (u32) (G_SETTILESIZE << 24)) {
gfx->words.w0 = (G_SETTILESIZE << 24) | uls | ult;

while ((opcode = GFX_GET_OPCODE(gfx->words.w0) >> 24) != G_ENDDL) {
if (opcode == (int8_t)G_SETTILESIZE) {
// Get values from the old tile size command
int32_t tile = _SHIFTR(gfx->words.w1, 24, 12);
int32_t uls = _SHIFTR(gfx->words.w0, 12, 12);
int32_t ult = _SHIFTR(gfx->words.w0, 0, 12);
int32_t lrs = _SHIFTR(gfx->words.w1, 12, 12);
int32_t lrt = _SHIFTR(gfx->words.w1, 0, 12);

// Write over old command to point to the new writeableDList
__gSPDisplayList(gfx, &writableDList[0]);

// Write DL data into writableDList. gDPScrollTexture takes up two Gfx
gDPScrollTexture(&writableDList[0], tile, uls, ult, lrs, lrt, stepX, stepY);
gSPEndDisplayList(&writableDList[2]);
break;
}
gfx++;
Expand Down
2 changes: 1 addition & 1 deletion src/racing/collision.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ void generate_collision_grid(void);
void generate_collision_mesh_with_defaults(Gfx*);
void generate_collision_mesh_with_default_section_id(Gfx*, s8);
void generate_collision_mesh(Gfx*, s8, u16);
void find_and_set_tile_size(uintptr_t, s32, s32);
void set_vertex_colours(uintptr_t, u32, s32, s8, u8, u8, u8);
void find_vtx_and_set_colours(Gfx*, s8, u8, u8, u8);
void subtract_scaled_vector(Vec3f, f32, Vec3f);
void scroll_texture_interpolated(Gfx* writableDList, const char* gfxAsset, s32 stepX, s32 stepY);

#endif
Loading