summaryrefslogtreecommitdiff
path: root/src/racing
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2025-05-14 18:30:32 -0600
committerGitHub <noreply@github.com>2025-05-14 18:30:32 -0600
commit32632cacdb316d7f2d3b6ecdb634f0ef9aebadf0 (patch)
treed374a84675fc0f49100c275aa34828bc9db538f8 /src/racing
parent70f049cb6c326dede27e0ba7e88ac0d67b7651a4 (diff)
Impl new intro (#193)
* Update menus * Update CMakeLists.txt * Add Ship * Impl hm ship actors * Update HM course * Impl new intro * Finish intro scene * Rename * Start Editor Work * raycast works * Fix ScreenRayTrace in widescreen * Basic Actor Picking * wip * Editor use vtx collision * gizmo work * otr works for object picking * Impl objects for editor * actor init * Update * Add all axis move (freemove) * Docking Windows works here * Setup imgui layout for editor * Editor Snap to Ground works * Basic Scene Explorer Works * Editor get actor names * Impl editor object names * impl Editor Play and Pause buttons * Editor translate works while paused * Fix freecam lighting * Added adjustable track properties to editor * Editor matrix, icons, rotation, impl light * Setup Track Properties 1 * Editor tooling wip * Load modded o2rs * Don't enable hud if editor is enabled * Updates * SceneManager nearly working * Fix mario kart 64 intro logo sizing * Fix Rotator * Finish new matrix translation code * Cleanup headers * Cleanup * Cleanup 2 * Cleanup 3 * Prevent divize by zero crash * Add visible circle for translate in all axis * Editor scaling/rot works properly now * Scale All_Axis evenly * Fixes to includes to work on Linux. * Removed overfilled arguments in gfx_create_framebuffer() * Added missing function definitions to Game.h * Editor sun face the camera * Add rotation model to gizmo * Add new handles * Failed attempt at transforming collision * Impl water volume * Import fast64 paths * water surface * Scene Setup 1 * Custom Track O2R almost working needs testing * Custom Track Load path O2r * Render custom track. Wip collision * Add missing function * Debug Spawning Custom O2R Track * Import courses working now * Fix memory leak * Remove New Track Button * Engine.cpp more consistent with sf64 * Fix Editor Enable Button * Editor Accurate mouse click drag objects * Editor selects closest object and cleanup * Gizmo rot and scale collision working * Remove constexpr from IRotator * Impl properties for location/rot/scale * Better Properties display, swap rot handles * Fix content browser dock and editor now disabled by default * Remove GameInfoWindow, Multiplayer Button, and FPS Slider * Disable Editor when its disabled * Add new logo to hm intro * Fix pause menu item box cursor * Remove minimap from Course::from_json and to_json * Impl Import Minimap * Fix custom minimap rendering * minimap uses extension .png * Refactor minimap * Freecam only for player 1 * GrandPrix Balloons work in custom track * Track Id is now std::string and outside of Props * Moved editor assets to be included in ship.o2r * Fixed GenerateO2R to package the correct folder and save to the correct filename * Linux specific changes. * Added "#include <stdio.h>" that required them * Changed how the "ship.o2r" file is loaded to allow it to load the file from within appimages. * Changed the Linuxdeploy version to avoid errors later when the Github Actions creates appimages(same fix applied to other ports.) * Revert "Moved editor assets to be included in ship.o2r" This reverts commit 05704c01f761baa67a83e357d9765f5c6b5e3fdb. * Added back files(this time without LUS changes) * Changed workflow file to use correct filename for assets file. * Missed a few spots in the workflow file. * Added .desktop file and made corrections to the main workflow. * Added the rest of upstream CMakeLists.txt * disabled USE_NETWORKING * New InverseMatrix * Renamed both .o2r files to be more accurate to its contents. * Reverted CmakeList.txt --------- Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com> Co-authored-by: sitton76 <58642183+sitton76@users.noreply.github.com>
Diffstat (limited to 'src/racing')
-rw-r--r--src/racing/actors.c101
-rw-r--r--src/racing/actors.h1
-rw-r--r--src/racing/collision.c188
-rw-r--r--src/racing/collision.h2
-rw-r--r--src/racing/framebuffer_effects.c35
-rw-r--r--src/racing/math_util.c17
-rw-r--r--src/racing/math_util.h2
-rw-r--r--src/racing/memory.c1
-rw-r--r--src/racing/render_courses.c90
-rw-r--r--src/racing/render_courses.h13
-rw-r--r--src/racing/skybox_and_splitscreen.c1
11 files changed, 263 insertions, 188 deletions
diff --git a/src/racing/actors.c b/src/racing/actors.c
index 9fc8059ef..9344bd3eb 100644
--- a/src/racing/actors.c
+++ b/src/racing/actors.c
@@ -135,6 +135,7 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f
actor->state = 0;
actor->unk_08 = 0.0f;
actor->boundingBoxSize = 0.0f;
+ actor->model = NULL;
func_802AAAAC(&actor->unk30);
switch (actorType) {
case ACTOR_BOX_TRUCK:
@@ -151,6 +152,7 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f
actor->velocity[0] = actor->pos[0];
actor->velocity[1] = actor->pos[1];
actor->velocity[2] = actor->pos[2] + 70.0f;
+ actor->model = d_course_yoshi_valley_dl_egg_lod0;
break;
case ACTOR_KIWANO_FRUIT:
actor->state = 0;
@@ -158,10 +160,12 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f
actor->rot[1] = 0;
actor->rot[2] = 0;
actor->boundingBoxSize = 2.0f;
+ actor->model = d_course_dks_jungle_parkway_dl_kiwano_fruit;
break;
case ACTOR_FALLING_ROCK:
actor->flags |= 0x4000;
actor->boundingBoxSize = 10.0f;
+ actor->model = d_course_choco_mountain_dl_falling_rock;
break;
case ACTOR_TRAIN_ENGINE:
actor->unk_08 = 10.0f;
@@ -169,6 +173,7 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f
case ACTOR_BANANA:
actor->flags = actor->flags | 0x4000 | 0x1000;
actor->boundingBoxSize = 2.0f;
+ actor->model = common_model_flat_banana;
break;
case ACTOR_GREEN_SHELL:
gNumSpawnedShells += 1;
@@ -194,27 +199,32 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f
actor->state = 0x0043;
actor->boundingBoxSize = 3.0f;
actor->unk_08 = 20.0f;
+ actor->model = d_course_mario_raceway_dl_tree;
break;
case ACTOR_MARIO_SIGN:
actor->flags |= 0x4000;
+ actor->model = d_course_mario_raceway_dl_sign;
break;
case ACTOR_TREE_YOSHI_VALLEY:
actor->flags |= 0x4000;
actor->state = 0x0043;
actor->boundingBoxSize = 3.0f;
actor->unk_08 = 23.0f;
+ actor->model = d_course_yoshi_valley_dl_tree;
break;
case ACTOR_TREE_ROYAL_RACEWAY:
actor->flags |= 0x4000;
actor->state = 0x0043;
actor->boundingBoxSize = 3.0f;
actor->unk_08 = 17.0f;
+ actor->model = d_course_royal_raceway_dl_tree;
break;
case ACTOR_TREE_MOO_MOO_FARM:
actor->state = 0x0043;
actor->flags = -0x8000;
actor->boundingBoxSize = 3.0f;
actor->unk_08 = 17.0f;
+ actor->model = d_course_moo_moo_farm_dl_tree;
break;
case 26:
actor->flags |= 0x4000;
@@ -275,17 +285,20 @@ void actor_init(struct Actor* actor, Vec3f startingPos, Vec3s startingRot, Vec3f
actor->unk_04 = 0;
actor->state = 5;
actor->boundingBoxSize = 5.5f;
+ actor->model = D_0D003090;
break;
case ACTOR_ITEM_BOX:
actor->flags |= 0x4000;
actor->unk_04 = 0;
actor->state = 0;
actor->boundingBoxSize = 5.5f;
+ actor->model = D_0D003090;
break;
case ACTOR_PIRANHA_PLANT:
actor->flags |= 0x4000;
actor->state = 0x001E;
actor->boundingBoxSize = 5.0f;
+ actor->model = d_course_mario_raceway_dl_piranha_plant;
break;
default:
break;
@@ -1053,15 +1066,6 @@ void spawn_course_actors(void) {
gNumPermanentActors = 0;
- if (gModeSelection != BATTLE) {
- if (!CM_DoesFinishlineExist()) {
- printf("\n[actors.c] COURSE MISSING THE FINISHLINE\n");
- printf(" In the Course class BeginPlay() function make sure to include:\n");
- printf(" gWorldInstance.AddActor(new AFinishline());\n\n");
- printf("\n Otherwise, course textures may glitch out or other strange issues may occur.\n");
- }
- }
-
// switch (gCurrentCourseId) {
// case COURSE_MARIO_RACEWAY:
// // spawn_foliage(d_course_mario_raceway_tree_spawns);
@@ -1224,6 +1228,7 @@ void init_actors_and_load_textures(void) {
destroy_all_actors();
CM_CleanWorld();
+ CM_SpawnFromLevelProps();
CM_BeginPlay();
spawn_course_actors();
}
@@ -1383,7 +1388,7 @@ s16 try_remove_destructable_item(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actor
return -1;
}
-// returns actor index if any slot avaible returns -1
+// returns actor index if any available actor type is -1
s16 add_actor_to_empty_slot(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actorType) {
size_t index;
@@ -1402,6 +1407,7 @@ s16 add_actor_to_empty_slot(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actorType)
gNumActors++;
struct Actor* actor = CM_AddBaseActor();
actor_init(actor, pos, rot, velocity, actorType);
+ CM_AddEditorObject(actor, get_actor_name(actor->type));
return (s16) CM_GetActorSize() - 1; // Return current index;
}
@@ -2637,3 +2643,78 @@ void update_course_actors(void) {
evaluate_collision_for_destructible_actors();
check_player_use_item();
}
+
+const char* get_actor_name(s32 id) {
+ switch(id) {
+ case ACTOR_FALLING_ROCK:
+ return "Falling Rock";
+ case ACTOR_GREEN_SHELL:
+ return "Green Shell";
+ case ACTOR_RED_SHELL:
+ return "Red Shell";
+ case ACTOR_BLUE_SPINY_SHELL:
+ return "Blue Spiny Shell";
+ case ACTOR_KIWANO_FRUIT:
+ return "Kiwano Fruit";
+ case ACTOR_BANANA:
+ return "Banana";
+ case ACTOR_PADDLE_BOAT:
+ return "Paddle Boat";
+ case ACTOR_TRAIN_ENGINE:
+ return "Train Engine";
+ case ACTOR_TRAIN_TENDER:
+ return "Train Tender";
+ case ACTOR_TRAIN_PASSENGER_CAR:
+ return "Train Passenger Car";
+ case ACTOR_ITEM_BOX:
+ return "Item Box";
+ case ACTOR_HOT_AIR_BALLOON_ITEM_BOX:
+ return "Hot Air Balloon Item Box";
+ case ACTOR_FAKE_ITEM_BOX:
+ return "Fake Item Box";
+ case ACTOR_PIRANHA_PLANT:
+ return "Piranha Plant";
+ case ACTOR_BANANA_BUNCH:
+ return "Banana Bunch";
+ case ACTOR_TRIPLE_GREEN_SHELL:
+ return "Triple Green Shell";
+ case ACTOR_TRIPLE_RED_SHELL:
+ return "Triple Red Shell";
+ case ACTOR_MARIO_SIGN:
+ return "Mario Sign";
+ case ACTOR_WARIO_SIGN:
+ return "Wario Sign";
+ case ACTOR_RAILROAD_CROSSING:
+ return "Railroad Crossing";
+ case ACTOR_TREE_MARIO_RACEWAY:
+ return "Tree (Mario Raceway)";
+ case ACTOR_TREE_YOSHI_VALLEY:
+ return "Tree (Yoshi Valley)";
+ case ACTOR_TREE_ROYAL_RACEWAY:
+ return "Tree (Royal Raceway)";
+ case ACTOR_TREE_MOO_MOO_FARM:
+ return "Tree (Moo Moo Farm)";
+ case ACTOR_PALM_TREE:
+ return "Palm Tree";
+ case ACTOR_UNKNOWN_0x1A:
+ return "Unknown Plant (0x1A)";
+ case ACTOR_UNKNOWN_0x1B:
+ return "Unknown (0x1B)";
+ case ACTOR_TREE_BOWSERS_CASTLE:
+ return "Tree (Bowser's Castle)";
+ case ACTOR_TREE_FRAPPE_SNOWLAND:
+ return "Tree (Frappe Snowland)";
+ case ACTOR_CACTUS1_KALAMARI_DESERT:
+ return "Cactus 1 (Kalamari Desert)";
+ case ACTOR_CACTUS2_KALAMARI_DESERT:
+ return "Cactus 2 (Kalamari Desert)";
+ case ACTOR_CACTUS3_KALAMARI_DESERT:
+ return "Cactus 3 (Kalamari Desert)";
+ case ACTOR_BUSH_BOWSERS_CASTLE:
+ return "Bush (Bowser's Castle)";
+ case ACTOR_YOSHI_EGG:
+ return "Yoshi Egg";
+ default:
+ return "Obj";
+ }
+}
diff --git a/src/racing/actors.h b/src/racing/actors.h
index fe32326af..4f71c9b97 100644
--- a/src/racing/actors.h
+++ b/src/racing/actors.h
@@ -111,6 +111,7 @@ void render_actor_palm_tree(Camera*, Mat4, struct PalmTree*);
void render_item_boxes(struct UnkStruct_800DC5EC*);
void render_course_actors(struct UnkStruct_800DC5EC*);
void update_course_actors(void);
+const char* get_actor_name(s32);
// audio/external.c
extern void func_800C98B8(Vec3f, Vec3f, u32);
diff --git a/src/racing/collision.c b/src/racing/collision.c
index c3e210c9a..a394f0080 100644
--- a/src/racing/collision.c
+++ b/src/racing/collision.c
@@ -11,6 +11,7 @@
#include "code_800029B0.h"
#include <defines.h>
#include "port/Game.h"
+#include <stdio.h>
#pragma intrinsic(sqrtf)
@@ -38,76 +39,8 @@ void func_802AAAAC(Collision* collision) {
vec3f_set(collision->orientationVector, 0.0f, 1.0f, 0.0f);
}
-f32 func_802AAB4C(Player* player) {
- f32 playerX;
- f32 playerZ;
- s32 temp_v1;
-
- playerX = player->pos[0];
- playerZ = player->pos[2];
- if (GetCourse() == GetBowsersCastle()) {
- if (playerX > 1859.0f) {
- return D_8015F8E4;
- }
- if (playerX < 1549.0f) {
- return D_8015F8E4;
- }
- if (playerZ > -1102.0f) {
- return D_8015F8E4;
- }
- if (playerZ < -1402.0f) {
- return D_8015F8E4;
- }
- return 20.0f;
- } else if (GetCourse() == GetKoopaTroopaBeach()) {
- if (playerX > 239.0f) {
- return D_8015F8E4;
- }
- if (playerX < 67.0f) {
- return D_8015F8E4;
- }
- if (playerZ > 2405.0f) {
- return D_8015F8E4;
- }
- if (playerZ < 2233.0f) {
- return D_8015F8E4;
- }
- return 0.8f;
- } else if (GetCourse() == GetSherbetLand()) {
- if ((get_surface_type(player->collision.meshIndexZX) & 0xFF) == SNOW) {
- return (f32) (gCourseMinY - 0xA);
- }
- return D_8015F8E4;
- } else if (GetCourse() == GetDkJungle()) {
- temp_v1 = get_track_section_id(player->collision.meshIndexZX) & 0xFF;
- if (temp_v1 == 0xFF) {
- if ((get_surface_type(player->collision.meshIndexZX) & 0xFF) == CAVE) {
- return -475.0f;
- }
- if (playerX > -478.0f) {
- return -33.9f;
- }
- if (playerX < -838.0f) {
- return -475.0f;
- }
- if (playerZ > -436.0f) {
- return -475.0f;
- }
- if (playerZ < -993.0f) {
- return -33.9f;
- }
- if (playerZ < playerX) {
- return -475.0f;
- }
- return -33.9f;
- }
- if (temp_v1 >= 0x14) {
- return -475.0f;
- }
- return -33.9f;
- } else {
- return D_8015F8E4;
- }
+f32 get_water_level(Player* player) {
+ return CM_GetWaterLevel(player->pos, &player->collision);
}
s32 check_collision_zx(Collision* collision, f32 boundingBoxSize, f32 posX, f32 posY, f32 posZ, u16 index) {
@@ -1493,18 +1426,23 @@ f32 spawn_actor_on_surface(f32 posX, f32 posY, f32 posZ) {
numTriangles = gCollisionGrid[gridSection].numTriangles;
if (sectionIndexX < 0) {
+ printf("collision.c: actor outside of -sectionX %d\n", sectionIndexX);
return 3000.0f;
}
if (sectionIndexZ < 0) {
+ printf("collision.c: actor outside of -sectionZ %d\n", sectionIndexZ);
return 3000.0f;
}
if (sectionIndexX >= GRID_SIZE) {
+ printf("collision.c: actor outside of sectionX %d\n", sectionIndexX);
return 3000.0f;
}
if (sectionIndexZ >= GRID_SIZE) {
+ printf("collision.c: actor outside of sectionZ %d\n", sectionIndexZ);
return 3000.0f;
}
if (numTriangles == 0) {
+ printf("collision.c: No collision triangles in track!\n Something is wrong with the tracks geometry\n");
return 3000.0f;
}
@@ -1753,7 +1691,7 @@ void add_collision_triangle(Vtx* vtx1, Vtx* vtx2, Vtx* vtx3, s8 surfaceType, u16
void set_vtx_from_triangle(u32 triangle, s8 surfaceType, u16 sectionId) {
u32 vert1 = ((triangle & 0x00FF0000) >> 16) / 2;
u32 vert2 = ((triangle & 0x0000FF00) >> 8) / 2;
- u32 vert3 = (triangle & 0x000000FF) / 2;
+ u32 vert3 = (triangle & 0x000000FF) / 2;
Vtx* vtx1 = vtxBuffer[vert1];
Vtx* vtx2 = vtxBuffer[vert2];
@@ -2016,8 +1954,9 @@ u32 numTimes = 0;
/**
* Generate via a recursive search and set for vertex data.
*/
+bool is_cull_box(const char* filePath);
void generate_collision_mesh(Gfx* addr, s8 surfaceType, u16 sectionId) {
- s32 opcode;
+ int8_t opcode;
uintptr_t lo;
uintptr_t hi;
s32 i;
@@ -2041,41 +1980,110 @@ void generate_collision_mesh(Gfx* addr, s8 surfaceType, u16 sectionId) {
for (i = 0; i < 0x1FFF; i++) {
lo = gfx->words.w0;
hi = gfx->words.w1;
- opcode = GFX_GET_OPCODE(lo);
+ opcode = GFX_GET_OPCODE(lo) >> 24;
// printf("ptr 0x%llX\n", &addr);
// printf("op 0x%llX\n", opcode);
// printf("w0 0x%llX\n", lo);
// printf("w1 0x%llX\n", hi);
- if (opcode == (G_DL << 24)) {
- // G_DL's hi contains an addr to another DL.
- generate_collision_mesh((Gfx*) hi, surfaceType, sectionId);
+ switch(opcode) {
+ case G_DL:
+ // G_DL's hi contains an addr to another DL.
+ generate_collision_mesh((Gfx*) hi, surfaceType, sectionId);
+ break;
+ case G_DL_OTR_FILEPATH:
+ generate_collision_mesh(ResourceGetDataByName((const char*)hi), surfaceType, sectionId);
+ break;
+ case G_VTX:
+ set_vtx_buffer((hi), (lo >> 10) & 0x3F, ((lo >> 16) & 0xFF) >> 1);
+ break;
+ case G_VTX_OTR_FILEPATH: {
+ const char* filePath = (const char*)hi;
+ // Fast64 outputs garbage data. Lets skip that...
+ if (is_cull_box(filePath)) {
+ printf("Skipped cull box\n");
+ gfx++;
+ continue;
+ }
+ gfx++;
+ size_t count = gfx->words.w0;
+ size_t index = (gfx->words.w1 >> 16);
+ size_t vtxDataOff = gfx->words.w1 & 0xFFFF;
+ Vtx* vtx = ( (Vtx*)ResourceGetDataByName(filePath) ) + vtxDataOff;
+
+ set_vtx_buffer(vtx, count, index);
+ break;
+ }
+ case G_TRI1:
+ D_8015F58C += 1;
+ set_vtx_from_triangle(hi, surfaceType, sectionId);
+ break;
+ case G_TRI1_OTR: {
+ uint32_t v1 = (lo & 0x0000FFFF) * 2;
+ uint32_t v2 = (hi >> 16) * 2;
+ uint32_t v3 = (hi & 0x0000FFFF) * 2;
+
+ // Repack into a format supported by f3dex
+ uint32_t repack = (v1 << 16) | (v2 << 8) | v3;
+
+ D_8015F58C += 1;
+ set_vtx_from_triangle(repack, surfaceType, sectionId);
+ break;
+ }
+ case G_TRI2:
+ D_8015F58C += 2;
+ set_vtx_from_tri2(lo, hi, surfaceType, sectionId);
+ break;
+ case G_QUAD:
+ D_8015F58C += 2;
+ set_vtx_from_quadrangle(hi, surfaceType, sectionId);
+ break;
+ case G_ENDDL:
+ return; // end of loop
+ }
- } else if (opcode == (G_VTX << 24)) {
- set_vtx_buffer((hi), (lo >> 10) & 0x3F, ((lo >> 16) & 0xFF) >> 1);
- } else if (opcode == (G_TRI1 << 24)) {
- D_8015F58C += 1;
- set_vtx_from_triangle(hi, surfaceType, sectionId);
+ // if (opcode == (G_DL << 24)) {
+ // // G_DL's hi contains an addr to another DL.
+ // generate_collision_mesh((Gfx*) hi, surfaceType, sectionId);
- } else if (opcode == (G_TRI2 << 24)) {
- D_8015F58C += 2;
+ // } else if (opcode == (G_VTX << 24)) {
+ // set_vtx_buffer((hi), (lo >> 10) & 0x3F, ((lo >> 16) & 0xFF) >> 1);
- set_vtx_from_tri2(lo, hi, surfaceType, sectionId);
+ // } else if (opcode == (G_TRI1 << 24)) {
+ // D_8015F58C += 1;
+ // set_vtx_from_triangle(hi, surfaceType, sectionId);
- } else if (opcode == (G_QUAD << 24)) {
- D_8015F58C += 2;
- set_vtx_from_quadrangle(hi, surfaceType, sectionId);
+ // } else if (opcode == (G_TRI2 << 24)) {
+ // D_8015F58C += 2;
- } else if (opcode == (int32_t) (G_ENDDL << 24)) {
- break;
- }
+ // set_vtx_from_tri2(lo, hi, surfaceType, sectionId);
+
+ // } else if (opcode == (G_QUAD << 24)) {
+ // D_8015F58C += 2;
+ // set_vtx_from_quadrangle(hi, surfaceType, sectionId);
+
+ // } else if (opcode == (int32_t) (G_ENDDL << 24)) {
+ // break;
+ // }
gfx++;
}
}
+bool is_cull_box(const char* filePath) {
+ const char* suffix = "cull";
+ size_t fileLen = strlen(filePath);
+ size_t suffixLen = strlen(suffix);
+
+ if (fileLen < suffixLen) {
+ return false;
+ }
+
+ return strcmp(filePath + fileLen - suffixLen, suffix) == 0;
+}
+
/**
* Search for G_SETTILESIZE and set its args.
*/
diff --git a/src/racing/collision.h b/src/racing/collision.h
index a6c3aca29..4720daf55 100644
--- a/src/racing/collision.h
+++ b/src/racing/collision.h
@@ -8,7 +8,7 @@
void nullify_displaylist(uintptr_t);
void func_802AAAAC(Collision*);
-f32 func_802AAB4C(Player*);
+f32 get_water_level(Player*);
s32 check_collision_zx(Collision*, f32, f32, f32, f32, u16);
s32 check_collision_yx(Collision*, f32, f32, f32, f32, u16);
s32 check_collision_zy(Collision*, f32, f32, f32, f32, u16);
diff --git a/src/racing/framebuffer_effects.c b/src/racing/framebuffer_effects.c
index 4406ca787..12b2f0624 100644
--- a/src/racing/framebuffer_effects.c
+++ b/src/racing/framebuffer_effects.c
@@ -35,30 +35,30 @@ void FB_CreateFramebuffers(void) {
* sure f3dex2 is loaded before this function is called.
*/
void FB_CopyToFramebuffer(Gfx** gfxP, s32 fb_src, s32 fb_dest, u8 oncePerFrame, u8* hasCopied) {
- Gfx* gfx = *gfxP;
+ // Gfx* gfx = *gfxP;
- gSPMatrix(gfx++, &gIdentityMatrix, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ // gSPMatrix(gfx++, &gIdentityMatrix, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetOtherMode(gfx++,
- G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE |
- G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
- G_AC_NONE | G_ZS_PRIM | G_RM_OPA_SURF | G_RM_OPA_SURF2);
+ // gDPSetOtherMode(gfx++,
+ // G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ // G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ // G_AC_NONE | G_ZS_PRIM | G_RM_OPA_SURF | G_RM_OPA_SURF2);
- gSPClearGeometryMode(gfx++, G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);
- gSPSetGeometryMode(gfx++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
+ // gSPClearGeometryMode(gfx++, G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);
+ // gSPSetGeometryMode(gfx++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
- gDPSetBlendColor(gfx++, 255, 255, 255, 8);
- gDPSetPrimDepth(gfx++, 0xFFFF, 0xFFFF);
+ // gDPSetBlendColor(gfx++, 255, 255, 255, 8);
+ // gDPSetPrimDepth(gfx++, 0xFFFF, 0xFFFF);
- gDPSetEnvColor(gfx++, 255, 255, 255, 255);
- gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
- ENVIRONMENT);
+ // gDPSetEnvColor(gfx++, 255, 255, 255, 255);
+ // gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
+ // ENVIRONMENT);
- gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+ // gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
- gDPCopyFB(gfx++, fb_dest, fb_src, oncePerFrame, hasCopied);
+ // gDPCopyFB(gfx++, fb_dest, fb_src, oncePerFrame, hasCopied);
- *gfxP = gfx;
+ // *gfxP = gfx;
}
/**
@@ -69,9 +69,8 @@ void FB_CopyToFramebuffer(Gfx** gfxP, s32 fb_src, s32 fb_dest, u8 oncePerFrame,
*/
void FB_WriteFramebufferSliceToCPU(Gfx** gfxP, void* buffer, u8 byteSwap) {
Gfx* gfx = *gfxP;
-
FB_CopyToFramebuffer(&gfx, 0, gReusableFrameBuffer, false, NULL);
-
+
// Set the N64 resolution framebuffer as the draw target (320x240)
gsSPSetFB(gfx++, gN64ResFrameBuffer);
// Reset scissor for new framebuffer
diff --git a/src/racing/math_util.c b/src/racing/math_util.c
index 1e9241528..ac34ceda7 100644
--- a/src/racing/math_util.c
+++ b/src/racing/math_util.c
@@ -8,6 +8,7 @@
#include "math.h"
#include "memory.h"
#include "engine/Matrix.h"
+#include "port/Game.h"
#pragma intrinsic(sqrtf, fabs)
@@ -428,10 +429,10 @@ void func_802B5CAC(s16 arg0, s16 arg1, Vec3f arg2) {
}
void func_802B5D30(s16 arg0, s16 arg1, s32 arg2) {
- func_802B5D64((Lights1*) 0x9000000, arg0, arg1, arg2);
+ set_track_light_direction((Lights1*) 0x9000000, arg0, arg1, arg2);
}
-void func_802B5D64(Lights1* addr, s16 arg1, s16 arg2, s32 arg3) {
+void set_track_light_direction(Lights1* addr, s16 pitch, s16 yaw, s32 numLights) {
UNUSED s32 pad;
f32 sp48;
f32 sp44;
@@ -443,14 +444,14 @@ void func_802B5D64(Lights1* addr, s16 arg1, s16 arg2, s32 arg3) {
Lights1* var_s0;
var_s0 = (Lights1*) addr;
- sp48 = sins(arg2);
- sp44 = coss(arg2);
- sp40 = sins(arg1);
- temp_f10 = coss(arg1);
+ sp48 = sins(yaw);
+ sp44 = coss(yaw);
+ sp40 = sins(pitch);
+ temp_f10 = coss(pitch);
sp2C[0] = sp44 * sp40 * 120.0f;
sp2C[1] = 120.0f * sp48;
sp2C[2] = sp44 * temp_f10 * -120.0f;
- for (var_v0 = 0; var_v0 < arg3; var_v0++, var_s0++) {
+ for (var_v0 = 0; var_v0 < numLights; var_v0++, var_s0++) {
var_s0->l[0].l.dir[0] = sp2C[0];
var_s0->l[0].l.dir[1] = sp2C[1];
var_s0->l[0].l.dir[2] = sp2C[2];
@@ -1181,7 +1182,7 @@ f32 is_within_render_distance(Vec3f cameraPos, Vec3f objectPos, u16 orientationY
}
// No idea if arg1 is actually a Mat4 or not, but since this function is unused
-// its impossible to know with certainty either way, very close of func_802B5D64
+// its impossible to know with certainty either way, very close of set_track_light_direction
UNUSED void func_802B8414(uintptr_t addr, Mat4 arg1, s16 arg2, s16 arg3, s32 arg4) {
UNUSED s32 pad;
Vec3f sp40;
diff --git a/src/racing/math_util.h b/src/racing/math_util.h
index bd4ce5759..b767e9068 100644
--- a/src/racing/math_util.h
+++ b/src/racing/math_util.h
@@ -41,7 +41,7 @@ void mtxf_s16_rotate_z(Mat4, s16);
void func_802B5B14(Vec3f b, Vec3s rotate); // unused
void func_802B5CAC(s16, s16, Vec3f);
void func_802B5D30(s16, s16, s32);
-void func_802B5D64(Lights1*, s16, s16, s32);
+void set_track_light_direction(Lights1*, s16, s16, s32);
void mtxf_scale(Mat4, f32);
void mtxf_pos_rotation_xyz(Mat4, Vec3f, Vec3s);
void mtxf_translate_vec3f_mat3(Vec3f, Mat3);
diff --git a/src/racing/memory.c b/src/racing/memory.c
index 1b5f02510..a3c3bf6b3 100644
--- a/src/racing/memory.c
+++ b/src/racing/memory.c
@@ -1512,4 +1512,5 @@ void load_course(s32 courseId) {
gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
CM_CleanWorld();
LoadCourse();
+ CM_Editor_SetLevelDimensions(gCourseMinX, gCourseMaxX, gCourseMinZ, gCourseMaxZ, gCourseMinY, gCourseMaxY);
}
diff --git a/src/racing/render_courses.c b/src/racing/render_courses.c
index b2d654fb4..71b182544 100644
--- a/src/racing/render_courses.c
+++ b/src/racing/render_courses.c
@@ -1,4 +1,4 @@
-#include <libultraship.h>
+ #include <libultraship.h>
#include <libultra/gbi.h>
#include <macros.h>
#include <mk64.h>
@@ -50,7 +50,7 @@ s32 func_80290C20(Camera* camera) {
return 0;
}
-void parse_course_displaylists(TrackSectionsI* asset) {
+void parse_course_displaylists(TrackSections* asset) {
TrackSections* section = (TrackSections*) asset;
while (section->addr != 0) {
@@ -299,7 +299,7 @@ void func_8029122C(struct UnkStruct_800DC5EC* arg0, s32 playerId) {
// break;
// }
// vector[0] = 0.0f;
- // vector[1] = D_8015F8E4;
+ // vector[1] = gWaterLevel;
// vector[2] = 0.0f;
// mtxf_translate(matrix, vector);
// render_set_position(matrix, 0);
@@ -328,7 +328,7 @@ void func_8029122C(struct UnkStruct_800DC5EC* arg0, s32 playerId) {
// render_course_segments(sherbet_land_dls_2, arg0);
// gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE);
- // if ((func_80290C20(arg0->camera) == 1) && (func_802AAB4C(player) < player->pos[1])) {
+ // if ((func_80290C20(arg0->camera) == 1) && (get_water_level(player) < player->pos[1])) {
// gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER);
// gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE);
// gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
@@ -978,7 +978,7 @@ void render_moo_moo_farm(struct UnkStruct_800DC5EC* arg0) {
s16 temp_s0 = arg0->pathCounter;
s16 playerDirection = arg0->playerDirection;
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -1047,7 +1047,7 @@ void render_moo_moo_farm(struct UnkStruct_800DC5EC* arg0) {
void render_toads_turnpike(struct UnkStruct_800DC5EC* arg0) {
UNUSED s32 pad[13];
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -1074,7 +1074,7 @@ void render_toads_turnpike(struct UnkStruct_800DC5EC* arg0) {
void render_kalimari_desert(struct UnkStruct_800DC5EC* arg0) {
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -1229,7 +1229,7 @@ void render_wario_stadium(struct UnkStruct_800DC5EC* arg0) {
void render_block_fort(UNUSED struct UnkStruct_800DC5EC* arg0) {
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -1238,7 +1238,7 @@ void render_block_fort(UNUSED struct UnkStruct_800DC5EC* arg0) {
}
void render_skyscraper(UNUSED struct UnkStruct_800DC5EC* arg0) {
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -1262,7 +1262,7 @@ void render_skyscraper(UNUSED struct UnkStruct_800DC5EC* arg0) {
void render_double_deck(UNUSED struct UnkStruct_800DC5EC* arg0) {
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -1274,8 +1274,8 @@ void render_double_deck(UNUSED struct UnkStruct_800DC5EC* arg0) {
void render_dks_jungle_parkway(struct UnkStruct_800DC5EC* arg0) {
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
- func_802B5D64(&D_800DC610[1], D_802B87D4, D_802B87D0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(&D_800DC610[1], D_802B87D4, D_802B87D0, 1);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK | G_LIGHTING);
@@ -1300,7 +1300,7 @@ void render_big_donut(struct UnkStruct_800DC5EC* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
@@ -1320,7 +1320,7 @@ void render_big_donut(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x07000230)));
}
-void func_8029569C(void) {
+void render_credits(void) {
CM_RenderCredits();
@@ -1389,7 +1389,7 @@ void func_8029569C(void) {
}
void render_course(struct UnkStruct_800DC5EC* arg0) {
- func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
+ set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
// Freecam priority renders collision.
if (CVarGetInteger("gRenderCollisionMesh", 0) == true) {
@@ -1398,7 +1398,7 @@ void render_course(struct UnkStruct_800DC5EC* arg0) {
}
if (creditsRenderMode) {
- func_8029569C();
+ render_credits();
return;
}
@@ -1521,7 +1521,7 @@ void course_init(void) {
// // parse_course_displaylists(d_course_mario_raceway_addr);
// // func_80295C6C();
- // // D_8015F8E4 = gCourseMinY - 10.0f;
+ // // gWaterLevel = gCourseMinY - 10.0f;
// break;
// case COURSE_CHOCO_MOUNTAIN:
// D_800DC5BC = 1;
@@ -1552,13 +1552,13 @@ void course_init(void) {
// parse_course_displaylists(d_course_choco_mountain_addr);
// func_802B5CAC(0x238E, 0x31C7, D_8015F590);
// func_80295C6C();
- // D_8015F8E4 = -80.0f;
+ // gWaterLevel = -80.0f;
// break;
// case COURSE_BOWSER_CASTLE:
// parse_course_displaylists(d_course_bowsers_castle_addr);
// func_80295C6C();
// find_vtx_and_set_colours(segmented_gfx_to_virtual(0x07001350), 0x32, 0, 0, 0);
- // D_8015F8E4 = -50.0f;
+ // gWaterLevel = -50.0f;
// break;
// case COURSE_BANSHEE_BOARDWALK:
// // D_800DC5BC = 1;
@@ -1568,20 +1568,20 @@ void course_init(void) {
// // parse_course_displaylists(d_course_banshee_boardwalk_track_sections);
// // func_80295C6C();
// // find_vtx_and_set_colours(segmented_gfx_to_virtual(0x07000878), 128, 0, 0, 0);
- // // D_8015F8E4 = -80.0f;
+ // // gWaterLevel = -80.0f;
// break;
// case COURSE_YOSHI_VALLEY: {
// Lights1 lights4 = gdSPDefLights1(100, 100, 100, 255, 254, 254, 0, 0, 120);
- // func_802B5D64(&lights4, -0x38F0, 0x1C70, 1);
+ // set_track_light_direction(&lights4, -0x38F0, 0x1C70, 1);
// parse_course_displaylists(d_course_yoshi_valley_addr);
// func_80295C6C();
- // D_8015F8E4 = gCourseMinY - 10.0f;
+ // gWaterLevel = gCourseMinY - 10.0f;
// break;
// }
// case COURSE_FRAPPE_SNOWLAND:
// parse_course_displaylists(d_course_frappe_snowland_addr);
// func_80295C6C();
- // D_8015F8E4 = -50.0f;
+ // gWaterLevel = -50.0f;
// break;
// case COURSE_KOOPA_BEACH:
// parse_course_displaylists(d_course_koopa_troopa_beach_addr);
@@ -1594,17 +1594,17 @@ void course_init(void) {
// case COURSE_ROYAL_RACEWAY:
// parse_course_displaylists(d_course_royal_raceway_addr);
// func_80295C6C();
- // D_8015F8E4 = -60.0f;
+ // gWaterLevel = -60.0f;
// break;
// case COURSE_LUIGI_RACEWAY:
// parse_course_displaylists(d_course_luigi_raceway_addr);
// func_80295C6C();
- // D_8015F8E4 = gCourseMinY - 10.0f;
+ // gWaterLevel = gCourseMinY - 10.0f;
// break;
// case COURSE_MOO_MOO_FARM:
// parse_course_displaylists(d_course_moo_moo_farm_addr);
// func_80295C6C();
- // D_8015F8E4 = gCourseMinY - 10.0f;
+ // gWaterLevel = gCourseMinY - 10.0f;
// break;
// case COURSE_TOADS_TURNPIKE:
// D_801625EC = 43;
@@ -1614,17 +1614,17 @@ void course_init(void) {
// D_802B87B4 = 1000;
// parse_course_displaylists(d_course_toads_turnpike_addr);
// func_80295C6C();
- // D_8015F8E4 = gCourseMinY - 10.0f;
+ // gWaterLevel = gCourseMinY - 10.0f;
// break;
// case COURSE_KALIMARI_DESERT:
// parse_course_displaylists(d_course_kalimari_desert_addr);
// func_80295C6C();
- // D_8015F8E4 = gCourseMinY - 10.0f;
+ // gWaterLevel = gCourseMinY - 10.0f;
// break;
// case COURSE_SHERBET_LAND:
// parse_course_displaylists(d_course_sherbet_land_addr);
// func_80295C6C();
- // D_8015F8E4 = -18.0f;
+ // gWaterLevel = -18.0f;
// // d_course_sherbet_land_packed_dl_1EB8
// find_vtx_and_set_colours(segmented_gfx_to_virtual(0x07001EB8), -0x4C, 255, 255, 255);
// // d_course_sherbet_land_packed_dl_2308
@@ -1634,7 +1634,7 @@ void course_init(void) {
// D_800DC5C8 = 1;
// parse_course_displaylists(d_course_rainbow_road_addr);
// func_80295C6C();
- // D_8015F8E4 = 0.0f;
+ // gWaterLevel = 0.0f;
// // d_course_rainbow_road_packed_dl_2068
// find_vtx_and_set_colours(segmented_gfx_to_virtual(0x07002068), -0x6A, 255, 255, 255);
// // d_course_rainbow_road_packed_dl_1E18
@@ -1649,7 +1649,7 @@ void course_init(void) {
// case COURSE_WARIO_STADIUM:
// parse_course_displaylists(d_course_wario_stadium_addr);
// func_80295C6C();
- // D_8015F8E4 = gCourseMinY - 10.0f;
+ // gWaterLevel = gCourseMinY - 10.0f;
// // d_course_wario_stadium_packed_dl_C50
// find_vtx_and_set_colours(segmented_gfx_to_virtual(0x07000C50), 100, 255, 255, 255);
// // d_course_wario_stadium_packed_dl_BD8
@@ -1671,7 +1671,7 @@ void course_init(void) {
// // d_course_block_fort_packed_dl_15C0
// generate_collision_mesh_with_default_section_id((Gfx*) segmented_gfx_to_virtual(0x070015C0), 1);
// func_80295C6C();
- // D_8015F8E4 = gCourseMinY - 10.0f;
+ // gWaterLevel = gCourseMinY - 10.0f;
// break;
// case COURSE_SKYSCRAPER:
// // d_course_skyscraper_packed_dl_1110
@@ -1680,18 +1680,18 @@ void course_init(void) {
// generate_collision_mesh_with_default_section_id((Gfx*) segmented_gfx_to_virtual(0x07000258), 1);
// func_80295C6C();
- // D_8015F8E4 = -480.0f;
+ // gWaterLevel = -480.0f;
// break;
// case COURSE_DOUBLE_DECK:
// // d_course_double_deck_packed_dl_738
// generate_collision_mesh_with_default_section_id((Gfx*) segmented_gfx_to_virtual(0x07000738), 1);
// func_80295C6C();
- // D_8015F8E4 = gCourseMinY - 10.0f;
+ // gWaterLevel = gCourseMinY - 10.0f;
// break;
// case COURSE_DK_JUNGLE:
// parse_course_displaylists(d_course_dks_jungle_parkway_addr);
// func_80295C6C();
- // D_8015F8E4 = -475.0f;
+ // gWaterLevel = -475.0f;
// // d_course_dks_jungle_parkway_packed_dl_3FA8
// find_vtx_and_set_colours(segmented_gfx_to_virtual(0x07003FA8), 120, 255, 255, 255);
// break;
@@ -1707,7 +1707,7 @@ void course_init(void) {
// // d_course_big_donut_packed_dl_230
// generate_collision_mesh_with_default_section_id((Gfx*) segmented_gfx_to_virtual(0x07000230), 6);
// func_80295C6C();
- // D_8015F8E4 = 100.0f;
+ // gWaterLevel = 100.0f;
// break;
// }
}
@@ -1719,13 +1719,13 @@ void func_802966A0(void) {
// switch (gCurrentCourseId) {
// case COURSE_KOOPA_BEACH:
// // clang-format off
- // if (D_8015F8E8 < 0.0f) {
- // if (D_8015F8E4 < -20.0f) { D_8015F8E8 *= -1.0f; }
+ // if (gWaterVelocity < 0.0f) {
+ // if (gWaterLevel < -20.0f) { gWaterVelocity *= -1.0f; }
// } else {
- // if (D_8015F8E4 > 0.0f) { D_8015F8E8 *= -1.0f; }
+ // if (gWaterLevel > 0.0f) { gWaterVelocity *= -1.0f; }
// }
// // clang-format on
- // D_8015F8E4 += D_8015F8E8;
+ // gWaterLevel += gWaterVelocity;
// D_802B87BC += 9;
// if (D_802B87BC > 255) {
@@ -1793,13 +1793,3 @@ void func_802966A0(void) {
// break;
// }
}
-
-void func_802969F8(void) {
- if (GetCourse() == GetMooMooFarm()) {
- D_8015F702 = 0;
- D_8015F700 = 200;
- } else if (GetCourse() == GetKoopaTroopaBeach()) {
- D_8015F8E8 = -0.1f;
- D_8015F8E4 = 0.0f;
- }
-}
diff --git a/src/racing/render_courses.h b/src/racing/render_courses.h
index dc9a26f63..cb11ad4c7 100644
--- a/src/racing/render_courses.h
+++ b/src/racing/render_courses.h
@@ -3,17 +3,11 @@
#include "code_800029B0.h"
#include "../camera.h"
-
-typedef struct {
- u32 addr;
- u8 surfaceType;
- u8 sectionId;
- u16 flags;
-} TrackSectionsI;
+#include <course.h>
void func_8029122C(struct UnkStruct_800DC5EC*, s32);
s32 func_80290C20(Camera*);
-void parse_course_displaylists(TrackSectionsI* asset);
+void parse_course_displaylists(TrackSections* asset);
void render_course_segments(const char*[], struct UnkStruct_800DC5EC*);
void func_80291198(void);
void render_mario_raceway_pipe(void);
@@ -35,7 +29,7 @@ void render_skyscraper(struct UnkStruct_800DC5EC*);
void render_double_deck(struct UnkStruct_800DC5EC*);
void render_dks_jungle_parkway(struct UnkStruct_800DC5EC*);
void render_big_donut(struct UnkStruct_800DC5EC*);
-void func_8029569C(void);
+void render_credits(void);
void course_init(void);
void render_course(struct UnkStruct_800DC5EC*);
void func_80295BF8(s32);
@@ -44,7 +38,6 @@ void func_80295D50(s16, s16);
void func_80295D6C(void);
void func_80295D88(void);
void func_802966A0(void);
-void func_802969F8(void);
extern s32 D_8015F59C;
diff --git a/src/racing/skybox_and_splitscreen.c b/src/racing/skybox_and_splitscreen.c
index d0d52f77e..77b1c03ff 100644
--- a/src/racing/skybox_and_splitscreen.c
+++ b/src/racing/skybox_and_splitscreen.c
@@ -854,6 +854,7 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) {
render_set_position(matrix, 0);
}
render_course_actors(screen);
+ CM_DrawStaticMeshActors();
render_object(mode);
switch (screenId) {
case 0: