Math util cleanup (#566)

* math util cleanup

* clean up min/max 3 and also distance and angle functions

* improve pipelining and make macros safe

* macros safer and cleaned approaches

* fix build

* made sure puppycam builds (and fixed unused var warnings)

* added 32 bit mins and maxs
This commit is contained in:
arthurtilly
2023-12-16 17:44:06 +13:00
committed by GitHub
parent 9fc928ed70
commit b73d8dd178
18 changed files with 563 additions and 939 deletions

View File

@@ -81,8 +81,8 @@ void rgba32_to_colorRGBAf(ColorRGBAf dst, RGBA32 src) {
dst[3] = COMPOSITE_TO_COLORF(src, MSK_RGBA32_A, IDX_RGBA32_A);
}
void colorRGB_to_colorRGBf(ColorRGBf dst, ColorRGB src) { vec3_quot_val(dst, src, 255.0f); }
void colorRGBf_to_colorRGB(ColorRGB dst, ColorRGBf src) { vec3_prod_val(dst, src, 255.0f); }
void colorRGB_to_colorRGBf(ColorRGBf dst, ColorRGB src) { vec3_scale_dest(dst, src, 1/255.0f); }
void colorRGBf_to_colorRGB(ColorRGB dst, ColorRGBf src) { vec3_scale_dest(dst, src, 255.0f); }
RGBA16Return32 colorRGBf_to_rgba16(ColorRGBf src) {
return (COLORF_TO_COMPOSITE(src[0], MSK_RGBA16_C, IDX_RGBA16_R)
@@ -137,7 +137,7 @@ Bool32 colorRGBA_average_3(ColorRGBA dst, ColorRGBA c1, ColorRGBA c2, ColorRGBA
RGBA16Return32 rgba16_make_grayscale(RGBA16 rgba) {
ColorRGBf color;
rgba16_to_colorRGBf(color, rgba);
ColorF avg = vec3_average(color);
ColorF avg = (color[0] + color[1] + color[2]) / 3.f;
vec3_same(color, avg);
return colorRGBf_to_rgba16(color);
}

View File

@@ -103,10 +103,10 @@
#define COMPOSITE_TO_COLORF(src, bitmask, index) ((ColorF)(((src) >> (index)) & (bitmask)) / (bitmask))
#define COLORF_TO_COMPOSITE(src, bitmask, index) (((CompositeColor)((src) * (bitmask)) & (bitmask)) << (index))
#define COLORRGB_TO_COLORRGBF( dst, src) vec3_quot_val((dst), (src), 255.0f)
#define COLORRGBF_TO_COLORRGB( dst, src) vec3_prod_val((dst), (src), 255.0f)
#define COLORRGBA_TO_COLORRGBAF(dst, src) vec4_quot_val((dst), (src), 255.0f)
#define COLORRGBAF_TO_COLORRGBA(dst, src) vec4_prod_val((dst), (src), 255.0f)
#define COLORRGB_TO_COLORRGBF( dst, src) vec3_scale_dest((dst), (src), 1/255.0f)
#define COLORRGBF_TO_COLORRGB( dst, src) vec3_scale_dest((dst), (src), 255.0f)
#define COLORRGBA_TO_COLORRGBAF(dst, src) vec4_scale_dest((dst), (src), 1/255.0f)
#define COLORRGBAF_TO_COLORRGBA(dst, src) vec4_scale_dest((dst), (src), 255.0f)
#define colorRGB_set( dst, r, g, b) vec3_set( (dst), (r), (g), (b))
#define colorRGB_copy( dst, src ) vec3_copy((dst), (src) )

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -248,7 +248,7 @@ static struct Surface *read_surface_data(TerrainData *vertexData, TerrainData **
Vec3t offset;
s16 min, max;
vec3_prod_val(offset, (*vertexIndices), 3);
vec3_scale_dest(offset, (*vertexIndices), 3);
vec3s_copy(v[0], (vertexData + offset[0]));
vec3s_copy(v[1], (vertexData + offset[1]));
@@ -265,7 +265,7 @@ static struct Surface *read_surface_data(TerrainData *vertexData, TerrainData **
}
#endif
mag = 1.0f / sqrtf(mag);
vec3_mul_val(n, mag);
vec3_scale(n, mag);
struct Surface *surface = alloc_surface(dynamic);
@@ -686,8 +686,9 @@ void load_object_collision_model(void) {
PUPPYPRINT_GET_SNAPSHOT();
TerrainData *collisionData = o->collisionData;
f32 sqrLateralDist;
vec3f_get_lateral_dist_squared(&o->oPosVec, &gMarioObject->oPosVec, &sqrLateralDist);
Vec3f dist;
vec3_diff(dist, &o->oPosVec, &gMarioObject->oPosVec);
f32 sqrLateralDist = sqr(dist[0]) + sqr(dist[2]);
f32 verticalMarioDiff = gMarioObject->oPosY - o->oPosY;

View File

@@ -104,12 +104,12 @@ static void chain_chomp_update_chain_segments(void) {
// Cap distance to previous chain part (so that the tail follows the chomp)
Vec3f offset;
vec3f_diff(offset, segment->pos, prevSegment->pos);
vec3_normalize_max(offset, o->oChainChompMaxDistBetweenChainParts);
vec3_set_max_dist(offset, o->oChainChompMaxDistBetweenChainParts);
// Cap distance to pivot (so that it stretches when the chomp moves far from the wooden post)
vec3f_add(offset, prevSegment->pos);
f32 maxTotalDist = o->oChainChompMaxDistFromPivotPerChainPart * (CHAIN_CHOMP_NUM_SEGMENTS - i);
vec3_normalize_max(offset, maxTotalDist);
vec3_set_max_dist(offset, maxTotalDist);
vec3f_copy(segment->pos, offset);
}
@@ -365,7 +365,7 @@ static void chain_chomp_act_move(void) {
f32 ratio = maxDistToPivot / o->oChainChompDistToPivot;
o->oChainChompDistToPivot = maxDistToPivot;
vec3_mul_val(o->oChainChompSegments[0].pos, ratio);
vec3_scale(o->oChainChompSegments[0].pos, ratio);
if (o->oChainChompReleaseStatus == CHAIN_CHOMP_NOT_RELEASED) {
// Restrict chain chomp position

View File

@@ -194,7 +194,8 @@ void hoot_action_loop(void) {
void hoot_turn_to_home(void) {
s16 pitchToHome, yawToHome;
vec3f_get_angle(&o->oPosVec, &o->oHomeVec, &pitchToHome, &yawToHome);
f32 distToHome;
vec3f_get_dist_and_angle(&o->oPosVec, &o->oHomeVec, &distToHome, &pitchToHome, &yawToHome);
o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, yawToHome, 0x140);
o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, -pitchToHome, 0x140);

View File

@@ -7,8 +7,9 @@
void intro_peach_set_pos_and_opacity(struct Object *obj, f32 targetOpacity, f32 increment) {
Vec3f newPos;
s16 focusPitch, focusYaw;
f32 dist;
vec3f_get_angle(gLakituState.pos, gLakituState.focus, &focusPitch, &focusYaw);
vec3f_get_dist_and_angle(gLakituState.pos, gLakituState.focus, &dist, &focusPitch, &focusYaw);
vec3f_set_dist_and_angle(gLakituState.pos, newPos, obj->oIntroPeachDistToCamera,
obj->oIntroPeachPitchFromFocus + focusPitch,
obj->oIntroPeachYawFromFocus + focusYaw);

View File

@@ -40,7 +40,8 @@ void bhv_collect_star_loop(void) {
void bhv_star_spawn_init(void) {
s16 yaw;
vec3f_get_lateral_dist_and_yaw(&o->oPosVec, &o->oHomeVec, &o->oStarSpawnDisFromHome, &yaw);
vec3f_get_yaw(&o->oPosVec, &o->oHomeVec, &yaw);
vec3f_get_lateral_dist(&o->oPosVec, &o->oHomeVec, &o->oStarSpawnDisFromHome)
o->oMoveAngleYaw = yaw;
o->oVelY = (o->oHomeY - o->oPosY) / 30.0f;
o->oForwardVel = o->oStarSpawnDisFromHome / 30.0f;

View File

@@ -3462,7 +3462,7 @@ void evaluate_cubic_spline(f32 u, Vec3f Q, Vec3f spline1, Vec3f spline2, Vec3f s
register f32 su = sqr(u);
register f32 hcu = (su * u) / 2.0f;
B[0] = cube(nu) / 6.0f;
B[0] = (nu * nu * nu) / 6.0f;
B[1] = hcu - su + (2.0f / 3.0f);
B[2] = -hcu + (su / 2.0f) + (u / 2.0f) + (1.0f / 6.0f);
B[3] = hcu / 3.0f;

View File

@@ -1,4 +1,5 @@
#include "PR/os_internal.h"
#include "engine/math_util.h"
#include "game_init.h"
@@ -9,11 +10,6 @@
#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0])))
#define CHNL_ERR(format) (((format).rxsize & CHNL_ERR_MASK) >> 4)
#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
#define S8_MAX __SCHAR_MAX__
#define S8_MIN (-S8_MAX - 1)
#define CLAMP_S8( x) CLAMP((x), S8_MIN, S8_MAX)
#define CHNL_ERR_MASK 0xC0 /* Bit 6-7: channel errors */
typedef struct

View File

@@ -1706,7 +1706,8 @@ s32 execute_mario_action(UNUSED struct Object *obj) {
s32 inLoop = TRUE;
// Updates once per frame:
vec3f_get_dist_and_lateral_dist_and_angle(gMarioState->prevPos, gMarioState->pos, &gMarioState->moveSpeed, &gMarioState->lateralSpeed, &gMarioState->movePitch, &gMarioState->moveYaw);
vec3f_get_dist_and_angle(gMarioState->prevPos, gMarioState->pos, &gMarioState->moveSpeed, &gMarioState->movePitch, &gMarioState->moveYaw);
vec3f_get_lateral_dist(gMarioState->prevPos, gMarioState->pos, &gMarioState->lateralSpeed);
vec3f_copy(gMarioState->prevPos, gMarioState->pos);
if (gMarioState->action) {

View File

@@ -1353,9 +1353,6 @@ void tilt_body_butt_slide(struct MarioState *m) {
}
void common_slide_action(struct MarioState *m, u32 endAction, u32 airAction, s32 animation) {
Vec3f pos;
vec3f_copy(pos, m->pos);
play_sound(SOUND_MOVING_TERRAIN_SLIDE + m->terrainSoundAddend, m->marioObj->header.gfx.cameraToObject);
#if ENABLE_RUMBLE

View File

@@ -137,7 +137,7 @@ static void apply_water_current(struct MarioState *m, Vec3f step) {
if (whirlpool != NULL) {
strength = 0.0f;
vec3f_to_vec3s_get_dist_and_angle(m->pos, whirlpool->pos, &distance, &pitchToWhirlpool, &yawToWhirlpool);
vec3_get_dist_and_angle(m->pos, whirlpool->pos, &distance, &pitchToWhirlpool, &yawToWhirlpool);
yawToWhirlpool -= (s16)(0x2000 * 1000.0f / (distance + 1000.0f));

View File

@@ -476,9 +476,9 @@ void obj_init_animation(struct Object *obj, s32 animIndex) {
void obj_apply_scale_to_transform(struct Object *obj) {
Vec3f scale;
vec3f_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]);
vec3_scale(obj->transform[0], scale[0]);
vec3_scale(obj->transform[1], scale[1]);
vec3_scale(obj->transform[2], scale[2]);
}
void obj_copy_scale(struct Object *dst, struct Object *src) {

View File

@@ -223,7 +223,6 @@ s32 puppycam_move_spline(struct sPuppySpline splinePos[], struct sPuppySpline sp
f32 tempProgress[2] = {0.0f, 0.0f};
f32 progChange = 0.0f;
s32 i;
Vec3f prevPos;
if (gPuppyCam.splineIndex == 65000) {
gPuppyCam.splineIndex = index;
@@ -236,7 +235,6 @@ s32 puppycam_move_spline(struct sPuppySpline splinePos[], struct sPuppySpline sp
return TRUE;
}
}
vec3f_set(prevPos, gPuppyCam.pos[0], gPuppyCam.pos[1], gPuppyCam.pos[2]);
for (i = 0; i < 4; i++) {
vec3f_set(tempPoints[i], splinePos[gPuppyCam.splineIndex + i].pos[0], splinePos[gPuppyCam.splineIndex + i].pos[1], splinePos[gPuppyCam.splineIndex + i].pos[2]);
@@ -680,7 +678,6 @@ static void puppycam_input_hold_preset2(f32 ivX) {
// Another alternative control scheme. This one aims to mimic the parallel camera scheme down to the last bit from the original game.
static void puppycam_input_hold_preset3(f32 ivX) {
f32 stickMag[2] = {gPlayer1Controller->rawStickX*0.65f, gPlayer1Controller->rawStickY*0.2f};
// Just in case it happens to be nonzero.
gPuppyCam.yawAcceleration = 0;
@@ -1374,7 +1371,7 @@ static void puppycam_collision(void) {
vec3f_normalize(dirToCam);
// Get the vector from mario's head to the camera plus the extra check dist
Vec3f vecToCam;
vec3_prod_val(vecToCam, dirToCam, colCheckDist);
vec3_scale_dest(vecToCam, dirToCam, colCheckDist);
dist[0] = find_surface_on_ray(target[0], vecToCam, &surf[0], hitpos[0], RAYCAST_FIND_FLOOR | RAYCAST_FIND_CEIL | RAYCAST_FIND_WALL);
dist[1] = find_surface_on_ray(target[1], vecToCam, &surf[1], hitpos[1], RAYCAST_FIND_FLOOR | RAYCAST_FIND_CEIL | RAYCAST_FIND_WALL);
@@ -1391,7 +1388,7 @@ static void puppycam_collision(void) {
closestDist -= surfOffset;
// Allow the camera to ride right up next to the wall (mario's wall radius is 50u so this is safe)
closestDist = MAX(closestDist, 50);
vec3_mul_val(dirToCam, closestDist);
vec3_scale(dirToCam, closestDist);
vec3_sum(gPuppyCam.pos, target[0], dirToCam);
// If the camera is uncomfortably close to the wall, move it up a bit

View File

@@ -1123,7 +1123,7 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) {
node->fnNode.func(GEO_CONTEXT_RENDER, &node->fnNode.node, gMatStack[gMatStackIndex]);
}
if (node->objNode != NULL && node->objNode->header.gfx.sharedChild != NULL) {
vec3_prod_val(translation, node->translation, 0.25f);
vec3_scale_dest(translation, node->translation, 0.25f);
mtxf_translate(mat, translation);
mtxf_copy(gMatStack[gMatStackIndex + 1], *gCurGraphNodeObject->throwMatrix);

View File

@@ -61,7 +61,7 @@ struct Skybox {
struct Skybox sSkyBoxInfo[2];
typedef const Texture *const SkyboxTexture[80 * sqr(SKYBOX_SIZE)];
typedef const Texture *const SkyboxTexture[80 * SKYBOX_SIZE * SKYBOX_SIZE];
extern SkyboxTexture bbh_skybox_ptrlist;
extern SkyboxTexture bidw_skybox_ptrlist;
@@ -304,7 +304,8 @@ Gfx *create_skybox_facing_camera(s8 player, s8 background, f32 fov, Vec3f pos, V
//! the first frame, which causes a floating point divide by 0
fov = 90.0f;
s16 yaw;
vec3f_get_angle(pos, focus, &sSkyBoxInfo[player].pitch, &yaw);
f32 dist;
vec3f_get_dist_and_angle(pos, focus, &dist, &sSkyBoxInfo[player].pitch, &yaw);
sSkyBoxInfo[player].yaw = yaw;
sSkyBoxInfo[player].scaledX = calculate_skybox_scaled_x(player, fov);
sSkyBoxInfo[player].scaledY = calculate_skybox_scaled_y(player, fov);