diff options
| author | coco875 <59367621+coco875@users.noreply.github.com> | 2024-09-11 00:20:55 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-10 16:20:55 -0600 |
| commit | b36b9e318095e0ae5fc720319a55418d9aa5a4c3 (patch) | |
| tree | 1f0b6e5784ba248722a86c464cf32dd9f4a1518e /src | |
| parent | 47e95c0e182ed21486648d88e2ce52aa05d2fe7c (diff) | |
[enhancement] Disable Culling (#58)
* less intrusif possible way to disable culling
* forget cloud and star
* some change and add gFarFrustrum
* reduce range of gFarFrustrum
* minor rename of a CVar
---------
Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
Diffstat (limited to 'src')
28 files changed, 162 insertions, 6 deletions
diff --git a/src/actors/banana/render.inc.c b/src/actors/banana/render.inc.c index ae87fc48d..e33938bd2 100644 --- a/src/actors/banana/render.inc.c +++ b/src/actors/banana/render.inc.c @@ -17,6 +17,9 @@ void render_actor_banana(Camera* camera, UNUSED Mat4 arg1, struct BananaActor* b f32 temp = is_within_render_distance(camera->pos, banana->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 490000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp = MAX(temp, 0.0f); + } if (temp < 0.0f) { actor_not_rendered(camera, (struct Actor*) banana); return; diff --git a/src/actors/box_truck/render.inc.c b/src/actors/box_truck/render.inc.c index b18b22643..bf5df9e30 100644 --- a/src/actors/box_truck/render.inc.c +++ b/src/actors/box_truck/render.inc.c @@ -18,6 +18,9 @@ void render_actor_box_truck(Camera* arg0, struct Actor* arg1) { UNUSED s32 pad2[32]; f32 temp_f0 = is_within_render_distance(arg0->pos, arg1->pos, arg0->rot[1], 2500.0f, gCameraZoom[arg0 - camera1], 9000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } if (temp_f0 < 0.0f) { return; } diff --git a/src/actors/car/render.inc.c b/src/actors/car/render.inc.c index 3ac8ec1c1..a00a8d4a7 100644 --- a/src/actors/car/render.inc.c +++ b/src/actors/car/render.inc.c @@ -17,6 +17,9 @@ void render_actor_car(Camera* arg0, struct Actor* arg1) { UNUSED s32 pad2[32]; f32 temp_f0 = is_within_render_distance(arg0->pos, arg1->pos, arg0->rot[1], 2500.0f, gCameraZoom[arg0 - camera1], 9000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } if (!(temp_f0 < 0.0f)) { if (CVarGetInteger("gDisableLod", 0) == 1) { diff --git a/src/actors/cow/render.inc.c b/src/actors/cow/render.inc.c index 0cf347530..e55154c03 100644 --- a/src/actors/cow/render.inc.c +++ b/src/actors/cow/render.inc.c @@ -14,7 +14,8 @@ */ void render_actor_cow(Camera* camera, Mat4 arg1, struct Actor* arg2) { if (is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], - 4000000.0f) < 0) { + 4000000.0f) < 0 && + CVarGetInteger("gNoCulling", 0) == 0) { return; } diff --git a/src/actors/fake_item_box/render.inc.c b/src/actors/fake_item_box/render.inc.c index 0ef7e6e69..7d0dab71e 100644 --- a/src/actors/fake_item_box/render.inc.c +++ b/src/actors/fake_item_box/render.inc.c @@ -25,7 +25,8 @@ void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) f32 someMultiplier; if (is_within_render_distance(camera->pos, fakeItemBox->pos, camera->rot[1], 2500.0f, gCameraZoom[camera - camera1], - 1000000.0f) < 0) { + 1000000.0f) < 0 && + CVarGetInteger("gNoCulling", 0) == 0) { actor_not_rendered(camera, (struct Actor*) fakeItemBox); return; } diff --git a/src/actors/falling_rock/render.inc.c b/src/actors/falling_rock/render.inc.c index b9beb5ec6..b7a23088b 100644 --- a/src/actors/falling_rock/render.inc.c +++ b/src/actors/falling_rock/render.inc.c @@ -23,6 +23,10 @@ void render_actor_falling_rock(Camera* camera, struct FallingRock* rock) { height = is_within_render_distance(camera->pos, rock->pos, camera->rot[1], 400.0f, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + height = CLAMP(height, 0.0f, 250000.0f); + } + if (height < 0.0f) { return; } diff --git a/src/actors/item_box/render.inc.c b/src/actors/item_box/render.inc.c index 7024709d7..d4a96a0e3 100644 --- a/src/actors/item_box/render.inc.c +++ b/src/actors/item_box/render.inc.c @@ -28,6 +28,9 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { temp_f0 = is_within_render_distance(camera->pos, item_box->pos, camera->rot[1], 0.0f, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = CLAMP(temp_f0, 0.0f, 600000.0f); + } if (!(temp_f0 < 0.0f) && !(600000.0f < temp_f0)) { if ((item_box->state == 2) && (temp_f0 < 100000.0f)) { someRot[0] = 0; diff --git a/src/actors/mario_sign/render.inc.c b/src/actors/mario_sign/render.inc.c index a58668a4b..1c72c8394 100644 --- a/src/actors/mario_sign/render.inc.c +++ b/src/actors/mario_sign/render.inc.c @@ -20,6 +20,9 @@ void render_actor_mario_sign(Camera* arg0, UNUSED Mat4 arg1, struct Actor* arg2) } unk = is_within_render_distance(arg0->pos, arg2->pos, arg0->rot[1], 0, gCameraZoom[arg0 - camera1], 16000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + unk = MAX(unk, 0.0f); + } if (!(unk < 0.0f)) { gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH); gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); diff --git a/src/actors/paddle_boat/render.inc.c b/src/actors/paddle_boat/render.inc.c index 8f0f5353a..26d65f160 100644 --- a/src/actors/paddle_boat/render.inc.c +++ b/src/actors/paddle_boat/render.inc.c @@ -32,6 +32,10 @@ void render_actor_paddle_boat(Camera* arg0, struct PaddleWheelBoat* boat, UNUSED temp = is_within_render_distance(arg0->pos, boat->pos, arg0->rot[1], 90000.0f, gCameraZoom[arg0 - camera1], 9000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp = MAX(temp, 0.0f); + } + if (temp < 0.0f) { return; } diff --git a/src/actors/palm_tree/render.inc.c b/src/actors/palm_tree/render.inc.c index e551e8c86..064e0fe13 100644 --- a/src/actors/palm_tree/render.inc.c +++ b/src/actors/palm_tree/render.inc.c @@ -23,6 +23,10 @@ void render_actor_palm_tree(Camera* arg0, UNUSED Mat4 arg1, struct PalmTree* arg temp_f0 = is_within_render_distance(arg0->pos, arg2->pos, arg0->rot[1], 0.0f, gCameraZoom[arg0 - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (!(temp_f0 < 0.0f)) { if (((temp_v0 & 0x400) == 0) && (temp_f0 < 250000.0f)) { func_8029794C(arg2->pos, arg2->rot, 2.0f); diff --git a/src/actors/piranha_plant/render.inc.c b/src/actors/piranha_plant/render.inc.c index b14fd5d63..88838f603 100644 --- a/src/actors/piranha_plant/render.inc.c +++ b/src/actors/piranha_plant/render.inc.c @@ -27,6 +27,10 @@ void render_actor_piranha_plant(Camera* arg0, Mat4 arg1, struct PiranhaPlant* ar temp_f0 = is_within_render_distance(arg0->pos, arg2->pos, arg0->rot[1], 0, gCameraZoom[arg0 - camera1], 1000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { switch (temp_lo) { diff --git a/src/actors/railroad_crossing/render.inc.c b/src/actors/railroad_crossing/render.inc.c index 3fe9eb98a..e91f56438 100644 --- a/src/actors/railroad_crossing/render.inc.c +++ b/src/actors/railroad_crossing/render.inc.c @@ -16,6 +16,10 @@ void render_actor_railroad_crossing(Camera* arg0, struct RailroadCrossing* rr_cr f32 unk = is_within_render_distance(arg0->pos, rr_crossing->pos, arg0->rot[1], 0.0f, gCameraZoom[arg0 - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + unk = MAX(unk, 0.0f); + } + if (!(unk < 0.0f)) { mtxf_pos_rotation_xyz(sp40, rr_crossing->pos, rr_crossing->rot); diff --git a/src/actors/school_bus/render.inc.c b/src/actors/school_bus/render.inc.c index 47c40ef1f..da9014033 100644 --- a/src/actors/school_bus/render.inc.c +++ b/src/actors/school_bus/render.inc.c @@ -19,6 +19,11 @@ void render_actor_school_bus(Camera* arg0, struct Actor* arg1) { temp_f0 = is_within_render_distance(arg0->pos, arg1->pos, arg0->rot[1], 2500.0f, gCameraZoom[arg0 - camera1], 9000000.0f); + + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } diff --git a/src/actors/tanker_truck/render.inc.c b/src/actors/tanker_truck/render.inc.c index f28eb60de..7411b3315 100644 --- a/src/actors/tanker_truck/render.inc.c +++ b/src/actors/tanker_truck/render.inc.c @@ -17,6 +17,10 @@ void render_actor_tanker_truck(Camera* camera, struct Actor* arg1) { f32 temp_f0 = is_within_render_distance(camera->pos, arg1->pos, camera->rot[1], 2500.0f, gCameraZoom[camera - camera1], 9000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (!(temp_f0 < 0.0f)) { if (CVarGetInteger("gDisableLod", 0) == 1) { diff --git a/src/actors/train/render.inc.c b/src/actors/train/render.inc.c index 4f4c26d6a..174a0ab29 100644 --- a/src/actors/train/render.inc.c +++ b/src/actors/train/render.inc.c @@ -22,6 +22,10 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) { f32 distance = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 2500.0f, gCameraZoom[camera - camera1], 9000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + distance = MAX(distance, 0.0f); + } + if (distance < 0.0f) { return; } @@ -173,6 +177,10 @@ void render_actor_train_tender(Camera* camera, struct TrainCar* actor) { f32 temp_f0 = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 625.0f, gCameraZoom[camera - camera1], 9000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -262,6 +270,10 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) { f32 temp_f0 = is_within_render_distance(camera->pos, actor->pos, camera->rot[1], 2025.0f, gCameraZoom[camera - camera1], 9000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } diff --git a/src/actors/trees/render.inc.c b/src/actors/trees/render.inc.c index 21f39c180..e3042a8f3 100644 --- a/src/actors/trees/render.inc.c +++ b/src/actors/trees/render.inc.c @@ -24,6 +24,10 @@ void render_actor_tree_mario_raceway(Camera* camera, Mat4 arg1, struct Actor* ar temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 16000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -59,6 +63,10 @@ void render_actor_tree_yoshi_valley(Camera* camera, Mat4 arg1, struct Actor* arg temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -94,6 +102,10 @@ void render_actor_tree_royal_raceway(Camera* camera, Mat4 arg1, struct Actor* ar temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -129,6 +141,10 @@ void render_actor_tree_moo_moo_farm(Camera* camera, Mat4 arg1, struct Actor* arg temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 6250000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -158,6 +174,10 @@ void func_80299864(Camera* camera, Mat4 arg1, struct Actor* arg2) { temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -212,6 +232,10 @@ void render_actor_tree_bowser_castle(Camera* camera, Mat4 arg1, struct Actor* ar temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -247,6 +271,10 @@ void render_actor_bush_bowser_castle(Camera* camera, Mat4 arg1, struct Actor* ar temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 640000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -282,6 +310,10 @@ void render_actor_tree_frappe_snowland(Camera* camera, Mat4 arg1, struct Actor* temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -316,6 +348,10 @@ void render_actor_tree_cactus1_kalimari_desert(Camera* camera, Mat4 arg1, struct temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -350,6 +386,10 @@ void render_actor_tree_cactus2_kalimari_desert(Camera* camera, Mat4 arg1, struct temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } @@ -384,6 +424,10 @@ void render_actor_tree_cactus3_kalimari_desert(Camera* camera, Mat4 arg1, struct temp_f0 = is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 4000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } diff --git a/src/actors/wario_sign/render.inc.c b/src/actors/wario_sign/render.inc.c index 9327bfbe6..3658b7efb 100644 --- a/src/actors/wario_sign/render.inc.c +++ b/src/actors/wario_sign/render.inc.c @@ -15,6 +15,10 @@ void render_actor_wario_sign(Camera* arg0, struct Actor* arg1) { f32 unk = is_within_render_distance(arg0->pos, arg1->pos, arg0->rot[1], 0, gCameraZoom[arg0 - camera1], 16000000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + unk = MAX(unk, 0.0f); + } + if (!(unk < 0.0f)) { gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH); gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); diff --git a/src/actors/yoshi_egg/render.inc.c b/src/actors/yoshi_egg/render.inc.c index 6c2a7a0cc..1dd53965d 100644 --- a/src/actors/yoshi_egg/render.inc.c +++ b/src/actors/yoshi_egg/render.inc.c @@ -21,6 +21,11 @@ void render_actor_yoshi_egg(Camera* arg0, Mat4 arg1, struct YoshiValleyEgg* egg, if (gGamestate != CREDITS_SEQUENCE) { temp_f0 = is_within_render_distance(arg0->pos, egg->pos, arg0->rot[1], 200.0f, gCameraZoom[arg0 - camera1], 16000000.0f); + + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = MAX(temp_f0, 0.0f); + } + if (temp_f0 < 0.0f) { return; } diff --git a/src/code_80005FD0.c b/src/code_80005FD0.c index 0053a4b16..ffacdf4e4 100644 --- a/src/code_80005FD0.c +++ b/src/code_80005FD0.c @@ -667,6 +667,10 @@ s32 set_vehicle_render_distance_flags(Vec3f vehiclePos, f32 renderDistance, s32 } } } + if (CVarGetInteger("gNoCulling", 0) == 1) { + flag |= (RENDER_VEHICLE << PLAYER_ONE) | (RENDER_VEHICLE << PLAYER_TWO) | (RENDER_VEHICLE << PLAYER_THREE) | + (RENDER_VEHICLE << PLAYER_FOUR); + } return flag; } diff --git a/src/code_80086E70.c b/src/code_80086E70.c index db5aa3171..e138aed68 100644 --- a/src/code_80086E70.c +++ b/src/code_80086E70.c @@ -1306,6 +1306,10 @@ bool is_object_visible_on_camera(s32 objectIndex, Camera* camera, u16 angle) { u16 temp_t2; s32 var_t0; + if (CVarGetInteger("gNoCulling", 0) == 1) { + return true; + } + var_t0 = false; temp_t2 = (get_angle_between_xy(camera->pos[0], gObjectList[objectIndex].pos[0], camera->pos[2], gObjectList[objectIndex].pos[2]) + @@ -1325,6 +1329,9 @@ void func_8008A1D0(s32 objectIndex, s32 cameraId, s32 arg2, s32 arg3) { camera = &camera1[cameraId]; set_object_flag_status_false(objectIndex, 0x00100000 | VISIBLE); temp_v0 = get_horizontal_distance_to_camera(objectIndex, camera); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_v0 = MIN(temp_v0, arg3 * arg3); + } if (temp_v0 < 0x2711U) { var_a2 = 0x5555; } else if (temp_v0 < 0x9C41U) { @@ -1368,6 +1375,9 @@ s32 func_8008A364(s32 objectIndex, s32 cameraId, u16 arg2, s32 arg3) { camera = &camera1[cameraId]; set_object_flag_status_false(objectIndex, 0x00020000 | VISIBLE); dist = get_horizontal_distance_to_camera(objectIndex, camera); + if (CVarGetInteger("gNoCulling", 0) == 1) { + dist = MIN(dist, (arg3 * arg3) - 1); + } if (dist < (arg3 * arg3)) { set_object_flag_status_true(objectIndex, 0x00020000); if (dist < 0x2711U) { diff --git a/src/main.h b/src/main.h index 55611629f..2faec36f6 100644 --- a/src/main.h +++ b/src/main.h @@ -11,7 +11,7 @@ #define MESG_START_GFX_SPTASK 103 #define MESG_NMI_REQUEST 104 -#define MTX_HUD_POOL_SIZE 800 +#define MTX_HUD_POOL_SIZE 1600 #ifdef AVOID_UB #define MTX_HUD_POOL_SIZE_MAX MTX_HUD_POOL_SIZE diff --git a/src/math_util_2.c b/src/math_util_2.c index 2a6a681ba..3e0346b80 100644 --- a/src/math_util_2.c +++ b/src/math_util_2.c @@ -456,6 +456,10 @@ bool is_particle_on_screen(Vec3f arg0, Camera* arg1, u16 arg2) { u16 temp_t9; s32 ret; + if (CVarGetInteger("gNoCulling", 0) == 1) { + return true; + } + ret = false; temp_t9 = (get_angle_between_xy(arg1->pos[0], arg0[0], arg1->pos[2], arg0[2]) + (arg2 / 2)) - arg1->rot[1]; if ((temp_t9 >= 0) && (arg2 >= temp_t9)) { diff --git a/src/os/guPerspectiveF.c b/src/os/guPerspectiveF.c index 1a6150a68..062d42751 100644 --- a/src/os/guPerspectiveF.c +++ b/src/os/guPerspectiveF.c @@ -4,6 +4,9 @@ void guPerspectiveF(float mf[4][4], u16* perspNorm, float fovy, float aspect, fl float yscale; int row; int col; + if (CVarGetInteger("gNoCulling", 0)) { + far = CVarGetFloat("gFarFrustrum", 10000.0f); + } guMtxIdentF(mf); fovy *= GU_PI / 180.0; yscale = cosf(fovy / 2) / sinf(fovy / 2); diff --git a/src/port/ui/ImguiUI.cpp b/src/port/ui/ImguiUI.cpp index a4f39a1ad..69d3d82e9 100644 --- a/src/port/ui/ImguiUI.cpp +++ b/src/port/ui/ImguiUI.cpp @@ -463,6 +463,10 @@ void DrawEnhancementsMenu() { { .tooltip = "Renders game objects regardless of camera distance" }); UIWidgets::CVarCheckbox("Select any star from menu", "gCompletedGame", { .tooltip = "Unlocks extra mode and sets all gold cups." }); + UIWidgets::CVarCheckbox("Disable Culling", "gNoCulling", { .tooltip = "Disable original culling of mk64" }); + UIWidgets::CVarSliderFloat( + "Far Frustrum", "gFarFrustrum", 0.0f, 10000.0f, 10000.0f, + { .tooltip = "Say how Far the Frustrum are when 'Disable Culling' are enable", .step = 10.0f }); ImGui::EndMenu(); } diff --git a/src/racing/actors.c b/src/racing/actors.c index 164c82fba..38a4b5438 100644 --- a/src/racing/actors.c +++ b/src/racing/actors.c @@ -630,7 +630,8 @@ void render_palm_trees(Camera* camera, Mat4 arg1, UNUSED struct Actor* actor) { spD4[2] = var_s1->pos[2]; if (is_within_render_distance(camera->pos, spD4, camera->rot[1], 0.0f, gCameraZoom[camera - camera1], var_f22) < - 0.0f) { + 0.0f && + CVarGetInteger("gNoCulling", 0) == 0) { var_s1++; continue; } @@ -691,6 +692,9 @@ void render_actor_shell(Camera* camera, Mat4 matrix, struct ShellActor* shell) { f32 temp_f0 = is_within_render_distance(camera->pos, shell->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], 490000.0f); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_f0 = CLAMP(temp_f0, 0.0f, 40000.0f); + } s32 maxObjectsReached; if (temp_f0 < 0.0f) { actor_not_rendered(camera, (struct Actor*) shell); @@ -754,7 +758,8 @@ UNUSED void func_8029ABD4(f32* pos, s16 state) { void func_8029AC18(Camera* camera, Mat4 arg1, struct Actor* arg2) { if (is_within_render_distance(camera->pos, arg2->pos, camera->rot[1], 0, gCameraZoom[camera - camera1], - 4000000.0f) < 0) { + 4000000.0f) < 0 && + CVarGetInteger("gNoCulling", 0) == 0) { return; } diff --git a/src/render_objects.c b/src/render_objects.c index f1fd51f9b..8ea3f0080 100644 --- a/src/render_objects.c +++ b/src/render_objects.c @@ -3359,6 +3359,9 @@ void render_object_boos(s32 arg0) { objectIndex = indexObjectList3[someIndex]; if (gObjectList[objectIndex].state >= 2) { temp_s2 = func_8008A364(objectIndex, arg0, 0x4000U, 0x00000320); + if (CVarGetInteger("gNoCulling", 0) == 1) { + temp_s2 = MIN(temp_s2, 0x15F91U); + } if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { func_800523B8(objectIndex, arg0, temp_s2); } @@ -4171,7 +4174,7 @@ void render_object_seagulls(s32 arg0) { for (i = 0; i < NUM_SEAGULLS; i++) { var_s1 = indexObjectList2[i]; - if (func_8008A364(var_s1, arg0, 0x5555U, 0x000005DC) < 0x9C401) { + if (func_8008A364(var_s1, arg0, 0x5555U, 0x000005DC) < 0x9C401 && CVarGetInteger("gNoCulling", 0) == 0) { D_80165908 = 1; func_800722A4(var_s1, 2); } @@ -4232,6 +4235,9 @@ void render_object_hedgehogs(s32 arg0) { for (someIndex = 0; someIndex < NUM_HEDGEHOGS; someIndex++) { test = indexObjectList2[someIndex]; something = func_8008A364(test, arg0, 0x4000U, 0x000003E8); + if (CVarGetInteger("gNoCulling", 0) == 1) { + something = MIN(something, 0x52211U - 1); + } if (is_obj_flag_status_active(test, VISIBLE) != 0) { set_object_flag_status_true(test, 0x00200000); if (something < 0x2711U) { diff --git a/src/render_player.c b/src/render_player.c index 17d04c016..990be011d 100644 --- a/src/render_player.c +++ b/src/render_player.c @@ -110,6 +110,10 @@ u16 check_player_camera_collision(Player* player, Camera* camera, f32 arg2, f32 s16 var_v0; u16 ret; + if (CVarGetInteger("gNoCulling", 0) == 1) { + return true; + } + ret = false; switch (gActiveScreenMode) { /* irregular */ case SCREEN_MODE_1P: diff --git a/src/update_objects.c b/src/update_objects.c index 325436100..2c3c2481f 100644 --- a/src/update_objects.c +++ b/src/update_objects.c @@ -2788,6 +2788,11 @@ void func_800788F8(s32 objectIndex, u16 rot, Camera* camera) { set_object_flag_status_true(objectIndex, 0x00000010); return; } + if (CVarGetInteger("gNoCulling", 0) == 1) { + gObjectList[objectIndex].unk_09C = (D_8018D218 + (D_8018D1E8 * temp_v0)); + set_object_flag_status_true(objectIndex, 0x00000010); + return; + } set_object_flag_status_false(objectIndex, 0x00000010); } |
