sm64pc/src/goddard/joints.c

1149 lines
29 KiB
C

#include <ultra64.h>
#include <macros.h>
#ifdef VERSION_EU
#include "prevent_bss_reordering.h"
#endif
#include "gd_types.h"
#include "gd_macros.h"
#include "joints.h"
#include "gd_main.h"
#include "sfx.h"
#include "draw_objects.h"
#include "objects.h"
#include "skin_movement.h"
#include "dynlist_proc.h"
#include "debug_utils.h"
#include "skin.h"
#include "gd_math.h"
#include "renderer.h"
// data
static s32 D_801A82D0 = 0;
static struct ObjBone *gGdTempBone = NULL; // @ 801A82D4
// bss
s32 sTargetWeightID; // @ 801BA960
static Mat4f *D_801BA964;
static struct GdVec3f D_801BA968;
static s32 sJointCount; // @ 801BA974
static s32 sJointNotF1Count; // @ 801BA978
static s32 sBoneCount; // @ 801BA97C
static s32 sJointArrLen; // @ 801BA980
static struct ObjJoint *sJointArr[10]; // @ 801BA988
static struct GdVec3f sJointArrVecs[10]; // @ 801BA9B0
static s32 sJointArr2Len; // @ 801BAA28
static struct ObjJoint *sJointArr2[10]; // @ 801BAA30
static struct GdVec3f sJointArr2Vecs[10]; // @ 801BAA58
static struct GdVec3f D_801BAAD0;
static struct GdVec3f D_801BAAE0;
// forward declarations
void set_joint_vecs(struct ObjJoint *, f32, f32, f32);
/* 23CCF0 -> 23D3B8 */
void Proc8018E520(struct ObjJoint *self) {
UNUSED u8 pad78[0xC8 - 0x78];
Mat4f *sp74;
UNUSED u8 pad70[4];
struct GdVec3f sp64;
UNUSED u8 pad50[0x10];
register struct Links *att; // sp4C?
UNUSED u8 pad48[0x8];
struct GdObj *attobj; // sp44
sp64.x = self->mat128[3][0] - self->unk54.x;
sp64.y = self->mat128[3][1] - self->unk54.y;
sp64.z = self->mat128[3][2] - self->unk54.z;
if (self->header.drawFlags & OBJ_PICKED) {
self->unk78.x = sp64.x * -0.25; //? -0.25f
self->unk78.y = sp64.y * -0.25; //? -0.25f
self->unk78.z = sp64.z * -0.25; //? -0.25f
self->unk1BC |= 0x2000;
; // necessary?
} else {
if (gGdCtrl.trgR == FALSE) // R-trigger not held or released
{
self->unk78.x -= sp64.x * 0.5; //? 0.5f
self->unk78.y -= sp64.y * 0.5; //? 0.5f
self->unk78.z -= sp64.z * 0.5; //? 0.5f
self->unk78.x *= 0.8; //? 0.8f
self->unk78.y *= 0.8; //? 0.8f
self->unk78.z *= 0.8; //? 0.8f
if (ABS(self->unk78.x) + ABS(self->unk78.y) + ABS(self->unk78.z) < 1.0) //? 1.0f
{
if (ABS(sp64.x) + ABS(sp64.y) + ABS(sp64.z) < 1.0) //? 1.0f
{
self->unk78.x = self->unk78.y = self->unk78.z = 0.0f;
self->mat128[3][0] -= sp64.x;
self->mat128[3][1] -= sp64.y;
self->mat128[3][2] -= sp64.z;
}
}
if (self->unk1BC & 0x2000) {
gd_play_sfx(GD_SFX_LET_GO_FACE);
}
self->unk1BC &= ~0x2000;
; // necessary?
} else {
self->unk78.x = self->unk78.y = self->unk78.z = 0.0f;
}
}
self->mat128[3][0] += self->unk78.x;
self->mat128[3][1] += self->unk78.y;
self->mat128[3][2] += self->unk78.z;
if (self->header.drawFlags & OBJ_PICKED) {
gGdCtrl.csrX -= (gGdCtrl.csrX - gGdCtrl.csrXatApress) * 0.2;
gGdCtrl.csrY -= (gGdCtrl.csrY - gGdCtrl.csrYatApress) * 0.2;
}
sp64.x = self->mat128[3][0] - self->unk54.x;
sp64.y = self->mat128[3][1] - self->unk54.y;
sp64.z = self->mat128[3][2] - self->unk54.z;
for (att = self->unk1F8->link1C; att != NULL; att = att->next) {
attobj = att->obj;
set_cur_dynobj(attobj);
sp74 = d_get_matrix_ptr();
gd_add_vec3f_to_mat4f_offset(sp74, &sp64);
}
}
/* 23D3B8 -> 23D62C */
void Proc8018EBE8(struct ObjJoint *self) {
Mat4f *sp5C;
struct GdVec3f sp50;
struct GdVec3f sp44;
UNUSED u8 pad2c[0x18];
register struct Links *att; // sp28
struct GdObj *attobj; // sp24
if (sCurrentMoveCamera == NULL) {
return;
}
if (self->unk1D0 != NULL) {
if (self->unk1D0->unk4C != 7) {
return;
}
}
set_cur_dynobj(self);
sp5C = d_get_rot_mtx_ptr();
sp44.x = (*sp5C)[3][0];
sp44.y = (*sp5C)[3][1];
sp44.z = (*sp5C)[3][2];
func_80179B9C(&sp44, sCurrentMoveCamera, sCurrentMoveView);
sp50.x = gGdCtrl.csrX - sp44.x;
sp50.y = -(gGdCtrl.csrY - sp44.y);
sp50.z = 0.0f;
sp50.x *= 2.0; //?2.0f
sp50.y *= 2.0; //?2.0f
sp50.z *= 2.0; //?2.0f
if (gd_vec3f_magnitude(&sp50) > 30.0f) {
gd_normalize_vec3f(&sp50);
sp50.x *= 30.0f;
sp50.y *= 30.0f;
sp50.z *= 30.0f;
}
for (att = self->unk1F8->link1C; att != NULL; att = att->next) {
attobj = att->obj;
set_cur_dynobj(attobj);
sp5C = d_get_rot_mtx_ptr();
gd_add_vec3f_to_mat4f_offset(sp5C, &sp50);
}
}
/* 23D62C -> 23D748; not called */
void Unknown8018EE5C(struct ObjJoint *j1, struct ObjJoint *j2, struct ObjJoint *j3) {
struct GdVec3f vec;
struct ObjJoint *curj;
if (j3 == NULL) {
return;
}
vec.z = j3->unk14.x;
vec.y = j3->unk14.y;
vec.x = j3->unk14.z;
curj = j1;
while (curj != NULL) {
set_joint_vecs(curj, curj->unk14.x + vec.z, curj->unk14.y + vec.y, curj->unk14.z + vec.x);
if (curj == j2) {
break;
}
curj = curj->prevjoint;
}
}
/* 23D748 -> 23D818; orig name: func_8018EF78 */
void set_joint_vecs(struct ObjJoint *j, f32 x, f32 y, f32 z) {
j->unk14.x = x;
j->unk14.y = y;
j->unk14.z = z;
j->unk30.x = x;
j->unk30.y = y;
j->unk30.z = z;
j->unk3C.x = x;
j->unk3C.y = y;
j->unk3C.z = z;
j->unk54.x = x;
j->unk54.y = y;
j->unk54.z = z;
j->mat128[3][0] = x;
j->mat128[3][1] = y;
j->mat128[3][2] = z;
}
/* 23D818 -> 23DA18 */
struct ObjJoint *make_joint(s32 flags, f32 x, f32 y, f32 z) {
struct ObjJoint *j; // sp24
struct ObjJoint *oldhead;
UNUSED u32 pad1C;
j = (struct ObjJoint *) make_object(OBJ_TYPE_JOINTS);
sJointCount++;
oldhead = gGdJointList;
gGdJointList = j;
if (oldhead != NULL) {
j->nextjoint = oldhead;
oldhead->prevjoint = j;
}
gd_set_identity_mat4(&j->matE8);
gd_set_identity_mat4(&j->mat128);
set_joint_vecs(j, x, y, z);
j->unk1CC = 0;
j->id = sJointCount;
j->unk1BC = flags;
if (!(j->unk1BC & 0x1)) {
sJointNotF1Count++;
}
if (j->unk1BC & 0x1) {
j->unk1C8 = 2;
} else {
j->unk1C8 = 9;
}
j->unk1C4 = NULL;
j->unk20 = NULL;
j->unk9C.x = 1.0f;
j->unk9C.y = 1.0f;
j->unk9C.z = 1.0f;
j->unkDC.x = 0.0f;
j->unkDC.y = 0.0f;
j->unkDC.z = 0.0f;
j->fn2C = NULL;
return j;
}
/* 23DA18 -> 23DAF8; orig name: func_8018F248 */
struct ObjJoint *make_joint_withshape(struct ObjShape *shape, s32 flags, f32 x, f32 y, f32 z) {
struct ObjJoint *j;
j = make_joint(0, x, y, z);
j->unk20 = shape;
j->unk1CC = 5;
j->unk1BC |= flags;
j->unk1C8 = 9;
j->header.drawFlags |= OBJ_IS_GRABBALE;
j->header.drawFlags |= OBJ_NOT_DRAWABLE;
j->fn2C = &Proc8018E520;
j->unk1D0 = NULL;
return j;
}
/* 23DAF8 -> 23DC9C */
void func_8018F328(struct ObjBone *b) {
struct ObjJoint *sp24;
struct ObjJoint *sp20;
struct ObjGroup *grp; // sp1C
struct Links *link; // sp18
grp = b->unk10C;
link = grp->link1C;
sp24 = (struct ObjJoint *) link->obj;
link = link->next;
sp20 = (struct ObjJoint *) link->obj;
b->unk14.x = (sp24->unk14.x + sp20->unk14.x) / 2.0; //?2.0f
b->unk14.y = (sp24->unk14.y + sp20->unk14.y) / 2.0; //?2.0f
b->unk14.z = (sp24->unk14.z + sp20->unk14.z) / 2.0; //?2.0f
b->unk58.x = sp20->unk14.x - sp24->unk14.x;
b->unk58.y = sp20->unk14.y - sp24->unk14.y;
b->unk58.z = sp20->unk14.z - sp24->unk14.z;
gd_normalize_vec3f(&b->unk58);
gd_create_origin_lookat(&b->matB0, &b->unk58, 0); //? 0.0f
}
/* 23DC9C -> 23DCF0 */
void Unknown8018F4CC(struct ObjJoint *j) {
if (j->unk1BC & 0x1000) {
j->unkB4.x = D_801BA968.x;
j->unkB4.y = D_801BA968.y;
j->unkB4.z = D_801BA968.z;
}
}
/* 23DCF0 -> 23E06C */
void func_8018F520(struct ObjBone *b) {
struct ObjJoint *spAC;
struct ObjJoint *spA8;
UNUSED u32 pad[3];
struct GdVec3f sp90;
struct GdVec3f sp84;
struct GdVec3f sp78;
struct GdVec3f sp6C;
f32 sp68;
f32 sp64;
struct ObjGroup *grp; // sp60
struct Links *link;
Mat4f mtx; // sp1C
grp = b->unk10C;
link = grp->link1C;
spAC = (struct ObjJoint *) link->obj;
link = link->next;
spA8 = (struct ObjJoint *) link->obj;
b->unk14.x = (spAC->unk14.x + spA8->unk14.x) / 2.0; //? 2.0f;
b->unk14.y = (spAC->unk14.y + spA8->unk14.y) / 2.0; //? 2.0f;
b->unk14.z = (spAC->unk14.z + spA8->unk14.z) / 2.0; //? 2.0f;
sp90.x = b->unk58.x;
sp90.y = b->unk58.y;
sp90.z = b->unk58.z;
sp6C.x = sp90.x;
sp6C.y = sp90.y;
sp6C.z = sp90.z;
sp6C.x -= b->unk64.x;
sp6C.y -= b->unk64.y;
sp6C.z -= b->unk64.z;
b->unk64.x = sp90.x;
b->unk64.y = sp90.y;
b->unk64.z = sp90.z;
sp68 = 5.4 / b->unkF8; //? 5.4f
sp6C.x *= sp68;
sp6C.y *= sp68;
sp6C.z *= sp68;
sp90.x *= sp68;
sp90.y *= sp68;
sp90.z *= sp68;
gd_cross_vec3f(&sp90, &sp6C, &sp78);
sp84.x = sp78.x;
sp84.y = sp78.y;
sp84.z = sp78.z;
gd_normalize_vec3f(&sp84);
sp64 = gd_vec3f_magnitude(&sp78);
gd_create_rot_mat_angular(&mtx, &sp84, sp64);
gd_mult_mat4f(&b->mat70, &mtx, &b->mat70);
D_801BA968.x = b->mat70[2][0];
D_801BA968.y = b->mat70[2][1];
D_801BA968.z = b->mat70[2][2];
D_801BA964 = &b->mat70;
apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) Unknown8018F4CC, b->unk10C);
}
/* 23E06C -> 23E238 */
void func_8018F89C(struct ObjBone *b) {
struct ObjJoint *spAC;
struct ObjJoint *spA8;
UNUSED u8 pad64[0x44];
struct ObjGroup *grp; // sp60
struct Links *link; // sp5c
Mat4f mtx; // sp1c
grp = b->unk10C;
link = grp->link1C;
spAC = (struct ObjJoint *) link->obj;
link = link->next;
spA8 = (struct ObjJoint *) link->obj;
b->unk14.x = (spAC->unk14.x + spA8->unk14.x) / 2.0; //? 2.0f;
b->unk14.y = (spAC->unk14.y + spA8->unk14.y) / 2.0; //? 2.0f;
b->unk14.z = (spAC->unk14.z + spA8->unk14.z) / 2.0; //? 2.0f;
gd_mult_mat4f(&b->matB0, &gGdSkinNet->mat128, &mtx);
gd_copy_mat4f(&mtx, &b->mat70);
D_801BA968.x = -b->mat70[2][0];
D_801BA968.y = -b->mat70[2][1];
D_801BA968.z = -b->mat70[2][2];
D_801BA964 = &b->mat70;
apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) Unknown8018F4CC, b->unk10C);
}
/* 23E238 -> 23E298 */
void Unknown8018FA68(struct ObjBone *b) {
if (b->unk104 & (0x8 | 0x2)) {
func_8018F89C(b);
} else {
func_8018F520(b);
}
}
/* 23E298 -> 23E328; orig name: func_8018FAC8 */
s32 set_skin_weight(struct ObjJoint *j, s32 id, struct ObjVertex *vtx, f32 weight) {
struct ObjWeight *w;
if (j->unk1F4 == NULL) {
j->unk1F4 = make_group(0);
}
w = make_weight(0, id, vtx, weight);
addto_group(j->unk1F4, &w->header);
return TRUE;
}
/* 23E328 -> 23E474 */
void func_8018FB58(struct ObjBone *b) {
struct GdVec3f vec; // sp2c
struct ObjJoint *j1; // sp28
struct ObjJoint *j2;
struct Links *link;
struct ObjGroup *grp;
grp = b->unk10C;
link = grp->link1C;
j1 = (struct ObjJoint *) link->obj;
link = link->next;
j2 = (struct ObjJoint *) link->obj;
vec.x = j1->unk14.x - j2->unk14.x;
vec.y = j1->unk14.y - j2->unk14.y;
vec.z = j1->unk14.z - j2->unk14.z;
b->unkF8 = gd_sqrt_d((vec.x * vec.x) + (vec.y * vec.y) + (vec.z * vec.z));
b->unkF4 = b->unkF8;
b->unkFC = b->unkF8;
func_8018F328(b);
}
/* 23E474 -> 23E56C */
void add_joint2bone(struct ObjBone *b, struct ObjJoint *j) {
if (j->header.type != OBJ_TYPE_JOINTS) {
fatal_printf("add_joint2bone(): Can only add Joints to Bones");
}
if (b->unk10C == NULL) {
b->unk10C = make_group(0);
}
addto_group(b->unk10C, &j->header);
if (j->unk1C4 == NULL) {
j->unk1C4 = make_group(0);
}
addto_group(j->unk1C4, &b->header);
if (b->unk10C->objCount == 2) {
func_8018FB58(b);
}
}
/* 23E56C -> 23E6E4 */
struct ObjBone *make_bone(s32 a0, struct ObjJoint *j1, struct ObjJoint *j2, UNUSED s32 a3) {
struct ObjBone *b; // sp34
struct ObjBone *oldhead;
UNUSED u32 pad1C[5];
b = (struct ObjBone *) make_object(OBJ_TYPE_BONES);
sBoneCount++;
b->id = sBoneCount;
oldhead = gGdBoneList;
gGdBoneList = b;
if (oldhead != NULL) {
b->next = oldhead;
oldhead->prev = b;
}
b->unk10C = NULL;
b->unk100 = 0;
b->unk104 = a0;
b->unkF0 = NULL;
gd_set_identity_mat4(&b->mat70);
b->unk110 = 0.8f;
b->unk114 = 0.9f;
b->unkF8 = 100.0f;
if (j1 != NULL && j2 != NULL) {
add_joint2bone(b, j1);
add_joint2bone(b, j2);
}
printf("Made bone %d\n", b->id);
return b;
}
/* 23E6E4 -> 23E6F8; not called */
void Unknown8018FF14(UNUSED u32 a0) {
}
/* 23E6F8 -> 23E758; not called */
void Unknown8018FF28(struct ObjJoint *a0, struct ObjJoint *a1) {
if (a1->unk1BC & 0x1) {
a0->unk84.x -= a1->unk84.x;
a0->unk84.y -= a1->unk84.y;
a0->unk84.z -= a1->unk84.z;
}
}
/* 23E758 -> 23E7B8; not called */
void Unknown8018FF88(s32 size) {
s32 i;
for (i = 0; i < size - 1; i++) {
gd_printf(" ");
}
}
/* 23E7B8 -> 23E938 */
s32 func_8018FFE8(struct ObjBone **a0, struct ObjJoint **a1, struct ObjJoint *a2, struct ObjJoint *a3) {
struct ObjBone *b; // 1C
struct ObjJoint *sp18;
s32 sp14 = 0;
struct ObjGroup *bonegrp; // 10
struct ObjGroup *grp; // 0c
struct Links *bonelink; // 08
struct Links *link; // 04
grp = a3->unk1C4;
if (grp == NULL) {
return 0;
}
link = grp->link1C;
if (link == NULL) {
return 0;
}
while (link != NULL) {
if ((b = (struct ObjBone *) link->obj) != NULL) {
bonegrp = b->unk10C;
bonelink = bonegrp->link1C;
while (bonelink != NULL) {
sp18 = (struct ObjJoint *) bonelink->obj;
if (sp18 != a3 && sp18 != a2) {
a1[sp14] = sp18;
a0[sp14] = b;
sp14++;
}
bonelink = bonelink->next;
}
}
link = link->next;
}
return sp14;
}
/* 23E938 -> 23EBB8 */
void func_80190168(struct ObjBone *b, UNUSED struct ObjJoint *a1, UNUSED struct ObjJoint *a2,
struct GdVec3f *a3) {
struct GdVec3f sp7C;
UNUSED u8 pad64[0x7c - 0x64];
f32 sp60;
f32 sp5C;
f32 sp58;
UNUSED u8 pad1C[0x58 - 0x1C];
return;
b->unk58.x = sp7C.x;
b->unk58.y = sp7C.y;
b->unk58.z = sp7C.z;
if (b->unk104 & 0x8) {
sp58 = gd_vec3f_magnitude(&sp7C);
if (sp58 == 0.0f) {
sp58 = 1.0f;
}
sp60 = (b->unkF8 / sp58) * b->unk110;
}
if (b->unk104 & 0x4) {
if (sp60 > (sp58 = gd_vec3f_magnitude(&sp7C))) {
sp5C = b->unk110;
a3->x *= sp5C;
a3->y *= sp5C;
a3->z *= sp5C;
} else {
a3->x = 0.0f;
a3->y = 0.0f;
a3->z = 0.0f;
}
}
if (b->unk104 & 0x2) {
if (sp60 < (sp58 = gd_vec3f_magnitude(&sp7C))) {
sp5C = b->unk110;
a3->x *= sp5C;
a3->y *= sp5C;
a3->z *= sp5C;
} else {
a3->x = 0.0f;
a3->y = 0.0f;
a3->z = 0.0f;
}
}
}
/* 23EBB8 -> 23ED44 */
void func_801903E8(struct ObjJoint *j, struct GdVec3f *a1, f32 x, f32 y, f32 z) {
f32 sp14;
struct GdVec3f sp8;
if (j->unk1BC & 0x1 || (j->unk1BC & 0x1000) == 0) {
j->unk3C.x += x;
j->unk3C.y += y;
j->unk3C.z += z;
a1->x = a1->y = a1->z = 0.0f;
;
} else {
sp14 = (j->unkB4.x * x) + (j->unkB4.y * y) + (j->unkB4.z * z);
sp8.x = j->unkB4.x * sp14;
sp8.y = j->unkB4.y * sp14;
sp8.z = j->unkB4.z * sp14;
j->unk3C.x += sp8.x;
j->unk3C.y += sp8.y;
j->unk3C.z += sp8.z;
a1->x = x - sp8.x;
a1->y = y - sp8.y;
a1->z = z - sp8.z;
}
}
/* 23EBB8 -> 23F184 */
void func_80190574(s32 a0, struct ObjJoint *a1, struct ObjJoint *a2, f32 x, f32 y, f32 z) // sp278
{
struct ObjJoint *sp274; // = a2?
struct ObjJoint *sp270; // mid-point of stack array?
struct ObjJoint *sp26C; // jointstackarr[i]? curjoint?
UNUSED u32 pad268;
UNUSED u32 sp264 = 0;
UNUSED u32 sp258[3]; // unused vec?
struct GdVec3f sp24C;
struct GdVec3f sp240;
UNUSED u32 pad238[2];
s32 sp234; // i?
s32 sp230;
s32 sp22C = 1;
UNUSED u32 pad228;
s32 sp224;
s32 sp220;
struct ObjJoint *sp120[0x40];
struct ObjBone *sp20[0x40];
for (sp230 = 1; sp230 < a0; sp230 *= 2) {
sp22C = sp22C * 2 + 1;
}
if (a0 & 0x8000) {
fatal_print("Too many nestings!\n");
}
printf("\n");
printf("NIDmask: %d / ", a0);
a2->unk1C0 |= a0;
sp224 = func_8018FFE8(sp20, sp120, a1, a2);
func_801903E8(a2, &sp240, x, y, z);
for (sp234 = 0; sp234 < sp224; sp234++) {
if (a1 != NULL) {
printf("branch %d from j%d-j%d(%d): ", sp234, a2->id, a1->id, sp224);
} else {
printf("branch %d from j%d(%d): ", sp234, a2->id, sp224);
}
sp274 = a2;
sp26C = sp120[sp234];
func_80190168(sp20[sp234], sp274, sp26C, &sp24C);
do {
sp220 = func_8018FFE8(&sp20[0x20], &sp120[0x20], sp274, sp26C);
sp270 = sp120[0x20];
if (sp26C->unk1C0 & sp22C) {
break;
}
if (sp220 < 2) {
if (sp26C->unk1BC & 0x1) {
sJointArrLen++;
sJointArr[sJointArrLen] = sp274;
sJointArrVecs[sJointArrLen].x = -sp24C.x;
sJointArrVecs[sJointArrLen].y = -sp24C.y;
sJointArrVecs[sJointArrLen].z = -sp24C.z;
sp26C->unk90.x += sp24C.x;
sp26C->unk90.y += sp24C.y;
sp26C->unk90.z += sp24C.z;
sp26C->unk90.x += sp240.x;
sp26C->unk90.y += sp240.y;
sp26C->unk90.z += sp240.z;
sp240.x = sp240.y = sp240.z = 0.0f;
break;
} else {
sp24C.x += sp240.x;
sp24C.y += sp240.y;
sp24C.z += sp240.z;
func_801903E8(sp26C, &sp240, sp24C.x, sp24C.y, sp24C.z);
}
if (sp220 == 1) {
func_80190168(sp20[0x20], sp26C, sp270, &sp24C);
}
}
if (sp220 > 1) {
func_80190574(a0 * 2, sp274, sp26C, sp24C.x, sp24C.y, sp24C.z);
break;
}
sp274 = sp26C;
sp26C = sp270;
} while (sp220);
printf("Exit");
// probably sp274(sp26C) because it would make sense to print
// the iterations of both of these loops.
printf(" %d(%d)", sp274->id, sp26C->id);
printf("R ");
printf("\n");
}
printf("\n\n");
}
/* 23F184 -> 23F1F0 */
void func_801909B4(void) {
struct ObjJoint *node;
D_801A82D0 = 0;
node = gGdJointList;
while (node != NULL) {
node->unk1C0 = 0;
node = node->nextjoint;
}
}
/* 23F1F0 -> 23F324; not called */
void Unknown80190A20(void) {
struct ObjJoint *j; // sp3c
UNUSED u32 pad38;
struct GdVec3f vec; // sp2C
struct ObjGroup *grp;
struct Links *link;
struct ObjBone *b;
j = gGdJointList;
while (j != NULL) {
if (j->unk1BC & 0x40) {
grp = j->unk1C4;
link = grp->link1C;
b = (struct ObjBone *) link->obj;
vec.z = b->unk40.x * 100.0f;
vec.y = b->unk40.y * 100.0f;
vec.x = b->unk40.z * 100.0f;
func_80190574(1, NULL, j, vec.z, vec.y, vec.x);
}
j = j->nextjoint;
}
}
/* 23F324 -> 23F638 */
void func_80190B54(struct ObjJoint *a0, struct ObjJoint *a1, struct GdVec3f *a2) // b0
{
struct GdVec3f spA4;
UNUSED struct GdVec3f pad98;
struct GdVec3f sp8C;
struct GdVec3f sp80;
f32 sp7C;
f32 sp78;
Mat4f sp38;
UNUSED u8 pad1C[0x1C];
if (a1 != NULL) {
spA4.x = a1->unk3C.x;
spA4.y = a1->unk3C.y;
spA4.z = a1->unk3C.z;
spA4.x -= a0->unk3C.x;
spA4.y -= a0->unk3C.y;
spA4.z -= a0->unk3C.z;
sp8C.x = spA4.x;
sp8C.y = spA4.y;
sp8C.z = spA4.z;
gd_normalize_vec3f(&sp8C);
sp7C = a1->unk228;
D_801BAAE0.x = spA4.x - (sp8C.x * sp7C);
D_801BAAE0.y = spA4.y - (sp8C.y * sp7C);
D_801BAAE0.z = spA4.z - (sp8C.z * sp7C);
sp78 = 5.4 / sp7C; //? 5.4f
D_801BAAD0.x *= sp78;
D_801BAAD0.y *= sp78;
D_801BAAD0.z *= sp78;
spA4.x *= sp78;
spA4.y *= sp78;
spA4.z *= sp78;
gd_cross_vec3f(&spA4, &D_801BAAD0, &sp80);
sp78 = gd_vec3f_magnitude(&sp80);
gd_normalize_vec3f(&sp80);
gd_create_rot_mat_angular(&sp38, &sp80, sp78);
gd_mult_mat4f(&a0->matE8, &sp38, &a0->matE8);
} else {
D_801BAAE0.x = a2->x;
D_801BAAE0.y = a2->y;
D_801BAAE0.z = a2->z;
}
a0->unk3C.x += D_801BAAE0.x;
a0->unk3C.y += D_801BAAE0.y;
a0->unk3C.z += D_801BAAE0.z;
D_801BAAD0.x = D_801BAAE0.x;
D_801BAAD0.y = D_801BAAE0.y;
D_801BAAD0.z = D_801BAAE0.z;
}
/* 23F638 -> 23F70C; not called */
void Unknown80190E68(struct GdObj *obj, f32 x, f32 y, f32 z) {
struct ObjJoint *sp44;
struct GdObj *sp40;
struct GdVec3f vec; // sp34
UNUSED u32 pad1C[6];
vec.x = x;
vec.y = y;
vec.z = z;
sp44 = NULL;
sp40 = obj;
while (sp40 != NULL) {
if (sp40->type != OBJ_TYPE_JOINTS) {
break;
}
func_80190B54(((struct ObjJoint *) sp40), sp44, &vec);
sp44 = ((struct ObjJoint *) sp40);
sp40 = ((struct ObjJoint *) sp40)->unk20C; //"attached object"
}
}
/* 23F70C -> 23F978 */
f32 func_80190F3C(struct ObjJoint *a0, f32 a1, f32 a2, f32 a3) {
struct ObjJoint *curj; // 34
s32 i; // 30
struct GdVec3f sp24;
sp24.x = a0->unk3C.x;
sp24.y = a0->unk3C.y;
sp24.z = a0->unk3C.z;
func_801909B4();
sJointArrLen = 0;
func_80190574(1, NULL, a0, a1, a2, a3);
for (i = 1; i <= sJointArrLen; i++) {
sJointArr2[i] = sJointArr[i];
sJointArr2Vecs[i].x = sJointArrVecs[i].x;
sJointArr2Vecs[i].y = sJointArrVecs[i].y;
sJointArr2Vecs[i].z = sJointArrVecs[i].z;
}
printf("Num return joints (pass 1): %d\n", i);
sJointArr2Len = sJointArrLen;
sJointArrLen = 0;
for (i = 1; i <= sJointArr2Len; i++) {
func_801909B4();
curj = sJointArr2[i];
func_80190574(1, NULL, curj, sJointArr2Vecs[i].x, sJointArr2Vecs[i].y, sJointArr2Vecs[i].z);
}
printf("Num return joints (pass 2): %d\n", i);
sp24.x -= a0->unk3C.x;
sp24.y -= a0->unk3C.y;
sp24.z -= a0->unk3C.z;
return gd_vec3f_magnitude(&sp24);
}
/* 23F978 -> 23F9F0 */
void Unknown801911A8(struct ObjJoint *j) {
j->unkCC.x = j->unkC0.x; // storing "shape offset"?
j->unkCC.y = j->unkC0.y;
j->unkCC.z = j->unkC0.z;
gd_rotate_and_translate_vec3f(&j->unkCC, &gGdSkinNet->mat128);
}
/* 23F9F0 -> 23FB90 */
void Unknown80191220(struct ObjJoint *j) {
j->unk48.x = j->unk54.x; // storing "attached offset"?
j->unk48.y = j->unk54.y;
j->unk48.z = j->unk54.z;
gd_mat4f_mult_vec3f(&j->unk48, &gGdSkinNet->mat128);
j->unk3C.x = j->unk48.x;
j->unk3C.y = j->unk48.y;
j->unk3C.z = j->unk48.z;
j->unk14.x = gGdSkinNet->unk14.x;
j->unk14.y = gGdSkinNet->unk14.y;
j->unk14.z = gGdSkinNet->unk14.z;
j->unk14.x += j->unk3C.x;
j->unk14.y += j->unk3C.y;
j->unk14.z += j->unk3C.z;
j->unk1A8.x = j->unk1A8.y = j->unk1A8.z = 0.0f;
gGdCounter.ctr0++;
}
/* 23FB90 -> 23FBC0 */
void Unknown801913C0(struct ObjJoint *j) {
UNUSED u32 pad[4];
func_80181894(j);
}
/* 23FBC0 -> 23FCC8 */
void Unknown801913F0(struct ObjJoint *j) {
j->unk78.x = j->unk14.x;
j->unk78.y = j->unk14.y;
j->unk78.z = j->unk14.z;
j->unk78.x -= j->unk30.x;
j->unk78.y -= j->unk30.y;
j->unk78.z -= j->unk30.z;
j->unk30.x = j->unk14.x;
j->unk30.y = j->unk14.y;
j->unk30.z = j->unk14.z;
gd_copy_mat4f(&gGdSkinNet->mat128, &j->matE8);
}
/* 23FCC8 -> 23FCDC */
void Unknown801914F8(UNUSED struct ObjJoint *j) {
}
/* 23FCDC -> 23FDD4; not called */
void Unknown8019150C(Mat4f *a0, struct GdVec3f *a1) {
struct GdVec3f sp1C;
sp1C.x = (*a0)[3][0] / 10.0; //? 10.0f
sp1C.y = (*a0)[3][1] / 10.0; //? 10.0f
sp1C.z = (*a0)[3][2] / 10.0; //? 10.0f
a1->x += sp1C.x;
a1->y += sp1C.y;
a1->z += sp1C.z;
gd_mat4f_mult_vec3f(a1, a0);
}
/* 23FDD4 -> 23FFF4 */
void func_80191604(struct ObjJoint *j) {
j->unk14.x = j->unk54.x;
j->unk14.y = j->unk54.y;
j->unk14.z = j->unk54.z;
j->unk30.x = j->unk54.x;
j->unk30.y = j->unk54.y;
j->unk30.z = j->unk54.z;
j->unk3C.x = j->unk54.x;
j->unk3C.y = j->unk54.y;
j->unk3C.z = j->unk54.z;
j->unk78.x = j->unk78.y = j->unk78.z = 0.0f;
j->unk84.x = j->unk84.y = j->unk84.z = 0.0f;
j->unk90.x = j->unk90.y = j->unk90.z = 0.0f;
j->unk1A8.x = j->unk1A8.y = j->unk1A8.z = 0.0f;
gd_set_identity_mat4(&j->mat168);
gd_scale_mat4f_by_vec3f(&j->mat168, (struct GdVec3f *) &j->unk9C);
gd_rot_mat_about_vec(&j->mat168, (struct GdVec3f *) &j->unk6C);
gd_add_vec3f_to_mat4f_offset(&j->mat168, &j->unk200);
gd_copy_mat4f(&j->mat168, &j->matE8);
gd_set_identity_mat4(&j->mat128);
gd_add_vec3f_to_mat4f_offset(&j->mat128, &j->unk54);
}
/* 23FFF4 -> 2400C4 */
void Unknown80191824(struct ObjJoint *j) {
UNUSED struct ObjNet *sp14;
UNUSED u32 pad00[4];
sp14 = gGdSkinNet->unk1F0;
if (j->unk1BC & 0x1) {
j->unk14.x = gGdSkinNet->unk14.x;
j->unk14.y = gGdSkinNet->unk14.y;
j->unk14.z = gGdSkinNet->unk14.z;
j->unk3C.x = gGdSkinNet->unk14.x;
j->unk3C.y = gGdSkinNet->unk14.y;
j->unk3C.z = gGdSkinNet->unk14.z;
}
}
/* 2400C4 -> 2401EC; not called */
void Unknown801918F4(struct ObjJoint *j) {
f32 sp4;
j->unk78.x = j->unk3C.x;
j->unk78.y = j->unk3C.y;
j->unk78.z = j->unk3C.z;
j->unk78.x -= j->unk30.x;
j->unk78.y -= j->unk30.y;
j->unk78.z -= j->unk30.z;
j->unk30.x = j->unk3C.x;
j->unk30.y = j->unk3C.y;
j->unk30.z = j->unk3C.z;
sp4 = -4.0f;
if (!(j->unk1BC & 0x41)) {
j->unk78.y += sp4 * 0.2; //? 0.2f
j->unk3C.x += j->unk78.x;
j->unk3C.y += j->unk78.y;
j->unk3C.z += j->unk78.z;
}
}
/* 2401EC -> 2403C8; not called */
void Unknown80191A1C(struct ObjBone *a0) {
f32 sp3C;
f32 sp38 = 0.0f;
struct GdObj *argjoint;
struct GdObj *tempjoint;
struct GdVec3f sp24;
struct GdVec3f sp18;
if (gGdTempBone == NULL) {
gGdTempBone = a0;
}
sp3C = gd_dot_vec3f(&gGdTempBone->unk40, &a0->unk40);
a0->unk118 = sp3C;
if ((sp3C -= sp38) < 0.0f) {
tempjoint = gGdTempBone->unk10C->link1C->obj;
argjoint = a0->unk10C->link1C->next->obj;
set_cur_dynobj(argjoint);
d_get_rel_pos(&sp24);
set_cur_dynobj(tempjoint);
d_get_rel_pos(&sp18);
sp24.x -= sp18.x;
sp24.y -= sp18.y;
sp24.z -= sp18.z;
gd_normalize_vec3f(&sp24);
sp3C = -sp3C * 50.0; //? 50.0f
if (!(((struct ObjJoint *) argjoint)->unk1BC & 0x1)) {
func_80190F3C((struct ObjJoint *) argjoint, sp24.x * sp3C, sp24.y * sp3C, sp24.z * sp3C);
}
}
gGdTempBone = a0;
}
/* 2403C8 -> 240530 */
void Unknown80191BF8(struct ObjJoint *j) {
f32 sp1C;
f32 sp18 = -2.0f;
if (!(j->unk1BC & 0x1)) {
j->unk3C.y += sp18;
}
if ((sp1C = j->unk3C.y - (D_801A8058 + 30.0f)) < 0.0f && j->unk78.y < 0.0f) {
sp1C += j->unk78.y;
sp1C *= 0.8; //? 0.8f
func_80190F3C(j, -j->unk78.x * 0.7, -sp1C, -j->unk78.z * 0.7);
}
func_80190F3C(j, 0.0f, 0.0f, 0.0f);
}
/* 240530 -> 240624 */
void Unknown80191D60(struct ObjJoint *j) {
j->unk78.x += j->unk3C.x - j->unk14.x;
j->unk78.y += j->unk3C.y - j->unk14.y;
j->unk78.z += j->unk3C.z - j->unk14.z;
j->unk78.x *= 0.9; //? 0.9f
j->unk78.y *= 0.9; //? 0.9f
j->unk78.z *= 0.9; //? 0.9f
j->unk14.x += j->unk78.x;
j->unk14.y += j->unk78.y;
j->unk14.z += j->unk78.z;
}
/* 240624 -> 240658 */
void Unknown80191E54(struct ObjJoint *j) {
j->unk3C.x = j->unk14.x;
j->unk3C.y = j->unk14.y;
j->unk3C.z = j->unk14.z;
}
/* 240658 -> 2406B8 */
void func_80191E88(struct ObjGroup *grp) {
apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) Unknown80191BF8, grp);
apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) Unknown80191D60, grp);
apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) Unknown80191E54, grp);
}
/* 2406B8 -> 2406E0; orig name: func_80191EE8 */
void reset_joint_counts(void) {
sJointCount = 0;
sJointNotF1Count = 0;
sBoneCount = 0;
}