Mario Kart 64
Loading...
Searching...
No Matches
collision.c File Reference
#include <ultra64.h>
#include <macros.h>
#include <PR/gbi.h>
#include <mk64.h>
#include <common_structs.h>
#include <actor_types.h>
#include "main.h"
#include "memory.h"
#include "collision.h"
#include "math_util.h"
#include "code_800029B0.h"
#include <defines.h>
Include dependency graph for collision.c:

Macros

#define MAX3(a, b, c, out)
 
#define MIN3(a, b, c, out)
 

Functions

void nullify_displaylist (uintptr_t addr)
 
void func_802AAAAC (Collision *collision)
 
f32 func_802AAB4C (Player *player)
 
s32 check_collision_zx (Collision *collision, f32 boundingBoxSize, f32 posX, f32 posY, f32 posZ, u16 index)
 
s32 check_collision_yx (Collision *collision, f32 boundingBoxSize, f32 posX, f32 posY, f32 posZ, u16 index)
 
s32 check_collision_zy (Collision *collision, f32 boundingBoxSize, f32 posX, f32 posY, f32 posZ, u16 index)
 
s32 check_horizontally_colliding_with_triangle (f32 posX, f32 posZ, u16 index)
 
s8 get_surface_type (u16 index)
 
s16 get_track_section_id (u16 index)
 
s16 func_802ABD7C (u16 index)
 
s16 func_802ABDB8 (u16 index)
 
s16 func_802ABDF4 (u16 index)
 
f32 calculate_surface_height (f32 x, f32 y, f32 z, u16 index)
 
f32 func_802ABEAC (Collision *collision, Vec3f pos)
 
void process_shell_collision (Vec3f pos, UNUSED f32 boundingBoxSize, Vec3f velocity, UNUSED f32 unk)
 
void shell_collision (Collision *collision, Vec3f velocity)
 
void adjust_pos_orthogonally (Vec3f pos1, f32 boundingBoxSize, Vec3f pos2, UNUSED f32 unk)
 
UNUSED s32 detect_tyre_collision (KartTyre *tyre)
 
s32 is_colliding_with_drivable_surface (Collision *collision, f32 boundingBoxSize, f32 newX, f32 newY, f32 newZ, u16 index, f32 oldX, f32 oldY, f32 oldZ)
 
s32 is_colliding_with_wall2 (Collision *arg, f32 boundingBoxSize, f32 x1, f32 y1, f32 z1, u16 surfaceIndex, f32 posX, f32 posY, f32 posZ)
 
s32 is_colliding_with_wall1 (Collision *arg, f32 boundingBoxSize, f32 x1, f32 y1, f32 z1, u16 surfaceIndex, f32 posX, f32 posY, f32 posZ)
 
u16 actor_terrain_collision (Collision *collision, f32 boundingBoxSize, f32 newX, f32 newY, f32 newZ, f32 oldX, f32 oldY, f32 oldZ)
 
u16 check_bounding_collision (Collision *collision, f32 boundingBoxSize, f32 posX, f32 posY, f32 posZ)
 
f32 spawn_actor_on_surface (f32 posX, f32 posY, f32 posZ)
 
void add_collision_triangle (Vtx *vtx1, Vtx *vtx2, Vtx *vtx3, s8 surfaceType, u16 sectionId)
 
void set_vtx_from_triangle (u32 triangle, s8 surfaceType, u16 sectionId)
 
void set_vtx_from_tri2 (u32 triangle1, u32 triangle2, s8 surfaceType, u16 sectionId)
 
void set_vtx_from_quadrangle (u32 line, s8 surfaceType, u16 sectionId)
 
void set_vtx_buffer (uintptr_t addr, u32 numVertices, u32 bufferIndex)
 
s32 is_line_intersecting_rectangle (s16 minX, s16 maxX, s16 minZ, s16 maxZ, s16 x1, s16 z1, s16 x2, s16 z2)
 
s32 is_triangle_intersecting_bounding_box (s16 minX, s16 maxX, s16 minZ, s16 maxZ, u16 index)
 
void generate_collision_grid (void)
 
void generate_collision_mesh_with_defaults (Gfx *gfx)
 
void generate_collision_mesh_with_default_section_id (Gfx *gfx, s8 surfaceType)
 
void generate_collision_mesh (Gfx *addr, s8 surfaceType, u16 sectionId)
 
void find_and_set_tile_size (uintptr_t addr, s32 uls, s32 ult)
 
void set_vertex_colours (uintptr_t addr, u32 vertexCount, UNUSED s32 vert3, s8 alpha, u8 red, u8 green, u8 blue)
 
