diff options
| author | MegaMech <MegaMech@users.noreply.github.com> | 2025-05-14 18:30:32 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-14 18:30:32 -0600 |
| commit | 32632cacdb316d7f2d3b6ecdb634f0ef9aebadf0 (patch) | |
| tree | d374a84675fc0f49100c275aa34828bc9db538f8 /src/racing | |
| parent | 70f049cb6c326dede27e0ba7e88ac0d67b7651a4 (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.c | 101 | ||||
| -rw-r--r-- | src/racing/actors.h | 1 | ||||
| -rw-r--r-- | src/racing/collision.c | 188 | ||||
| -rw-r--r-- | src/racing/collision.h | 2 | ||||
| -rw-r--r-- | src/racing/framebuffer_effects.c | 35 | ||||
| -rw-r--r-- | src/racing/math_util.c | 17 | ||||
| -rw-r--r-- | src/racing/math_util.h | 2 | ||||
| -rw-r--r-- | src/racing/memory.c | 1 | ||||
| -rw-r--r-- | src/racing/render_courses.c | 90 | ||||
| -rw-r--r-- | src/racing/render_courses.h | 13 | ||||
| -rw-r--r-- | src/racing/skybox_and_splitscreen.c | 1 |
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: |
