diff --git a/src/audio/external.c b/src/audio/external.c index efd5b9bb..72345ea0 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -10,14 +10,11 @@ #include "game/level_update.h" #include "game/object_list_processor.h" #include "game/camera.h" +#include "engine/math_util.h" #include "seq_ids.h" #include "dialog_ids.h" -#if defined(VERSION_EU) || defined(VERSION_SH) #define EU_FLOAT(x) x##f -#else -#define EU_FLOAT(x) x -#endif // N.B. sound banks are different from the audio banks referred to in other // files. We should really fix our naming to be less ambiguous... @@ -845,7 +842,7 @@ static void process_sound_request(u32 bits, f32 *pos) { // Allocate from free list soundIndex = sSoundBankFreeListFront[bank]; - dist = sqrtf(pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]) * one; + dist = sqrtf(sqr(pos[0]) + sqr(pos[1]) + sqr(pos[2])) * one; sSoundBanks[bank][soundIndex].x = &pos[0]; sSoundBanks[bank][soundIndex].y = &pos[1]; sSoundBanks[bank][soundIndex].z = &pos[2]; diff --git a/src/engine/graph_node.c b/src/engine/graph_node.c index 3f968659..c91c1358 100644 --- a/src/engine/graph_node.c +++ b/src/engine/graph_node.c @@ -9,10 +9,6 @@ #include "game/area.h" #include "geo_layout.h" -// unused Mtx(s) -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 } }; - /** * 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/math_util.c b/src/engine/math_util.c index 4f4efad7..a8fc7189 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -12,6 +12,10 @@ #include "config.h" +// unused Mtx(s) +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 gVec3fX = { 1.0f, 0.0f, 0.0f }; Vec3f gVec3fY = { 0.0f, 1.0f, 0.0f }; Vec3f gVec3fZ = { 0.0f, 0.0f, 1.0f }; @@ -40,11 +44,7 @@ static inline s32 roundf(f32 in) { // } f32 absf(f32 x) { - if (x >= 0) { - return x; - } else { - return -x; - } + return ABSF(x); } /// Returns the lowest of three values. @@ -543,7 +543,7 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) { register s32 i; register s16 *c = b; for (i = 0; i < 3; i++) { - c[0] = x * temp2[0] + y * temp2[4] + z * temp2[8] + temp2[12]; + c[0] = (x * temp2[0]) + (y * temp2[4]) + (z * temp2[8]) + temp2[12]; c++; temp2++; } @@ -566,13 +566,13 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) { void mtxf_to_mtx_scale(Mtx *dest, Mat4 src) { Mat4 temp; register s32 i, j; - for( i = 0; i < 4; i++ ) { - for( j = 0; j < 3; j++ ) { - temp[i][j] = src[i][j] / gWorldScale; + for(i = 0; i < 4; i++) { + for(j = 0; j < 3; j++) { + temp[i][j] = (src[i][j] / gWorldScale); } temp[i][3] = src[i][3]; } - guMtxF2L( temp, dest ); + guMtxF2L(temp, dest); } void mtxf_to_mtx_constant(register s16 *dest, register f32 *src) { @@ -580,7 +580,7 @@ void mtxf_to_mtx_constant(register s16 *dest, register f32 *src) { s32 i; for (i = 0; i < 16; i++) { asFixedPoint = (src[i] * (1 << 16)); - dest[i] = (asFixedPoint >> 16); + dest[i ] = (asFixedPoint >> 16); dest[i + 16] = (asFixedPoint & 0xFFFF); } } @@ -660,7 +660,7 @@ void vec3f_get_lateral_dist(Vec3f from, Vec3f to, f32 *lateralDist) { *lateralDist = sqrtf(sqr(dx) + sqr(dz)); } -/// Finds the squared horizontal distance between two vectors. +/// Finds the squared horizontal distance between two vectors. Avoids a sqrtf call. void vec3f_get_lateral_dist_squared(Vec3f from, Vec3f to, f32 *lateralDist) { register f32 dx = (to[0] - from[0]); register f32 dz = (to[2] - from[2]); @@ -674,7 +674,7 @@ void vec3f_get_dist(Vec3f from, Vec3f to, f32 *dist) { *dist = vec3_mag(d); } -/// Finds the squared distance between two vectors. +/// Finds the squared distance between two vectors. Avoids a sqrtf call. void vec3f_get_dist_squared(Vec3f from, Vec3f to, f32 *dist) { register Vec3f d; vec3_diff(d, to, from); diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 24bf7753..5b58fee9 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -481,20 +481,21 @@ void mtxf_to_mtx_scale(Mtx *dest, Mat4 src); void mtxf_rotate_xy(Mtx *mtx, s32 angle); void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, Mat4 camMtx); -void vec2f_get_lateral_dist( Vec2f from, Vec2f to, f32 *lateralDist ); -void vec3f_get_lateral_dist( Vec3f from, Vec3f to, f32 *lateralDist ); -void vec3f_get_dist( Vec3f from, Vec3f to, f32 *dist ); -void vec3f_get_dist_squared( Vec3f from, Vec3f to, f32 *dist ); -void vec3f_get_dist_and_yaw( Vec3f from, Vec3f to, f32 *dist, Angle *yaw); -void vec3f_get_pitch( Vec3f from, Vec3f to, Angle *pitch ); -void vec3f_get_yaw( Vec3f from, Vec3f to, Angle *yaw); -void vec3f_get_angle( Vec3f from, Vec3f to, Angle *pitch, Angle *yaw); -void vec3f_get_lateral_dist_and_pitch( Vec3f from, Vec3f to, f32 *lateralDist, Angle *pitch ); -void vec3f_get_lateral_dist_and_yaw( Vec3f from, Vec3f to, f32 *lateralDist, Angle *yaw); -void vec3f_get_lateral_dist_and_angle( Vec3f from, Vec3f to, f32 *lateralDist, Angle *pitch, Angle *yaw); -void vec3f_get_dist_and_lateral_dist_and_angle(Vec3f from, Vec3f to, f32 *dist, f32 *lateralDist, Angle *pitch, Angle *yaw); -void vec3s_get_dist_and_angle( Vec3s from, Vec3s to, s16 *dist, Angle *pitch, Angle *yaw); -void vec3f_get_dist_and_angle( Vec3f from, Vec3f to, f32 *dist, Angle *pitch, Angle *yaw); +void vec2f_get_lateral_dist( Vec2f from, Vec2f to, f32 *lateralDist ); +void vec3f_get_lateral_dist( Vec3f from, Vec3f to, f32 *lateralDist ); +void vec3f_get_lateral_dist_squared( Vec3f from, Vec3f to, f32 *lateralDist ); +void vec3f_get_dist( Vec3f from, Vec3f to, f32 *dist ); +void vec3f_get_dist_squared( Vec3f from, Vec3f to, f32 *dist ); +void vec3f_get_dist_and_yaw( Vec3f from, Vec3f to, f32 *dist, Angle *yaw); +void vec3f_get_pitch( Vec3f from, Vec3f to, Angle *pitch ); +void vec3f_get_yaw( Vec3f from, Vec3f to, Angle *yaw); +void vec3f_get_angle( Vec3f from, Vec3f to, Angle *pitch, Angle *yaw); +void vec3f_get_lateral_dist_and_pitch( Vec3f from, Vec3f to, f32 *lateralDist, Angle *pitch ); +void vec3f_get_lateral_dist_and_yaw( Vec3f from, Vec3f to, f32 *lateralDist, Angle *yaw); +void vec3f_get_lateral_dist_and_angle( Vec3f from, Vec3f to, f32 *lateralDist, Angle *pitch, Angle *yaw); +void vec3f_get_dist_and_lateral_dist_and_angle(Vec3f from, Vec3f to, f32 *dist, f32 *lateralDist, Angle *pitch, Angle *yaw); +void vec3s_get_dist_and_angle( Vec3s from, Vec3s to, s16 *dist, Angle *pitch, Angle *yaw); +void vec3f_get_dist_and_angle( Vec3f from, Vec3f to, f32 *dist, Angle *pitch, Angle *yaw); void vec3s_set_dist_and_angle( Vec3s from, Vec3s to, s16 dist, Angle32 pitch, Angle32 yaw); void vec3f_set_dist_and_angle( Vec3f from, Vec3f to, f32 dist, Angle32 pitch, Angle32 yaw); diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index 2014bb1c..db8a3d4e 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -717,9 +717,9 @@ static void get_optimal_coll_dist(struct Object *obj) { */ void load_object_collision_model(void) { TerrainData vertexData[600]; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif TerrainData *collisionData = gCurrentObject->collisionData; f32 marioDist = gCurrentObject->oDistanceToMario; diff --git a/src/game/behavior_actions.h b/src/game/behavior_actions.h index 37701670..bab17674 100644 --- a/src/game/behavior_actions.h +++ b/src/game/behavior_actions.h @@ -569,7 +569,7 @@ Gfx *geo_snufit_move_mask(s32 callContext, struct GraphNode *node, UNUSED Mat4 * Gfx *geo_snufit_scale_body(s32 callContext, struct GraphNode *node, UNUSED Mat4 *c); // Bowser key cutscene -Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED f32 mtx[4][4]); +Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED Mat4 mtx); // Water splash extern struct WaterDropletParams gShallowWaterSplashDropletParams; diff --git a/src/game/behaviors/amp.inc.c b/src/game/behaviors/amp.inc.c index f9bb9bed..eb417c57 100644 --- a/src/game/behaviors/amp.inc.c +++ b/src/game/behaviors/amp.inc.c @@ -270,7 +270,7 @@ static void fixed_circling_amp_idle_loop(void) { f32 xToMario = gMarioObject->header.gfx.pos[0] - o->oPosX; f32 yToMario = gMarioObject->header.gfx.pos[1] + 120.0f - o->oPosY; f32 zToMario = gMarioObject->header.gfx.pos[2] - o->oPosZ; - s16 vAngleToMario = atan2s(sqrtf(xToMario * xToMario + zToMario * zToMario), -yToMario); + s16 vAngleToMario = atan2s(sqrtf(sqr(xToMario) + sqr(zToMario)), -yToMario); obj_turn_toward_object(o, gMarioObject, 19, 0x1000); o->oFaceAnglePitch = approach_s16_symmetric(o->oFaceAnglePitch, vAngleToMario, 0x1000); diff --git a/src/game/behaviors/bbh_merry_go_round.inc.c b/src/game/behaviors/bbh_merry_go_round.inc.c index d1d047da..f65a3197 100644 --- a/src/game/behaviors/bbh_merry_go_round.inc.c +++ b/src/game/behaviors/bbh_merry_go_round.inc.c @@ -12,7 +12,7 @@ static void handle_merry_go_round_music(void) { // If the music should play, play it and check whether it still should. // Otherwise, don't play it and check whether it should. - if (o->oMerryGoRoundMusicShouldPlay == FALSE) { + if (!o->oMerryGoRoundMusicShouldPlay) { if (gMarioCurrentRoom == BBH_NEAR_MERRY_GO_ROUND_ROOM) { // Play the merry-go-round and BBH music at the same time play_secondary_music(SEQ_EVENT_MERRY_GO_ROUND, 45, 20, 200); diff --git a/src/game/behaviors/beta_chest.inc.c b/src/game/behaviors/beta_chest.inc.c index 7a1a786d..6a373f29 100644 --- a/src/game/behaviors/beta_chest.inc.c +++ b/src/game/behaviors/beta_chest.inc.c @@ -44,7 +44,7 @@ void bhv_beta_chest_bottom_loop(void) { void bhv_beta_chest_lid_loop(void) { switch (o->oAction) { case BETA_CHEST_ACT_IDLE_CLOSED: - if (dist_between_objects(o->parentObj, gMarioObject) < 300.0f) { + if (dist_between_objects_squared(o->parentObj, gMarioObject) < sqr(300.0f)) { o->oAction++; // Set to BETA_CHEST_ACT_OPENING } diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 6509da94..037d8178 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -14,9 +14,9 @@ static struct ObjectHitbox sBooGivingStarHitbox = { // Relative positions static s16 sCourtyardBooTripletPositions[][3] = { - {0, 50, 0}, - {210, 110, 210}, - {-210, 70, -210} + { 0, 50, 0}, + { 210, 110, 210}, + {-210, 70, -210} }; static void boo_stop(void) { @@ -31,20 +31,14 @@ void bhv_boo_init(void) { static s32 boo_should_be_stopped(void) { if (cur_obj_has_behavior(bhvMerryGoRoundBigBoo) || cur_obj_has_behavior(bhvMerryGoRoundBoo)) { - if (!gMarioOnMerryGoRound) { - return TRUE; - } else { - return FALSE; - } + return (!gMarioOnMerryGoRound); } else { if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) { return TRUE; } - if (o->oRoom == 10) { - if (gTimeStopState & TIME_STOP_MARIO_OPENED_DOOR) { - return TRUE; - } + if ((o->oRoom == 10) && (gTimeStopState & TIME_STOP_MARIO_OPENED_DOOR)) { + return TRUE; } } @@ -52,20 +46,10 @@ static s32 boo_should_be_stopped(void) { } static s32 boo_should_be_active(void) { - f32 activationRadius; - - if (cur_obj_has_behavior(bhvBalconyBigBoo)) { - activationRadius = 5000.0f; - } else { - activationRadius = 1500.0f; - } + f32 activationRadius = (cur_obj_has_behavior(bhvBalconyBigBoo) ? 5000.0f : 1500.0f); if (cur_obj_has_behavior(bhvMerryGoRoundBigBoo) || cur_obj_has_behavior(bhvMerryGoRoundBoo)) { - if (gMarioOnMerryGoRound == TRUE) { - return TRUE; - } else { - return FALSE; - } + return (gMarioOnMerryGoRound); } else if (o->oRoom == -1) { if (o->oDistanceToMario < activationRadius) { return TRUE; @@ -299,11 +283,7 @@ static s32 boo_update_during_death(void) { } static s32 obj_has_attack_type(u32 attackType) { - if ((o->oInteractStatus & INT_STATUS_ATTACK_MASK) == attackType) { - return TRUE; - } else { - return FALSE; - } + return ((o->oInteractStatus & INT_STATUS_ATTACK_MASK) == attackType); } static s32 boo_get_attack_status(void) { @@ -338,7 +318,7 @@ static void boo_chase_mario(f32 minDY, s16 yawIncrement, f32 mul) { if (boo_vanish_or_appear()) { o->oInteractType = 0x8000; - if (cur_obj_lateral_dist_from_mario_to_home() > 1500.0f) { + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1500.0f)) { targetYaw = cur_obj_angle_to_home(); } else { targetYaw = o->oAngleToMario; diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index 61e175fe..50ef6f6e 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -187,11 +187,7 @@ s32 bowser_set_anim_look_up_and_walk(void) { if (cur_obj_check_anim_frame(21)) { o->oForwardVel = 3.0f; } - if (cur_obj_check_if_near_animation_end()) { - return TRUE; - } else { - return FALSE; - } + return (cur_obj_check_if_near_animation_end()); } /** @@ -201,11 +197,7 @@ s32 bowser_set_anim_look_up_and_walk(void) { s32 bowser_set_anim_slow_gait(void) { o->oForwardVel = 3.0f; cur_obj_init_animation_with_sound(BOWSER_ANIM_SLOW_GAIT); - if (cur_obj_check_if_near_animation_end()) { - return TRUE; - } else { - return FALSE; - } + return (cur_obj_check_if_near_animation_end()); } /** @@ -217,11 +209,7 @@ s32 bowser_set_anim_look_down_stop_walk(void) { if (cur_obj_check_anim_frame(20)) { o->oForwardVel = 0.0f; } - if (cur_obj_check_if_near_animation_end()) { - return TRUE; - } else { - return FALSE; - } + return (cur_obj_check_if_near_animation_end()); } @@ -315,7 +303,7 @@ void bowser_bitdw_actions(void) { // Generate random float f32 rand = random_float(); // Set attacks when Bowser Reacts - if (o->oBowserIsReacting == FALSE) { + if (!o->oBowserIsReacting) { if (o->oBowserStatus & BOWSER_STATUS_ANGLE_MARIO) { if (o->oDistanceToMario < 1500.0f) { o->oAction = BOWSER_ACT_BREATH_FIRE; // nearby @@ -358,7 +346,7 @@ void bowser_bitfs_actions(void) { // Generate random float f32 rand = random_float(); // Set attacks when Bowser Reacts - if (o->oBowserIsReacting == FALSE) { + if (!o->oBowserIsReacting) { if (o->oBowserStatus & BOWSER_STATUS_ANGLE_MARIO) { if (o->oDistanceToMario < 1300.0f) { // nearby if (rand < 0.5f) { // 50% chance @@ -425,7 +413,7 @@ void bowser_bits_actions(void) { case FALSE: // oBowserBitsJustJump never changes value, // so its always FALSE, maybe a debug define - if (o->oBowserBitsJustJump == FALSE) { + if (!o->oBowserBitsJustJump) { bowser_bits_action_list(); } else { bowser_set_act_big_jump(); @@ -669,11 +657,7 @@ void bowser_act_hit_mine(void) { */ s32 bowser_set_anim_jump(void) { cur_obj_init_animation_with_sound(BOWSER_ANIM_JUMP_START); - if (cur_obj_check_anim_frame(11)) { - return TRUE; - } else { - return FALSE; - } + return (cur_obj_check_anim_frame(11)); } /** @@ -859,11 +843,7 @@ s32 bowser_turn_on_timer(s32 time, s16 yaw) { } o->oForwardVel = 0.0f; o->oMoveAngleYaw += yaw; - if (o->oTimer >= time) { - return TRUE; - } else { - return FALSE; - } + return (o->oTimer >= time); } /** @@ -1069,7 +1049,7 @@ void bowser_act_jump_onto_stage(void) { o->oDragStrength = 10.0f; o->oSubAction++; // Spawn shockwave (BITS only) if is not on a platform - if (onDynamicFloor == FALSE) { + if (!onDynamicFloor) { bowser_spawn_shockwave(); // If is on a dynamic floor in BITS, then jump // because of the falling platform @@ -1644,7 +1624,7 @@ void bhv_bowser_loop(void) { s16 angleToCentre; // AngleToCentre from Bowser's perspective // Set distance/angle values - o->oBowserDistToCentre = sqrtf(o->oPosX * o->oPosX + o->oPosZ * o->oPosZ); + o->oBowserDistToCentre = sqrtf(sqr(o->oPosX) + sqr(o->oPosZ)); o->oBowserAngleToCentre = atan2s(0.0f - o->oPosZ, 0.0f - o->oPosX); angleToMario = abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario); angleToCentre = abs_angle_diff(o->oMoveAngleYaw, o->oBowserAngleToCentre); diff --git a/src/game/behaviors/bowser_flame.inc.c b/src/game/behaviors/bowser_flame.inc.c index f709ef18..c8b138da 100644 --- a/src/game/behaviors/bowser_flame.inc.c +++ b/src/game/behaviors/bowser_flame.inc.c @@ -214,12 +214,8 @@ void bhv_flame_bouncing_loop(void) { if (bowser_flame_should_despawn(300)) { obj_mark_for_deletion(o); } - if (bowser != NULL) { - if (bowser->oHeldState == HELD_FREE) { - if (lateral_dist_between_objects(o, bowser) < 300.0f) { - obj_mark_for_deletion(o); - } - } + if ((bowser != NULL) && (bowser->oHeldState == HELD_FREE) && (lateral_dist_between_objects_squared(o, bowser) < sqr(300.0f))) { + obj_mark_for_deletion(o); } } diff --git a/src/game/behaviors/bowser_key_cutscene.inc.c b/src/game/behaviors/bowser_key_cutscene.inc.c index 96c074c7..62c7c7cf 100644 --- a/src/game/behaviors/bowser_key_cutscene.inc.c +++ b/src/game/behaviors/bowser_key_cutscene.inc.c @@ -1,8 +1,8 @@ // bowser_key_cutscene.inc.c -Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED Mat4 mtx) { +Gfx *geo_scale_bowser_key(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx) { struct Object *nodeObj; - if (run == TRUE) { + if (callContext == GEO_CONTEXT_RENDER) { nodeObj = (struct Object *) gCurGraphNodeObject; ((struct GraphNodeScale *) node->next)->scale = nodeObj->oBowserKeyScale; } diff --git a/src/game/behaviors/bub.inc.c b/src/game/behaviors/bub.inc.c index a54536f8..5caf416a 100644 --- a/src/game/behaviors/bub.inc.c +++ b/src/game/behaviors/bub.inc.c @@ -67,7 +67,7 @@ void bub_act_1(void) { if (dy > 300.0f) o->oPosY = o->oPosY - 1.0f; } - if (800.0f < cur_obj_lateral_dist_from_mario_to_home()) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100); if (o->oDistanceToMario < 200.0f) @@ -101,7 +101,7 @@ void bub_act_2(void) { if (dy > 300.0f) o->oPosY -= 1.0f; } - if (cur_obj_lateral_dist_from_mario_to_home() > 800.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario + 0x8000, 0x400); if (o->oTimer > 200 && o->oDistanceToMario > 600.0f) diff --git a/src/game/behaviors/butterfly.inc.c b/src/game/behaviors/butterfly.inc.c index cb72c0c2..885cfe0d 100644 --- a/src/game/behaviors/butterfly.inc.c +++ b/src/game/behaviors/butterfly.inc.c @@ -73,7 +73,7 @@ void butterfly_act_return_home(void) { f32 homeDistY = o->oHomeY - o->oPosY; f32 homeDistZ = o->oHomeZ - o->oPosZ; s16 hAngleToHome = atan2s(homeDistZ, homeDistX); - s16 vAngleToHome = atan2s(sqrtf(homeDistX * homeDistX + homeDistZ * homeDistZ), -homeDistY); + s16 vAngleToHome = atan2s(sqrtf(sqr(homeDistX) + sqr(homeDistZ)), -homeDistY); o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, hAngleToHome, 0x800); o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, vAngleToHome, 0x50); @@ -84,9 +84,7 @@ void butterfly_act_return_home(void) { cur_obj_init_animation(1); o->oAction = BUTTERFLY_ACT_RESTING; - o->oPosX = o->oHomeX; - o->oPosY = o->oHomeY; - o->oPosZ = o->oHomeZ; + vec3_copy(&o->oPosVec, &o->oHomeVec); } } diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 609ec508..07a4ab8f 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -88,10 +88,8 @@ static void chain_chomp_act_uninitialized(void) { static void chain_chomp_update_chain_segments(void) { struct ChainSegment *prevSegment; struct ChainSegment *segment; - f32 offsetX; - f32 offsetY; - f32 offsetZ; - f32 offset; + Vec3f offset; + f32 mag; f32 segmentVelY; f32 maxTotalOffset; s32 i; @@ -115,40 +113,41 @@ static void chain_chomp_update_chain_segments(void) { segment->posY = 0.0f; } - // Cap distance to previous chain part (so that the tail follows the - // chomp) + // Cap distance to previous chain part (so that the tail follows the chomp) - offsetX = segment->posX - prevSegment->posX; - offsetY = segment->posY - prevSegment->posY; - offsetZ = segment->posZ - prevSegment->posZ; - offset = sqrtf(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ); + offset[0] = segment->posX - prevSegment->posX; + offset[1] = segment->posY - prevSegment->posY; + offset[2] = segment->posZ - prevSegment->posZ; + mag = (sqr(offset[0]) + sqr(offset[1]) + sqr(offset[2])); - if (offset > o->oChainChompMaxDistBetweenChainParts) { - offset = o->oChainChompMaxDistBetweenChainParts / offset; - offsetX *= offset; - offsetY *= offset; - offsetZ *= offset; + if (mag > sqr(o->oChainChompMaxDistBetweenChainParts)) { + mag = sqrtf(mag); + mag = o->oChainChompMaxDistBetweenChainParts / mag; + offset[0] *= mag; + offset[1] *= mag; + offset[2] *= mag; } // Cap distance to pivot (so that it stretches when the chomp moves far // from the wooden post) - offsetX += prevSegment->posX; - offsetY += prevSegment->posY; - offsetZ += prevSegment->posZ; - offset = sqrtf(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ); + offset[0] += prevSegment->posX; + offset[1] += prevSegment->posY; + offset[2] += prevSegment->posZ; + mag = (sqr(offset[0]) + sqr(offset[1]) + sqr(offset[2])); maxTotalOffset = o->oChainChompMaxDistFromPivotPerChainPart * (5 - i); - if (offset > maxTotalOffset) { - offset = maxTotalOffset / offset; - offsetX *= offset; - offsetY *= offset; - offsetZ *= offset; + if (mag > sqr(maxTotalOffset)) { + mag = sqrtf(mag); + mag = maxTotalOffset / mag; + offset[0] *= mag; + offset[1] *= mag; + offset[2] *= mag; } - segment->posX = offsetX; - segment->posY = offsetY; - segment->posZ = offsetZ; + segment->posX = offset[0]; + segment->posY = offset[1]; + segment->posZ = offset[2]; } } @@ -397,9 +396,9 @@ static void chain_chomp_act_move(void) { o->oChainChompSegments[0].posZ = o->oPosZ - o->parentObj->oPosZ; o->oChainChompDistToPivot = - sqrtf(o->oChainChompSegments[0].posX * o->oChainChompSegments[0].posX - + o->oChainChompSegments[0].posY * o->oChainChompSegments[0].posY - + o->oChainChompSegments[0].posZ * o->oChainChompSegments[0].posZ); + sqrtf(sqr(o->oChainChompSegments[0].posX) + + sqr(o->oChainChompSegments[0].posY) + + sqr(o->oChainChompSegments[0].posZ)); // If the chain is fully stretched maxDistToPivot = o->oChainChompMaxDistFromPivotPerChainPart * 5; diff --git a/src/game/behaviors/chuckya.inc.c b/src/game/behaviors/chuckya.inc.c index 942e4124..bae7f4f6 100644 --- a/src/game/behaviors/chuckya.inc.c +++ b/src/game/behaviors/chuckya.inc.c @@ -38,8 +38,8 @@ void bhv_chuckya_anchor_mario_loop(void) { s32 unknown_chuckya_function(s32 updateAngle, f32 latDist, f32 dist, s32 time) { s32 ret = 0; if (o->oChuckyaUnused != 4) { - if (latDist < cur_obj_lateral_dist_from_mario_to_home()) { - if (cur_obj_lateral_dist_to_home() < 200.0f) { + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(latDist)) { + if (cur_obj_lateral_dist_to_home_is_in_range(200.0f)) { ret = 0; } else { ret = 1; @@ -86,7 +86,7 @@ void chuckya_act_0(void) { switch (initialSubAction = o->oSubAction) { case 0: o->oForwardVel = 0; - if (cur_obj_lateral_dist_from_mario_to_home() < 2000.0f) { + if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(2000.0f)) { cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400); if (o->oChuckyaSubActionTimer > 40 || abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < 0x1000) @@ -98,7 +98,7 @@ void chuckya_act_0(void) { approach_forward_vel(&o->oForwardVel, 30.0f, 4.0f); if (abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) > 0x4000) o->oSubAction = 2; - if (cur_obj_lateral_dist_from_mario_to_home() > 2000.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(2000.0f)) o->oSubAction = 3; break; case 2: @@ -107,14 +107,14 @@ void chuckya_act_0(void) { o->oSubAction = 0; break; case 3: - if (cur_obj_lateral_dist_to_home() < 500.0f) + if (cur_obj_lateral_dist_to_home_is_in_range(500.0f)) o->oForwardVel = 0; else { approach_forward_vel(&o->oForwardVel, 10.0f, 4.0f); o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x800); } - if (cur_obj_lateral_dist_from_mario_to_home() < 1900.0f) + if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(1900.0f)) o->oSubAction = 0; break; } diff --git a/src/game/behaviors/end_birds_2.inc.c b/src/game/behaviors/end_birds_2.inc.c index 8f5ef9dd..cd52f8b4 100644 --- a/src/game/behaviors/end_birds_2.inc.c +++ b/src/game/behaviors/end_birds_2.inc.c @@ -18,8 +18,9 @@ void bhv_end_birds_2_loop(void) { vec3f_set_dist_and_angle(gCamera->pos, pos, 14000.f, pitch, yaw); obj_rotate_towards_point(gCurrentObject, pos, 0, 0, 8, 8); - if ((gCurrentObject->oEndBirdCutsceneVars9PointX == 0.f) && (gCurrentObject->oTimer == 0)) + if ((gCurrentObject->oEndBirdCutsceneVars9PointX == 0.f) && (gCurrentObject->oTimer == 0)) { cur_obj_play_sound_2(SOUND_GENERAL_BIRDS_FLY_AWAY); + } break; } diff --git a/src/game/behaviors/eyerok.inc.c b/src/game/behaviors/eyerok.inc.c index 33b49610..e3c52ad6 100644 --- a/src/game/behaviors/eyerok.inc.c +++ b/src/game/behaviors/eyerok.inc.c @@ -12,12 +12,8 @@ struct ObjectHitbox sEyerokHitbox = { s8 sEyerokAnimStatesList[] = { 0, 1, 3, 2, 1, 0 }; -static s32 eyerok_check_mario_relative_z(s32 arg0) { - if (gMarioObject->oPosZ - o->oHomeZ < arg0) { - return TRUE; - } else { - return FALSE; - } +static s32 eyerok_check_mario_relative_z(s32 z) { + return (gMarioObject->oPosZ - o->oHomeZ < z); } static void eyerok_spawn_hand(s16 side, s32 model, const BehaviorScript *behavior) { diff --git a/src/game/behaviors/haunted_chair.inc.c b/src/game/behaviors/haunted_chair.inc.c index 29d8cb47..28ab9786 100644 --- a/src/game/behaviors/haunted_chair.inc.c +++ b/src/game/behaviors/haunted_chair.inc.c @@ -29,7 +29,7 @@ void haunted_chair_act_0(void) { if (o->parentObj != o) { if (o->oHauntedChairFallTargetAngle == 0) { - if (lateral_dist_between_objects(o, o->parentObj) < 250.0f) { + if (lateral_dist_between_objects_squared(o, o->parentObj) < sqr(250.0f)) { dAngleToPiano = obj_angle_to_object(o, o->parentObj) - o->oFaceAngleYaw + 0x2000; if (dAngleToPiano & 0x4000) { o->oHauntedChairFallFromPianoAngle = &o->oFaceAngleRoll; diff --git a/src/game/behaviors/heave_ho.inc.c b/src/game/behaviors/heave_ho.inc.c index c20ae418..fc0a2321 100644 --- a/src/game/behaviors/heave_ho.inc.c +++ b/src/game/behaviors/heave_ho.inc.c @@ -42,7 +42,7 @@ void heave_ho_act_1(void) { void heave_ho_act_2(void) { s16 angleVel; - if (1000.0f < cur_obj_lateral_dist_from_mario_to_home()) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) o->oAngleToMario = cur_obj_angle_to_home(); if (o->oTimer > 150) { o->oHeaveHoTimedSpeed = (302 - o->oTimer) / 152.0f; diff --git a/src/game/behaviors/hoot.inc.c b/src/game/behaviors/hoot.inc.c index a77383b9..6f5e8260 100644 --- a/src/game/behaviors/hoot.inc.c +++ b/src/game/behaviors/hoot.inc.c @@ -196,7 +196,7 @@ void hoot_turn_to_home(void) { f32 homeDistY = o->oHomeY - o->oPosY; f32 homeDistZ = o->oHomeZ - o->oPosZ; s16 hAngleToHome = atan2s(homeDistZ, homeDistX); - s16 vAngleToHome = atan2s(sqrtf(homeDistX * homeDistX + homeDistZ * homeDistZ), -homeDistY); + s16 vAngleToHome = atan2s(sqrtf(sqr(homeDistX) + sqr(homeDistZ)), -homeDistY); o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, hAngleToHome, 0x140); o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, vAngleToHome, 0x140); diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index a36f8614..82e3417c 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -24,11 +24,9 @@ void intro_lakitu_set_offset_from_camera(struct Object *obj, Vec3f offset) { } void intro_lakitu_set_focus(struct Object *obj, Vec3f newFocus) { - f32 dist; s16 pitch, yaw; - // newFocus is an offset from lakitu's origin, not a point in the world. - vec3f_get_dist_and_angle(gVec3fZero, newFocus, &dist, &pitch, &yaw); + vec3f_get_angle(gVec3fZero, newFocus, &pitch, &yaw); obj->oFaceAnglePitch = pitch; obj->oFaceAngleYaw = yaw; } diff --git a/src/game/behaviors/king_bobomb.inc.c b/src/game/behaviors/king_bobomb.inc.c index 43c3c260..b408d20f 100644 --- a/src/game/behaviors/king_bobomb.inc.c +++ b/src/game/behaviors/king_bobomb.inc.c @@ -40,12 +40,8 @@ void king_bobomb_act_0(void) { } } -s32 mario_is_far_below_object(f32 arg0) { - if (arg0 < o->oPosY - gMarioObject->oPosY) { - return TRUE; - } else { - return FALSE; - } +s32 mario_is_far_below_object(f32 maxY) { + return (maxY < (o->oPosY - gMarioObject->oPosY)); } void king_bobomb_act_2(void) { diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index 561c4673..a90cb6c2 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -265,11 +265,8 @@ static void klepto_act_struck_by_mario(void) { o->oGravity = 0.0f; o->oMoveAnglePitch = -obj_get_pitch_from_vel(); - o->oKleptoSpeed = sqrtf(o->oForwardVel * o->oForwardVel + o->oVelY * o->oVelY); - - o->oHomeX = o->oPosX; - o->oHomeY = o->oPosY + 500.0f; - o->oHomeZ = o->oPosZ; + o->oKleptoSpeed = sqrtf(sqr(o->oForwardVel) + sqr(o->oVelY)); + vec3_copy_y_off(&o->oHomeVec, &o->oPosVec, 500.0f); } } diff --git a/src/game/behaviors/koopa.inc.c b/src/game/behaviors/koopa.inc.c index 14417a76..74c79f81 100644 --- a/src/game/behaviors/koopa.inc.c +++ b/src/game/behaviors/koopa.inc.c @@ -403,8 +403,7 @@ static void koopa_unshelled_act_dive(void) { // units behind mario. // Using this, we can get the koopa to pick up and despawn its shell // while mario is riding it. - if (shell != NULL && dist_between_objects(shell, gMarioObject) > 200.0f - && distToShell < 50.0f) { + if (shell != NULL && dist_between_objects_squared(shell, gMarioObject) > sqr(200.0f) && distToShell < 50.0f) { o->oKoopaMovementType = KOOPA_BP_NORMAL; o->oAction = KOOPA_SHELLED_ACT_LYING; o->oForwardVel *= 0.5f; @@ -766,7 +765,7 @@ static void koopa_the_quick_update(void) { } if (o->parentObj != o) { - if (dist_between_objects(o, o->parentObj) < 400.0f) { + if (dist_between_objects_squared(o, o->parentObj) < sqr(400.0f)) { o->parentObj->oKoopaRaceEndpointKoopaFinished = TRUE; } } diff --git a/src/game/behaviors/mad_piano.inc.c b/src/game/behaviors/mad_piano.inc.c index 08c053a3..8998c48a 100644 --- a/src/game/behaviors/mad_piano.inc.c +++ b/src/game/behaviors/mad_piano.inc.c @@ -44,10 +44,10 @@ static void mad_piano_act_attack(void) { } else { f32 dx = o->oPosX - o->oHomeX; f32 dz = o->oPosZ - o->oHomeZ; - f32 distToHome = sqrtf(sqr(dx) + sqr(dz)); + f32 distToHome = (sqr(dx) + sqr(dz)); - if (distToHome > 400.0f) { - distToHome = 400.0f / distToHome; + if (distToHome > sqr(400.0f)) { + distToHome = 400.0f / sqrtf(distToHome); o->oPosX = o->oHomeX + dx * distToHome; o->oPosZ = o->oHomeZ + dz * distToHome; } diff --git a/src/game/behaviors/purple_switch.inc.c b/src/game/behaviors/purple_switch.inc.c index 135960aa..75a606a5 100644 --- a/src/game/behaviors/purple_switch.inc.c +++ b/src/game/behaviors/purple_switch.inc.c @@ -15,10 +15,8 @@ void bhv_purple_switch_loop(void) { case PURPLE_SWITCH_ACT_IDLE: cur_obj_set_model(MODEL_PURPLE_SWITCH); cur_obj_scale(1.5f); - if (gMarioObject->platform == o && !(gMarioStates[0].action & MARIO_NO_PURPLE_SWITCH)) { - if (lateral_dist_between_objects(o, gMarioObject) < 127.5f) { - o->oAction = PURPLE_SWITCH_ACT_PRESSED; - } + if ((gMarioObject->platform == o) && !(gMarioStates[0].action & MARIO_NO_PURPLE_SWITCH) && (lateral_dist_between_objects_squared(o, gMarioObject) < sqr(127.5f))) { + o->oAction = PURPLE_SWITCH_ACT_PRESSED; } break; /** diff --git a/src/game/behaviors/scuttlebug.inc.c b/src/game/behaviors/scuttlebug.inc.c index fffe6b59..a9e98ebd 100644 --- a/src/game/behaviors/scuttlebug.inc.c +++ b/src/game/behaviors/scuttlebug.inc.c @@ -45,7 +45,7 @@ void bhv_scuttlebug_loop(void) { break; case 1: o->oForwardVel = 5.0f; - if (cur_obj_lateral_dist_from_mario_to_home() > 1000.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) o->oAngleToMario = cur_obj_angle_to_home(); else { if (o->oScuttlebugIsAtttacking == 0) { diff --git a/src/game/behaviors/sparkle_spawn_star.inc.c b/src/game/behaviors/sparkle_spawn_star.inc.c index 0272dd1a..4f76e7a0 100644 --- a/src/game/behaviors/sparkle_spawn_star.inc.c +++ b/src/game/behaviors/sparkle_spawn_star.inc.c @@ -32,15 +32,13 @@ void set_sparkle_spawn_star_hitbox(void) { } void set_home_to_mario(void) { - f32 dx; - f32 dz; o->oHomeX = gMarioObject->oPosX; o->oHomeZ = gMarioObject->oPosZ; o->oHomeY = gMarioObject->oPosY; o->oHomeY += 250.0f; o->oPosY = o->oHomeY; - dx = o->oHomeX - o->oPosX; - dz = o->oHomeZ - o->oPosZ; + f32 dx = o->oHomeX - o->oPosX; + f32 dz = o->oHomeZ - o->oPosZ; o->oForwardVel = sqrtf(sqr(dx) + sqr(dz)) / 23.0f; } diff --git a/src/game/behaviors/spindrift.inc.c b/src/game/behaviors/spindrift.inc.c index b1bad6d6..5174733a 100644 --- a/src/game/behaviors/spindrift.inc.c +++ b/src/game/behaviors/spindrift.inc.c @@ -20,7 +20,7 @@ void bhv_spindrift_loop(void) { switch (o->oAction) { case 0: approach_forward_vel(&o->oForwardVel, 4.0f, 1.0f); - if (cur_obj_lateral_dist_from_mario_to_home() > 1000.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) o->oAngleToMario = cur_obj_angle_to_home(); else if (o->oDistanceToMario > 300.0f) o->oAngleToMario = obj_angle_to_object(o, gMarioObject); diff --git a/src/game/behaviors/strong_wind_particle.inc.c b/src/game/behaviors/strong_wind_particle.inc.c index 03ee7500..ab97eb8c 100644 --- a/src/game/behaviors/strong_wind_particle.inc.c +++ b/src/game/behaviors/strong_wind_particle.inc.c @@ -39,8 +39,8 @@ void bhv_strong_wind_particle_loop(void) { if (penguinObj != NULL) { penguinXDist = penguinObj->oSLWalkingPenguinWindCollisionXPos - o->oPosX; penguinZDist = penguinObj->oSLWalkingPenguinWindCollisionZPos - o->oPosZ; - distanceFromPenguin = sqrtf(penguinXDist * penguinXDist + penguinZDist * penguinZDist); - if (distanceFromPenguin < 300.0f) { + distanceFromPenguin = (sqr(penguinXDist) + sqr(penguinZDist)); + if (distanceFromPenguin < sqr(300.0f)) { obj_mark_for_deletion(o); cur_obj_become_intangible(); } diff --git a/src/game/behaviors/tilting_inverted_pyramid.inc.c b/src/game/behaviors/tilting_inverted_pyramid.inc.c index da5e16ce..e811cc29 100644 --- a/src/game/behaviors/tilting_inverted_pyramid.inc.c +++ b/src/game/behaviors/tilting_inverted_pyramid.inc.c @@ -64,78 +64,47 @@ f32 approach_by_increment(f32 goal, f32 src, f32 inc) { * then gradually tilt back moving Mario with them. */ void bhv_tilting_inverted_pyramid_loop(void) { - f32 dx; - f32 dy; - f32 dz; - f32 d; - + Vec3f d; +#ifndef PLATFORM_DISPLACEMENT_2 Vec3f dist; Vec3f posBeforeRotation; Vec3f posAfterRotation; // Mario's position - f32 mx; - f32 my; - f32 mz; - - s32 marioOnPlatform = FALSE; + Vec3f m; +#endif Mat4 *transform = &o->transform; - if (gMarioObject->platform == o) { - get_mario_pos(&mx, &my, &mz); - - dist[0] = gMarioObject->oPosX - o->oPosX; - dist[1] = gMarioObject->oPosY - o->oPosY; - dist[2] = gMarioObject->oPosZ - o->oPosZ; +#ifndef PLATFORM_DISPLACEMENT_2 + get_mario_pos(&m[0], &m[1], &m[2]); + vec3_diff(dist, &gMarioObject->oPosVec, &o->oPosVec); linear_mtxf_mul_vec3f(*transform, posBeforeRotation, dist); - - dx = gMarioObject->oPosX - o->oPosX; - dy = 500.0f; - dz = gMarioObject->oPosZ - o->oPosZ; - d = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); - - //! Always true since dy = 500, making d >= 500. - if (d != 0.0f) { - // Normalizing - d = 1.0f / d; - dx *= d; - dy *= d; - dz *= d; - } else { - dx = 0.0f; - dy = 1.0f; - dz = 0.0f; - } - - if (o->oTiltingPyramidMarioOnPlatform == TRUE) - marioOnPlatform++; - +#endif + d[0] = gMarioObject->oPosX - o->oPosX; + d[1] = 500.0f; + d[2] = gMarioObject->oPosZ - o->oPosZ; + vec3f_normalize(d); o->oTiltingPyramidMarioOnPlatform = TRUE; } else { - dx = 0.0f; - dy = 1.0f; - dz = 0.0f; + vec3_copy(d, gVec3fY); o->oTiltingPyramidMarioOnPlatform = FALSE; } - // Approach the normals by 0.01f towards the new goal, then create a transform matrix and orient the object. // Outside of the other conditionals since it needs to tilt regardless of whether Mario is on. - o->oTiltingPyramidNormalX = approach_by_increment(dx, o->oTiltingPyramidNormalX, 0.01f); - o->oTiltingPyramidNormalY = approach_by_increment(dy, o->oTiltingPyramidNormalY, 0.01f); - o->oTiltingPyramidNormalZ = approach_by_increment(dz, o->oTiltingPyramidNormalZ, 0.01f); + o->oTiltingPyramidNormalX = approach_by_increment(d[0], o->oTiltingPyramidNormalX, 0.01f); + o->oTiltingPyramidNormalY = approach_by_increment(d[1], o->oTiltingPyramidNormalY, 0.01f); + o->oTiltingPyramidNormalZ = approach_by_increment(d[2], o->oTiltingPyramidNormalZ, 0.01f); create_transform_from_normals(*transform, o->oTiltingPyramidNormalX, o->oTiltingPyramidNormalY, o->oTiltingPyramidNormalZ); - +#ifndef PLATFORM_DISPLACEMENT_2 // If Mario is on the platform, adjust his position for the platform tilt. - if (marioOnPlatform != FALSE) { + if (o->oTiltingPyramidMarioOnPlatform) { linear_mtxf_mul_vec3f(*transform, posAfterRotation, dist); - mx += posAfterRotation[0] - posBeforeRotation[0]; - my += posAfterRotation[1] - posBeforeRotation[1]; - mz += posAfterRotation[2] - posBeforeRotation[2]; + m[0] += posAfterRotation[0] - posBeforeRotation[0]; + m[1] += posAfterRotation[1] - posBeforeRotation[1]; + m[2] += posAfterRotation[2] - posBeforeRotation[2]; - #ifndef PLATFORM_DISPLACEMENT_2 - set_mario_pos(mx, my, mz); - #endif + set_mario_pos(m[0], m[1], m[2]); } - +#endif o->header.gfx.throwMatrix = transform; } diff --git a/src/game/behaviors/tuxie.inc.c b/src/game/behaviors/tuxie.inc.c index b9264134..6c2655d9 100644 --- a/src/game/behaviors/tuxie.inc.c +++ b/src/game/behaviors/tuxie.inc.c @@ -20,13 +20,13 @@ void tuxies_mother_act_2(void) { if (o->oSubAction == 0) { cur_obj_init_animation_with_sound(0); o->oForwardVel = 10.0f; - if (800.0f < cur_obj_lateral_dist_from_mario_to_home()) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) o->oSubAction = 1; cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400); } else { o->oForwardVel = 0.0f; cur_obj_init_animation_with_sound(3); - if (cur_obj_lateral_dist_from_mario_to_home() < 700.0f) + if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(700.0f)) o->oSubAction = 0; } } else { @@ -213,20 +213,20 @@ void small_penguin_act_0(void) { } void small_penguin_act_5(void) { - f32 distToMother; s16 angleToMother; struct Object *motherPenguinObj = cur_obj_nearest_object_with_behavior(bhvTuxiesMother); if (motherPenguinObj != NULL) { - if (o->oDistanceToMario < 1000.0f) + if (o->oDistanceToMario < 1000.0f) { o->oForwardVel = 2.0f; - else + } else { o->oForwardVel = 0.0f; - distToMother = dist_between_objects(o, motherPenguinObj); + } angleToMother = obj_angle_to_object(o, motherPenguinObj); - if (distToMother > 200.0f) + if (dist_between_objects_squared(o, motherPenguinObj) > sqr(200.0f)) { cur_obj_rotate_yaw_toward(angleToMother, 0x400); - else + } else { cur_obj_rotate_yaw_toward(angleToMother + 0x8000, 0x400); + } cur_obj_init_animation_with_sound(0); } small_penguin_dive_with_mario(); diff --git a/src/game/behaviors/tweester.inc.c b/src/game/behaviors/tweester.inc.c index b6d334ab..f5942f77 100644 --- a/src/game/behaviors/tweester.inc.c +++ b/src/game/behaviors/tweester.inc.c @@ -71,8 +71,7 @@ void tweester_act_chase(void) { o->oAngleToHome = cur_obj_angle_to_home(); cur_obj_play_sound_1(SOUND_ENV_WIND1); - if (cur_obj_lateral_dist_from_mario_to_home() < activationRadius - && o->oSubAction == TWEESTER_SUB_ACT_CHASE_MARIO) { + if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(activationRadius) && o->oSubAction == TWEESTER_SUB_ACT_CHASE_MARIO) { o->oForwardVel = 20.0f; cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x200); @@ -84,7 +83,7 @@ void tweester_act_chase(void) { o->oForwardVel = 20.0f; cur_obj_rotate_yaw_toward(o->oAngleToHome, 0x200); - if (cur_obj_lateral_dist_to_home() < 200.0f) + if (cur_obj_lateral_dist_to_home_is_in_range(200.0f)) o->oAction = TWEESTER_ACT_HIDE; } @@ -111,7 +110,7 @@ void tweester_act_hide(void) { tweester_scale_and_move(shrinkTimer / 60.0f); else { cur_obj_become_intangible(); - if (cur_obj_lateral_dist_from_mario_to_home() > 2500.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(2500.0f)) o->oAction = TWEESTER_ACT_IDLE; if (o->oTimer > 360) o->oAction = TWEESTER_ACT_IDLE; diff --git a/src/game/behaviors/ukiki.inc.c b/src/game/behaviors/ukiki.inc.c index 9e430762..bd58174c 100644 --- a/src/game/behaviors/ukiki.inc.c +++ b/src/game/behaviors/ukiki.inc.c @@ -336,17 +336,7 @@ static Trajectory sCageUkikiPath[] = { * our death. Ukiki is a tad suicidal. */ void ukiki_act_go_to_cage(void) { - struct Object* obj; - f32 latDistToCage = 0.0f; - s16 yawToCage = 0; - obj = cur_obj_nearest_object_with_behavior(bhvUkikiCageChild); - - // Ultimately is checking the cage, as it points to the parent - // of a dummy child object of the cage. - if (obj != NULL) { - latDistToCage = lateral_dist_between_objects(o, obj->parentObj); - yawToCage = obj_angle_to_object(o, obj->parentObj); - } + struct Object *obj = cur_obj_nearest_object_with_behavior(bhvUkikiCageChild); cur_obj_become_intangible(); o->oFlags |= OBJ_FLAG_ACTIVE_FROM_AFAR; @@ -375,7 +365,7 @@ void ukiki_act_go_to_cage(void) { if (cur_obj_can_mario_activate_textbox(200.0f, 30.0f, 0x7FFF)) { o->oSubAction++; // fallthrough } else { - break; + break; } case UKIKI_SUB_ACT_CAGE_TALK_TO_MARIO: @@ -389,8 +379,9 @@ void ukiki_act_go_to_cage(void) { case UKIKI_SUB_ACT_CAGE_TURN_TO_CAGE: cur_obj_init_animation_with_sound(UKIKI_ANIM_RUN); - - if (cur_obj_rotate_yaw_toward(yawToCage, 0x400)) { + // Ultimately is checking the cage, as it points to the parent + // of a dummy child object of the cage. + if (obj != NULL && cur_obj_rotate_yaw_toward(obj_angle_to_object(o, obj->parentObj), 0x400)) { o->oForwardVel = 10.0f; o->oSubAction++; } @@ -403,7 +394,9 @@ void ukiki_act_go_to_cage(void) { break; case UKIKI_SUB_ACT_CAGE_LAND_ON_CAGE: - if (latDistToCage < 50.0f) { + // Ultimately is checking the cage, as it points to the parent + // of a dummy child object of the cage. + if ((obj != NULL) && lateral_dist_between_objects_squared(o, obj->parentObj) < sqr(50.0f)) { o->oForwardVel = 0.0f; } diff --git a/src/game/behaviors/water_bomb.inc.c b/src/game/behaviors/water_bomb.inc.c index b4383672..2321ff6a 100644 --- a/src/game/behaviors/water_bomb.inc.c +++ b/src/game/behaviors/water_bomb.inc.c @@ -29,14 +29,10 @@ static struct ObjectHitbox sWaterBombHitbox = { * Spawn water bombs targeting mario when he comes in range. */ void bhv_water_bomb_spawner_update(void) { - f32 latDistToMario; - f32 spawnerRadius; - - spawnerRadius = 50 * (u16)(o->oBehParams >> 16) + 200.0f; - latDistToMario = lateral_dist_between_objects(o, gMarioObject); + f32 spawnerRadius = 50 * (u16)(o->oBehParams >> 16) + 200.0f; // When mario is in range and a water bomb isn't already active - if (!o->oWaterBombSpawnerBombActive && latDistToMario < spawnerRadius + if (!o->oWaterBombSpawnerBombActive && lateral_dist_between_objects_squared(o, gMarioObject) < sqr(spawnerRadius) && gMarioObject->oPosY - o->oPosY < 1000.0f) { if (o->oWaterBombSpawnerTimeToSpawn != 0) { o->oWaterBombSpawnerTimeToSpawn--; diff --git a/src/game/camera.c b/src/game/camera.c index d63beb0e..14c67381 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -1997,10 +1997,10 @@ s16 update_default_camera(struct Camera *c) { nextYawVel = 0; } sYawSpeed = 0x400; - vec3f_get_lateral_dist(sMarioCamState->pos, c->pos, &xzDist); + vec3f_get_lateral_dist_squared(sMarioCamState->pos, c->pos, &xzDist); if (sStatusFlags & CAM_FLAG_BEHIND_MARIO_POST_DOOR) { - if (xzDist >= 250) { + if (xzDist >= sqr(250.0f)) { sStatusFlags &= ~CAM_FLAG_BEHIND_MARIO_POST_DOOR; } if (ABS((sMarioCamState->faceAngle[1] - yaw) / 2) < 0x1800) { @@ -2009,7 +2009,8 @@ s16 update_default_camera(struct Camera *c) { dist = 800.f; sStatusFlags |= CAM_FLAG_BLOCK_SMOOTH_MOVEMENT; } - } else if (xzDist < 250) { + } else if (xzDist < sqr(250.0f)) { + xzDist = sqrtf(xzDist); // Turn rapidly if very close to Mario c->pos[0] += (250 - xzDist) * sins(yaw); c->pos[2] += (250 - xzDist) * coss(yaw); @@ -6081,7 +6082,7 @@ s32 rotate_camera_around_walls(UNUSED struct Camera *c, Vec3f cPos, s16 *avoidYa if ((is_range_behind_surface(sMarioCamState->pos, cPos, wall, yawRange, SURFACE_WALL_MISC) == 0) && (is_behind_surface(sMarioCamState->pos, wall) == TRUE) // Also check if the wall is tall enough to cover Mario - && (is_surf_within_bounding_box(wall, -1.f, 150.f, -1.f) == FALSE)) { + && (!is_surf_within_bounding_box(wall, -1.f, 150.f, -1.f))) { // Calculate the avoid direction. The function returns the opposite direction so add 180 // degrees. *avoidYaw = calc_avoid_yaw(yawFromMario, wallYaw) + DEGREES(180); diff --git a/src/game/game_init.c b/src/game/game_init.c index 344c2e74..a070efbb 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -8,6 +8,7 @@ #include "buffers/framebuffers.h" #include "buffers/zbuffer.h" #include "engine/level_script.h" +#include "engine/math_util.h" #include "game_init.h" #include "main.h" #include "memory.h" @@ -535,25 +536,13 @@ void adjust_analog_stick(struct Controller *controller) { controller->stickY = 0; // Modulate the rawStickX and rawStickY to be the new f32 values by adding/subtracting 6. - if (controller->rawStickX <= -8) { - controller->stickX = controller->rawStickX + 6; - } - - if (controller->rawStickX >= 8) { - controller->stickX = controller->rawStickX - 6; - } - - if (controller->rawStickY <= -8) { - controller->stickY = controller->rawStickY + 6; - } - - if (controller->rawStickY >= 8) { - controller->stickY = controller->rawStickY - 6; - } + if (controller->rawStickX <= -8) controller->stickX = controller->rawStickX + 6; + if (controller->rawStickX >= 8) controller->stickX = controller->rawStickX - 6; + if (controller->rawStickY <= -8) controller->stickY = controller->rawStickY + 6; + if (controller->rawStickY >= 8) controller->stickY = controller->rawStickY - 6; // Calculate f32 magnitude from the center by vector length. - controller->stickMag = - sqrtf(controller->stickX * controller->stickX + controller->stickY * controller->stickY); + controller->stickMag = sqrtf(sqr(controller->stickX) + sqr(controller->stickY)); // Magnitude cannot exceed 64.0f: if it does, modify the values // appropriately to flatten the values down to the allowed maximum value. @@ -595,28 +584,27 @@ void read_controller_inputs(s32 threadID) { // 0.5x A presses are a good meme controller->buttonDown = controller->controllerData->button; adjust_analog_stick(controller); - } else // otherwise, if the controllerData is NULL, 0 out all of the inputs. - { - controller->rawStickX = 0; - controller->rawStickY = 0; + } else { // otherwise, if the controllerData is NULL, 0 out all of the inputs. + controller->rawStickX = 0; + controller->rawStickY = 0; controller->buttonPressed = 0; - controller->buttonDown = 0; - controller->stickX = 0; - controller->stickY = 0; - controller->stickMag = 0; + controller->buttonDown = 0; + controller->stickX = 0; + controller->stickY = 0; + controller->stickMag = 0; } } // For some reason, player 1's inputs are copied to player 3's port. // This potentially may have been a way the developers "recorded" // the inputs for demos, despite record_demo existing. - gPlayer3Controller->rawStickX = gPlayer1Controller->rawStickX; - gPlayer3Controller->rawStickY = gPlayer1Controller->rawStickY; - gPlayer3Controller->stickX = gPlayer1Controller->stickX; - gPlayer3Controller->stickY = gPlayer1Controller->stickY; - gPlayer3Controller->stickMag = gPlayer1Controller->stickMag; + gPlayer3Controller->rawStickX = gPlayer1Controller->rawStickX; + gPlayer3Controller->rawStickY = gPlayer1Controller->rawStickY; + gPlayer3Controller->stickX = gPlayer1Controller->stickX; + gPlayer3Controller->stickY = gPlayer1Controller->stickY; + gPlayer3Controller->stickMag = gPlayer1Controller->stickMag; gPlayer3Controller->buttonPressed = gPlayer1Controller->buttonPressed; - gPlayer3Controller->buttonDown = gPlayer1Controller->buttonDown; + gPlayer3Controller->buttonDown = gPlayer1Controller->buttonDown; } /** diff --git a/src/game/geo_misc.h b/src/game/geo_misc.h index 904633af..f2a97c2a 100644 --- a/src/game/geo_misc.h +++ b/src/game/geo_misc.h @@ -23,10 +23,10 @@ extern void make_vertex( ); #endif extern s16 round_float(f32); -extern Gfx *geo_exec_inside_castle_light(s32 callContext, struct GraphNode *node, UNUSED f32 mtx[4][4]); -extern Gfx *geo_exec_flying_carpet_timer_update(s32 callContext, struct GraphNode *node, UNUSED f32 mtx[4][4]); -extern Gfx *geo_exec_flying_carpet_create(s32 callContext, struct GraphNode *node, UNUSED f32 mtx[4][4]); -extern Gfx *geo_exec_cake_end_screen(s32 callContext, struct GraphNode *node, UNUSED f32 mtx[4][4]); +extern Gfx *geo_exec_inside_castle_light(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); +extern Gfx *geo_exec_flying_carpet_timer_update(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); +extern Gfx *geo_exec_flying_carpet_create(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); +extern Gfx *geo_exec_cake_end_screen(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); #define gLoadBlockTexture(dl, width, height, format, image) \ { \ diff --git a/src/game/interaction.c b/src/game/interaction.c index 78f9c941..8a5ff3a1 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -476,12 +476,12 @@ u32 bully_knock_back_mario(struct MarioState *mario) { marioDYaw = newMarioYaw - mario->faceAngle[1]; mario->faceAngle[1] = newMarioYaw; - mario->forwardVel = sqrtf(marioData.velX * marioData.velX + marioData.velZ * marioData.velZ); + mario->forwardVel = sqrtf(sqr(marioData.velX) + sqr(marioData.velZ)); mario->pos[0] = marioData.posX; mario->pos[2] = marioData.posZ; bully->oMoveAngleYaw = newBullyYaw; - bully->oForwardVel = sqrtf(bullyData.velX * bullyData.velX + bullyData.velZ * bullyData.velZ); + bully->oForwardVel = sqrtf(sqr(bullyData.velX) + sqr(bullyData.velZ)); bully->oPosX = bullyData.posX; bully->oPosZ = bullyData.posZ; @@ -611,9 +611,9 @@ void push_mario_out_of_object(struct MarioState *m, struct Object *obj, f32 padd f32 offsetX = m->pos[0] - obj->oPosX; f32 offsetZ = m->pos[2] - obj->oPosZ; - f32 distance = sqrtf(offsetX * offsetX + offsetZ * offsetZ); + f32 distance = (sqr(offsetX) + sqr(offsetZ)); - if (distance < minDistance) { + if (distance < sqr(minDistance)) { struct Surface *floor; s16 pushAngle; f32 newMarioX; @@ -662,8 +662,8 @@ void bounce_back_from_attack(struct MarioState *m, u32 interaction) { } u32 should_push_or_pull_door(struct MarioState *m, struct Object *obj) { - f32 dx = obj->oPosX - m->pos[0]; - f32 dz = obj->oPosZ - m->pos[2]; + f32 dx = (obj->oPosX - m->pos[0]); + f32 dz = (obj->oPosZ - m->pos[2]); s16 dYaw = abs_angle_diff(obj->oMoveAngleYaw, atan2s(dz, dx)); return (dYaw <= 0x4000) ? WARP_FLAG_DOOR_PULLED : WARP_FLAG_DOOR_FLIP_MARIO; } @@ -1226,9 +1226,7 @@ u32 interact_bully(struct MarioState *m, UNUSED u32 interactType, struct Object attack_object(obj, interaction); bounce_back_from_attack(m, interaction); return TRUE; - } - - else if (!sInvulnerable && !(m->flags & MARIO_VANISH_CAP) + } else if (!sInvulnerable && !(m->flags & MARIO_VANISH_CAP) && !(obj->oInteractionSubtype & INT_SUBTYPE_DELAY_INVINCIBILITY)) { obj->oInteractStatus = INT_STATUS_INTERACTED; m->invincTimer = 2; diff --git a/src/game/mario.c b/src/game/mario.c index 2afe2f0a..3c4727ee 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1192,8 +1192,7 @@ void debug_print_speed_action_normal(struct MarioState *m) { f32 floor_nY; if (gShowDebugText) { - steepness = sqrtf( - ((m->floor->normal.x * m->floor->normal.x) + (m->floor->normal.z * m->floor->normal.z))); + steepness = sqrtf(sqr(m->floor->normal.x) + sqr(m->floor->normal.z)); floor_nY = m->floor->normal.y; print_text_fmt_int(210, 88, "ANG %d", (atan2s(floor_nY, steepness) * 180.0f) / 32768.0f); diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 2ee09de5..897b4480 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -156,21 +156,18 @@ s32 check_fall_damage_or_get_stuck(struct MarioState *m, u32 hardFallAction) { } s32 check_horizontal_wind(struct MarioState *m) { - struct Surface *floor; - f32 speed; - s16 pushAngle; - - floor = m->floor; + struct Surface *floor = m->floor; if (floor->type == SURFACE_HORIZONTAL_WIND) { - pushAngle = floor->force << 8; + s16 pushAngle = floor->force << 8; m->slideVelX += 1.2f * sins(pushAngle); m->slideVelZ += 1.2f * coss(pushAngle); - speed = sqrtf(m->slideVelX * m->slideVelX + m->slideVelZ * m->slideVelZ); + f32 speed = (sqr(m->slideVelX) + sqr(m->slideVelZ)); - if (speed > 48.0f) { + if (speed > sqr(48.0f)) { + speed = sqrtf(speed); m->slideVelX = m->slideVelX * 48.0f / speed; m->slideVelZ = m->slideVelZ * 48.0f / speed; speed = 48.0f; diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 8a5ff6c5..906894c5 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -1292,19 +1292,18 @@ s32 act_spawn_no_spin_landing(struct MarioState *m) { s32 act_bbh_enter_spin(struct MarioState *m) { f32 floorDist; f32 scale; - f32 cageDX; - f32 cageDZ; + f32 cageDX, cageDZ; f32 cageDist; f32 forwardVel; cageDX = m->usedObj->oPosX - m->pos[0]; cageDZ = m->usedObj->oPosZ - m->pos[2]; - cageDist = sqrtf(cageDX * cageDX + cageDZ * cageDZ); + cageDist = (sqr(cageDX) + sqr(cageDZ)); - if (cageDist > 20.0f) { + if (cageDist > sqr(20.0f)) { forwardVel = 10.0f; } else { - forwardVel = cageDist / 2.0f; + forwardVel = sqrtf(cageDist) / 2.0f; } if (forwardVel < 0.5f) { forwardVel = 0.0f; @@ -1374,8 +1373,7 @@ s32 act_bbh_enter_spin(struct MarioState *m) { } s32 act_bbh_enter_jump(struct MarioState *m) { - f32 cageDX; - f32 cageDZ; + f32 cageDX, cageDZ; f32 cageDist; play_mario_action_sound( @@ -1385,7 +1383,7 @@ s32 act_bbh_enter_jump(struct MarioState *m) { if (m->actionState == 0) { cageDX = m->usedObj->oPosX - m->pos[0]; cageDZ = m->usedObj->oPosZ - m->pos[2]; - cageDist = sqrtf(cageDX * cageDX + cageDZ * cageDZ); + cageDist = sqrtf(sqr(cageDX) + sqr(cageDZ)); m->vel[1] = 60.0f; m->faceAngle[1] = atan2s(cageDZ, cageDX); @@ -1914,7 +1912,7 @@ static s32 jumbo_star_cutscene_flying(struct MarioState *m) { targetDX = targetPos[0] - m->pos[0]; targetDY = targetPos[1] - m->pos[1]; targetDZ = targetPos[2] - m->pos[2]; - targetHyp = sqrtf(targetDX * targetDX + targetDZ * targetDZ); + targetHyp = sqrtf(sqr(targetDX) + sqr(targetDZ)); targetAngle = atan2s(targetDZ, targetDX); vec3f_copy(m->pos, targetPos); diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 74a03ea5..d5897fd5 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -171,7 +171,7 @@ s32 set_triple_jump_action(struct MarioState *m, UNUSED u32 action, UNUSED u32 a void update_sliding_angle(struct MarioState *m, f32 accel, f32 lossFactor) { struct Surface *floor = m->floor; s16 slopeAngle = atan2s(floor->normal.z, floor->normal.x); - f32 steepness = sqrtf(floor->normal.x * floor->normal.x + floor->normal.z * floor->normal.z); + f32 steepness = sqrtf(sqr(floor->normal.x) + sqr(floor->normal.z)); m->slideVelX += accel * steepness * sins(slopeAngle); m->slideVelZ += accel * steepness * coss(slopeAngle); @@ -301,18 +301,10 @@ void apply_slope_accel(struct MarioState *m) { } switch (slopeClass) { - case SURFACE_CLASS_VERY_SLIPPERY: - slopeAccel = 5.3f; - break; - case SURFACE_CLASS_SLIPPERY: - slopeAccel = 2.7f; - break; - default: - slopeAccel = 1.7f; - break; - case SURFACE_CLASS_NOT_SLIPPERY: - slopeAccel = 0.0f; - break; + case SURFACE_CLASS_VERY_SLIPPERY: slopeAccel = 5.3f; break; + case SURFACE_CLASS_SLIPPERY: slopeAccel = 2.7f; break; + default: slopeAccel = 1.7f; break; + case SURFACE_CLASS_NOT_SLIPPERY: slopeAccel = 0.0f; break; } if (floorDYaw > -0x4000 && floorDYaw < 0x4000) { @@ -1418,7 +1410,7 @@ void common_slide_action(struct MarioState *m, u32 endAction, u32 airAction, s32 slide_bonk(m, ACT_GROUND_BONK, endAction); } else if (m->wall != NULL) { s16 wallAngle = atan2s(m->wall->normal.z, m->wall->normal.x); - f32 slideSpeed = sqrtf(m->slideVelX * m->slideVelX + m->slideVelZ * m->slideVelZ); + f32 slideSpeed = sqrtf(sqr(m->slideVelX) + sqr(m->slideVelZ)); if ((slideSpeed *= 0.9f) < 4.0f) { slideSpeed = 4.0f; diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index 583de0b3..712d47da 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -137,7 +137,7 @@ static void apply_water_current(struct MarioState *m, Vec3f step) { f32 dz = whirlpool->pos[2] - m->pos[2]; f32 lateralDist = sqrtf(sqr(dx) + sqr(dz)); - f32 distance = sqrtf(lateralDist * lateralDist + sqr(dy)); + f32 distance = sqrtf(sqr(lateralDist) + sqr(dy)); s16 pitchToWhirlpool = atan2s(lateralDist, dy); s16 yawToWhirlpool = atan2s(dz, dx); diff --git a/src/game/mario_step.c b/src/game/mario_step.c index 5bc69cf2..6315a197 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -646,7 +646,7 @@ void apply_vertical_wind(struct MarioState *m) { s32 perform_air_step(struct MarioState *m, u32 stepArg) { // s16 wallDYaw; Vec3f intendedPos; - const f32 numSteps = 4.0f; /* max(4.0f, (s32)(sqrtf(m->vel[0] * m->vel[0] + m->vel[1] * m->vel[1] + m->vel[2] * m->vel[2]) / 50.0f));*/ + const f32 numSteps = 4.0f; /* max(4.0f, (s32)(sqrtf(sqr(m->vel[0]) + sqr(m->vel[1]) + sqr(m->vel[2])) / 50.0f));*/ s32 i; s32 quarterStepResult; s32 stepResult = AIR_STEP_NONE; diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index a9cbefe4..732dc2bd 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -296,7 +296,7 @@ void calc_new_obj_vel_and_pos_y(struct Surface *objFloor, f32 objFloorY, f32 obj } calc_obj_friction(&objFriction, floor_nY); - o->oForwardVel = sqrtf(objVelX * objVelX + objVelZ * objVelZ) * objFriction; + o->oForwardVel = sqrtf(sqr(objVelX) + sqr(objVelZ)) * objFriction; } } @@ -628,18 +628,9 @@ s8 current_mario_room_check(s16 room) { // Since object surfaces have room 0, this tests if the surface is an // object first and uses the last room if so. if (gMarioCurrentRoom == 0) { - if (room == sPrevCheckMarioRoom) { - return TRUE; - } else { - return FALSE; - } + return (room == sPrevCheckMarioRoom); } else { - if (room == gMarioCurrentRoom) { - result = TRUE; - } else { - result = FALSE; - } - + result = (room == gMarioCurrentRoom); sPrevCheckMarioRoom = gMarioCurrentRoom; } diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index 2af73438..00fcd91d 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -49,9 +49,9 @@ //! TODO: remove static -#define POS_OP_SAVE_POSITION 0 -#define POS_OP_COMPUTE_VELOCITY 1 -#define POS_OP_RESTORE_POSITION 2 +#define POS_OP_SAVE_POSITION 0x0 +#define POS_OP_COMPUTE_VELOCITY 0x1 +#define POS_OP_RESTORE_POSITION 0x2 /* BSS (declared to force order) */ extern s32 sNumActiveFirePiranhaPlants; @@ -185,9 +185,7 @@ static void platform_on_track_update_pos_or_spawn_ball(s32 ballIndex, f32 x, f32 MODEL_TRAJECTORY_MARKER_BALL, bhvTrackBall); if (trackBall != NULL) { - trackBall->oPosX = x; - trackBall->oPosY = y; - trackBall->oPosZ = z; + vec3_set(&trackBall->oPosVec, x, y, z); } } else { if (prevWaypoint != initialPrevWaypoint) { @@ -225,7 +223,7 @@ static void cur_obj_spin_all_dimensions(f32 pitchSpeed, f32 rollSpeed) { if (o->oFaceAngleRoll < 0) { roll = -rollSpeed; } else if (o->oFaceAngleRoll > 0) { - roll = rollSpeed; + roll = rollSpeed; } } @@ -265,11 +263,11 @@ static s16 obj_get_pitch_to_home(f32 latDistToHome) { } static void obj_compute_vel_from_move_pitch(f32 speed) { - o->oForwardVel = speed * coss(o->oMoveAnglePitch); - o->oVelY = speed * -sins(o->oMoveAnglePitch); + o->oForwardVel = speed * coss(o->oMoveAnglePitch); + o->oVelY = speed * -sins(o->oMoveAnglePitch); } -static s32 clamp_s16(s16 *value, s16 minimum, s16 maximum) { +static s32 clamp_s16(s16 *value, s16 minimum, s16 maximum) { // move to math_util? if (*value <= minimum) { *value = minimum; } else if (*value >= maximum) { @@ -280,7 +278,7 @@ static s32 clamp_s16(s16 *value, s16 minimum, s16 maximum) { return TRUE; } -static s32 clamp_f32(f32 *value, f32 minimum, f32 maximum) { +static s32 clamp_f32(f32 *value, f32 minimum, f32 maximum) { // move to math_util? if (*value <= minimum) { *value = minimum; } else if (*value >= maximum) { @@ -343,9 +341,7 @@ static s32 approach_f32_ptr(f32 *px, f32 target, f32 delta) { if (*px > target) { delta = -delta; } - *px += delta; - if ((*px - target) * delta >= 0) { *px = target; return TRUE; @@ -439,8 +435,7 @@ static s32 obj_grow_then_shrink(f32 *scaleVel, f32 shootFireScale, f32 endScale) return 0; } -static s32 oscillate_toward(s32 *value, f32 *vel, s32 target, f32 velCloseToZero, f32 accel, - f32 slowdown) { +static s32 oscillate_toward(s32 *value, f32 *vel, s32 target, f32 velCloseToZero, f32 accel, f32 slowdown) { s32 startValue = *value; *value += (s32) *vel; @@ -786,21 +781,18 @@ static s32 obj_move_for_one_second(s32 endAction) { * with partial updates. */ static void treat_far_home_as_mario(f32 threshold) { - f32 dx = o->oHomeX - o->oPosX; - f32 dy = o->oHomeY - o->oPosY; - f32 dz = o->oHomeZ - o->oPosZ; - f32 distance = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); + Vec3f d; + vec3_diff(d, &o->oHomeVec, &o->oPosVec); + f32 distance = vec3_sumsq(d); - if (distance > threshold) { - o->oAngleToMario = atan2s(dz, dx); + if (distance > sqr(threshold)) { + o->oAngleToMario = atan2s(d[2], d[0]); o->oDistanceToMario = 25000.0f; } else { - dx = o->oHomeX - gMarioObject->oPosX; - dy = o->oHomeY - gMarioObject->oPosY; - dz = o->oHomeZ - gMarioObject->oPosZ; - distance = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); + vec3_diff(d, &o->oHomeVec, &gMarioObject->oPosVec); + distance = vec3_sumsq(d); - if (distance > threshold) { + if (distance > sqr(threshold)) { o->oDistanceToMario = 20000.0f; } } diff --git a/src/game/object_collision.c b/src/game/object_collision.c index 6b765fe4..22cdb86f 100644 --- a/src/game/object_collision.c +++ b/src/game/object_collision.c @@ -28,9 +28,9 @@ s32 detect_object_hitbox_overlap(struct Object *a, struct Object *b) { f32 dx = a->oPosX - b->oPosX; f32 dz = a->oPosZ - b->oPosZ; f32 collisionRadius = a->hitboxRadius + b->hitboxRadius; - f32 distance = sqrtf(sqr(dx) + sqr(dz)); + f32 distance = (sqr(dx) + sqr(dz)); - if (collisionRadius > distance) { + if (sqr(collisionRadius) > distance) { f32 dya_top = a->hitboxHeight + dya_bottom; f32 dyb_top = b->hitboxHeight + dyb_bottom; @@ -56,13 +56,13 @@ s32 detect_object_hurtbox_overlap(struct Object *a, struct Object *b) { f32 dx = a->oPosX - b->oPosX; f32 dz = a->oPosZ - b->oPosZ; f32 collisionRadius = a->hurtboxRadius + b->hurtboxRadius; - f32 distance = sqrtf(sqr(dx) + sqr(dz)); + f32 distance = (sqr(dx) + sqr(dz)); if (a == gMarioObject) { b->oInteractionSubtype |= INT_SUBTYPE_DELAY_INVINCIBILITY; } - if (collisionRadius > distance) { + if (sqr(collisionRadius) > distance) { f32 dya_top = a->hitboxHeight + dya_bottom; f32 dyb_top = b->hurtboxHeight + dyb_bottom; diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index e19e7f6c..4cad77fd 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -242,12 +242,26 @@ f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2) { return lateralDist; } +// Same as above, but doesn't do sqrtf. +f32 lateral_dist_between_objects_squared(struct Object *obj1, struct Object *obj2) { + register f32 dx = obj2->oPosX - obj1->oPosX; + register f32 dz = obj2->oPosZ - obj1->oPosZ; + return (sqr(dx) + sqr(dz)); +} + f32 dist_between_objects(struct Object *obj1, struct Object *obj2) { f32 dist; vec3f_get_dist(&obj1->oPosVec, &obj2->oPosVec, &dist); return dist; } +// Same as above, but doesn't do sqrtf. +f32 dist_between_objects_squared(struct Object *obj1, struct Object *obj2) { + register Vec3f d; + vec3_diff(d, &obj2->oPosVec, &obj1->oPosVec); + return vec3_sumsq(d); +} + void cur_obj_forward_vel_approach_upward(f32 target, f32 increment) { if (o->oForwardVel >= target) { o->oForwardVel = target; @@ -269,7 +283,7 @@ s16 obj_angle_to_object(struct Object *obj1, struct Object *obj2) { s16 obj_turn_toward_object(struct Object *obj, struct Object *target, s16 angleIndex, s16 turnAmount) { f32 a, b, c, d; - s16 targetAngle = 0; + s16 targetAngle = 0x0; s16 startAngle; switch (angleIndex) { @@ -667,17 +681,15 @@ f32 cur_obj_dist_to_nearest_object_with_behavior(const BehaviorScript *behavior) struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript *behavior, f32 *dist) { uintptr_t *behaviorAddr = segmented_to_virtual(behavior); struct Object *closestObj = NULL; - struct Object *obj; - struct ObjectNode *listHead; - f32 minDist = 0x20000; + f32 minDist = F32_MAX; - listHead = &gObjectLists[get_object_list_from_behavior(behaviorAddr)]; - obj = (struct Object *) listHead->next; + struct ObjectNode *listHead = &gObjectLists[get_object_list_from_behavior(behaviorAddr)]; + struct Object *obj = (struct Object *) listHead->next; while (obj != (struct Object *) listHead) { if (obj->behavior == behaviorAddr) { if (obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj != o) { - f32 objDist = dist_between_objects(o, obj); + f32 objDist = dist_between_objects_squared(o, obj); if (objDist < minDist) { closestObj = obj; minDist = objDist; @@ -686,8 +698,11 @@ struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript *b } obj = (struct Object *) obj->header.next; } - - *dist = minDist; + if (minDist == F32_MAX) { + *dist = F32_MAX; + } else { + *dist = sqrtf(minDist); + } return closestObj; } @@ -748,7 +763,7 @@ struct Object *cur_obj_find_nearby_held_actor(const BehaviorScript *behavior, f3 // This includes the dropped and thrown states. By combining instant // release, this allows us to activate mama penguin remotely if (obj->oHeldState != HELD_FREE) { - if (dist_between_objects(o, obj) < maxDist) { + if (dist_between_objects_squared(o, obj) < sqr(maxDist)) { foundObj = obj; break; } @@ -1038,7 +1053,7 @@ static s32 cur_obj_move_xz(f32 steepSlopeNormalY, s32 careAboutEdgesAndSteepSlop } static void cur_obj_move_update_underwater_flags(void) { - f32 decelY = (f32)(sqrtf(o->oVelY * o->oVelY) * (o->oDragStrength * 7.0f)) / 100.0L; + f32 decelY = (f32)(ABSF(o->oVelY) * (o->oDragStrength * 7.0f)) / 100.0L; if (o->oVelY > 0) { o->oVelY -= decelY; @@ -1178,7 +1193,6 @@ void cur_obj_move_y_with_terminal_vel(void) { if (o->oVelY < -70.0f) { o->oVelY = -70.0f; } - o->oPosY += o->oVelY; } @@ -1211,7 +1225,6 @@ s32 obj_check_if_collided_with_object(struct Object *obj1, struct Object *obj2) return TRUE; } } - return FALSE; } @@ -1231,10 +1244,10 @@ s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior) { return (obj->behavior == segmented_to_virtual(behavior)); } -f32 cur_obj_lateral_dist_from_mario_to_home(void) { +Bool32 cur_obj_lateral_dist_from_mario_to_home_is_in_range(f32 dist) { f32 dx = o->oHomeX - gMarioObject->oPosX; f32 dz = o->oHomeZ - gMarioObject->oPosZ; - return sqrtf(sqr(dx) + sqr(dz)); + return ((sqr(dx) + sqr(dz)) < sqr(dist)); } f32 cur_obj_lateral_dist_to_home(void) { @@ -1243,6 +1256,12 @@ f32 cur_obj_lateral_dist_to_home(void) { return sqrtf(sqr(dx) + sqr(dz)); } +Bool32 cur_obj_lateral_dist_to_home_is_in_range(f32 dist) { + f32 dx = o->oHomeX - o->oPosX; + f32 dz = o->oHomeZ - o->oPosZ; + return ((sqr(dx) + sqr(dz)) < sqr(dist)); +} + s32 cur_obj_outside_home_square(f32 halfLength) { if (o->oHomeX - halfLength > o->oPosX) return TRUE; if (o->oHomeX + halfLength < o->oPosX) return TRUE; @@ -1286,13 +1305,6 @@ void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent) { gSecondCameraFocus = o; } -// unused, self explanatory, maybe oInteractStatus originally had TRUE/FALSE statements -void set_mario_interact_true_if_in_range(UNUSED s32 arg0, UNUSED s32 arg1, f32 range) { - if (o->oDistanceToMario < range) { - gMarioObject->oInteractStatus = TRUE; - } -} - void obj_set_billboard(struct Object *obj) { obj->header.gfx.node.flags |= GRAPH_RENDER_BILLBOARD; } @@ -1664,9 +1676,8 @@ s32 cur_obj_follow_path(UNUSED s32 unusedArg) { struct Waypoint *startWaypoint; struct Waypoint *lastWaypoint; struct Waypoint *targetWaypoint; - f32 prevToNextX, prevToNextY, prevToNextZ; + Vec3f prevToNext, objToNext; f32 objToNextXZ; - f32 objToNextX, objToNextY, objToNextZ; if (o->oPathedPrevWaypointFlags == 0) { o->oPathedPrevWaypoint = o->oPathedStartWaypoint; @@ -1683,21 +1694,16 @@ s32 cur_obj_follow_path(UNUSED s32 unusedArg) { } o->oPathedPrevWaypointFlags = lastWaypoint->flags | WAYPOINT_FLAGS_INITIALIZED; + vec3_diff(prevToNext, targetWaypoint->pos, lastWaypoint->pos); + vec3_diff(objToNext, targetWaypoint->pos, &o->oPosVec); - prevToNextX = targetWaypoint->pos[0] - lastWaypoint->pos[0]; - prevToNextY = targetWaypoint->pos[1] - lastWaypoint->pos[1]; - prevToNextZ = targetWaypoint->pos[2] - lastWaypoint->pos[2]; + objToNextXZ = sqrtf(sqr(objToNext[0]) + sqr(objToNext[2])); - objToNextX = targetWaypoint->pos[0] - o->oPosX; - objToNextY = targetWaypoint->pos[1] - o->oPosY; - objToNextZ = targetWaypoint->pos[2] - o->oPosZ; - objToNextXZ = sqrtf(sqr(objToNextX) + sqr(objToNextZ)); - - o->oPathedTargetYaw = atan2s(objToNextZ, objToNextX); - o->oPathedTargetPitch = atan2s(objToNextXZ, -objToNextY); + o->oPathedTargetYaw = atan2s(objToNext[2], objToNext[0]); + o->oPathedTargetPitch = atan2s(objToNextXZ, -objToNext[1]); // If dot(prevToNext, objToNext) <= 0 (i.e. reached other side of target waypoint) - if (prevToNextX * objToNextX + prevToNextY * objToNextY + prevToNextZ * objToNextZ <= 0.0f) { + if (vec3_dot(prevToNext, objToNext) <= 0.0f) { o->oPathedPrevWaypoint = targetWaypoint; if ((targetWaypoint + 1)->flags == WAYPOINT_FLAGS_END) { return PATH_REACHED_END; @@ -1832,12 +1838,7 @@ s32 cur_obj_wait_then_blink(s32 timeUntilBlinking, s32 numBlinks) { } s32 cur_obj_is_mario_ground_pounding_platform(void) { - if (gMarioObject->platform == o) { - if (gMarioStates[0].action == ACT_GROUND_POUND_LAND) { - return TRUE; - } - } - return FALSE; + return ((gMarioObject->platform == o) && (gMarioStates[0].action == ACT_GROUND_POUND_LAND)); } void spawn_mist_particles(void) { @@ -1855,6 +1856,7 @@ void cur_obj_push_mario_away(f32 radius) { f32 marioDist = (sqr(marioRelX) + sqr(marioRelZ)); if (marioDist < sqr(radius)) { + marioDist = sqrtf(marioDist); //! If this function pushes Mario out of bounds, it will trigger Mario's // oob failsafe gMarioStates[0].pos[0] += (radius - marioDist) / radius * marioRelX; @@ -1876,11 +1878,9 @@ void cur_obj_push_mario_away_from_cylinder(f32 radius, f32 extentY) { void bhv_dust_smoke_loop(void) { vec3_add(&o->oPosVec, &o->oVelVec); - if (o->oSmokeTimer == 10) { obj_mark_for_deletion(o); } - o->oSmokeTimer++; } @@ -1970,23 +1970,11 @@ s32 cur_obj_mario_far_away(void) { f32 dz = o->oHomeZ - gMarioObject->oPosZ; f32 marioDistToHome = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); - if (o->oDistanceToMario > 2000.0f && marioDistToHome > 2000.0f) { - return TRUE; - } else { - return FALSE; - } + return (o->oDistanceToMario > 2000.0f && marioDistToHome > 2000.0f); } s32 is_mario_moving_fast_or_in_air(s32 speedThreshold) { - if (gMarioStates[0].forwardVel > speedThreshold) { - return TRUE; - } - - if (gMarioStates[0].action & ACT_FLAG_AIR) { - return TRUE; - } else { - return FALSE; - } + return ((gMarioStates[0].forwardVel > speedThreshold) || (gMarioStates[0].action & ACT_FLAG_AIR)); } s32 is_item_in_array(s8 item, s8 *array) { @@ -1994,10 +1982,8 @@ s32 is_item_in_array(s8 item, s8 *array) { if (*array == item) { return TRUE; } - array++; } - return FALSE; } @@ -2133,11 +2119,7 @@ Gfx *geo_offset_klepto_debug(s32 callContext, struct GraphNode *node, UNUSED s32 } s32 obj_is_hidden(struct Object *obj) { - if (obj->header.gfx.node.flags & GRAPH_RENDER_INVISIBLE) { - return TRUE; - } else { - return FALSE; - } + return (obj->header.gfx.node.flags & GRAPH_RENDER_INVISIBLE); } void enable_time_stop(void) { @@ -2159,7 +2141,7 @@ void clear_time_stop_flags(s32 flags) { s32 cur_obj_can_mario_activate_textbox(f32 radius, f32 height, UNUSED s32 unused) { if (o->oDistanceToMario < 1500.0f) { if (o->oPosY < gMarioObject->oPosY + 160.0f && gMarioObject->oPosY < o->oPosY + height && !(gMarioStates[0].action & ACT_FLAG_AIR) - && lateral_dist_between_objects(o, gMarioObject) < radius && mario_ready_to_speak()) { + && lateral_dist_between_objects_squared(o, gMarioObject) < sqr(radius) && mario_ready_to_speak()) { return TRUE; } } @@ -2328,11 +2310,7 @@ s32 cur_obj_update_dialog_with_cutscene(s32 actionArg, s32 dialogFlags, s32 cuts } s32 cur_obj_has_model(u16 modelID) { - if (o->header.gfx.sharedChild == gLoadedGraphNodes[modelID]) { - return TRUE; - } else { - return FALSE; - } + return (o->header.gfx.sharedChild == gLoadedGraphNodes[modelID]); } void cur_obj_align_gfx_with_floor(void) { diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index 83bb8dff..41e4a86c 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -67,7 +67,9 @@ void obj_apply_scale_to_matrix(struct Object *obj, Mat4 dst, Mat4 src); void create_transformation_from_matrices(Mat4 dst, Mat4 a1, Mat4 a2); void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior); f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2); +f32 lateral_dist_between_objects_squared(struct Object *obj1, struct Object *obj2); f32 dist_between_objects(struct Object *obj1, struct Object *obj2); +f32 dist_between_objects_squared(struct Object *obj1, struct Object *obj2); void cur_obj_forward_vel_approach_upward(f32 target, f32 increment); s32 cur_obj_rotate_yaw_toward(s16 target, s16 increment); s16 obj_angle_to_object(struct Object *obj1, struct Object *obj2); @@ -162,13 +164,13 @@ void cur_obj_set_behavior(const BehaviorScript *behavior); void obj_set_behavior(struct Object *obj, const BehaviorScript *behavior); s32 cur_obj_has_behavior(const BehaviorScript *behavior); s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior); -f32 cur_obj_lateral_dist_from_mario_to_home(void); +Bool32 cur_obj_lateral_dist_from_mario_to_home_is_in_range(f32 dist); f32 cur_obj_lateral_dist_to_home(void); +Bool32 cur_obj_lateral_dist_to_home_is_in_range(f32 dist); void cur_obj_set_pos_to_home(void); void cur_obj_set_pos_to_home_and_stop(void); void cur_obj_shake_y(f32 amount); void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent); -void set_mario_interact_true_if_in_range(UNUSED s32 sp0, UNUSED s32 sp4, f32 sp8); void obj_set_billboard(struct Object *obj); void cur_obj_set_hitbox_radius_and_height(f32 radius, f32 height); void cur_obj_set_hurtbox_radius_and_height(f32 radius, f32 height); diff --git a/src/game/paintings.c b/src/game/paintings.c index a42fb2e8..5e87bc75 100644 --- a/src/game/paintings.c +++ b/src/game/paintings.c @@ -771,7 +771,6 @@ void painting_average_vertex_normals(s16 *neighborTris, s16 numVtx) { f32 nx = 0.0f; f32 ny = 0.0f; f32 nz = 0.0f; - f32 nlen; // The first number of each entry is the number of adjacent tris neighbors = neighborTris[entry]; @@ -788,13 +787,14 @@ void painting_average_vertex_normals(s16 *neighborTris, s16 numVtx) { nx /= neighbors; ny /= neighbors; nz /= neighbors; - nlen = sqrtf(sqr(nx) + sqr(ny) + sqr(nz)); + f32 nlen = (sqr(nx) + sqr(ny) + sqr(nz)); if (nlen == 0.0f) { gPaintingMesh[i].norm[0] = 0; gPaintingMesh[i].norm[1] = 0; gPaintingMesh[i].norm[2] = 0; } else { + nlen = sqrtf(nlen); gPaintingMesh[i].norm[0] = normalize_component(nx / nlen); gPaintingMesh[i].norm[1] = normalize_component(ny / nlen); gPaintingMesh[i].norm[2] = normalize_component(nz / nlen); diff --git a/src/game/platform_displacement.c b/src/game/platform_displacement.c index 4169f8c0..3c73aa83 100644 --- a/src/game/platform_displacement.c +++ b/src/game/platform_displacement.c @@ -227,7 +227,7 @@ void apply_platform_displacement(u32 isMario, struct Object *platform) { Vec3f relativeOffset; Vec3f newObjectOffset; Vec3s rotation; - f32 displaceMatrix[4][4]; + Mat4 displaceMatrix; rotation[0] = platform->oAngleVelPitch; rotation[1] = platform->oAngleVelYaw; diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index d6ceae06..638645c6 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -946,7 +946,7 @@ static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) } else if (sPuppyVolumeStack[index]->shape == PUPPYVOLUME_SHAPE_CYLINDER) { // s16 dir; vec3_diff(rel, sPuppyVolumeStack[index]->pos, &gPuppyCam.targetObj->oPosVec); - f32 dist = sqrtf(sqr(rel[0]) + sqr(rel[2])); + f32 dist = (sqr(rel[0]) + sqr(rel[2])); #ifdef VISUAL_DEBUG Vec3f debugPos[2]; vec3f_set(debugPos[0], sPuppyVolumeStack[index]->pos[0], sPuppyVolumeStack[index]->pos[1], sPuppyVolumeStack[index]->pos[2]); @@ -954,7 +954,7 @@ static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) debug_box_color(0x0000FF00); debug_box_rot(debugPos[0], debugPos[1], sPuppyVolumeStack[index]->rot, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_DEFAULT); #endif - f32 distCheck = (dist < sPuppyVolumeStack[index]->radius[0]); + f32 distCheck = (dist < sqr(sPuppyVolumeStack[index]->radius[0])); if (-sPuppyVolumeStack[index]->radius[1] < rel[1] && rel[1] < sPuppyVolumeStack[index]->radius[1] && distCheck) { *volume = *sPuppyVolumeStack[index]; @@ -1141,8 +1141,10 @@ static void puppycam_projection(void) { targetPos3[0] = (s16)approach_f32_asymptotic(targetPos[0], targetPos2[0], 0.5f); targetPos3[1] = (s16)approach_f32_asymptotic(targetPos[1], targetPos2[1], 0.5f); targetPos3[2] = (s16)approach_f32_asymptotic(targetPos[2], targetPos2[2], 0.5f); - gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0],(ABS(LENCOS(sqrtf(((targetPos[0] - targetPos2[0]) * (targetPos[0] - targetPos2[0])) + ((targetPos[2] - targetPos2[2]) * (targetPos[2] - targetPos2[2]))), - (s16)ABS(((gPuppyCam.yaw + 0x8000) % 0xFFFF - 0x8000) - (atan2s(targetPos[2] - targetPos2[2], targetPos[0] - targetPos2[0])) % 0xFFFF - 0x8000) + 0x4000))), 0.2f); + Vec3s d; + vec3_diff(d, targetPos, targetPos2); + gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0], (ABS(LENCOS(sqrtf(sqr(d[0]) + sqr(d[2])), + (s16)ABS(((gPuppyCam.yaw + 0x8000) % 0xFFFF - 0x8000) - (atan2s(d[2], d[0])) % 0xFFFF - 0x8000) + 0x4000))), 0.2f); } else { gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0], 0, 0.2f); } diff --git a/src/game/screen_transition.c b/src/game/screen_transition.c index 98083747..0ea9febe 100644 --- a/src/game/screen_transition.c +++ b/src/game/screen_transition.c @@ -93,32 +93,24 @@ s16 calc_tex_transition_radius(s8 fadeTimer, s8 transTime, struct WarpTransition } f32 calc_tex_transition_time(s8 fadeTimer, s8 transTime, struct WarpTransitionData *transData) { - f32 startX = transData->startTexX; - f32 startY = transData->startTexY; - f32 endX = transData->endTexX; - f32 endY = transData->endTexY; - f32 sqrtfXY = sqrtf((startX - endX) * (startX - endX) + (startY - endY) * (startY - endY)); - f32 result = (f32) sTransitionColorFadeCount[fadeTimer] * sqrtfXY / (f32)(transTime - 1); - - return result; + f32 dx = transData->startTexX - transData->endTexX; + f32 dy = transData->startTexY - transData->endTexY; + return (f32) sTransitionColorFadeCount[fadeTimer] * sqrtf(sqr(dx) + sqr(dy)) / (f32)(transTime - 1); } u16 convert_tex_transition_angle_to_pos(struct WarpTransitionData *transData) { - f32 x = transData->endTexX - transData->startTexX; - f32 y = transData->endTexY - transData->startTexY; - - return atan2s(x, y); + f32 dx = transData->endTexX - transData->startTexX; + f32 dy = transData->endTexY - transData->startTexY; + return atan2s(dx, dy); } s16 center_tex_transition_x(struct WarpTransitionData *transData, f32 texTransTime, u16 texTransPos) { f32 x = transData->startTexX + coss(texTransPos) * texTransTime; - return (s16)(x + 0.5f); } s16 center_tex_transition_y(struct WarpTransitionData *transData, f32 texTransTime, u16 texTransPos) { f32 y = transData->startTexY + sins(texTransPos) * texTransTime; - return (s16)(y + 0.5f); } @@ -206,36 +198,16 @@ s32 render_textured_transition(s8 fadeTimer, s8 transTime, struct WarpTransition s32 render_screen_transition(s8 fadeTimer, s8 transType, u8 transTime, struct WarpTransitionData *transData) { switch (transType) { - case WARP_TRANSITION_FADE_FROM_COLOR: - return render_fade_transition_from_color(fadeTimer, transTime, transData); - break; - case WARP_TRANSITION_FADE_INTO_COLOR: - return render_fade_transition_into_color(fadeTimer, transTime, transData); - break; - case WARP_TRANSITION_FADE_FROM_STAR: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_STAR, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_INTO_STAR: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_STAR, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_FROM_CIRCLE: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_CIRCLE, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_INTO_CIRCLE: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_CIRCLE, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_FROM_MARIO: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_MARIO, TRANS_TYPE_CLAMP); - break; - case WARP_TRANSITION_FADE_INTO_MARIO: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_MARIO, TRANS_TYPE_CLAMP); - break; - case WARP_TRANSITION_FADE_FROM_BOWSER: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_BOWSER, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_INTO_BOWSER: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_BOWSER, TRANS_TYPE_MIRROR); - break; + case WARP_TRANSITION_FADE_FROM_COLOR: return render_fade_transition_from_color(fadeTimer, transTime, transData); break; + case WARP_TRANSITION_FADE_INTO_COLOR: return render_fade_transition_into_color(fadeTimer, transTime, transData); break; + case WARP_TRANSITION_FADE_FROM_STAR: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_STAR, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_INTO_STAR: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_STAR, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_FROM_CIRCLE: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_CIRCLE, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_INTO_CIRCLE: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_CIRCLE, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_FROM_MARIO: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_MARIO, TRANS_TYPE_CLAMP ); break; + case WARP_TRANSITION_FADE_INTO_MARIO: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_MARIO, TRANS_TYPE_CLAMP ); break; + case WARP_TRANSITION_FADE_FROM_BOWSER: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_BOWSER, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_INTO_BOWSER: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_BOWSER, TRANS_TYPE_MIRROR); break; } return 0; } diff --git a/src/game/shadow.c b/src/game/shadow.c index 936a40b1..4354a4d2 100644 --- a/src/game/shadow.c +++ b/src/game/shadow.c @@ -253,12 +253,13 @@ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, s->floorDownwardAngle = atan2_deg(s->floorNormalZ, s->floorNormalX); - f32 floorSteepness = sqrtf(sqr(s->floorNormalX) + sqr(s->floorNormalZ)); + f32 floorSteepness = (sqr(s->floorNormalX) + sqr(s->floorNormalZ)); // This if-statement avoids dividing by 0. if (floorSteepness == 0.0f) { s->floorTilt = 0; } else { + floorSteepness = sqrtf(floorSteepness); s->floorTilt = 90.0f - atan2_deg(floorSteepness, s->floorNormalY); } return 0; diff --git a/src/game/skybox.c b/src/game/skybox.c index 3bd89d27..d7142282 100644 --- a/src/game/skybox.c +++ b/src/game/skybox.c @@ -308,7 +308,7 @@ Gfx *create_skybox_facing_camera(s8 player, s8 background, f32 fov, //! the first frame, which causes a floating point divide by 0 fov = 90.0f; sSkyBoxInfo[player].yaw = atan2s(cameraFaceZ, cameraFaceX); - sSkyBoxInfo[player].pitch = atan2s(sqrtf(cameraFaceX * cameraFaceX + cameraFaceZ * cameraFaceZ), cameraFaceY); + sSkyBoxInfo[player].pitch = atan2s(sqrtf(sqr(cameraFaceX) + sqr(cameraFaceZ)), cameraFaceY); sSkyBoxInfo[player].scaledX = calculate_skybox_scaled_x(player, fov); sSkyBoxInfo[player].scaledY = calculate_skybox_scaled_y(player, fov); sSkyBoxInfo[player].upperLeftTile = get_top_left_tile_idx(player); diff --git a/src/game/sound_init.c b/src/game/sound_init.c index 1abd9192..d471021c 100644 --- a/src/game/sound_init.c +++ b/src/game/sound_init.c @@ -115,7 +115,7 @@ void raise_background_noise(s32 a) { * Called from threads: thread5_game_loop */ void disable_background_sound(void) { - if (sBgMusicDisabled == FALSE) { + if (!sBgMusicDisabled) { sBgMusicDisabled = TRUE; sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); } @@ -125,7 +125,7 @@ void disable_background_sound(void) { * Called from threads: thread5_game_loop */ void enable_background_sound(void) { - if (sBgMusicDisabled == TRUE) { + if (sBgMusicDisabled) { sBgMusicDisabled = FALSE; sound_banks_enable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); } diff --git a/src/goddard/joints.c b/src/goddard/joints.c index e6d4d793..57b05e07 100644 --- a/src/goddard/joints.c +++ b/src/goddard/joints.c @@ -62,8 +62,7 @@ void grabbable_joint_update_func(struct ObjJoint *self) { self->flags |= 0x2000; } else { - if (gGdCtrl.trgR == FALSE) // R trigger is released - { + if (!gGdCtrl.trgR) { // R trigger is released // Set velocity so that the joint approaches its initial position self->velocity.x -= offset.x * 0.5f; self->velocity.y -= offset.y * 0.5f;