You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
Held object fix
This commit is contained in:
@@ -37,7 +37,7 @@ void vec3f_set(Vec3f dest, f32 x, f32 y, f32 z) {
|
||||
|
||||
/// Add vector 'a' to 'dest'
|
||||
void vec3f_add(Vec3f dest, Vec3f a) {
|
||||
register f32 *temp = dest;
|
||||
register f32 *temp = (f32 *)dest;
|
||||
register s32 j;
|
||||
register f32 sum, sum2;
|
||||
for (j = 0; j < 3; j++) {
|
||||
@@ -118,9 +118,6 @@ void vec3f_normalize(Vec3f dest) {
|
||||
|
||||
invsqrt = 1.0f / size;
|
||||
vec3_mul_val(dest, invsqrt);
|
||||
/*dest[0] *= invsqrt;
|
||||
dest[1] *= invsqrt;
|
||||
dest[2] *= invsqrt;*/
|
||||
} else {
|
||||
dest[0] = 0;
|
||||
dest[1] = 1;
|
||||
@@ -160,7 +157,7 @@ void mtxf_identity(register Mat4 mtx) {
|
||||
*/
|
||||
void mtxf_translate(Mat4 dest, Vec3f b) {
|
||||
mtxf_identity(dest);
|
||||
vec3f_copy(dest[3], b);
|
||||
vec3_copy(dest[3], b);
|
||||
}
|
||||
|
||||
void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) {
|
||||
@@ -212,7 +209,7 @@ void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) {
|
||||
f32 lookAtCalc(f32 sqrtsqrt) {
|
||||
f32 calc = sqrtf(sqrtsqrt);
|
||||
if (calc == 0)
|
||||
calc = 0.00000000001;
|
||||
calc = 0.001f;
|
||||
|
||||
return -1.0 / calc;
|
||||
}
|
||||
@@ -236,7 +233,6 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) {
|
||||
f32 xColX;
|
||||
f32 yColX;
|
||||
f32 zColX;
|
||||
f32 calc;
|
||||
|
||||
dx = to[0] - from[0];
|
||||
dz = to[2] - from[2];
|
||||
@@ -375,7 +371,7 @@ void mtxf_rotate_xyz_and_translate(Mat4 dest, Vec3f b, Vec3s c) {
|
||||
void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) {
|
||||
register s32 i;
|
||||
register f32 *temp, *temp2;
|
||||
temp = dest;
|
||||
temp = (f32 *)dest;
|
||||
for (i = 0; i < 16; i++) {
|
||||
*temp = 0;
|
||||
temp++;
|
||||
@@ -388,8 +384,8 @@ void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) {
|
||||
dest[2][3] = 0;
|
||||
((u32 *) dest)[15] = 0x3F800000;
|
||||
|
||||
temp = dest;
|
||||
temp2 = mtx;
|
||||
temp = (f32 *)dest;
|
||||
temp2 = (f32 *)mtx;
|
||||
for (i = 0; i < 3; i++) {
|
||||
temp[12] = temp2[0] * position[0] + temp2[4] * position[1] + temp2[8] * position[2] + temp2[12];
|
||||
temp++;
|
||||
@@ -448,7 +444,7 @@ void mtxf_align_terrain_normal(Mat4 dest, Vec3f upDir, Vec3f pos, s32 yaw) {
|
||||
* 'radius' is the distance from each triangle vertex to the center
|
||||
*/
|
||||
void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) {
|
||||
struct Surface *sp74;
|
||||
struct Surface *floor;
|
||||
Vec3f point0;
|
||||
Vec3f point1;
|
||||
Vec3f point2;
|
||||
@@ -466,9 +462,9 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) {
|
||||
point2[0] = pos[0] + radius * sins(yaw + 0xD555);
|
||||
point2[2] = pos[2] + radius * coss(yaw + 0xD555);
|
||||
|
||||
point0[1] = find_floor(point0[0], pos[1] + 150, point0[2], &sp74);
|
||||
point1[1] = find_floor(point1[0], pos[1] + 150, point1[2], &sp74);
|
||||
point2[1] = find_floor(point2[0], pos[1] + 150, point2[2], &sp74);
|
||||
point0[1] = find_floor(point0[0], pos[1] + 150, point0[2], &floor);
|
||||
point1[1] = find_floor(point1[0], pos[1] + 150, point1[2], &floor);
|
||||
point2[1] = find_floor(point2[0], pos[1] + 150, point2[2], &floor);
|
||||
|
||||
if (point0[1] - pos[1] < minY) {
|
||||
point0[1] = pos[1];
|
||||
@@ -482,29 +478,21 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) {
|
||||
point2[1] = pos[1];
|
||||
}
|
||||
|
||||
avgY = (point0[1] + point1[1] + point2[1]) * .3333333333333333333333333333333333333333333333f;
|
||||
avgY = (point0[1] + point1[1] + point2[1]) / 3;
|
||||
|
||||
vec3f_set(forward, sins(yaw), 0, coss(yaw));
|
||||
vec3_set(forward, sins(yaw), 0, coss(yaw));
|
||||
find_vector_perpendicular_to_plane(yColumn, point0, point1, point2);
|
||||
vec3f_normalize(yColumn);
|
||||
vec3f_cross(xColumn, yColumn, forward);
|
||||
vec3_cross(xColumn, yColumn, forward);
|
||||
vec3f_normalize(xColumn);
|
||||
vec3f_cross(zColumn, xColumn, yColumn);
|
||||
vec3_cross(zColumn, xColumn, yColumn);
|
||||
vec3f_normalize(zColumn);
|
||||
vec3f_copy(mtx[0], xColumn);
|
||||
vec3f_copy(mtx[1], yColumn);
|
||||
vec3f_copy(mtx[2], zColumn);
|
||||
|
||||
mtx[0][0] = xColumn[0];
|
||||
mtx[0][1] = xColumn[1];
|
||||
mtx[0][2] = xColumn[2];
|
||||
mtx[3][0] = pos[0];
|
||||
|
||||
mtx[1][0] = yColumn[0];
|
||||
mtx[1][1] = yColumn[1];
|
||||
mtx[1][2] = yColumn[2];
|
||||
mtx[3][1] = (avgY < pos[1]) ? pos[1] : avgY;
|
||||
|
||||
mtx[2][0] = zColumn[0];
|
||||
mtx[2][1] = zColumn[1];
|
||||
mtx[2][2] = zColumn[2];
|
||||
mtx[3][2] = pos[2];
|
||||
|
||||
mtx[0][3] = 0;
|
||||
@@ -525,15 +513,15 @@ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) {
|
||||
register f32 entry0;
|
||||
register f32 entry1;
|
||||
register f32 entry2;
|
||||
register f32 *temp = a;
|
||||
register f32 *temp2 = dest;
|
||||
register f32 *temp = (f32 *)a;
|
||||
register f32 *temp2 = (f32 *)dest;
|
||||
register f32 *temp3;
|
||||
register s32 i;
|
||||
for (i = 0; i < 16; i++) {
|
||||
entry0 = temp[0];
|
||||
entry1 = temp[1];
|
||||
entry2 = temp[2];
|
||||
temp3 = b;
|
||||
temp3 = (f32 *)b;
|
||||
for (; (i & 3) !=3; i++) {
|
||||
*temp2 = entry0 * temp3[0] + entry1 * temp3[4] + entry2 * temp3[8];
|
||||
temp2++;
|
||||
@@ -543,7 +531,7 @@ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) {
|
||||
temp += 4;
|
||||
temp2++;
|
||||
}
|
||||
vec3f_add(&dest[3][0], &b[3][0]);
|
||||
vec3_add(&dest[3][0], &b[3][0]);
|
||||
((u32 *) dest)[15] = 0x3F800000;
|
||||
}
|
||||
|
||||
@@ -551,9 +539,10 @@ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) {
|
||||
* Set matrix 'dest' to 'mtx' scaled by vector s
|
||||
*/
|
||||
void mtxf_scale_vec3f(Mat4 dest, Mat4 mtx, register Vec3f s) {
|
||||
register f32 *temp = dest;
|
||||
register f32 *temp2 = mtx;
|
||||
register f32 *temp = (f32 *)dest;
|
||||
register f32 *temp2 = (f32 *)mtx;
|
||||
register s32 i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
temp[0] = temp2[0] * s[0];
|
||||
temp[4] = temp2[4] * s[1];
|
||||
@@ -573,7 +562,7 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) {
|
||||
register f32 x = b[0];
|
||||
register f32 y = b[1];
|
||||
register f32 z = b[2];
|
||||
register f32 *temp2 = mtx;
|
||||
register f32 *temp2 = (f32 *)mtx;
|
||||
register s32 i;
|
||||
register s16 *c = b;
|
||||
for (i = 0; i < 3; i++) {
|
||||
@@ -636,7 +625,7 @@ void mtxf_to_mtx(void *dest, void *src) {
|
||||
void mtxf_rotate_xy(Mtx *mtx, s32 angle) {
|
||||
register s32 i = coss(angle) * 65536;
|
||||
register s32 j = sins(angle) * 65536;
|
||||
register f32 *temp = mtx;
|
||||
register f32 *temp = (f32 *)mtx;
|
||||
register s32 k;
|
||||
for (k = 0; k < 16; k++) {
|
||||
*temp = 0;
|
||||
@@ -644,20 +633,8 @@ void mtxf_rotate_xy(Mtx *mtx, s32 angle) {
|
||||
}
|
||||
MATENTRY(0, i)
|
||||
MATENTRY(1, j)
|
||||
//((s32 *) mtx)[1] = 0;
|
||||
MATENTRY(4, -j)
|
||||
MATENTRY(5, i)
|
||||
/*((s32 *) mtx)[3] = 0;
|
||||
((s32 *) mtx)[4] = 0;
|
||||
((s32 *) mtx)[5] = 0;
|
||||
((s32 *) mtx)[6] = 0;
|
||||
((s32 *) mtx)[7] = 0;
|
||||
((s32 *) mtx)[9] = 0;
|
||||
((s32 *) mtx)[11] = 0;
|
||||
((s32 *) mtx)[12] = 0;
|
||||
((s32 *) mtx)[13] = 0;
|
||||
((s32 *) mtx)[14] = 0;
|
||||
((s32 *) mtx)[15] = 0;*/
|
||||
((s16 *) mtx)[10] = 1;
|
||||
((s16 *) mtx)[15] = 1;
|
||||
}
|
||||
@@ -672,11 +649,11 @@ void mtxf_rotate_xy(Mtx *mtx, s32 angle) {
|
||||
*/
|
||||
void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) {
|
||||
register s32 i;
|
||||
register f32 *temp = dest;
|
||||
register f32 *temp2 = camMtx;
|
||||
register f32 *temp = (f32 *)dest;
|
||||
register f32 *temp2 = (f32 *)camMtx;
|
||||
f32 y[3];
|
||||
register f32 *x = y;
|
||||
register f32 *temp3 = objMtx;
|
||||
register f32 *temp3 = (f32 *)objMtx;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
*x = (temp3[12] - temp2[12]);
|
||||
@@ -690,7 +667,6 @@ void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) {
|
||||
temp++;
|
||||
temp2 += 4;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "debug_box.h"
|
||||
#include "level_update.h"
|
||||
#include "behavior_data.h"
|
||||
#include "string.h"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
@@ -350,12 +351,13 @@ void geo_append_display_list(void *displayList, s32 layer) {
|
||||
}
|
||||
}
|
||||
|
||||
void incrementMatStack() {
|
||||
void incrementMatStack(void) {
|
||||
Mtx *mtx = alloc_display_list(sizeof(*mtx));
|
||||
gMatStackIndex++;
|
||||
mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]);
|
||||
gMatStackFixed[gMatStackIndex] = mtx;
|
||||
}
|
||||
|
||||
void appendDLandReturn(struct GraphNodeDisplayList *node) {
|
||||
if (node->displayList != NULL) {
|
||||
geo_append_display_list(node->displayList, node->node.flags >> 8);
|
||||
@@ -1022,6 +1024,7 @@ void geo_process_object_parent(struct GraphNodeObjectParent *node) {
|
||||
void geo_process_held_object(struct GraphNodeHeldObject *node) {
|
||||
Mat4 mat;
|
||||
Vec3f translation;
|
||||
Mat4 tempMtx;
|
||||
|
||||
#ifdef F3DEX_GBI_2
|
||||
gSPLookAt(gDisplayListHead++, &lookAt);
|
||||
@@ -1033,16 +1036,17 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) {
|
||||
if (node->objNode != NULL && node->objNode->header.gfx.sharedChild != NULL) {
|
||||
s32 hasAnimation = (node->objNode->header.gfx.node.flags & GRAPH_RENDER_HAS_ANIMATION) != 0;
|
||||
|
||||
translation[0] = node->translation[0] / 4.0f;
|
||||
translation[1] = node->translation[1] / 4.0f;
|
||||
translation[2] = node->translation[2] / 4.0f;
|
||||
translation[0] = node->translation[0] / 4;
|
||||
translation[1] = node->translation[1] / 4;
|
||||
translation[2] = node->translation[2] / 4;
|
||||
|
||||
mtxf_translate(mat, translation);
|
||||
mtxf_copy(gMatStack[gMatStackIndex + 1], *gCurGraphNodeObject->throwMatrix);
|
||||
gMatStack[gMatStackIndex + 1][3][0] = gMatStack[gMatStackIndex][3][0];
|
||||
gMatStack[gMatStackIndex + 1][3][1] = gMatStack[gMatStackIndex][3][1];
|
||||
gMatStack[gMatStackIndex + 1][3][2] = gMatStack[gMatStackIndex][3][2];
|
||||
mtxf_mul(gMatStack[gMatStackIndex + 1], mat, gMatStack[gMatStackIndex + 1]);
|
||||
mtxf_copy(temp, gMatStack[gMatStackIndex + 1]);
|
||||
mtxf_mul(gMatStack[gMatStackIndex + 1], mat, tempMtx);
|
||||
mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], node->objNode->header.gfx.scale);
|
||||
if (node->fnNode.func != NULL) {
|
||||
node->fnNode.func(GEO_CONTEXT_HELD_OBJ, &node->fnNode.node, (struct AllocOnlyPool *) gMatStack[gMatStackIndex + 1]);
|
||||
|
||||
Reference in New Issue
Block a user