Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,16 @@ file(DOWNLOAD "https://raw.githubusercontent.com/DLTcollab/sse2neon/refs/heads/m

include_directories(${SSE2NEON_DIR})

#==================== CGLM ===================
FetchContent_Declare(
cglm
GIT_REPOSITORY https://github.com/recp/cglm.git
GIT_TAG v0.9.6
)
FetchContent_MakeAvailable(cglm)

include_directories(${cglm_SOURCE_DIR}/include)

#=================== DRLibs ===================
FetchContent_Declare(
dr_libs
Expand Down
59 changes: 59 additions & 0 deletions include/convert_angle.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#ifndef CONVERT_ANGLE_H
#define CONVERT_ANGLE_H

#include <math.h> // For M_PI and other mathematical functions if necessary

// Ensure s16 is defined. This often comes from <libultraship.h> or a common types file.
// If not, you might need something like:
// #include <stdint.h> // For int16_t
// typedef int16_t s16;

// Basic constants for conversions
#define N64_ANGLE_UNITS_PER_CIRCLE 65536.0f
#define DEGREES_PER_CIRCLE 360.0f
#define RADIANS_PER_CIRCLE (2.0f * M_PI)

// --- Conversion from N64 angle units (0-65535 for a full circle) ---

/**
* Converts an N64 angle value to radians.
* N64 angles are often s16 or u16 where 65535 equals 2*PI radians.
*/
#define N64_ANGLE_TO_RADIANS(n64_angle) \
(((float)(n64_angle) / N64_ANGLE_UNITS_PER_CIRCLE) * RADIANS_PER_CIRCLE)

/**
* Converts an N64 angle value to degrees.
*/
#define N64_ANGLE_TO_DEGREES(n64_angle) \
(((float)(n64_angle) / N64_ANGLE_UNITS_PER_CIRCLE) * DEGREES_PER_CIRCLE)

// --- Conversion from Radians ---

/**
* Converts an angle value in radians to N64 angle units (typically s16).
*/
#define RADIANS_TO_N64_ANGLE(rad_angle) \
((s16)(((rad_angle) / RADIANS_PER_CIRCLE) * N64_ANGLE_UNITS_PER_CIRCLE))

/**
* Converts an angle value in radians to degrees.
*/
#define RADIANS_TO_DEGREES(rad_angle) \
((rad_angle) * (DEGREES_PER_CIRCLE / RADIANS_PER_CIRCLE)) // Equivalent to (rad_angle) * (180.0f / M_PI)

// --- Conversion from Degrees ---

/**
* Converts an angle value in degrees to N64 angle units (typically s16).
*/
#define DEGREES_TO_N64_ANGLE(deg_angle) \
((s16)(((deg_angle) / DEGREES_PER_CIRCLE) * N64_ANGLE_UNITS_PER_CIRCLE))

/**
* Converts an angle value in degrees to radians.
*/
#define DEGREES_TO_RADIANS(deg_angle) \
((deg_angle) * (RADIANS_PER_CIRCLE / DEGREES_PER_CIRCLE)) // Equivalent to (deg_angle) * (M_PI / 180.0f)

#endif // CONVERT_ANGLE_H
8 changes: 3 additions & 5 deletions src/actors/banana/update.inc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <code_800029B0.h>
#include <defines.h>
#include <main.h>
#include <cglm/cglm.h>

/**
* @brief Update the banana actor
Expand All @@ -14,7 +15,6 @@ void update_actor_banana(struct BananaActor* banana) {
struct BananaActor* elderBanana;
struct Controller* controller;
Vec3f someOtherVelocity;
Vec3f someVelocity;
f32 temp_f0;
UNUSED f32 var_f8;
UNUSED f32 pad2;
Expand Down Expand Up @@ -71,7 +71,7 @@ void update_actor_banana(struct BananaActor* banana) {
} else {
temp_f0 = (player->unk_094 * 0.75f) + 3.5f + pad3;
}
vec3f_set(someVelocity, 0, pad3, temp_f0);
Vec3f someVelocity = {0, pad3, temp_f0};
func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
banana->velocity[0] = someVelocity[0];
banana->velocity[1] = someVelocity[1];
Expand Down Expand Up @@ -118,9 +118,7 @@ void update_actor_banana(struct BananaActor* banana) {
}
break;
case FIRST_BANANA_BUNCH_BANANA:
someVelocity[0] = 0.0f;
someVelocity[1] = 0.0f;
someVelocity[2] = -5.0f;
Vec3f someVelocity = {0, 0, -5.0f};
func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
unkX = player->pos[0] + someVelocity[0];
unkY = player->pos[1] + someVelocity[1];
Expand Down
4 changes: 2 additions & 2 deletions src/actors/blue_and_red_shells/update.inc.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,9 @@ s16 func_802B3FD0(Player* owner, struct ShellActor* shell) {
if (gPlayerBalloonCount[playerIndex] < 0) {
continue;
}
// func_802B51E8 is not quite a 3D distance function, it doubles (rather than squares) the Z difference of the
// calc_sq_xy_diff_plus_2_z_diff is not quite a 3D distance function, it doubles (rather than squares) the Z difference of the
// positions
playerToShellDistance = func_802B51E8(player->pos, shell->pos);
playerToShellDistance = calc_sq_xy_diff_plus_2_z_diff(player->pos, shell->pos);
if (playerToShellDistance < smallestDistance) {
smallestDistance = playerToShellDistance;
playerId = player - gPlayerOne;
Expand Down
4 changes: 2 additions & 2 deletions src/actors/falling_rock/update.inc.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ void func_8029CF0C(struct ActorSpawnData* spawnData, struct FallingRock* rock) {
rock->pos[0] = (f32) temp_v0[rock->unk_06].pos[0] * gCourseDirection;
rock->pos[1] = (f32) temp_v0[rock->unk_06].pos[1] + 10.0f;
rock->pos[2] = (f32) temp_v0[rock->unk_06].pos[2];
vec3f_set(rock->velocity, 0, 0, 0);
glm_vec3_zero(rock->velocity);
vec3s_set(rock->rot, 0, 0, 0);
}

Expand Down Expand Up @@ -50,7 +50,7 @@ void spawn_falling_rocks(struct ActorSpawnData* spawnData) {
startingPos[0] = temp_s0->pos[0] * gCourseDirection;
startingPos[1] = temp_s0->pos[1] + 10.0f;
startingPos[2] = temp_s0->pos[2];
vec3f_set(startingVelocity, 0, 0, 0);
glm_vec3_zero(startingVelocity);
vec3s_set(startingRot, 0, 0, 0);
temp = add_actor_to_empty_slot(startingPos, startingRot, startingVelocity, ACTOR_FALLING_ROCK);
temp_v1 = (struct FallingRock*) GET_ACTOR(temp);
Expand Down
4 changes: 2 additions & 2 deletions src/actors/paddle_boat/render.inc.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "courses/all_course_data.h"
#include <assets/dks_jungle_parkway_data.h>
#include <libultra/gbi.h>
#include <cglm/cglm.h>

/**
* @brief Renders the paddle boat actor.
Expand All @@ -19,7 +20,6 @@
*/
void render_actor_paddle_boat(Camera* arg0, struct PaddleWheelBoat* boat, UNUSED Mat4 arg2, u16 pathCounter) {
UNUSED s32 pad[3];
Vec3f sp120;
Mat4 spE0;
Mat4 spA0;
Mat4 sp60;
Expand Down Expand Up @@ -51,7 +51,7 @@ void render_actor_paddle_boat(Camera* arg0, struct PaddleWheelBoat* boat, UNUSED
gSPDisplayList(gDisplayListHead++, &d_course_dks_jungle_parkway_railings_dl);

mtxf_rotate_x(spE0, boat->wheelRot);
vec3f_set(sp120, 0, 16.0f, -255.0f);
Vec3f sp120 = {0.0f, 16.0f, -255.0f};
mtxf_translate(spA0, sp120);
mtxf_multiplication(sp60, spE0, spA0);
if (render_set_position(sp60, 3) != 0) {
Expand Down
41 changes: 21 additions & 20 deletions src/actors/train/render.inc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <libultra/gbi.h>
#include <main.h>
#include <assets/kalimari_desert_data.h>
#include <cglm/cglm.h>

/**
* @brief Renders the train engine actor.
Expand Down Expand Up @@ -63,7 +64,7 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D28);

mtxf_rotate_x(mainMtx, actor->wheelRot);
vec3f_set(sp160, 17.0f, 6.0f, 32.0f);
glm_vec3_copy((vec3) {17.0f, 6.0f, 32.0f}, sp160);
mtxf_translate(objectMtx, sp160);
mtxf_multiplication(resultMtx, mainMtx, objectMtx);

Expand All @@ -76,7 +77,7 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(mainMtx, actor->wheelRot);
vec3f_set(sp160, -17.0, 6.0f, 32.0f);
glm_vec3_copy((vec3) {-17.0f, 6.0f, 32.0f}, sp160);
mtxf_translate(objectMtx, sp160);
mtxf_multiplication(resultMtx, mainMtx, objectMtx);

Expand All @@ -89,7 +90,7 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x16C));
vec3f_set(sp160, 17.0f, 6.0f, 16.0f);
glm_vec3_copy((vec3) {17.0f, 6.0f, 16.0f}, sp160);
mtxf_translate(objectMtx, sp160);
mtxf_multiplication(resultMtx, mainMtx, objectMtx);

Expand All @@ -102,7 +103,7 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x16C));
vec3f_set(sp160, -17.0f, 6.0f, 16.0f);
glm_vec3_copy((vec3) {-17.0f, 6.0f, 16.0f}, sp160);
mtxf_translate(objectMtx, sp160);
mtxf_multiplication(resultMtx, mainMtx, objectMtx);

Expand All @@ -115,7 +116,7 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x444));
vec3f_set(sp160, 17.0f, 12.0f, -12.0f);
glm_vec3_copy((vec3) {17.0f, 12.0f, -12.0f}, sp160);
mtxf_translate(objectMtx, sp160);
mtxf_multiplication(resultMtx, mainMtx, objectMtx);

Expand All @@ -128,7 +129,7 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x444));
vec3f_set(sp160, -17.0f, 12.0f, -12.0f);
glm_vec3_copy((vec3) {-17.0f, 12.0f, -12.0f}, sp160);
mtxf_translate(objectMtx, sp160);
mtxf_multiplication(resultMtx, mainMtx, objectMtx);

Expand All @@ -141,7 +142,7 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x2D8));
vec3f_set(sp160, 17.0f, 12.0f, -34.0f);
glm_vec3_copy((vec3) {17.0f, 12.0f, -34.0f}, sp160);
mtxf_translate(objectMtx, sp160);
mtxf_multiplication(resultMtx, mainMtx, objectMtx);

Expand All @@ -154,7 +155,7 @@ void render_actor_train_engine(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(mainMtx, (s16) (actor->wheelRot + 0x2D8));
vec3f_set(sp160, -17.0f, 12.0f, -34.0f);
glm_vec3_copy((vec3) {-17.0f, 12.0f, -34.0f}, sp160);
mtxf_translate(objectMtx, sp160);
mtxf_multiplication(resultMtx, mainMtx, objectMtx);

Expand Down Expand Up @@ -213,7 +214,7 @@ void render_actor_train_tender(Camera* camera, struct TrainCar* actor) {
gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D28);

mtxf_rotate_x(sp120, actor->wheelRot);
vec3f_set(sp160, 17.0f, 6.0f, 8.0f);
glm_vec3_copy((vec3) {17.0f, 6.0f, 8.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -225,7 +226,7 @@ void render_actor_train_tender(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, actor->wheelRot);
vec3f_set(sp160, -17.0, 6.0f, 8.0f);
glm_vec3_copy((vec3) {-17.0f, 6.0f, 8.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -237,7 +238,7 @@ void render_actor_train_tender(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x444));
vec3f_set(sp160, 17.0f, 6.0f, -8.0f);
glm_vec3_copy((vec3) {17.0f, 6.0f, -8.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -249,7 +250,7 @@ void render_actor_train_tender(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x444));
vec3f_set(sp160, -17.0f, 6.0f, -8.0f);
glm_vec3_copy((vec3) {-17.0f, 6.0f, -8.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand Down Expand Up @@ -311,7 +312,7 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) {
gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_22D28);

mtxf_rotate_x(sp120, actor->wheelRot);
vec3f_set(sp160, 17.0f, 6.0f, 28.0f);
glm_vec3_copy((vec3) {17.0f, 6.0f, 28.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -323,7 +324,7 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, actor->wheelRot);
vec3f_set(sp160, -17.0, 6.0f, 28.0f);
glm_vec3_copy((vec3) {-17.0, 6.0f, 28.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -335,7 +336,7 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x222));
vec3f_set(sp160, 17.0f, 6.0f, 12.0f);
glm_vec3_copy((vec3) {17.0f, 6.0f, 12.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -347,7 +348,7 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x222));
vec3f_set(sp160, -17.0f, 6.0f, 12.0f);
glm_vec3_copy((vec3) {-17.0f, 6.0f, 12.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -359,7 +360,7 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x5B0));
vec3f_set(sp160, 17.0f, 6.0f, -8.0f);
glm_vec3_copy((vec3) {17.0f, 6.0f, -8.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -371,7 +372,7 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x5B0));
vec3f_set(sp160, -17.0f, 6.0f, -8.0f);
glm_vec3_copy((vec3) {-17.0f, 6.0f, -8.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -383,7 +384,7 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x16C));
vec3f_set(sp160, 17.0f, 6.0f, -24.0f);
glm_vec3_copy((vec3) {17.0f, 6.0f, -24.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand All @@ -395,7 +396,7 @@ void render_actor_train_passenger_car(Camera* camera, struct TrainCar* actor) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);

mtxf_rotate_x(sp120, (s16) (actor->wheelRot + 0x16C));
vec3f_set(sp160, -17.0f, 6.0f, -24.0f);
glm_vec3_copy((vec3) {-17.0f, 6.0f, -24.0f}, sp160);
mtxf_translate(spE0, sp160);
mtxf_multiplication(spA0, sp120, spE0);

Expand Down
18 changes: 9 additions & 9 deletions src/code_800029B0.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,33 +265,33 @@ void func_80002DAC(void) {

// switch (gCurrentCourseId) {
// case COURSE_MARIO_RACEWAY:
// // vec3f_set(D_8015F748, -223.0f, 94.0f, -155.0f);
// // glm_vec3_copy((vec3) {-223.0f, 94.0f, -155.0f}, D_8015F748);
// // func_800C9D80(D_8015F748, D_802B91C8, 0x5103700B);
// break;
// case COURSE_ROYAL_RACEWAY:
// vec3f_set(D_8015F748, 177.0f, 87.0f, -393.0f);
// glm_vec3_copy((vec3) {177.0f, 87.0f, -393.0f}, D_8015F748);
// func_800C9D80(D_8015F748, D_802B91C8, 0x5103700B);
// break;
// case COURSE_LUIGI_RACEWAY:
// vec3f_set(D_8015F748, 85.0f, 21.0f, -219.0f);
// glm_vec3_copy((vec3) {85.0f, 21.0f, -219.0f}, D_8015F748);
// func_800C9D80(D_8015F748, D_802B91C8, 0x5103700B);
// break;
// case COURSE_WARIO_STADIUM:
// vec3f_set(D_8015F748, 298.0f, 202.0f, -850.0f);
// glm_vec3_copy((vec3) {298.0f, 202.0f, -850.0f}, D_8015F748);
// func_800C9D80(D_8015F748, D_802B91C8, 0x5103700B);
// vec3f_set(D_8015F758, -1600.0f, 202.0f, -2430.0f);
// glm_vec3_copy((vec3) {-1600.0f, 202.0f, -2430.0f}, D_8015F758);
// func_800C9D80(D_8015F758, D_802B91C8, 0x5103700B);
// vec3f_set(D_8015F768, -2708.0f, 202.0f, 1762.0f);
// glm_vec3_copy((vec3) {-2708.0f, 202.0f, 1762.0f}, D_8015F768);
// func_800C9D80(D_8015F768, D_802B91C8, 0x5103700B);
// vec3f_set(D_8015F778, -775.0f, 202.0f, 1930.0f);
// glm_vec3_copy((vec3) {-775.0f, 202.0f, 1930.0f}, D_8015F778);
// func_800C9D80(D_8015F778, D_802B91C8, 0x5103700B);
// break;
// case COURSE_KOOPA_BEACH:
// vec3f_set(D_8015F738, 153.0f, 0.0f, 2319.0f);
// glm_vec3_copy((vec3) {153.0f, 0.0f, 2319.0f}, D_8015F738);
// func_800C9D80(D_8015F738, D_802B91C8, 0x51028001);
// break;
// case COURSE_DK_JUNGLE:
// vec3f_set(D_8015F738, -790.0f, -255.0f, -447.0f);
// glm_vec3_copy((vec3) {-790.0f, -255.0f, -447.0f}, D_8015F738);
// func_800C9D80(D_8015F738, D_802B91C8, 0x51028001);
// break;
// default:
Expand Down
Loading
Loading