From 28e8d99707fc56edb21caf58c351e31db9125b93 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 21:13:26 -0700 Subject: [PATCH] Some optimizations + cleanup --- src/engine/graph_node.c | 5 - src/engine/graph_node.h | 5 - src/engine/math_util.c | 156 ++++---- src/engine/math_util.h | 18 +- src/engine/surface_collision.c | 335 ++++++------------ src/game/behaviors/bbh_tilting_trap.inc.c | 2 +- src/game/behaviors/boo.inc.c | 11 + src/game/behaviors/chain_chomp.inc.c | 5 +- .../behaviors/checkerboard_platform.inc.c | 12 +- src/game/behaviors/coffin.inc.c | 2 +- src/game/behaviors/jrb_ship.inc.c | 9 +- src/game/behaviors/klepto.inc.c | 8 +- src/game/behaviors/mr_blizzard.inc.c | 2 +- src/game/behaviors/seesaw_platform.inc.c | 2 +- src/game/behaviors/sl_snowman_wind.inc.c | 4 +- src/game/mario_actions_automatic.c | 2 +- src/game/mario_actions_moving.c | 2 +- src/game/obj_behaviors_2.c | 5 +- src/game/object_helpers.c | 328 ++++------------- src/game/object_helpers.h | 4 - src/game/puppycam2.c | 5 +- src/game/sound_init.c | 36 +- 22 files changed, 339 insertions(+), 619 deletions(-) diff --git a/src/engine/graph_node.c b/src/engine/graph_node.c index a2b2f5d1..3f968659 100644 --- a/src/engine/graph_node.c +++ b/src/engine/graph_node.c @@ -13,11 +13,6 @@ s16 identityMtx[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; s16 zeroMtx[4][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; -Vec3f gVec3fZero = { 0.0f, 0.0f, 0.0f }; -Vec3s gVec3sZero = { 0, 0, 0 }; -Vec3f gVec3fOne = { 1.0f, 1.0f, 1.0f }; -UNUSED Vec3s gVec3sOne = { 1, 1, 1 }; - /** * Initialize a geo node with a given type. Sets all links such that there * are no siblings, parent or children for this node. diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index 5d8f4c5c..f497efb8 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -376,11 +376,6 @@ extern struct GraphNode *gCurGraphNodeList[]; extern s16 gCurGraphNodeIndex; -extern Vec3f gVec3fZero; -extern Vec3s gVec3sZero; -extern Vec3f gVec3fOne; -extern Vec3s gVec3sOne; - void init_scene_graph_node_links(struct GraphNode *graphNode, s32 type); struct GraphNodeRoot *init_graph_node_root(struct AllocOnlyPool *pool, struct GraphNodeRoot *graphNode, diff --git a/src/engine/math_util.c b/src/engine/math_util.c index d83439c7..4f4efad7 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -12,8 +12,40 @@ #include "config.h" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wreturn-local-addr" +Vec3f gVec3fX = { 1.0f, 0.0f, 0.0f }; +Vec3f gVec3fY = { 0.0f, 1.0f, 0.0f }; +Vec3f gVec3fZ = { 0.0f, 0.0f, 1.0f }; +Vec3f gVec3fNX = { -1.0f, 0.0f, 0.0f }; +Vec3f gVec3fNY = { 0.0f, -1.0f, 0.0f }; +Vec3f gVec3fNZ = { 0.0f, 0.0f, -1.0f }; +Vec3f gVec3fZero = { 0.0f, 0.0f, 0.0f }; +Vec3f gVec3fOne = { 1.0f, 1.0f, 1.0f }; +Vec3s gVec3sZero = { 0, 0, 0 }; +Vec3i gVec3iZero = { 0, 0, 0 }; +Vec3s gVec3sOne = { 1, 1, 1 }; + +/// From Wiseguy +static inline s32 roundf(f32 in) { + f32 tmp; + s32 out; + __asm__("round.w.s %0,%1" : "=f" (tmp) : "f" (in)); + __asm__("mfc1 %0,%1" : "=r" (out) : "f" (tmp)); + return out; +} + +// static inline float absf(float in) { +// f32 out; +// __asm__("abs.s %0,%1" : "=f" (out) : "f" (in)); +// return out; +// } + +f32 absf(f32 x) { + if (x >= 0) { + return x; + } else { + return -x; + } +} /// Returns the lowest of three values. s32 min_3i(s32 a0, s32 a1, s32 a2) { if (a1 < a0) a0 = a1; if (a2 < a0) a0 = a2; return a0; } @@ -112,7 +144,7 @@ void vec3f_cross(Vec3f dest, Vec3f a, Vec3f b) { /// Scale vector 'dest' so it has length 1 void vec3f_normalize(Vec3f dest) { f32 mag = sqrtf(sqr(dest[0]) + sqr(dest[1]) + sqr(dest[2])); - if (mag > __FLT_EPSILON__) { + if (mag > NEAR_ZERO) { register f32 invsqrt = 1.0f / mag; vec3_mul_val(dest, invsqrt); } else { @@ -125,7 +157,7 @@ void vec3f_normalize(Vec3f dest) { /// Scale vector 'dest' so it has length -1 void vec3f_normalize_negative(Vec3f dest) { f32 mag = sqrtf(sqr(dest[0]) + sqr(dest[1]) + sqr(dest[2])); - if (mag > __FLT_EPSILON__) { + if (mag > NEAR_ZERO) { register f32 invsqrt = -1.0f / mag; vec3_mul_val(dest, invsqrt); } else { @@ -135,7 +167,6 @@ void vec3f_normalize_negative(Vec3f dest) { } } -#pragma GCC diagnostic pop struct CopyMe { f32 x; f32 y; f32 z; f32 w; f32 x1; f32 y1; f32 z1; f32 w1; @@ -173,33 +204,31 @@ void mtxf_translate(Mat4 dest, Vec3f b) { void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { register f32 sx = sins(rot[0]); register f32 cx = coss(rot[0]); - register f32 sy = sins(rot[1]); register f32 cy = coss(rot[1]); - register f32 sz = sins(rot[2]); register f32 cz = coss(rot[2]); register Vec3f entry; - entry[0] = cy * cz; - entry[1] = cy * sz; + entry[0] = (cy * cz); + entry[1] = (cy * sz); entry[2] = -sy; dest[0][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; dest[0][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; dest[0][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; - entry[1] = sx * sy; + entry[1] = (sx * sy); entry[0] = (entry[1] * cz) - (cx * sz); entry[1] = (entry[1] * sz) + (cx * cz); - entry[2] = sx * cy; + entry[2] = (sx * cy); dest[1][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; dest[1][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; dest[1][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; - entry[1] = cx * sy; + entry[1] = (cx * sy); entry[0] = (entry[1] * cz) + (sx * sz); entry[1] = (entry[1] * sz) - (sx * cz); - entry[2] = cx * cy; + entry[2] = (cx * cy); dest[2][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; dest[2][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; dest[2][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; @@ -223,7 +252,7 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { register f32 dx = (to[0] - from[0]); register f32 dz = (to[2] - from[2]); register f32 invLength = sqrtf(sqr(dx) + sqr(dz)); - invLength = -(1.0f / MAX(invLength, __FLT_EPSILON__)); + invLength = -(1.0f / MAX(invLength, NEAR_ZERO)); dx *= invLength; dz *= invLength; f32 sr = sins(roll); @@ -256,30 +285,26 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { * axis, and then translates. */ void mtxf_rotate_zxy_and_translate(Mat4 dest, Vec3f translate, Vec3s rotate) { - register f32 sx = sins(rotate[0]); - register f32 cx = coss(rotate[0]); - - register f32 sy = sins(rotate[1]); - register f32 cy = coss(rotate[1]); - - register f32 sz = sins(rotate[2]); - register f32 cz = coss(rotate[2]); - - dest[0][0] = cy * cz + sx * sy * sz; - dest[1][0] = -cy * sz + sx * sy * cz; - dest[2][0] = cx * sy; - dest[3][0] = translate[0]; - - dest[0][1] = cx * sz; - dest[1][1] = cx * cz; + register f32 sx = sins(rotate[0]); + register f32 cx = coss(rotate[0]); + register f32 sy = sins(rotate[1]); + register f32 cy = coss(rotate[1]); + register f32 sz = sins(rotate[2]); + register f32 cz = coss(rotate[2]); + register f32 cycz = (cy * cz); + register f32 cysz = (cy * sz); + register f32 sycz = (sy * cz); + register f32 sysz = (sy * sz); + dest[0][0] = ((sx * sysz) + cycz); + dest[1][0] = ((sx * sycz) - cysz); + dest[2][0] = (cx * sy); + dest[0][1] = (cx * sz); + dest[1][1] = (cx * cz); dest[2][1] = -sx; - dest[3][1] = translate[1]; - - dest[0][2] = -sy * cz + sx * cy * sz; - dest[1][2] = sy * sz + sx * cy * cz; + dest[0][2] = ((sx * cysz) - sycz); + dest[1][2] = ((sx * cycz) + sysz); dest[2][2] = cx * cy; - dest[3][2] = translate[2]; - + vec3_copy(dest[3], translate); dest[0][3] = dest[1][3] = dest[2][3] = 0.; ((u32 *) dest)[15] = 0x3F800000; } @@ -289,33 +314,29 @@ void mtxf_rotate_zxy_and_translate(Mat4 dest, Vec3f translate, Vec3s rotate) { * axis, and then translates. */ void mtxf_rotate_xyz_and_translate(Mat4 dest, Vec3f b, Vec3s c) { - register f32 sx = sins(c[0]); - register f32 cx = coss(c[0]); - - register f32 sy = sins(c[1]); - register f32 cy = coss(c[1]); - - register f32 sz = sins(c[2]); - register f32 cz = coss(c[2]); - - dest[0][0] = cy * cz; - dest[0][1] = cy * sz; + register f32 sx = sins(c[0]); + register f32 cx = coss(c[0]); + register f32 sy = sins(c[1]); + register f32 cy = coss(c[1]); + register f32 sz = sins(c[2]); + register f32 cz = coss(c[2]); + register f32 cxsz = (cx * sz); + register f32 cxcz = (cx * cz); + register f32 sxsz = (sx * sz); + register f32 sxcz = (sx * cz); + dest[0][0] = (cy * cz); + dest[0][1] = (cy * sz); dest[0][2] = -sy; + dest[1][0] = ((sxcz * sy) - cxsz); + dest[1][1] = ((sxsz * sy) + cxcz); + dest[1][2] = (sx * cy); + dest[2][0] = ((cxcz * sy) + sxsz); + dest[2][1] = ((cxsz * sy) - sxcz); + dest[2][2] = (cx * cy); dest[0][3] = 0; - - dest[1][0] = sx * sy * cz - cx * sz; - dest[1][1] = sx * sy * sz + cx * cz; - dest[1][2] = sx * cy; dest[1][3] = 0; - - dest[2][0] = cx * sy * cz + sx * sz; - dest[2][1] = cx * sy * sz - sx * cz; - dest[2][2] = cx * cy; dest[2][3] = 0; - - dest[3][0] = b[0]; - dest[3][1] = b[1]; - dest[3][2] = b[2]; + vec3_copy(dest[3], b); ((u32 *) dest)[15] = 0x3F800000; } @@ -333,10 +354,17 @@ void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { *temp = 0; temp++; } - dest[0][0] = coss(angle); - dest[0][1] = sins(angle); - dest[1][0] = -dest[0][1]; - dest[1][1] = dest[0][0]; + if (angle == 0x0) { + dest[0][0] = 1; + dest[0][1] = 0; + dest[1][0] = 0; + dest[1][1] = 1; + } else { + dest[0][0] = coss(angle); + dest[0][1] = sins(angle); + dest[1][0] = -dest[0][1]; + dest[1][1] = dest[0][0]; + } ((u32 *) dest)[10] = 0x3F800000; dest[2][3] = 0; ((u32 *) dest)[15] = 0x3F800000; @@ -344,7 +372,7 @@ void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { temp = (f32 *)dest; temp2 = (f32 *)mtx; for (i = 0; i < 3; i++) { - temp[12] = temp2[0] * position[0] + temp2[4] * position[1] + temp2[8] * position[2] + temp2[12]; + temp[12] = (temp2[0] * position[0]) + (temp2[4] * position[1]) + (temp2[8] * position[2]) + temp2[12]; temp++; temp2++; } diff --git a/src/engine/math_util.h b/src/engine/math_util.h index c09b957a..24bf7753 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -5,9 +5,20 @@ #include "types.h" -#define NEAR_ZERO 0.00001f -#define NEARER_ZERO 0.000001f -#define NEAR_ONE 0.99999f +#define NEAR_ZERO __FLT_EPSILON__ +#define NEAR_ONE (1.0f - __FLT_EPSILON__) + +extern Vec3f gVec3fX; +extern Vec3f gVec3fY; +extern Vec3f gVec3fZ; +extern Vec3f gVec3fNX; +extern Vec3f gVec3fNY; +extern Vec3f gVec3fNZ; +extern Vec3f gVec3fZero; +extern Vec3s gVec3sZero; +extern Vec3i gVec3iZero; +extern Vec3f gVec3fOne; +extern Vec3s gVec3sOne; /** * Converts an angle in degrees to sm64's s16 angle units. For example, DEGREES(90) == 0x4000 @@ -433,6 +444,7 @@ extern f32 gSineTable[]; } \ } +f32 absf(f32 x); s32 min_3i(s32 a0, s32 a1, s32 a2); f32 min_3f(f32 a0, f32 a1, f32 a2); s32 max_3i(s32 a0, s32 a1, s32 a2); diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index 11b474db..42cb4b41 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -5,7 +5,6 @@ #include "game/level_update.h" #include "game/mario.h" #include "game/object_list_processor.h" -// #include "game/rendering_graph_node.h" #include "math_util.h" #include "surface_collision.h" #include "surface_load.h" @@ -46,14 +45,6 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc register f32 margin_radius = (radius - 1.0f); register TerrainData type = SURFACE_DEFAULT; s32 numCols = 0; -// #if EXTENDED_BOUNDS_MODE -// const float down_scale = (1.0f / gWorldScale); -// radius *= down_scale; -// x *= down_scale; -// y *= down_scale; -// z *= down_scale; -// margin_radius *= down_scale; -// #endif // Max collision radius = 200 if (radius > 200.0f) { radius = 200.0f; @@ -67,34 +58,22 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc if ((type == SURFACE_NEW_WATER) || (type == SURFACE_NEW_WATER_BOTTOM)) continue; // Determine if checking for the camera or not. if (gCheckingSurfaceCollisionsForCamera) { - if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) { - continue; - } + if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) continue; } else { // Ignore camera only surfaces. - if (type == SURFACE_CAMERA_BOUNDARY) { - continue; - } + if (type == SURFACE_CAMERA_BOUNDARY) continue; // If an object can pass through a vanish cap wall, pass through. if (type == SURFACE_VANISH_CAP_WALLS && gCurrentObject != NULL) { // If an object can pass through a vanish cap wall, pass through. - if (gCurrentObject->activeFlags & ACTIVE_FLAG_MOVE_THROUGH_GRATE) { - continue; - } + if (gCurrentObject->activeFlags & ACTIVE_FLAG_MOVE_THROUGH_GRATE) continue; // If Mario has a vanish cap, pass through the vanish cap wall. - if (gCurrentObject == gMarioObject && (gMarioState->flags & MARIO_VANISH_CAP)) { - continue; - } + if (gCurrentObject == gMarioObject && (gMarioState->flags & MARIO_VANISH_CAP)) continue; } } - if (pos[1] < surf->lowerY || pos[1] > surf->upperY) { - continue; - } + if (pos[1] < surf->lowerY || pos[1] > surf->upperY) continue; // Dot of normal and pos, + origin offset offset = (surf->normal.x * pos[0]) + (surf->normal.y * pos[1]) + (surf->normal.z * pos[2]) + surf->originOffset; - if (offset < -radius || offset > radius) { - continue; - } + if (offset < -radius || offset > radius) continue; vec3_diff(v0, surf->vertex2, surf->vertex1); vec3_diff(v1, surf->vertex3, surf->vertex1); vec3_diff(v2, pos, surf->vertex1); @@ -106,13 +85,9 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc d21 = vec3_dot(v2, v1); invDenom = 1.0f / ((d00 * d11) - (d01 * d01)); v = ((d11 * d20) - (d01 * d21)) * invDenom; - if (v < 0.0f || v > 1.0f) { - goto edge_1_2; - } - w = (d00 * d21 - d01 * d20) * invDenom; - if (w < 0.0f || w > 1.0f || v + w > 1.0f) { - goto edge_1_2; - } + if (v < 0.0f || v > 1.0f) goto edge_1_2; + w = ((d00 * d21) - (d01 * d20)) * invDenom; + if (w < 0.0f || w > 1.0f || v + w > 1.0f) goto edge_1_2; pos[0] += surf->normal.x * (radius - offset); pos[2] += surf->normal.z * (radius - offset); goto hasCollision; @@ -130,9 +105,7 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc pos[0] += (d00 *= invDenom); pos[2] += (d01 *= invDenom); margin_radius += 0.01f; - if ((d00 * surf->normal.x) + (d01 * surf->normal.z) < (corner_threshold * offset)) { - continue; - } + if ((d00 * surf->normal.x) + (d01 * surf->normal.z) < (corner_threshold * offset)) continue; hasCollision: // (Unreferenced Walls) Since this only returns the first MAX_REFEREMCED_WALLS walls, // this can lead to wall interaction being missed. Typically unreferenced walls @@ -142,11 +115,6 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc } numCols++; } -// #if EXTENDED_BOUNDS_MODE -// x *= gWorldScale; -// y *= gWorldScale; -// z *= gWorldScale; -// #endif data->x = pos[0]; data->z = pos[2]; return numCols; @@ -157,23 +125,17 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc */ s32 f32_find_wall_collision(f32 *xPtr, f32 *yPtr, f32 *zPtr, f32 offsetY, f32 radius) { struct WallCollisionData collision; - s32 numCollisions = 0; - - collision.offsetY = offsetY; - collision.radius = radius; - - collision.x = *xPtr; - collision.y = *yPtr; - collision.z = *zPtr; - + s32 numCollisions = 0; + collision.offsetY = offsetY; + collision.radius = radius; + collision.x = *xPtr; + collision.y = *yPtr; + collision.z = *zPtr; collision.numWalls = 0; - - numCollisions = find_wall_collisions(&collision); - - *xPtr = collision.x; - *yPtr = collision.y; - *zPtr = collision.z; - + numCollisions = find_wall_collisions(&collision); + *xPtr = collision.x; + *yPtr = collision.y; + *zPtr = collision.z; return numCollisions; } @@ -186,9 +148,9 @@ s32 find_wall_collisions(struct WallCollisionData *colData) { s32 numCollisions = 0; s32 x = colData->x; s32 z = colData->z; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif colData->numWalls = 0; @@ -212,9 +174,9 @@ s32 find_wall_collisions(struct WallCollisionData *colData) { // Increment the debug tracker. gNumCalls.wall++; - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return numCollisions; } @@ -229,7 +191,7 @@ void resolve_and_return_wall_collisions(Vec3f pos, f32 offset, f32 radius, struc collisionData->radius = radius; collisionData->offsetY = offset; - find_wall_collisions(collisionData); + find_wall_collisions(collisionData); pos[0] = collisionData->x; pos[1] = collisionData->y; @@ -241,12 +203,12 @@ void resolve_and_return_wall_collisions(Vec3f pos, f32 offset, f32 radius, struc **************************************************/ void add_ceil_margin(s32 *x, s32 *z, Vec3s target1, Vec3s target2, f32 margin) { - register f32 diff_x, diff_z, invDenom; - diff_x = target1[0] - *x + target2[0] - *x; - diff_z = target1[2] - *z + target2[2] - *z; - invDenom = margin / sqrtf(sqr(diff_x) + sqr(diff_z)); - *x += diff_x * invDenom; - *z += diff_z * invDenom; + register f32 diff_x, diff_z, invDenom; + diff_x = target1[0] - *x + target2[0] - *x; + diff_z = target1[2] - *z + target2[2] - *z; + invDenom = margin / sqrtf(sqr(diff_x) + sqr(diff_z)); + *x += diff_x * invDenom; + *z += diff_z * invDenom; } /** @@ -263,64 +225,38 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 while (surfaceNode != NULL) { surf = surfaceNode->surface; surfaceNode = surfaceNode->next; - if (y > surf->upperY) { - continue; - } + if (y > surf->upperY) continue; vx[0] = surf->vertex1[0]; vz[0] = surf->vertex1[2]; - if (surf->type != SURFACE_HANGABLE) { - add_ceil_margin(&vx[0], &vz[0], surf->vertex2, surf->vertex3, margin); - } + if (surf->type != SURFACE_HANGABLE) add_ceil_margin(&vx[0], &vz[0], surf->vertex2, surf->vertex3, margin); vx[1] = surf->vertex2[0]; vz[1] = surf->vertex2[2]; - if (surf->type != SURFACE_HANGABLE) { - add_ceil_margin(&vx[1], &vz[1], surf->vertex3, surf->vertex1, margin); - } + if (surf->type != SURFACE_HANGABLE) add_ceil_margin(&vx[1], &vz[1], surf->vertex3, surf->vertex1, margin); // Checking if point is in bounds of the triangle laterally. - if ((vz[0] - z) * (vx[1] - vx[0]) - (vx[0] - x) * (vz[1] - vz[0]) > 0) { - continue; - } + if ((vz[0] - z) * (vx[1] - vx[0]) - (vx[0] - x) * (vz[1] - vz[0]) > 0) continue; // Slight optimization by checking these later. vx[2] = surf->vertex3[0]; vz[2] = surf->vertex3[2]; - if (surf->type != SURFACE_HANGABLE) { - add_ceil_margin(&vx[2], &vz[2], surf->vertex1, surf->vertex2, margin); - } - if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) > 0) { - continue; - } - if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) > 0) { - continue; - } + if (surf->type != SURFACE_HANGABLE) add_ceil_margin(&vx[2], &vz[2], surf->vertex1, surf->vertex2, margin); + if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) > 0) continue; + if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) > 0) continue; // Determine if checking for the camera or not. - if (surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) { - continue; - } + if (surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) continue; if (gCheckingSurfaceCollisionsForCamera) { - if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) { - continue; - } + if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) continue; } else if (surf->type == SURFACE_CAMERA_BOUNDARY) { // Ignore camera only surfaces. continue; } // Find the ceil height at the specific point. height = get_surface_height_at_location(x, z, surf); - if (height > *pheight) { - continue; - } + if (height > *pheight) continue; // Checks for ceiling interaction - if (y > height) { - continue; - } - if (y >= surf->upperY) { - continue; - } + if (y > height) continue; + if (y >= surf->upperY) continue; *pheight = height; ceil = surf; - if (height == y) { - break; - } + if (height == y) break; } return ceil; } @@ -335,10 +271,9 @@ f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil) { f32 height = CELL_HEIGHT_LIMIT; f32 dynamicHeight = CELL_HEIGHT_LIMIT; s32 x, y, z; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif - +#endif x = posX; y = posY; z = posZ; @@ -370,9 +305,9 @@ f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil) { // Increment the debug tracker. gNumCalls.ceil++; - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return height; } @@ -403,49 +338,33 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 while (surfaceNode != NULL) { surf = surfaceNode->surface; surfaceNode = surfaceNode->next; - if (y < surf->lowerY - 30) { - continue; - } + if (y < (surf->lowerY - 30)) continue; vx[0] = surf->vertex1[0]; vz[0] = surf->vertex1[2]; vx[1] = surf->vertex2[0]; vz[1] = surf->vertex2[2]; // Check that the point is within the triangle bounds. - if ((vz[0] - z) * (vx[1] - vx[0]) - (vx[0] - x) * (vz[1] - vz[0]) < 0) { - continue; - } + if ((vz[0] - z) * (vx[1] - vx[0]) - (vx[0] - x) * (vz[1] - vz[0]) < 0) continue; // To slightly save on computation time, set this later. vx[2] = surf->vertex3[0]; vz[2] = surf->vertex3[2]; - if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) < 0) { - continue; - } - if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) < 0) { - continue; - } + if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) < 0) continue; + if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) < 0) continue; // Determine if we are checking for the camera or not. if (gCheckingSurfaceCollisionsForCamera != 0) { - if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION || surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) { - continue; - } + if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION || surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) continue; } else if (surf->type == SURFACE_CAMERA_BOUNDARY) { // If we are not checking for the camera, ignore camera only floors. continue; } // Find the height of the floor at a given location. height = get_surface_height_at_location(x, z, surf); - if (height < *pheight) { - continue; - } + if (height < *pheight) continue; // Checks for floor interaction with a 78 unit buffer. - if (y < (height - 78.0f)) { - continue; - } + if (y < (height - 78.0f)) continue; *pheight = height; floor = surf; - if (height - 78.0f == y) { - break; - } + if ((height - 78.0f) == y) break; } return floor; } @@ -496,7 +415,7 @@ struct Surface *find_water_floor_from_list(struct SurfaceNode *surfaceNode, s32 surf = topSurfaceNode->surface; topSurfaceNode = topSurfaceNode->next; - if (surf->type == SURFACE_NEW_WATER_BOTTOM || !check_within_triangle_bounds(x, z, surf)) continue; + if ((surf->type == SURFACE_NEW_WATER_BOTTOM) || !check_within_triangle_bounds(x, z, surf)) continue; curHeight = get_surface_height_at_location(x, z, surf); @@ -517,10 +436,7 @@ struct Surface *find_water_floor_from_list(struct SurfaceNode *surfaceNode, s32 */ f32 find_floor_height(f32 x, f32 y, f32 z) { struct Surface *floor; - - f32 floorHeight = find_floor(x, y, z, &floor); - - return floorHeight; + return find_floor(x, y, z, &floor); } /** @@ -554,9 +470,9 @@ f32 unused_find_dynamic_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfl */ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { s32 cellZ, cellX; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif struct Surface *floor, *dynamicFloor; struct SurfaceNode *surfaceList; @@ -574,9 +490,9 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { *pfloor = NULL; if (is_outside_level_bounds(x, z)) { - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG collisionTime[perfIteration] += osGetTime() - first; - #endif +#endif return height; } @@ -645,9 +561,7 @@ f32 find_water_floor(s32 xPos, s32 yPos, s32 zPos, struct Surface **pfloor) { s32 y = yPos; s32 z = zPos; - if (is_outside_level_bounds(x, z)) { - return height; - } + if (is_outside_level_bounds(x, z)) return height; // Each level is split into cells to limit load, find the appropriate cell. cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; @@ -681,15 +595,10 @@ s32 find_water_level_and_floor(s32 x, s32 z, struct Surface **pfloor) { s32 waterLevel = FLOOR_LOWER_LIMIT; TerrainData *p = gEnvironmentRegions; struct Surface *floor = NULL; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif - - if (gCheckingSurfaceCollisionsForCamera) { - waterLevel = find_water_floor(x, gLakituState.pos[1], z, &floor); - } else { - waterLevel = find_water_floor(x, gMarioState->pos[1], z, &floor); - } +#endif + waterLevel = find_water_floor(x, (gCheckingSurfaceCollisionsForCamera ? gLakituState.pos[1] : gMarioState->pos[1]), z, &floor); if (p != NULL && waterLevel == FLOOR_LOWER_LIMIT) { numRegions = *p++; @@ -714,10 +623,9 @@ s32 find_water_level_and_floor(s32 x, s32 z, struct Surface **pfloor) { *pfloor = floor; } - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif - +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return waterLevel; } @@ -763,9 +671,9 @@ s32 find_water_level(s32 x, s32 z) { } } - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return waterLevel; } @@ -780,9 +688,9 @@ s32 find_poison_gas_level(s32 x, s32 z) { s32 loX, hiX, loZ, hiZ; s32 gasLevel = FLOOR_LOWER_LIMIT; TerrainData *p = gEnvironmentRegions; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif if (p != NULL) { numRegions = *p++; @@ -809,9 +717,9 @@ s32 find_poison_gas_level(s32 x, s32 z) { } } - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return gasLevel; } @@ -825,12 +733,10 @@ s32 find_poison_gas_level(s32 x, s32 z) { */ static s32 surface_list_length(struct SurfaceNode *list) { s32 count = 0; - while (list != NULL) { list = list->next; count++; } - return count; } @@ -946,51 +852,34 @@ s32 ray_surface_intersect(Vec3f orig, Vec3f dir, f32 dir_length, struct Surface f32 a, f, u, v; Vec3f add_dir; Vec3f norm; - - //Ignore certain surface types. - if (surface->type == SURFACE_INTANGIBLE || surface->flags & SURFACE_FLAG_NO_CAM_COLLISION) - return FALSE; - + // Ignore certain surface types. + if (surface->type == SURFACE_INTANGIBLE || surface->flags & SURFACE_FLAG_NO_CAM_COLLISION) return FALSE; // Get surface normal and some other stuff vec3_set(norm, 0, surface->normal.y, 0); vec3_mul_val(norm, RAY_OFFSET); - vec3_copy(v0, surface->vertex1); vec3_copy(v1, surface->vertex2); vec3_copy(v2, surface->vertex3); - - vec3_add(v0, norm); - vec3_add(v1, norm); - vec3_add(v2, norm); - + vec3_add( v0, norm); + vec3_add( v1, norm); + vec3_add( v2, norm); vec3_diff(e1, v1, v0); vec3_diff(e2, v2, v0); - vec3_cross(h, dir, e2); - // Check if we're perpendicular from the surface a = vec3_dot(e1, h); - if (a > -0.00001f && a < 0.00001f) { - return FALSE; - } + if ((a > -NEAR_ZERO) && (a < NEAR_ZERO)) return FALSE; // Check if we're making contact with the surface f = 1.0f / a; - vec3_diff(s, orig, v0); u = f * vec3_dot(s, h); - if (u < 0.0f || u > 1.0f) { - return FALSE; - } + if ((u < 0.0f) || (u > 1.0f)) return FALSE; vec3_cross(q, s, e1); v = f * vec3_dot(dir, q); - if (v < 0.0f || u + v > 1.0f) { - return FALSE; - } + if ((v < 0.0f) || ((u + v) > 1.0f)) return FALSE; // Get the length between our origin and the surface contact point *length = f * vec3_dot(e2, q); - if (*length <= 0.00001 || *length > dir_length) { - return FALSE; - } + if (*length <= 0.00001 || *length > dir_length) return FALSE; // Successful contact vec3f_copy(add_dir, dir); vec3_mul_val(add_dir, *length); @@ -1009,42 +898,38 @@ void find_surface_on_ray_list(struct SurfaceNode *list, Vec3f orig, Vec3f dir, f // Get upper and lower bounds of ray if (dir[1] >= 0.0f) { - top = orig[1] + dir[1] * dir_length; + top = (orig[1] + (dir[1] * dir_length)); bottom = orig[1]; } else { - top = orig[1]; - bottom = orig[1] + dir[1] * dir_length; + top = orig[1]; + bottom = (orig[1] + (dir[1] * dir_length)); } // Iterate through every surface of the list for (; list != NULL; list = list->next) { // Reject surface if out of vertical bounds - if (list->surface->lowerY > top || list->surface->upperY < bottom) { - continue; - } + if (list->surface->lowerY > top || list->surface->upperY < bottom) continue; // Check intersection between the ray and this surface - if ((hit = ray_surface_intersect(orig, dir, dir_length, list->surface, chk_hit_pos, &length)) != 0) { - if (length <= *max_length) { - *hit_surface = list->surface; - vec3f_copy(hit_pos, chk_hit_pos); - *max_length = length; - } + if ((hit = ray_surface_intersect(orig, dir, dir_length, list->surface, chk_hit_pos, &length)) && (length <= *max_length)) { + *hit_surface = list->surface; + vec3f_copy(hit_pos, chk_hit_pos); + *max_length = length; } } - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += (osGetTime() - first); +#endif } void find_surface_on_ray_cell(s32 cellX, s32 cellZ, Vec3f orig, Vec3f normalized_dir, f32 dir_length, struct Surface **hit_surface, Vec3f hit_pos, f32 *max_length, s32 flags) { // Skip if OOB if (cellX >= 0 && cellX <= (NUM_CELLS - 1) && cellZ >= 0 && cellZ <= (NUM_CELLS - 1)) { // Iterate through each surface in this partition - if (normalized_dir[1] > -0.99999f && flags & RAYCAST_FIND_CEIL) { + if ((normalized_dir[1] > -NEAR_ONE) && (flags & RAYCAST_FIND_CEIL)) { find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); } - if (normalized_dir[1] < 0.99999f && flags & RAYCAST_FIND_FLOOR) { + if ((normalized_dir[1] < NEAR_ONE) && (flags & RAYCAST_FIND_FLOOR)) { find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); } @@ -1060,12 +945,10 @@ void find_surface_on_ray_cell(s32 cellX, s32 cellZ, Vec3f orig, Vec3f normalized } void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, s32 flags) { - f32 max_length; s32 cellZ, cellX, cellPrevX, cellPrevZ; f32 fCellZ, fCellX; - f32 dir_length; Vec3f normalized_dir; - f32 step, dx, dz; + f32 step; s32 i; // Set that no surface has been hit @@ -1073,8 +956,8 @@ void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Ve vec3_sum(hit_pos, orig, dir); // Get normalized direction - dir_length = vec3_mag(dir); - max_length = dir_length; + f32 dir_length = vec3_mag(dir); + f32 max_length = dir_length; vec3f_copy(normalized_dir, dir); vec3f_normalize(normalized_dir); @@ -1093,13 +976,13 @@ void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Ve } // Get cells we cross using DDA - if (ABS(dir[0]) >= ABS(dir[2])) + if (ABS(dir[0]) >= ABS(dir[2])) { step = RAY_STEPS * ABS(dir[0]) / CELL_SIZE; - else + } else { step = RAY_STEPS * ABS(dir[2]) / CELL_SIZE; - - dx = dir[0] / step / CELL_SIZE; - dz = dir[2] / step / CELL_SIZE; + } + f32 dx = dir[0] / step / CELL_SIZE; + f32 dz = dir[2] / step / CELL_SIZE; for (i = 0; i < step && *hit_surface == NULL; i++) { find_surface_on_ray_cell(cellX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); diff --git a/src/game/behaviors/bbh_tilting_trap.inc.c b/src/game/behaviors/bbh_tilting_trap.inc.c index d2657bb4..9dc0cc01 100644 --- a/src/game/behaviors/bbh_tilting_trap.inc.c +++ b/src/game/behaviors/bbh_tilting_trap.inc.c @@ -29,7 +29,7 @@ void bhv_bbh_tilting_trap_platform_loop(void) { // the platform more dangerous. This code will not work correctly // without the oAction changes above, since oTimer will not ever // reset to 0 without them. - if ((absi(o->oFaceAnglePitch) < 3000) || (o->oTimer >= 16)) { + if ((ABSI(o->oFaceAnglePitch) < 3000) || (o->oTimer >= 16)) { // Make the platform return to the horizontal at a speed of // 200 angle units/frame, and clamp it to 0 if it's within 200 units of 0. o->oAngleVelPitch = 0; diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 7ca36a0a..6509da94 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -854,6 +854,17 @@ void bhv_boo_in_castle_loop(void) { cur_obj_move_using_fvel_and_gravity(); } +static s8 sBbhStairJiggleOffsets[] = { -8, 8, -4, 4 }; + +s32 jiggle_bbh_stair(s32 index) { + if (index >= 4 || index < 0) { + return TRUE; + } + + o->oPosY += sBbhStairJiggleOffsets[index]; + return FALSE; +} + void bhv_boo_staircase(void) { f32 targetY = 0.0f; diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index a4a70ebb..609ec508 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -508,10 +508,9 @@ void bhv_wooden_post_update(void) { if (o->oDistanceToMario > 400.0f) { o->oTimer = o->oWoodenPostTotalMarioAngle = 0; } else { - // When mario runs around the post 3 times within 200 frames, spawn - // coins + // When mario runs around the post 3 times within 200 frames, spawn coins o->oWoodenPostTotalMarioAngle += (s16)(o->oAngleToMario - o->oWoodenPostPrevAngleToMario); - if (absi(o->oWoodenPostTotalMarioAngle) > 0x30000 && o->oTimer < 200) { + if (ABSI(o->oWoodenPostTotalMarioAngle) > 0x30000 && o->oTimer < 200) { obj_spawn_loot_yellow_coins(o, 5, 20.0f); set_object_respawn_info_bits(o, 1); } diff --git a/src/game/behaviors/checkerboard_platform.inc.c b/src/game/behaviors/checkerboard_platform.inc.c index 353fc35e..c7fd8798 100644 --- a/src/game/behaviors/checkerboard_platform.inc.c +++ b/src/game/behaviors/checkerboard_platform.inc.c @@ -38,8 +38,9 @@ void checkerboard_plat_act_move_y(UNUSED s32 unused, f32 vel, s32 time) { void checkerboard_plat_act_rotate(s32 nextAction, s16 pitch) { o->oVelY = 0.0f; o->oAngleVelPitch = pitch; - if (o->oTimer + 1 == 0x8000 / absi(pitch)) + if (o->oTimer + 1 == 0x8000 / ABSI(pitch)) { o->oAction = nextAction; + } o->oCheckerBoardPlatformRotateAction = nextAction; } @@ -72,12 +73,13 @@ void bhv_checkerboard_platform_loop(void) { checkerboard_plat_act_rotate(1, -512); break; } - o->oMoveAnglePitch += absi(o->oAngleVelPitch); - o->oFaceAnglePitch += absi(o->oAngleVelPitch); + o->oMoveAnglePitch += ABSI(o->oAngleVelPitch); + o->oFaceAnglePitch += ABSI(o->oAngleVelPitch); o->oFaceAngleYaw = o->oMoveAngleYaw; if (o->oMoveAnglePitch != 0) { - o->oForwardVel = signum_positive(o->oAngleVelPitch) * sins(o->oMoveAnglePitch) * radius; - o->oVelY = signum_positive(o->oAngleVelPitch) * coss(o->oMoveAnglePitch) * radius; + f32 mul = (o->oAngleVelPitch >= 0) ? 1.0f : -1.0f; + o->oForwardVel = mul * sins(o->oMoveAnglePitch) * radius; + o->oVelY = mul * coss(o->oMoveAnglePitch) * radius; } if (o->oCheckerBoardPlatformRotateAction == 1) { o->oAngleVelPitch = 0; diff --git a/src/game/behaviors/coffin.inc.c b/src/game/behaviors/coffin.inc.c index 081a6869..dc35492e 100644 --- a/src/game/behaviors/coffin.inc.c +++ b/src/game/behaviors/coffin.inc.c @@ -101,7 +101,7 @@ void coffin_act_idle(void) { // It also checks in the case Mario is squished, so he doesn't get permanently squished. if (o->oTimer > 60 && (o->oDistanceToMario > 100.0f || gMarioState->action == ACT_SQUISHED)) { - if (gMarioObject->oPosY - o->oPosY < 200.0f && absf(distForwards) < 140.0f) { + if (gMarioObject->oPosY - o->oPosY < 200.0f && ABSF(distForwards) < 140.0f) { if (distSideways < 150.0f && distSideways > -450.0f) { cur_obj_play_sound_2(SOUND_GENERAL_BUTTON_PRESS_2_LOWPRIO); o->oAction = COFFIN_ACT_STAND_UP; diff --git a/src/game/behaviors/jrb_ship.inc.c b/src/game/behaviors/jrb_ship.inc.c index a88606a1..ba8ce49e 100644 --- a/src/game/behaviors/jrb_ship.inc.c +++ b/src/game/behaviors/jrb_ship.inc.c @@ -65,12 +65,13 @@ void bhv_jrb_sliding_box_loop(void) { o->oJrbSlidingBoxAdditiveZ = sins(o->oJrbSlidingBoxAngle) * 20.0f; o->oJrbSlidingBoxAngle += 0x100; o->oParentRelativePosZ += o->oJrbSlidingBoxAdditiveZ; - if (gMarioObject->oPosY > 1000.0f) - if (absf(o->oJrbSlidingBoxAdditiveZ) > 3.0f) - cur_obj_play_sound_1(SOUND_AIR_ROUGH_SLIDE); + if ((gMarioObject->oPosY > 1000.0f) && (ABSF(o->oJrbSlidingBoxAdditiveZ) > 3.0f)) { + cur_obj_play_sound_1(SOUND_AIR_ROUGH_SLIDE); + } obj_set_hitbox(o, &sSkullSlidingBoxHitbox); - if (!(o->oJrbSlidingBoxAngle & 0x7FFF)) + if (!(o->oJrbSlidingBoxAngle & 0x7FFF)) { cur_obj_become_tangible(); + } if (obj_check_if_collided_with_object(o, gMarioObject)) { o->oInteractStatus = 0; cur_obj_become_intangible(); diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index a2adb846..561c4673 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -104,9 +104,9 @@ static void klepto_change_target(void) { dx = gMarioObject->oPosX - sKleptoTargetPositions[i][0]; dz = gMarioObject->oPosZ - sKleptoTargetPositions[i][2]; - targetDist = sqrtf(sqr(dx) + sqr(dz)); - if (targetDist < minTargetDist) { - minTargetDist = targetDist; + targetDist = (sqr(dx) + sqr(dz)); + if (targetDist < sqr(minTargetDist)) { + minTargetDist = sqrtf(targetDist); newTarget = i; } } @@ -114,7 +114,7 @@ static void klepto_change_target(void) { newTarget = random_u16() % 3; } - o->oKleptoHomeYOffset = 400 * absi(newTarget - o->oKleptoTargetNumber); + o->oKleptoHomeYOffset = 400 * ABSI(newTarget - o->oKleptoTargetNumber); o->oKleptoTargetNumber = newTarget; o->oHomeX = sKleptoTargetPositions[o->oKleptoTargetNumber][0]; diff --git a/src/game/behaviors/mr_blizzard.inc.c b/src/game/behaviors/mr_blizzard.inc.c index 62d3f46e..44c7cea8 100644 --- a/src/game/behaviors/mr_blizzard.inc.c +++ b/src/game/behaviors/mr_blizzard.inc.c @@ -182,7 +182,7 @@ static void mr_blizzard_act_rotate(void) { // If Dizziness is not 0 and Mr. Blizzard's FaceRollAngle has a magnitude greater than // 67.5 degrees move to death action, delete the snowball, and make Mr. Blizzard intangible. if (o->oMrBlizzardDizziness != 0.0f) { - if (absi(o->oFaceAngleRoll) > 0x3000) { + if (ABSI(o->oFaceAngleRoll) > 0x3000) { o->oAction = MR_BLIZZARD_ACT_DEATH; o->prevObj = o->oMrBlizzardHeldObj = NULL; cur_obj_become_intangible(); diff --git a/src/game/behaviors/seesaw_platform.inc.c b/src/game/behaviors/seesaw_platform.inc.c index 4822ec25..b977da37 100644 --- a/src/game/behaviors/seesaw_platform.inc.c +++ b/src/game/behaviors/seesaw_platform.inc.c @@ -31,7 +31,7 @@ void bhv_seesaw_platform_init(void) { void bhv_seesaw_platform_update(void) { o->oFaceAnglePitch += (s32) o->oSeesawPlatformPitchVel; - if (absf(o->oSeesawPlatformPitchVel) > 10.0f) { + if (ABSF(o->oSeesawPlatformPitchVel) > 10.0f) { cur_obj_play_sound_1(SOUND_ENV_BOAT_ROCKING1); } diff --git a/src/game/behaviors/sl_snowman_wind.inc.c b/src/game/behaviors/sl_snowman_wind.inc.c index a9d41b2e..d62efab0 100644 --- a/src/game/behaviors/sl_snowman_wind.inc.c +++ b/src/game/behaviors/sl_snowman_wind.inc.c @@ -20,9 +20,9 @@ void bhv_sl_snowman_wind_loop(void) { // Mario has come close, begin dialog. } else if (o->oSubAction == SL_SNOWMAN_WIND_ACT_TALKING) { - if (cur_obj_update_dialog(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TEXT_DEFAULT, DIALOG_153, 0)) + if (cur_obj_update_dialog(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TEXT_DEFAULT, DIALOG_153, 0)) { o->oSubAction++; - + } // Blowing, spawn wind particles (SL_SNOWMAN_WIND_ACT_BLOWING) } else if (o->oDistanceToMario < 1500.0f && absf(gMarioObject->oPosY - o->oHomeY) < 500.0f) { // Point towards Mario, but only within 0x1500 angle units of the original angle. diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 961a12c9..3d53800a 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -343,7 +343,7 @@ s32 update_hang_moving(struct MarioState *m) { // Reduce Mario's forward speed by the turn amount, so Mario won't move off sideward from the intended angle when turning around. m->forwardVel *= ((coss(dYaw) + 1.0f) / 2.0f); // 1.0f is turning forwards, 0.0f is turning backwards // Increase turn speed if forwardVel is lower and intendedMag is higher - turnRange *= (2.0f - (ABSF(m->forwardVel) / MAX(m->intendedMag, __FLT_EPSILON__))); // 1.0f front, 2.0f back + turnRange *= (2.0f - (ABSF(m->forwardVel) / MAX(m->intendedMag, NEAR_ZERO))); // 1.0f front, 2.0f back } m->faceAngle[1] = approach_angle(m->faceAngle[1], m->intendedYaw, turnRange); #else diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 600f51a4..74a03ea5 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -468,7 +468,7 @@ void update_walking_speed(struct MarioState *m) { // Reduce Mario's forward speed by the turn amount, so Mario won't move off sideward from the intended angle when turning around. m->forwardVel *= ((coss(dYaw) + 1.0f) / 2.0f); // 1.0f is turning forwards, 0.0f is turning backwards // Increase turn speed if forwardVel is lower and intendedMag is higher - turnRange *= (2.0f - (ABSF(m->forwardVel) / MAX(m->intendedMag, __FLT_EPSILON__))); // 1.0f front, 2.0f back + turnRange *= (2.0f - (ABSF(m->forwardVel) / MAX(m->intendedMag, NEAR_ZERO))); // 1.0f front, 2.0f back } m->faceAngle[1] = approach_angle(m->faceAngle[1], m->intendedYaw, turnRange); #elif GROUND_TURN_MODE == 2 // similar to mode 1, but a bit further from vanilla, and allows instant turnaround if Mario is moving slower than a certain threshold. diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index dd1d1a7b..2af73438 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -386,10 +386,9 @@ static s32 obj_smooth_turn(s16 *angleVel, s32 *angle, s16 targetAngle, f32 targe s16 currentSpeed; s16 currentAngle = (s16)(*angle); - *angleVel = - approach_s16_symmetric(*angleVel, (targetAngle - currentAngle) * targetSpeedProportion, accel); + *angleVel = approach_s16_symmetric(*angleVel, (targetAngle - currentAngle) * targetSpeedProportion, accel); - currentSpeed = absi(*angleVel); + currentSpeed = ABSI(*angleVel); clamp_s16(¤tSpeed, minSpeed, maxSpeed); *angle = approach_angle(*angle, targetAngle, currentSpeed); diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index d5281d52..e19e7f6c 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -28,7 +28,6 @@ #include "spawn_sound.h" #include "puppylights.h" -static s8 sBbhStairJiggleOffsets[] = { -8, 8, -4, 4 }; static s8 sLevelsWithRooms[] = { LEVEL_BBH, LEVEL_CASTLE, LEVEL_HMC, -1 }; static s32 clear_move_flag(u32 * bitSet, s32 flag); @@ -146,10 +145,10 @@ Gfx *geo_switch_anim_state(s32 callContext, struct GraphNode *node, UNUSED void return NULL; } +//! rename to geo_switch_room? Gfx *geo_switch_area(s32 callContext, struct GraphNode *node, UNUSED void *context) { s16 roomCase; struct Surface *floor; - UNUSED struct Object *obj = (struct Object *) gCurGraphNodeObject; // TODO: change global type to Object pointer struct GraphNodeSwitchCase *switchCase = (struct GraphNodeSwitchCase *) node; if (callContext == GEO_CONTEXT_RENDER) { @@ -178,31 +177,19 @@ Gfx *geo_switch_area(s32 callContext, struct GraphNode *node, UNUSED void *conte } void obj_update_pos_from_parent_transformation(Mat4 mtx, struct Object *obj) { - f32 parentRelX = obj->oParentRelativePosX; - f32 parentRelY = obj->oParentRelativePosY; - f32 parentRelZ = obj->oParentRelativePosZ; + Vec3f rel; + vec3_copy(rel, &obj->oParentRelativePosVec); - obj->oPosX = parentRelX * mtx[0][0] + parentRelY * mtx[1][0] + parentRelZ * mtx[2][0] + mtx[3][0]; - obj->oPosY = parentRelX * mtx[0][1] + parentRelY * mtx[1][1] + parentRelZ * mtx[2][1] + mtx[3][1]; - obj->oPosZ = parentRelX * mtx[0][2] + parentRelY * mtx[1][2] + parentRelZ * mtx[2][2] + mtx[3][2]; + obj->oPosX = rel[0] * mtx[0][0] + rel[1] * mtx[1][0] + rel[2] * mtx[2][0] + mtx[3][0]; + obj->oPosY = rel[0] * mtx[0][1] + rel[1] * mtx[1][1] + rel[2] * mtx[2][1] + mtx[3][1]; + obj->oPosZ = rel[0] * mtx[0][2] + rel[1] * mtx[1][2] + rel[2] * mtx[2][2] + mtx[3][2]; } void obj_apply_scale_to_matrix(struct Object *obj, Mat4 dst, Mat4 src) { - dst[0][0] = src[0][0] * obj->header.gfx.scale[0]; - dst[1][0] = src[1][0] * obj->header.gfx.scale[1]; - dst[2][0] = src[2][0] * obj->header.gfx.scale[2]; - dst[3][0] = src[3][0]; - - dst[0][1] = src[0][1] * obj->header.gfx.scale[0]; - dst[1][1] = src[1][1] * obj->header.gfx.scale[1]; - dst[2][1] = src[2][1] * obj->header.gfx.scale[2]; - dst[3][1] = src[3][1]; - - dst[0][2] = src[0][2] * obj->header.gfx.scale[0]; - dst[1][2] = src[1][2] * obj->header.gfx.scale[1]; - dst[2][2] = src[2][2] * obj->header.gfx.scale[2]; - dst[3][2] = src[3][2]; - + vec3_prod_val(dst[0], src[0], obj->header.gfx.scale[0]); + vec3_prod_val(dst[1], src[1], obj->header.gfx.scale[1]); + vec3_prod_val(dst[2], src[2], obj->header.gfx.scale[2]); + vec3_copy(dst[3], src[3]); dst[0][3] = src[0][3]; dst[1][3] = src[1][3]; dst[2][3] = src[2][3]; @@ -240,17 +227,9 @@ void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior) obj->parentObj = o; if (obj->oFlags & OBJ_FLAG_HOLDABLE) { - if (heldBehavior == bhvCarrySomethingHeld) { - obj->oHeldState = HELD_HELD; - } - - if (heldBehavior == bhvCarrySomethingThrown) { - obj->oHeldState = HELD_THROWN; - } - - if (heldBehavior == bhvCarrySomethingDropped) { - obj->oHeldState = HELD_DROPPED; - } + if (heldBehavior == bhvCarrySomethingHeld ) obj->oHeldState = HELD_HELD; + if (heldBehavior == bhvCarrySomethingThrown ) obj->oHeldState = HELD_THROWN; + if (heldBehavior == bhvCarrySomethingDropped) obj->oHeldState = HELD_DROPPED; } else { obj->curBhvCommand = segmented_to_virtual(heldBehavior); obj->bhvStackIndex = 0; @@ -258,18 +237,15 @@ void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior) } f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2) { - f32 dx = obj1->oPosX - obj2->oPosX; - f32 dz = obj1->oPosZ - obj2->oPosZ; - - return sqrtf(sqr(dx) + sqr(dz)); + f32 lateralDist; + vec3f_get_lateral_dist(&obj1->oPosVec, &obj2->oPosVec, &lateralDist); + return lateralDist; } f32 dist_between_objects(struct Object *obj1, struct Object *obj2) { - f32 dx = obj1->oPosX - obj2->oPosX; - f32 dy = obj1->oPosY - obj2->oPosY; - f32 dz = obj1->oPosZ - obj2->oPosZ; - - return sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); + f32 dist; + vec3f_get_dist(&obj1->oPosVec, &obj2->oPosVec, &dist); + return dist; } void cur_obj_forward_vel_approach_upward(f32 target, f32 increment) { @@ -546,50 +522,32 @@ void linear_mtxf_mul_vec3f(Mat4 m, Vec3f dst, Vec3f v) { void linear_mtxf_transpose_mul_vec3f(Mat4 m, Vec3f dst, Vec3f v) { s32 i; for (i = 0; i < 3; i++) { - dst[i] = m[i][0] * v[0] + m[i][1] * v[1] + m[i][2] * v[2]; + dst[i] = vec3_dot(m[i], v); } } void obj_apply_scale_to_transform(struct Object *obj) { - f32 scaleX = obj->header.gfx.scale[0]; - f32 scaleY = obj->header.gfx.scale[1]; - f32 scaleZ = obj->header.gfx.scale[2]; - - obj->transform[0][0] *= scaleX; - obj->transform[0][1] *= scaleX; - obj->transform[0][2] *= scaleX; - - obj->transform[1][0] *= scaleY; - obj->transform[1][1] *= scaleY; - obj->transform[1][2] *= scaleY; - - obj->transform[2][0] *= scaleZ; - obj->transform[2][1] *= scaleZ; - obj->transform[2][2] *= scaleZ; + Vec3f scale; + vec3_copy(scale, obj->header.gfx.scale); + vec3_mul_val(obj->transform[0], scale[0]); + vec3_mul_val(obj->transform[1], scale[1]); + vec3_mul_val(obj->transform[2], scale[2]); } void obj_copy_scale(struct Object *dst, struct Object *src) { - dst->header.gfx.scale[0] = src->header.gfx.scale[0]; - dst->header.gfx.scale[1] = src->header.gfx.scale[1]; - dst->header.gfx.scale[2] = src->header.gfx.scale[2]; + vec3_copy(dst->header.gfx.scale, src->header.gfx.scale); } void obj_scale_xyz(struct Object *obj, f32 xScale, f32 yScale, f32 zScale) { - obj->header.gfx.scale[0] = xScale; - obj->header.gfx.scale[1] = yScale; - obj->header.gfx.scale[2] = zScale; + vec3_set(obj->header.gfx.scale, xScale, yScale, zScale); } void obj_scale(struct Object *obj, f32 scale) { - obj->header.gfx.scale[0] = scale; - obj->header.gfx.scale[1] = scale; - obj->header.gfx.scale[2] = scale; + vec3_same(obj->header.gfx.scale, scale); } void cur_obj_scale(f32 scale) { - o->header.gfx.scale[0] = scale; - o->header.gfx.scale[1] = scale; - o->header.gfx.scale[2] = scale; + vec3_same(o->header.gfx.scale, scale); } void cur_obj_init_animation(s32 animIndex) { @@ -676,9 +634,7 @@ void cur_obj_unused_init_on_floor(void) { } void obj_set_face_angle_to_move_angle(struct Object *obj) { - obj->oFaceAnglePitch = obj->oMoveAnglePitch; - obj->oFaceAngleYaw = obj->oMoveAngleYaw; - obj->oFaceAngleRoll = obj->oMoveAngleRoll; + vec3_copy(&obj->oFaceAngleVec, &obj->oMoveAngleVec); } u32 get_object_list_from_behavior(const BehaviorScript *behavior) { @@ -696,23 +652,15 @@ u32 get_object_list_from_behavior(const BehaviorScript *behavior) { } struct Object *cur_obj_nearest_object_with_behavior(const BehaviorScript *behavior) { - struct Object *obj; f32 dist; - - obj = cur_obj_find_nearest_object_with_behavior(behavior, &dist); - + struct Object *obj = cur_obj_find_nearest_object_with_behavior(behavior, &dist); return obj; } f32 cur_obj_dist_to_nearest_object_with_behavior(const BehaviorScript *behavior) { - struct Object *obj; f32 dist; - - obj = cur_obj_find_nearest_object_with_behavior(behavior, &dist); - if (obj == NULL) { - dist = 15000.0f; - } - + struct Object *obj = cur_obj_find_nearest_object_with_behavior(behavior, &dist); + if (obj == NULL) dist = 15000.0f; return dist; } @@ -807,10 +755,8 @@ struct Object *cur_obj_find_nearby_held_actor(const BehaviorScript *behavior, f3 } } } - obj = (struct Object *) obj->header.next; } - return foundObj; } @@ -828,7 +774,6 @@ void cur_obj_change_action(s32 action) { void cur_obj_set_vel_from_mario_vel(f32 min, f32 mul) { f32 marioFwdVel = gMarioStates[0].forwardVel; f32 minVel = min * mul; - if (marioFwdVel < minVel) { o->oForwardVel = minVel; } else { @@ -845,7 +790,6 @@ void cur_obj_reverse_animation(void) { void cur_obj_extend_animation_if_at_end(void) { s32 animFrame = o->header.gfx.animInfo.animFrame; s32 nearLoopEnd = o->header.gfx.animInfo.curAnim->loopEnd - 2; - if (animFrame == nearLoopEnd) o->header.gfx.animInfo.animFrame--; } @@ -853,78 +797,40 @@ s32 cur_obj_check_if_near_animation_end(void) { u32 animFlags = (s32) o->header.gfx.animInfo.curAnim->flags; s32 animFrame = o->header.gfx.animInfo.animFrame; s32 nearLoopEnd = o->header.gfx.animInfo.curAnim->loopEnd - 2; - s32 isNearEnd = FALSE; - - if (animFlags & ANIM_FLAG_NOLOOP && nearLoopEnd + 1 == animFrame) { - isNearEnd = TRUE; - } - - if (animFrame == nearLoopEnd) { - isNearEnd = TRUE; - } - - return isNearEnd; + return ((animFlags & ANIM_FLAG_NOLOOP && nearLoopEnd + 1 == animFrame) || animFrame == nearLoopEnd); } s32 cur_obj_check_if_at_animation_end(void) { s32 animFrame = o->header.gfx.animInfo.animFrame; s32 lastFrame = o->header.gfx.animInfo.curAnim->loopEnd - 1; - - if (animFrame == lastFrame) { - return TRUE; - } else { - return FALSE; - } + return (animFrame == lastFrame); } s32 cur_obj_check_anim_frame(s32 frame) { s32 animFrame = o->header.gfx.animInfo.animFrame; - - if (animFrame == frame) { - return TRUE; - } else { - return FALSE; - } + return (animFrame == frame); } s32 cur_obj_check_anim_frame_in_range(s32 startFrame, s32 rangeLength) { s32 animFrame = o->header.gfx.animInfo.animFrame; - - if (animFrame >= startFrame && animFrame < startFrame + rangeLength) { - return TRUE; - } else { - return FALSE; - } + return (animFrame >= startFrame && animFrame < startFrame + rangeLength); } s32 cur_obj_check_frame_prior_current_frame(s16 *frame) { s16 animFrame = o->header.gfx.animInfo.animFrame; - while (*frame != -1) { - if (*frame == animFrame) { - return TRUE; - } - + if (*frame == animFrame) return TRUE; frame++; } - return FALSE; } s32 mario_is_in_air_action(void) { - if (gMarioStates[0].action & ACT_FLAG_AIR) { - return TRUE; - } else { - return FALSE; - } + return (gMarioStates[0].action & ACT_FLAG_AIR); } s32 mario_is_dive_sliding(void) { - if (gMarioStates[0].action == ACT_DIVE_SLIDE) { - return TRUE; - } else { - return FALSE; - } + return (gMarioStates[0].action == ACT_DIVE_SLIDE); } void cur_obj_set_y_vel_and_animation(f32 yVel, s32 animIndex) { @@ -1318,76 +1224,38 @@ void obj_set_behavior(struct Object *obj, const BehaviorScript *behavior) { } s32 cur_obj_has_behavior(const BehaviorScript *behavior) { - if (o->behavior == segmented_to_virtual(behavior)) { - return TRUE; - } else { - return FALSE; - } + return (o->behavior == segmented_to_virtual(behavior)); } s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior) { - if (obj->behavior == segmented_to_virtual(behavior)) { - return TRUE; - } else { - return FALSE; - } + return (obj->behavior == segmented_to_virtual(behavior)); } f32 cur_obj_lateral_dist_from_mario_to_home(void) { - f32 dist; f32 dx = o->oHomeX - gMarioObject->oPosX; f32 dz = o->oHomeZ - gMarioObject->oPosZ; - - dist = sqrtf(sqr(dx) + sqr(dz)); - return dist; + return sqrtf(sqr(dx) + sqr(dz)); } f32 cur_obj_lateral_dist_to_home(void) { - f32 dist; f32 dx = o->oHomeX - o->oPosX; f32 dz = o->oHomeZ - o->oPosZ; - - dist = sqrtf(sqr(dx) + sqr(dz)); - return dist; + return sqrtf(sqr(dx) + sqr(dz)); } s32 cur_obj_outside_home_square(f32 halfLength) { - if (o->oHomeX - halfLength > o->oPosX) { - return TRUE; - } - - if (o->oHomeX + halfLength < o->oPosX) { - return TRUE; - } - - if (o->oHomeZ - halfLength > o->oPosZ) { - return TRUE; - } - - if (o->oHomeZ + halfLength < o->oPosZ) { - return TRUE; - } - + if (o->oHomeX - halfLength > o->oPosX) return TRUE; + if (o->oHomeX + halfLength < o->oPosX) return TRUE; + if (o->oHomeZ - halfLength > o->oPosZ) return TRUE; + if (o->oHomeZ + halfLength < o->oPosZ) return TRUE; return FALSE; } s32 cur_obj_outside_home_rectangle(f32 minX, f32 maxX, f32 minZ, f32 maxZ) { - if (o->oHomeX + minX > o->oPosX) { - return TRUE; - } - - if (o->oHomeX + maxX < o->oPosX) { - return TRUE; - } - - if (o->oHomeZ + minZ > o->oPosZ) { - return TRUE; - } - - if (o->oHomeZ + maxZ < o->oPosZ) { - return TRUE; - } - + if (o->oHomeX + minX > o->oPosX) return TRUE; + if (o->oHomeX + maxX < o->oPosX) return TRUE; + if (o->oHomeZ + minZ > o->oPosZ) return TRUE; + if (o->oHomeZ + maxZ < o->oPosZ) return TRUE; return FALSE; } @@ -1566,11 +1434,7 @@ s32 cur_obj_resolve_wall_collisions(void) { wall = collisionData.walls[collisionData.numWalls - 1]; o->oWallAngle = atan2s(wall->normal.z, wall->normal.x); - if (abs_angle_diff(o->oWallAngle, o->oMoveAngleYaw) > 0x4000) { - return TRUE; - } else { - return FALSE; - } + return (abs_angle_diff(o->oWallAngle, o->oMoveAngleYaw) > 0x4000); } } @@ -1674,19 +1538,10 @@ void cur_obj_move_standard(s16 steepSlopeAngleDegrees) { } } -UNUSED static s32 cur_obj_within_12k_bounds(void) { - if (o->oPosX < -12000.0f || 12000.0f < o->oPosX) { - return FALSE; - } - - if (o->oPosY < -12000.0f || 12000.0f < o->oPosY) { - return FALSE; - } - - if (o->oPosZ < -12000.0f || 12000.0f < o->oPosZ) { - return FALSE; - } - +UNUSED static s32 cur_obj_within_bounds(f32 bounds) { + if (o->oPosX < -bounds || bounds < o->oPosX) return FALSE; + if (o->oPosY < -bounds || bounds < o->oPosY) return FALSE; + if (o->oPosZ < -bounds || bounds < o->oPosZ) return FALSE; return TRUE; } @@ -1954,53 +1809,26 @@ void obj_set_hitbox(struct Object *obj, struct ObjectHitbox *hitbox) { cur_obj_become_tangible(); } - obj->hitboxRadius = obj->header.gfx.scale[0] * hitbox->radius; - obj->hitboxHeight = obj->header.gfx.scale[1] * hitbox->height; - obj->hurtboxRadius = obj->header.gfx.scale[0] * hitbox->hurtboxRadius; - obj->hurtboxHeight = obj->header.gfx.scale[1] * hitbox->hurtboxHeight; + obj->hitboxRadius = obj->header.gfx.scale[0] * hitbox->radius; + obj->hitboxHeight = obj->header.gfx.scale[1] * hitbox->height; + obj->hurtboxRadius = obj->header.gfx.scale[0] * hitbox->hurtboxRadius; + obj->hurtboxHeight = obj->header.gfx.scale[1] * hitbox->hurtboxHeight; obj->hitboxDownOffset = obj->header.gfx.scale[1] * hitbox->downOffset; } -s32 signum_positive(s32 x) { - if (x >= 0) { - return 1; - } else { - return -1; - } -} - -f32 absf(f32 x) { - if (x >= 0) { - return x; - } else { - return -x; - } -} - -s32 absi(s32 x) { - if (x >= 0) { - return x; - } else { - return -x; - } -} - s32 cur_obj_wait_then_blink(s32 timeUntilBlinking, s32 numBlinks) { - s32 done = FALSE; s32 timeBlinking; - if (o->oTimer >= timeUntilBlinking) { if ((timeBlinking = o->oTimer - timeUntilBlinking) % 2 != 0) { o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; if (timeBlinking / 2 > numBlinks) { - done = TRUE; + return TRUE; } } else { o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; } } - - return done; + return FALSE; } s32 cur_obj_is_mario_ground_pounding_platform(void) { @@ -2009,7 +1837,6 @@ s32 cur_obj_is_mario_ground_pounding_platform(void) { return TRUE; } } - return FALSE; } @@ -2025,9 +1852,9 @@ void spawn_mist_particles_with_sound(u32 soundMagic) { void cur_obj_push_mario_away(f32 radius) { f32 marioRelX = gMarioObject->oPosX - o->oPosX; f32 marioRelZ = gMarioObject->oPosZ - o->oPosZ; - f32 marioDist = sqrtf(sqr(marioRelX) + sqr(marioRelZ)); + f32 marioDist = (sqr(marioRelX) + sqr(marioRelZ)); - if (marioDist < radius) { + if (marioDist < sqr(radius)) { //! If this function pushes Mario out of bounds, it will trigger Mario's // oob failsafe gMarioStates[0].pos[0] += (radius - marioDist) / radius * marioRelX; @@ -2048,9 +1875,7 @@ void cur_obj_push_mario_away_from_cylinder(f32 radius, f32 extentY) { } void bhv_dust_smoke_loop(void) { - o->oPosX += o->oVelX; - o->oPosY += o->oVelY; - o->oPosZ += o->oVelZ; + vec3_add(&o->oPosVec, &o->oVelVec); if (o->oSmokeTimer == 10) { obj_mark_for_deletion(o); @@ -2107,11 +1932,7 @@ void cur_obj_set_pos_to_home_with_debug(void) { } s32 cur_obj_is_mario_on_platform(void) { - if (gMarioObject->platform == o) { - return TRUE; - } else { - return FALSE; - } + return (gMarioObject->platform == o); } s32 cur_obj_shake_y_until(s32 cycles, s32 amount) { @@ -2121,20 +1942,7 @@ s32 cur_obj_shake_y_until(s32 cycles, s32 amount) { o->oPosY += amount; } - if (o->oTimer == cycles * 2) { - return TRUE; - } else { - return FALSE; - } -} - -s32 jiggle_bbh_stair(s32 index) { - if (index >= 4 || index < 0) { - return TRUE; - } - - o->oPosY += sBbhStairJiggleOffsets[index]; - return FALSE; + return (o->oTimer == cycles * 2); } void cur_obj_call_action_function(void (*actionFunctions[])(void)) { diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index aeef86ce..83bb8dff 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -219,9 +219,6 @@ struct GraphNode_802A45E4 { }; void obj_set_hitbox(struct Object *obj, struct ObjectHitbox *hitbox); -s32 signum_positive(s32 x); -f32 absf(f32 x); -s32 absi(s32 a0); s32 cur_obj_wait_then_blink(s32 timeUntilBlinking, s32 numBlinks); s32 cur_obj_is_mario_ground_pounding_platform(void); void spawn_mist_particles(void); @@ -233,7 +230,6 @@ s32 cur_obj_progress_direction_table(void); void cur_obj_scale_over_time(s32 axis, s32 times, f32 start, f32 end); void cur_obj_set_pos_to_home_with_debug(void); s32 cur_obj_is_mario_on_platform(void); -s32 jiggle_bbh_stair(s32 timer); void cur_obj_call_action_function(void (*actionFunctions[])(void)); void spawn_base_star_with_no_lvl_exit(void); s32 cur_obj_mario_far_away(void); diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index 6bf921b3..d6ceae06 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -1029,9 +1029,8 @@ void puppycam_projection_behaviours(void) { //This is the base floor height when stood on the ground. It's used to set a baseline for where the camera sits while Mario remains a height from this point, so it keeps a consistent motion. gPuppyCam.targetFloorHeight = CLAMP(find_floor_height(gPuppyCam.targetObj->oPosX, gPuppyCam.targetObj->oPosY, gPuppyCam.targetObj->oPosZ), gPuppyCam.targetObj->oPosY-350, gPuppyCam.targetObj->oPosY+300); - gPuppyCam.lastTargetFloorHeight = approach_f32_asymptotic(gPuppyCam.lastTargetFloorHeight - , gPuppyCam.targetFloorHeight - , CLAMP((absf(gMarioState->vel[1]) - 17.f) / 200.f, 0, 0.1f) + gPuppyCam.lastTargetFloorHeight = approach_f32_asymptotic(gPuppyCam.lastTargetFloorHeight , gPuppyCam.targetFloorHeight + , CLAMP((ABSF(gMarioState->vel[1]) - 17.f) / 200.f, 0, 0.1f) + CLAMP((absf(gPuppyCam.targetFloorHeight - gPuppyCam.lastTargetFloorHeight) - 30.f) / 300.f, 0, 0.1f)); if (gMarioState->action == ACT_SLEEPING || gMarioState->action == ACT_START_SLEEPING) { diff --git a/src/game/sound_init.c b/src/game/sound_init.c index 94b4c869..1abd9192 100644 --- a/src/game/sound_init.c +++ b/src/game/sound_init.c @@ -18,7 +18,6 @@ #define MUSIC_NONE 0xFFFF -static Vec3f unused80339DC0; static OSMesgQueue sSoundMesgQueue; static OSMesg sSoundMesgBuf[1]; static struct VblankHandler sSoundVblankHandler; @@ -334,52 +333,45 @@ void audio_game_loop_tick(void) { void thread4_sound(UNUSED void *arg) { audio_init(); sound_init(); - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime lastTime; - #endif - - // Zero-out unused vector - vec3f_copy(unused80339DC0, gVec3fZero); +#endif osCreateMesgQueue(&sSoundMesgQueue, sSoundMesgBuf, ARRAY_COUNT(sSoundMesgBuf)); set_vblank_handler(1, &sSoundVblankHandler, &sSoundMesgQueue, (OSMesg) 512); - while (TRUE) - { + while (TRUE) { OSMesg msg; osRecvMesg(&sSoundMesgQueue, &msg, OS_MESG_BLOCK); - #if PUPPYPRINT_DEBUG - while (TRUE) - { +#if PUPPYPRINT_DEBUG + while (TRUE) { lastTime = osGetTime(); dmaAudioTime[perfIteration] = 0; - #endif +#endif if (gResetTimer < 25) { struct SPTask *spTask; spTask = create_next_audio_frame_task(); if (spTask != NULL) { dispatch_audio_sptask(spTask); } - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG profiler_update(audioTime, lastTime); audioTime[perfIteration] -= dmaAudioTime[perfIteration]; - if (benchmarkLoop > 0 && benchOption == 1) - { + if (benchmarkLoop > 0 && benchOption == 1) { benchmarkLoop--; benchMark[benchmarkLoop] = osGetTime() - lastTime; - if (benchmarkLoop == 0) - { + if (benchmarkLoop == 0) { puppyprint_profiler_finished(); break; } - } - else + } else { break; - #endif + } +#endif } - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG } - #endif +#endif } }