void find_vtx_and_set_colours (uintptr_t displayList, s8 alpha, u8 red, u8 green, u8 blue)
 
void subtract_scaled_vector (Vec3f pos1, f32 boundingBoxSize, Vec3f pos2)
 
u16 player_terrain_collision (Player *player, KartTyre *tyre, f32 tyre2X, f32 tyre2Y, f32 tyre2Z)
 

Variables

u8 D_8014F1110
 
u32 D_8015F58C
 

Macro Definition Documentation

◆ MAX3

#define MAX3 ( a,
b,
c,
out )
Value:
if (a >= b) { \
if (a >= c) { \
out = a; \
} else \
out = c; \
\
} else if (b >= c) { \
out = b; \
} else \
out = c;

◆ MIN3

#define MIN3 ( a,
b,
c,
out )
Value:
if (a <= b) { \
if (a <= c) { \
out = a; \
} else \
out = c; \
\
} else if (b <= c) { \
out = b; \
} else \
out = c;

Function Documentation

◆ actor_terrain_collision()

u16 actor_terrain_collision ( Collision * collision,
f32 boundingBoxSize,
f32 newX,
f32 newY,
f32 newZ,
f32 oldX,
f32 oldY,
f32 oldZ )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_collision_triangle()

void add_collision_triangle ( Vtx * vtx1,
Vtx * vtx2,
Vtx * vtx3,
s8 surfaceType,
u16 sectionId )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ adjust_pos_orthogonally()

void adjust_pos_orthogonally ( Vec3f pos1,
f32 boundingBoxSize,
Vec3f pos2,
UNUSED f32 unk )

Adjusts the position of pos2 based on pos1 but in the orthogonal direction to pos2.

Here is the caller graph for this function:

◆ calculate_surface_height()

f32 calculate_surface_height ( f32 x,
f32 y,
f32 z,
u16 index )
Here is the caller graph for this function:

◆ check_bounding_collision()

u16 check_bounding_collision ( Collision * collision,
f32 boundingBoxSize,
f32 posX,
f32 posY,
f32 posZ )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_collision_yx()

s32 check_collision_yx ( Collision * collision,
f32 boundingBoxSize,
f32 posX,
f32 posY,
f32 posZ,
u16 index )
Here is the caller graph for this function:

◆ check_collision_zx()

s32 check_collision_zx ( Collision * collision,
f32 boundingBoxSize,
f32 posX,
f32 posY,
f32 posZ,
u16 index )
Here is the caller graph for this function:

◆ check_collision_zy()

s32 check_collision_zy ( Collision * collision,
f32 boundingBoxSize,
f32 posX,
f32 posY,
f32 posZ,
u16 index )
Here is the caller graph for this function:

◆ check_horizontally_colliding_with_triangle()

s32 check_horizontally_colliding_with_triangle ( f32 posX,
f32 posZ,
u16 index )
Here is the caller graph for this function:

◆ detect_tyre_collision()

UNUSED s32 detect_tyre_collision ( KartTyre * tyre)
Bug
Here is the call graph for this function:

◆ find_and_set_tile_size()

void find_and_set_tile_size ( uintptr_t addr,
s32 uls,
s32 ult )

Search for G_SETTILESIZE and set its args.

Here is the caller graph for this function:

◆ find_vtx_and_set_colours()

void find_vtx_and_set_colours ( uintptr_t displayList,
s8 alpha,
u8 red,
u8 green,
u8 blue )

Recursive search for vertices and set their colour values.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ func_802AAAAC()

void func_802AAAAC ( Collision * collision)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ func_802AAB4C()

f32 func_802AAB4C ( Player * player)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ func_802ABD7C()

s16 func_802ABD7C ( u16 index)
Here is the caller graph for this function:

◆ func_802ABDB8()

s16 func_802ABDB8 ( u16 index)
Here is the caller graph for this function:

◆ func_802ABDF4()

s16 func_802ABDF4 ( u16 index)
Here is the caller graph for this function:

◆ func_802ABEAC()

f32 func_802ABEAC ( Collision * collision,
Vec3f pos )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generate_collision_grid()

void generate_collision_grid ( void )

Splits the collision mesh into 32x32 sections. This allows the game to check only nearby geography for a collision rather than checking against the whole collision mesh. (checking against the whole mesh for every actor would be expensive)

Warning
gNextFreeMemoryAddress incremented just outside this function. Bad practice to hide memory allocation like this.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ generate_collision_mesh()

