You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
Fix objects using throwmatrix having incorrect rotation when paused (#769)
* throwmatrix fix * ok fixed it and removed some cringe matching * happy bitch
This commit is contained in:
@@ -187,8 +187,6 @@ s8 turn_obj_away_from_steep_floor(struct Surface *objFloor, f32 floorY, f32 objV
|
||||
void obj_orient_graph(struct Object *obj, f32 normalX, f32 normalY, f32 normalZ) {
|
||||
Vec3f objVisualPosition, surfaceNormals;
|
||||
|
||||
Mat4 *throwMatrix;
|
||||
|
||||
// Passes on orienting certain objects that shouldn't be oriented, like boulders.
|
||||
if (!sOrientObjWithFloor) {
|
||||
return;
|
||||
@@ -199,17 +197,11 @@ void obj_orient_graph(struct Object *obj, f32 normalX, f32 normalY, f32 normalZ)
|
||||
return;
|
||||
}
|
||||
|
||||
throwMatrix = alloc_display_list(sizeof(*throwMatrix));
|
||||
// If out of memory, fail to try orienting the object.
|
||||
if (throwMatrix == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
vec3f_copy_y_off(objVisualPosition, &obj->oPosVec, obj->oGraphYOffset);
|
||||
vec3f_set(surfaceNormals, normalX, normalY, normalZ);
|
||||
|
||||
mtxf_align_terrain_normal(*throwMatrix, surfaceNormals, objVisualPosition, obj->oFaceAngleYaw);
|
||||
obj->header.gfx.throwMatrix = throwMatrix;
|
||||
mtxf_align_terrain_normal(obj->transform, surfaceNormals, objVisualPosition, obj->oFaceAngleYaw);
|
||||
obj->header.gfx.throwMatrix = &obj->transform;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -255,10 +247,7 @@ void calc_new_obj_vel_and_pos_y(struct Surface *objFloor, f32 objFloorY, f32 obj
|
||||
}
|
||||
}
|
||||
|
||||
//! (Obj Position Crash) If you got an object with height past 2^31, the game would crash.
|
||||
if ((s32) o->oPosY >= (s32) objFloorY && (s32) o->oPosY < (s32) objFloorY + 37) {
|
||||
obj_orient_graph(o, floor_nX, floor_nY, floor_nZ);
|
||||
|
||||
if ((o->oPosY >= objFloorY) && (o->oPosY < objFloorY + 37)) {
|
||||
// Adds horizontal component of gravity for horizontal speed.
|
||||
f32 nxz = sqr(floor_nX) + sqr(floor_nZ);
|
||||
f32 vel = ((nxz) / (nxz + sqr(floor_nY))) * o->oGravity * 2;
|
||||
@@ -312,9 +301,7 @@ void calc_new_obj_vel_and_pos_y_underwater(struct Surface *objFloor, f32 floorY,
|
||||
o->oVelY = -o->oVelY;
|
||||
}
|
||||
|
||||
if ((s32) o->oPosY >= (s32) floorY && (s32) o->oPosY < (s32) floorY + 37) {
|
||||
obj_orient_graph(o, floor_nX, floor_nY, floor_nZ);
|
||||
|
||||
if ((o->oPosY >= floorY) && (o->oPosY < floorY + 37)) {
|
||||
// Adds horizontal component of gravity for horizontal speed.
|
||||
f32 nxz = sqr(floor_nX) + sqr(floor_nZ);
|
||||
f32 velm = (nxz / (nxz + sqr(floor_nY))) * netYAccel * 2;
|
||||
@@ -411,6 +398,11 @@ s16 object_step(void) {
|
||||
}
|
||||
|
||||
obj_update_pos_vel_xz();
|
||||
|
||||
if (sObjFloor && (o->oPosY >= floorY) && (o->oPosY < floorY + 37)) {
|
||||
obj_orient_graph(o, sObjFloor->normal.x, sObjFloor->normal.y, sObjFloor->normal.z);
|
||||
}
|
||||
|
||||
if ((s32) o->oPosY == (s32) floorY) {
|
||||
collisionFlags += OBJ_COL_FLAG_GROUNDED;
|
||||
}
|
||||
@@ -420,7 +412,7 @@ s16 object_step(void) {
|
||||
}
|
||||
|
||||
// Generate a splash if in water.
|
||||
obj_splash((s32) waterY, (s32) o->oPosY);
|
||||
obj_splash(waterY, o->oPosY);
|
||||
return collisionFlags;
|
||||
}
|
||||
|
||||
|
||||
@@ -1039,6 +1039,8 @@ void geo_process_object(struct Object *node) {
|
||||
if (node->header.gfx.areaIndex == gCurGraphNodeRoot->areaIndex) {
|
||||
s32 isInvisible = (node->header.gfx.node.flags & GRAPH_RENDER_INVISIBLE);
|
||||
s32 noThrowMatrix = (node->header.gfx.throwMatrix == NULL);
|
||||
// Maintain throw matrix pointer if the game is paused as it won't be updated.
|
||||
Mat4 *oldThrowMatrix = (sCurrPlayMode == PLAY_MODE_PAUSED) ? node->header.gfx.throwMatrix : NULL;
|
||||
|
||||
// If the throw matrix is null and the object is invisible, there is no need
|
||||
// to update billboarding, scale, rotation, etc.
|
||||
@@ -1087,7 +1089,7 @@ void geo_process_object(struct Object *node) {
|
||||
|
||||
gMatStackIndex--;
|
||||
gCurrAnimType = ANIM_TYPE_NONE;
|
||||
node->header.gfx.throwMatrix = NULL;
|
||||
node->header.gfx.throwMatrix = oldThrowMatrix;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user