Skip to content
92 changes: 92 additions & 0 deletions src/SB/Game/zLasso.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,98 @@ static zLassoGuideList sGuideList[64];

static s32 negativeHondaX = 1;

void zLasso_SetGuide(xEnt* ent, xAnimState* lassoAnim)
{
// FIXME: 90% disassembly match, needs more work to get all the way
zLassoGuideList* temp_r5;
zLassoGuideList* var_r3;
zLassoGuideList* var_r5;

sCurrentGuide = NULL;

if (ent == NULL || lassoAnim == NULL)
{
return;
}

var_r5 = sGuideList;
u32 guideListIdx = 0;

for (u32 i = sNumGuideLists; i > 0; i--) {
if (var_r5->target == ent) {
break;
}

var_r5 += 1;
guideListIdx += 1;
}

if (guideListIdx < sNumGuideLists)
{
u32 guideIdx = 0;

temp_r5 = &sGuideList[guideListIdx];
var_r3 = temp_r5;
for (u32 i = temp_r5->numGuides; i > 0; i--)
{
if (var_r3->guide[0].lassoAnim == lassoAnim)
{
break;
}

var_r3 += 1;
guideIdx += 1;
}

if (guideIdx < sGuideList[guideListIdx].numGuides)
{
sCurrentGuide = &temp_r5->guide[guideIdx];
}
}

if (sCurrentGuide == NULL)
{
sCurrentGuide = &sGuideList->guide[0];
}
}

void zLasso_InterpToGuide(zLasso* lasso)
{
xVec3 sp14;
xVec3 sp8;

RwV3d* morphTargetVector;
S32 currentGuideNumTris;

if (sCurrentGuide != NULL)
{
currentGuideNumTris = sCurrentGuide->poly->Data->geometry->numTriangles;
morphTargetVector = sCurrentGuide->poly->Data->geometry->morphTarget->verts;
xVec3Init(&lasso->tgCenter, 0.0f, 0.0f, 0.0f);

S32 vertMapIdx = 0;
for (S32 i = 0; i < currentGuideNumTris; i++) {
xVec3AddTo(&lasso->tgCenter, (xVec3*) morphTargetVector + sCurrentGuide->vertMap[vertMapIdx]);
vertMapIdx += 1;
}

xVec3SMul(&lasso->tgCenter, &lasso->tgCenter, 1.0f / (f32) currentGuideNumTris);
xVec3Sub(&sp14, (xVec3*) morphTargetVector + sCurrentGuide->vertMap[0], &lasso->tgCenter);
xVec3Sub(&sp8, (xVec3*) morphTargetVector + sCurrentGuide->vertMap[1], &lasso->tgCenter);

lasso->tgRadius = xVec3Normalize(&sp14, &sp14);

xVec3Cross(&lasso->tgNormal, &sp14, &sp8);
xVec3Normalize(&lasso->tgNormal, &lasso->tgNormal);

if (lasso->tgNormal.y < 0.0f) {
xVec3Inv(&lasso->tgNormal, &lasso->tgNormal);
}

xMat4x3Toworld(&lasso->tgCenter, (xMat4x3*) sCurrentGuide->poly->Mat, &lasso->tgCenter);
}
}

void zLasso_InitTimer(zLasso* lasso, F32 interpTime)
{
lasso->secsTotal = interpTime;
Expand Down