void generate_collision_mesh ( Gfx * addr,
s8 surfaceType,
u16 sectionId )

Generate via a recursive search and set for vertex data.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ generate_collision_mesh_with_default_section_id()

void generate_collision_mesh_with_default_section_id ( Gfx * gfx,
s8 surfaceType )

Recursive search for vtx and set sectionId's to 0xFF

Here is the call graph for this function:
Here is the caller graph for this function:

◆ generate_collision_mesh_with_defaults()

void generate_collision_mesh_with_defaults ( Gfx * gfx)

Recursive search for vtx and set surfaceTypes to -1 and sectionId's to 0xFF

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_surface_type()

s8 get_surface_type ( u16 index)
Here is the caller graph for this function:

◆ get_track_section_id()

s16 get_track_section_id ( u16 index)
Here is the caller graph for this function:

◆ is_colliding_with_drivable_surface()

s32 is_colliding_with_drivable_surface ( Collision * collision,
f32 boundingBoxSize,
f32 newX,
f32 newY,
f32 newZ,
u16 index,
f32 oldX,
f32 oldY,
f32 oldZ )
Here is the caller graph for this function:

◆ is_colliding_with_wall1()

s32 is_colliding_with_wall1 ( Collision * arg,
f32 boundingBoxSize,
f32 x1,
f32 y1,
f32 z1,
u16 surfaceIndex,
f32 posX,
f32 posY,
f32 posZ )

This is actually more like colliding with face X/Y/Z

Here is the caller graph for this function:

◆ is_colliding_with_wall2()

s32 is_colliding_with_wall2 ( Collision * arg,
f32 boundingBoxSize,
f32 x1,
f32 y1,
f32 z1,
u16 surfaceIndex,
f32 posX,
f32 posY,
f32 posZ )

Wall collision

Here is the caller graph for this function:

◆ is_line_intersecting_rectangle()

s32 is_line_intersecting_rectangle ( s16 minX,
s16 maxX,
s16 minZ,
s16 maxZ,
s16 x1,
s16 z1,
s16 x2,
s16 z2 )
Returns
1 intersecting triangle, 0 not intersecting.
Here is the caller graph for this function:

◆ is_triangle_intersecting_bounding_box()

s32 is_triangle_intersecting_bounding_box ( s16 minX,
s16 maxX,
s16 minZ,
s16 maxZ,
u16 index )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ nullify_displaylist()

void nullify_displaylist ( uintptr_t addr)
Here is the caller graph for this function:

◆ player_terrain_collision()

u16 player_terrain_collision ( Player * player,
KartTyre * tyre,
f32 tyre2X,
f32 tyre2Y,
f32 tyre2Z )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_shell_collision()

void process_shell_collision ( Vec3f pos,
UNUSED f32 boundingBoxSize,
Vec3f velocity,
UNUSED f32 unk )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_vertex_colours()

void set_vertex_colours ( uintptr_t addr,
u32 vertexCount,
UNUSED s32 vert3,
s8 alpha,
u8 red,
u8 green,
u8 blue )
Here is the caller graph for this function:

◆ set_vtx_buffer()

void set_vtx_buffer ( uintptr_t addr,
u32 numVertices,
u32 bufferIndex )

Generates a list of pointers to course vtx.

Here is the caller graph for this function:

◆ set_vtx_from_quadrangle()

void set_vtx_from_quadrangle ( u32 line,
s8 surfaceType,
u16 sectionId )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_vtx_from_tri2()

void set_vtx_from_tri2 ( u32 triangle1,
u32 triangle2,
s8 surfaceType,
u16 sectionId )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_vtx_from_triangle()

void set_vtx_from_triangle ( u32 triangle,
s8 surfaceType,
u16 sectionId )

Triangle contains three indices that are used to get the actual vertices.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ shell_collision()

void shell_collision ( Collision * collision,
Vec3f velocity )
Here is the call graph for this function:
Here is the caller graph for this function:

◆ spawn_actor_on_surface()

f32 spawn_actor_on_surface ( f32 posX,
f32 posY,
f32 posZ )

If unable to spawn actor on the surface set to -3000.0f or if outside the collision grid, spawn in the air (3000.0f).

Here is the call graph for this function:
Here is the caller graph for this function:

◆ subtract_scaled_vector()

void subtract_scaled_vector ( Vec3f pos1,
f32 boundingBoxSize,
Vec3f pos2 )
Here is the caller graph for this function:

Variable Documentation

◆ D_8014F1110

u8 D_8014F1110
extern

◆ D_8015F58C

u32 D_8015F58C
extern