You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user