Collision Documentation (#640)

* Collision related renames
This commit is contained in:
MegaMech
2024-06-26 19:22:38 -06:00
committed by GitHub
parent 975b96265c
commit 3d7cdcee8a
47 changed files with 2435 additions and 2415 deletions
+16 -16
View File
@@ -257,7 +257,7 @@ void actor_init(struct Actor *actor, Vec3f startingPos, Vec3s startingRot, Vec3f
actor->flags = actor->flags | 0x4000 | 0x1000;
actor->unk_08 = 0.35f;
actor->boundingBoxSize = 1.925f;
func_802ADDC8(&actor->unk30, 1.925f, actor->pos[0], actor->pos[1], actor->pos[2]);
check_bounding_collision(&actor->unk30, 1.925f, actor->pos[0], actor->pos[1], actor->pos[2]);
break;
case ACTOR_HOT_AIR_BALLOON_ITEM_BOX:
actor->flags |= 0x4000;
@@ -376,21 +376,21 @@ void func_80297760(struct Actor *arg0, Vec3f arg1) {
arg1[0] = arg0->pos[0];
arg1[1] = arg0->pos[1];
arg1[2] = arg0->pos[2];
arg1[1] = func_802ABE30(arg1[0], arg1[1], arg1[2], arg0->unk30.unk3A);
arg1[1] = calculate_surface_height(arg1[0], arg1[1], arg1[2], arg0->unk30.meshIndexZX);
}
void func_802977B0(Player *arg0) {
arg0->boundingBoxCorners[1].unk_14 |= 2;
arg0->boundingBoxCorners[0].unk_14 |= 2;
arg0->boundingBoxCorners[3].unk_14 |= 2;
arg0->boundingBoxCorners[2].unk_14 |= 2;
arg0->tyres[FRONT_RIGHT].unk_14 |= 2;
arg0->tyres[FRONT_LEFT].unk_14 |= 2;
arg0->tyres[BACK_RIGHT].unk_14 |= 2;
arg0->tyres[BACK_LEFT].unk_14 |= 2;
}
void func_802977E4(Player *arg0) {
arg0->boundingBoxCorners[1].unk_14 &= ~2 & 0xFFFF;
arg0->boundingBoxCorners[0].unk_14 &= ~2 & 0xFFFF;
arg0->boundingBoxCorners[3].unk_14 &= ~2 & 0xFFFF;
arg0->boundingBoxCorners[2].unk_14 &= ~2 & 0xFFFF;
arg0->tyres[FRONT_RIGHT].unk_14 &= ~2 & 0xFFFF;
arg0->tyres[FRONT_LEFT].unk_14 &= ~2 & 0xFFFF;
arg0->tyres[BACK_RIGHT].unk_14 &= ~2 & 0xFFFF;
arg0->tyres[BACK_LEFT].unk_14 &= ~2 & 0xFFFF;
}
// Invert green and red on green shell texture
@@ -565,7 +565,7 @@ void evaluate_collision_players_palm_trees(void) {
for (index = 0; index < 4; index++){
// wtf is up with the << 0x18 >> 0x18? is it some weird type conversion? just use & 0xFF have the same effect to keep 8 first bit
if (((gPlayers[index].type & 0xC000) != 0) && (((get_surface_type(gPlayers[index].unk_110.unk3A) << 24) >> 24) == GRASS)) {
if (((gPlayers[index].type & 0xC000) != 0) && (((get_surface_type(gPlayers[index].collision.meshIndexZX) << 24) >> 24) == GRASS)) {
evaluate_collision_player_palm_trees(&gPlayers[index]);
}
}
@@ -855,7 +855,7 @@ void spawn_palm_trees(struct ActorSpawnData *spawnData) {
temp_v1 = (struct PalmTree *) &gActorList[temp];
temp_v1->variant = temp_s0->someId;
func_802ADDC8((Collision *) &temp_v1->unk30, 5.0f, temp_v1->pos[0], temp_v1->pos[1], temp_v1->pos[2]);
check_bounding_collision((Collision *) &temp_v1->unk30, 5.0f, temp_v1->pos[0], temp_v1->pos[1], temp_v1->pos[2]);
func_802976EC((Collision *) &temp_v1->unk30, temp_v1->rot);
temp_s0++;
}
@@ -935,9 +935,9 @@ void spawn_foliage(struct ActorSpawnData *arg0) {
if (gGamestate == CREDITS_SEQUENCE) {
func_802976D8(temp_s0->rot);
} else {
func_802ADDC8(&temp_s0->unk30, 5.0f, temp_s0->pos[0], temp_s0->pos[1], temp_s0->pos[2]);
if (temp_s0->unk30.unk3C[2] < 0.0f) {
temp_s0->pos[1] = func_802ABE30(temp_s0->pos[0], temp_s0->pos[1], temp_s0->pos[2], temp_s0->unk30.unk3A);
check_bounding_collision(&temp_s0->unk30, 5.0f, temp_s0->pos[0], temp_s0->pos[1], temp_s0->pos[2]);
if (temp_s0->unk30.surfaceDistance[2] < 0.0f) {
temp_s0->pos[1] = calculate_surface_height(temp_s0->pos[0], temp_s0->pos[1], temp_s0->pos[2], temp_s0->unk30.meshIndexZX);
}
func_802976EC(&temp_s0->unk30, temp_s0->rot);
}
@@ -967,7 +967,7 @@ void spawn_all_item_boxes(struct ActorSpawnData *spawnData) {
startingRot[1] = random_u16();
startingRot[2] = random_u16();
temp_s1 = add_actor_to_empty_slot(startingPos, startingRot, startingVelocity, ACTOR_ITEM_BOX);
temp_f0 = func_802AE1C0(startingPos[0], startingPos[1] + 10.0f, startingPos[2]);
temp_f0 = spawn_actor_on_surface(startingPos[0], startingPos[1] + 10.0f, startingPos[2]);
// Should be struct ItemBox but not enough space in the stack.
// It's either the ItemBox or the SEGMENT/OFFSET variables.
+29 -29
View File
@@ -16,20 +16,20 @@
#include "effects.h"
#include "sounds.h"
void copy_collision(Collision *arg0, Collision *arg1) {
arg1->unk30 = arg0->unk30;
arg1->unk32 = arg0->unk32;
arg1->unk34 = arg0->unk34;
arg1->unk36 = arg0->unk36;
arg1->unk38 = arg0->unk38;
arg1->unk3A = arg0->unk3A;
arg1->unk3C[0] = arg0->unk3C[0];
arg1->unk3C[1] = arg0->unk3C[1];
arg1->unk3C[2] = arg0->unk3C[2];
void copy_collision(Collision *src, Collision *dest) {
dest->unk30 = src->unk30;
dest->unk32 = src->unk32;
dest->unk34 = src->unk34;
dest->meshIndexYX = src->meshIndexYX;
dest->meshIndexZY = src->meshIndexZY;
dest->meshIndexZX = src->meshIndexZX;
dest->surfaceDistance[0] = src->surfaceDistance[0];
dest->surfaceDistance[1] = src->surfaceDistance[1];
dest->surfaceDistance[2] = src->surfaceDistance[2];
vec3f_copy_return(arg1->unk48, arg0->unk48);
vec3f_copy_return(arg1->unk54, arg0->unk54);
vec3f_copy_return(arg1->orientationVector, arg0->orientationVector);
vec3f_copy_return(dest->unk48, src->unk48);
vec3f_copy_return(dest->unk54, src->unk54);
vec3f_copy_return(dest->orientationVector, src->orientationVector);
}
void triple_shell_actor_collide_with_player(struct ShellActor *shell, s32 shellType) {
@@ -572,7 +572,7 @@ s32 init_triple_shell(TripleShellParent *parent, Player *player, s16 shellType,
startingPos[0] = player->pos[0];
startingPos[1] = player->pos[1];
startingPos[2] = player->pos[2];
func_802AD950(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
actor_terrain_collision(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
func_802B4E30((struct Actor *)shell);
shell->flags = 0x9000;
switch (shellType) {
@@ -622,7 +622,7 @@ s32 use_green_shell_item(Player *player) {
startingPos[0] = player->pos[0];
startingPos[1] = player->pos[1];
startingPos[2] = player->pos[2];
func_802AD950(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
actor_terrain_collision(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
func_802B4E30((struct Actor *)shell);
shell->state = HELD_SHELL;
shell->rotVelocity = 0;
@@ -661,7 +661,7 @@ s32 use_red_shell_item(Player *player) {
startingPos[0] = player->pos[0];
startingPos[1] = player->pos[1];
startingPos[2] = player->pos[2];
func_802AD950(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
actor_terrain_collision(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
func_802B4E30((struct Actor *)shell);
shell->state = HELD_SHELL;
shell->rotVelocity = 0;
@@ -708,7 +708,7 @@ void func_802B2914(struct BananaBunchParent *banana_bunch, Player *player, s16 b
startingPos[0] = player->pos[0];
startingPos[1] = player->pos[1];
startingPos[2] = player->pos[2];
func_802AD950(&newBanana->unk30, newBanana->boundingBoxSize + 1.0f, newBanana->pos[0], newBanana->pos[1], newBanana->pos[2], startingPos[0], startingPos[1], startingPos[2]);
actor_terrain_collision(&newBanana->unk30, newBanana->boundingBoxSize + 1.0f, newBanana->pos[0], newBanana->pos[1], newBanana->pos[2], startingPos[0], startingPos[1], startingPos[2]);
func_802B4E30((struct Actor*)newBanana);
newBanana->flags = 0x9000;
newBanana->playerId = player - gPlayerOne;
@@ -960,19 +960,19 @@ void check_player_use_item(void) {
#include "actors/blue_and_red_shells/update.inc.c"
void func_802B4E30(struct Actor *arg0) {
if ((arg0->unk30.unk3C[2] < 0.0f) && (arg0->unk30.unk34 == 1)) {
arg0->pos[0] -= (arg0->unk30.orientationVector[0] * arg0->unk30.unk3C[2]);
arg0->pos[1] -= (arg0->unk30.orientationVector[1] * arg0->unk30.unk3C[2]);
arg0->pos[2] -= (arg0->unk30.orientationVector[2] * arg0->unk30.unk3C[2]);
if ((arg0->unk30.surfaceDistance[2] < 0.0f) && (arg0->unk30.unk34 == 1)) {
arg0->pos[0] -= (arg0->unk30.orientationVector[0] * arg0->unk30.surfaceDistance[2]);
arg0->pos[1] -= (arg0->unk30.orientationVector[1] * arg0->unk30.surfaceDistance[2]);
arg0->pos[2] -= (arg0->unk30.orientationVector[2] * arg0->unk30.surfaceDistance[2]);
}
if ((arg0->unk30.unk3C[0] < 0.0f) && (arg0->unk30.unk30 == 1)) {
arg0->pos[0] -= (arg0->unk30.unk48[0] * arg0->unk30.unk3C[0]);
arg0->pos[1] -= (arg0->unk30.unk48[1] * arg0->unk30.unk3C[0]);
arg0->pos[2] -= (arg0->unk30.unk48[2] * arg0->unk30.unk3C[0]);
if ((arg0->unk30.surfaceDistance[0] < 0.0f) && (arg0->unk30.unk30 == 1)) {
arg0->pos[0] -= (arg0->unk30.unk48[0] * arg0->unk30.surfaceDistance[0]);
arg0->pos[1] -= (arg0->unk30.unk48[1] * arg0->unk30.surfaceDistance[0]);
arg0->pos[2] -= (arg0->unk30.unk48[2] * arg0->unk30.surfaceDistance[0]);
}
if ((arg0->unk30.unk3C[1] < 0.0f) && (arg0->unk30.unk32 == 1)) {
arg0->pos[0] -= (arg0->unk30.unk54[0] * arg0->unk30.unk3C[1]);
arg0->pos[1] -= (arg0->unk30.unk54[1] * arg0->unk30.unk3C[1]);
arg0->pos[2] -= (arg0->unk30.unk54[2] * arg0->unk30.unk3C[1]);
if ((arg0->unk30.surfaceDistance[1] < 0.0f) && (arg0->unk30.unk32 == 1)) {
arg0->pos[0] -= (arg0->unk30.unk54[0] * arg0->unk30.surfaceDistance[1]);
arg0->pos[1] -= (arg0->unk30.unk54[1] * arg0->unk30.surfaceDistance[1]);
arg0->pos[2] -= (arg0->unk30.unk54[2] * arg0->unk30.surfaceDistance[1]);
}
}
+673 -676
View File
File diff suppressed because it is too large Load Diff
+12 -12
View File
@@ -9,28 +9,28 @@
void nullify_displaylist(uintptr_t);
void func_802AAAAC(Collision*);
f32 func_802AAB4C(Player*);
s32 func_802AAE4C(Collision*, f32, f32, f32, f32, u16);
s32 func_802AB288(Collision*, f32, f32, f32, f32, u16);
s32 func_802AB6C4(Collision*, f32, f32, f32, f32, u16);
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);
s8 get_surface_type(u16);
s16 func_802ABD40(u16);
s16 get_section_id(u16);
s16 func_802ABD7C(u16);
s16 func_802ABDB8(u16);
s16 func_802ABDF4(u16);
f32 func_802ABE30(f32, f32, f32, u16);
f32 calculate_surface_height(f32, f32, f32, u16);
f32 func_802ABEAC(Collision*, Vec3f);
void shell_collision(Collision *, Vec3f);
void process_shell_collision(Vec3f, f32, Vec3f, f32);
u16 process_collision(Player*, KartBoundingBoxCorner*, f32, f32, f32);
void func_802AC114(Vec3f, f32, Vec3f, f32);
s32 func_802AC22C(KartBoundingBoxCorner*);
u16 func_802AD950(Collision*, f32, f32, f32, f32, f32, f32, f32);
u16 func_802ADDC8(Collision*, f32, f32, f32, f32);
f32 func_802AE1C0(f32, f32, f32);
u16 process_collision(Player*, KartTyre*, f32, f32, f32);
void adjust_pos_orthogonally(Vec3f, f32, Vec3f, f32);
s32 detect_tyre_collision(KartTyre*);
u16 actor_terrain_collision(Collision*, f32, f32, f32, f32, f32, f32, f32);
u16 check_bounding_collision(Collision*, f32, f32, f32, f32);
f32 spawn_actor_on_surface(f32, f32, f32);
void set_vtx_buffer(uintptr_t, u32, u32);
s32 is_line_intersecting_rectangle(s16, s16, s16, s16, s16, s16, s16, s16);
s32 is_triangle_intersecting_bounding_box(s16, s16, s16, s16, u16);
void func_802AF314(void);
void generate_collision_grid(void);
void generate_collision_mesh_with_defaults(Gfx*);
void generate_collision_mesh_with_default_section_id(Gfx*, s8);
void generate_collision_mesh(Gfx*, s8, u16);
+9 -9
View File
@@ -1202,16 +1202,16 @@ void func_802B8614(Player *arg0) {
f64 temp_f4;
f64 temp_f6;
temp_f6 = (f64) arg0->boundingBoxCorners[1].cornerPos[0];
temp_f6 = (f64) arg0->tyres[FRONT_RIGHT].pos[0];
sp78 = temp_f6;
sp70 = (f64) arg0->boundingBoxCorners[1].cornerGroundY;
sp68 = (f64) arg0->boundingBoxCorners[1].cornerPos[2];
temp_f30 = (f64) arg0->boundingBoxCorners[0].cornerPos[0];
sp58 = (f64) arg0->boundingBoxCorners[0].cornerGroundY;
sp50 = (f64) arg0->boundingBoxCorners[0].cornerPos[2];
sp48 = (f64) arg0->boundingBoxCorners[3].cornerPos[0];
sp40 = (f64) arg0->boundingBoxCorners[3].cornerGroundY;
temp_f4 = (f64) arg0->boundingBoxCorners[3].cornerPos[2];
sp70 = (f64) arg0->tyres[FRONT_RIGHT].baseHeight;
sp68 = (f64) arg0->tyres[FRONT_RIGHT].pos[2];
temp_f30 = (f64) arg0->tyres[FRONT_LEFT].pos[0];
sp58 = (f64) arg0->tyres[FRONT_LEFT].baseHeight;
sp50 = (f64) arg0->tyres[FRONT_LEFT].pos[2];
sp48 = (f64) arg0->tyres[BACK_RIGHT].pos[0];
sp40 = (f64) arg0->tyres[BACK_RIGHT].baseHeight;
temp_f4 = (f64) arg0->tyres[BACK_RIGHT].pos[2];
temp_f2 = sp58 - sp70;
sp38 = temp_f4;
temp_f12 = temp_f4 - sp50;
+21 -21
View File
@@ -31,13 +31,13 @@ s16 D_802B87D4 = 0;
s16 currentScreenSection = 0;
s32 func_80290C20(Camera *camera) {
if (camera->unk_54.unk34 == 0) {
if (camera->collision.unk34 == 0) {
return 1;
}
if ((camera->unk_54.unk30 == 1) && (camera->unk_54.unk3C[0] < 3.0f)) {
if ((camera->collision.unk30 == 1) && (camera->collision.surfaceDistance[0] < 3.0f)) {
return 1;
}
if ((camera->unk_54.unk32 == 1) && (camera->unk_54.unk3C[1] < 3.0f)) {
if ((camera->collision.unk32 == 1) && (camera->collision.surfaceDistance[1] < 3.0f)) {
return 1;
}
return 0;
@@ -116,19 +116,19 @@ void render_course_segments(uintptr_t addr, struct UnkStruct_800DC5EC *arg1) {
arg1->playerDirection = var_a3;
if (D_80152300[camera - camera1] == 1) {
sp1E = func_802ABD40(camera->unk_54.unk3A);
temp_v0_3 = func_802ABD40(player->unk_110.unk3A);
sp1E = get_section_id(camera->collision.meshIndexZX);
temp_v0_3 = get_section_id(player->collision.meshIndexZX);
index = sp1E - temp_v0_3;
if ((index < 2) && (index >= -1)) {
if (sp1E == 255) {
if (temp_v0_3 == 255) {
index = arg1->pathCounter;
} else if (player->unk_110.unk3C[2] > 30.0f) {
} else if (player->collision.surfaceDistance[2] > 30.0f) {
index = arg1->pathCounter;
} else {
index = temp_v0_3;
}
} else if (camera->unk_54.unk3C[2] > 30.0f) {
} else if (camera->collision.surfaceDistance[2] > 30.0f) {
index = arg1->pathCounter;
} else {
index = sp1E;
@@ -161,7 +161,7 @@ void render_course_segments(uintptr_t addr, struct UnkStruct_800DC5EC *arg1) {
default:
if (temp_v0_3 == 255) {
index = arg1->pathCounter;
} else if (player->unk_110.unk3C[2] > 30.0f) {
} else if (player->collision.surfaceDistance[2] > 30.0f) {
index = arg1->pathCounter;
} else {
index = temp_v0_3;
@@ -170,8 +170,8 @@ void render_course_segments(uintptr_t addr, struct UnkStruct_800DC5EC *arg1) {
}
}
} else {
index = func_802ABD40(camera->unk_54.unk3A);
if (camera->unk_54.unk3C[2] > 30.0f) {
index = get_section_id(camera->collision.meshIndexZX);
if (camera->collision.surfaceDistance[2] > 30.0f) {
index = arg1->pathCounter;
} else if (index == 255) {
index = arg1->pathCounter;
@@ -1369,16 +1369,16 @@ void render_course(struct UnkStruct_800DC5EC *arg0) {
void func_80295BF8(s32 playerIndex) {
Player* player = &gPlayers[playerIndex];
func_802AAAAC(&player->unk_110);
player->boundingBoxCorners[FRONT_RIGHT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[FRONT_LEFT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[BACK_RIGHT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[BACK_LEFT_TYRE].surfaceFlags = 0;
func_802AAAAC(&player->collision);
player->tyres[FRONT_RIGHT].surfaceFlags = 0;
player->tyres[FRONT_LEFT].surfaceFlags = 0;
player->tyres[BACK_RIGHT].surfaceFlags = 0;
player->tyres[BACK_LEFT].surfaceFlags = 0;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].collisionMeshIndex = 0x1388;
player->boundingBoxCorners[FRONT_LEFT_TYRE].collisionMeshIndex = 0x1388;
player->boundingBoxCorners[BACK_RIGHT_TYRE].collisionMeshIndex = 0x1388;
player->boundingBoxCorners[BACK_LEFT_TYRE].collisionMeshIndex = 0x1388;
player->tyres[FRONT_RIGHT].collisionMeshIndex = 0x1388;
player->tyres[FRONT_LEFT].collisionMeshIndex = 0x1388;
player->tyres[BACK_RIGHT].collisionMeshIndex = 0x1388;
player->tyres[BACK_LEFT].collisionMeshIndex = 0x1388;
}
void func_80295C6C(void) {
@@ -1388,8 +1388,8 @@ void func_80295C6C(void) {
gCourseMinX += -20;
gCourseMinZ += -20;
gCourseMinY += -20;
func_802AF314();
gNextFreeMemoryAddress += ALIGN16(D_8015F58A * 2);
generate_collision_grid();
gNextFreeMemoryAddress += ALIGN16(gNumCollisionTriangles * 2);
}
UNUSED void func_80295D50(s16 arg0, s16 arg1) {
+1 -1
View File
@@ -49,6 +49,6 @@ extern Lights1 D_800DC610[];
extern Lights1 D_800DC610[]; // Light data?
extern u16 D_8015F58A;
extern u16 gNumCollisionTriangles;
#endif