marioparty4/src/game/hsfmotion.c
Dávid Balatoni bc19d2263b
Port most of hsfload to PC (#581)
* Port some of hsfload.c

* More byteswaps in hsfload.c

* Finish hsfload besides cenv

* hsfload fixes
2025-04-11 13:54:23 +02:00

1550 lines
45 KiB
C

#include "game/hsfmotion.h"
#include "game/ClusterExec.h"
#include "game/EnvelopeExec.h"
#include "game/ShapeExec.h"
#include "game/hsfdraw.h"
#include "game/hsfload.h"
#include "game/hsfman.h"
#include "game/init.h"
#include "ext_math.h"
#include "string.h"
#define HU3D_MOTATTR_SHIFT_ALL (HU3D_MOTATTR_SHIFT_LOOP | HU3D_MOTATTR_SHIFT_PAUSE | HU3D_MOTATTR_SHIFT_REV)
#define HU3D_MOTATTR_NOSHIFT_ALL (HU3D_MOTATTR_LOOP | HU3D_MOTATTR_PAUSE | HU3D_MOTATTR_REV)
#define HU3D_MOTATTR_ALL (HU3D_MOTATTR_SHIFT_ALL | HU3D_MOTATTR_NOSHIFT_ALL)
static s32 SearchObjectIndex(HsfData *arg0, u32 arg1);
static s32 SearchAttributeIndex(HsfData *arg0, u32 arg1);
MotionData Hu3DMotion[HU3D_MOTION_MAX];
static HsfBitmap *bitMapPtr;
void Hu3DMotionInit(void)
{
MotionData *var_r31;
s16 i;
var_r31 = (MotionData *)Hu3DData;
for (i = 0; i < HU3D_MOTION_MAX; i++, var_r31++) {
var_r31->hsfData = 0;
}
}
s16 Hu3DMotionCreate(void *arg0)
{
MotionData *var_r31;
s16 i;
var_r31 = Hu3DMotion;
for (i = 0; i < HU3D_MOTION_MAX; i++, var_r31++) {
if (var_r31->hsfData == 0) {
break;
}
}
if (i == HU3D_MOTION_MAX) {
OSReport("Error: Create Motion Over!\n");
return -1;
}
var_r31->hsfData = LoadHSF(arg0);
var_r31->attr = 0;
var_r31->modelId = -1;
return i;
}
s16 Hu3DMotionModelCreate(s16 arg0)
{
ModelData *temp_r29 = &Hu3DData[arg0];
MotionData *var_r31;
s16 i;
var_r31 = Hu3DMotion;
for (i = 0; i < HU3D_MOTION_MAX; i++, var_r31++) {
if (var_r31->hsfData == 0) {
break;
}
}
if (i == HU3D_MOTION_MAX) {
OSReport("Error: Create Motion Over!\n");
return -1;
}
var_r31->hsfData = temp_r29->hsfData;
var_r31->attr = 0;
var_r31->modelId = arg0;
temp_r29->unk_20 = i;
return i;
}
s32 Hu3DMotionKill(s16 arg0)
{
ModelData *var_r30;
MotionData *temp_r31;
s16 i;
temp_r31 = &Hu3DMotion[arg0];
if (temp_r31->hsfData == 0) {
return 0;
}
var_r30 = Hu3DData;
for (i = 0; i < 512; i++, var_r30++) {
if (var_r30->hsfData && var_r30->unk_08 == arg0 && temp_r31->modelId != i) {
break;
}
}
if (i != 512) {
return 0;
}
if (temp_r31->modelId == -1) {
#ifdef TARGET_PC
KillHSF(temp_r31->hsfData);
#endif
HuMemDirectFree(temp_r31->hsfData);
}
else {
Hu3DData[temp_r31->modelId].unk_20 = -1;
}
temp_r31->hsfData = NULL;
return 1;
}
void Hu3DMotionAllKill(void)
{
MotionData *var_r27;
s16 i;
var_r27 = Hu3DMotion;
for (i = 0; i < HU3D_MOTION_MAX; i++, var_r27++) {
if (var_r27->hsfData) {
Hu3DMotionKill(i);
}
}
}
void Hu3DMotionSet(s16 arg0, s16 arg1)
{
Hu3DData[arg0].unk_0C = -1;
Hu3DData[arg0].unk_08 = arg1;
Hu3DData[arg0].unk_64 = 0.0f;
Hu3DData[arg0].unk_6C = 0.0f;
Hu3DData[arg0].unk_70 = Hu3DMotionMaxTimeGet(arg0);
}
void Hu3DMotionOverlaySet(s16 arg0, s16 arg1)
{
Hu3DData[arg0].unk_0A = arg1;
Hu3DData[arg0].unk_74 = 0.0f;
Hu3DData[arg0].unk_78 = 1.0f;
}
void Hu3DMotionOverlayReset(s16 arg0)
{
Hu3DData[arg0].unk_0A = -1;
}
float Hu3DMotionOverlayTimeGet(s16 arg0)
{
return Hu3DData[arg0].unk_74;
}
void Hu3DMotionOverlayTimeSet(s16 arg0, float arg1)
{
Hu3DData[arg0].unk_74 = arg1;
}
void Hu3DMotionOverlaySpeedSet(s16 arg0, float arg1)
{
Hu3DData[arg0].unk_78 = arg1;
}
void Hu3DMotionShiftSet(s16 arg0, s16 arg1, float arg2, float arg3, u32 arg4)
{
ModelData *temp_r31 = &Hu3DData[arg0];
MotionData *sp10 = &Hu3DMotion[arg1];
s32 var_r30;
arg4 &= ~HU3D_MOTATTR;
var_r30 = 0;
if (temp_r31->unk_0C != -1) {
temp_r31->unk_08 = temp_r31->unk_0C;
temp_r31->unk_64 = temp_r31->unk_84;
temp_r31->unk_68 = temp_r31->unk_88;
temp_r31->unk_6C = temp_r31->unk_8C;
temp_r31->unk_70 = temp_r31->unk_90;
if (arg4 & HU3D_MOTATTR_SHIFT_LOOP) {
var_r30 |= HU3D_MOTATTR_LOOP;
}
if (arg4 & HU3D_MOTATTR_SHIFT_PAUSE) {
var_r30 |= HU3D_MOTATTR_PAUSE;
}
if (arg4 & HU3D_MOTATTR_SHIFT_REV) {
var_r30 |= HU3D_MOTATTR_REV;
}
temp_r31->motion_attr &= ~HU3D_MOTATTR_ALL;
temp_r31->motion_attr |= var_r30;
temp_r31->motion_attr &= ~HU3D_MOTATTR;
}
else {
temp_r31->motion_attr &= ~HU3D_MOTATTR_SHIFT_ALL;
}
temp_r31->unk_0C = arg1;
temp_r31->unk_84 = arg2;
temp_r31->unk_88 = 1.0f;
temp_r31->unk_7C = 0.0f;
temp_r31->unk_80 = arg3;
temp_r31->unk_8C = 0.0f;
temp_r31->unk_90 = Hu3DMotionShiftMaxTimeGet(arg0);
if (arg4 & HU3D_MOTATTR_LOOP) {
var_r30 |= HU3D_MOTATTR_SHIFT_LOOP;
}
if (arg4 & HU3D_MOTATTR_PAUSE) {
var_r30 |= HU3D_MOTATTR_SHIFT_PAUSE;
}
if (arg4 & HU3D_MOTATTR_REV) {
var_r30 |= HU3D_MOTATTR_SHIFT_REV;
}
arg4 &= ~HU3D_MOTATTR_NOSHIFT_ALL;
temp_r31->motion_attr |= var_r30 | arg4;
temp_r31->motion_attr &= ~HU3D_MOTATTR;
}
void Hu3DMotionShapeSet(s16 arg0, s16 arg1)
{
Hu3DData[arg0].unk_0E = arg1;
Hu3DData[arg0].unk_94 = 0.0f;
Hu3DData[arg0].unk_98 = 1.0f;
Hu3DData[arg0].unk_9C = 0.0f;
Hu3DData[arg0].unk_A0 = Hu3DMotionShapeMaxTimeGet(arg0);
}
s16 Hu3DMotionShapeIDGet(s16 arg0)
{
return Hu3DData[arg0].unk_0E;
}
void Hu3DMotionShapeSpeedSet(s16 arg0, float arg1)
{
ModelData *temp_r31 = &Hu3DData[arg0];
temp_r31->unk_98 = arg1;
}
void Hu3DMotionShapeTimeSet(s16 arg0, float arg1)
{
Hu3DData[arg0].unk_94 = arg1;
}
float Hu3DMotionShapeMaxTimeGet(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
return Hu3DMotionMotionMaxTimeGet(temp_r31->unk_0E);
}
void Hu3DMotionShapeStartEndSet(s16 arg0, float arg1, float arg2)
{
ModelData *temp_r31 = &Hu3DData[arg0];
temp_r31->unk_9C = arg1;
temp_r31->unk_A0 = arg2;
}
s16 Hu3DMotionClusterSet(s16 arg0, s16 arg1)
{
ModelData *temp_r31 = &Hu3DData[arg0];
s16 i;
for (i = 0; i < 4; i++) {
if (temp_r31->unk_10[i] == -1) {
temp_r31->unk_10[i] = arg1;
temp_r31->unk_A4[i] = 0.0f;
temp_r31->unk_B4[i] = 1.0f;
temp_r31->cluster_attr[i] = HU3D_ATTR_NONE;
temp_r31->attr |= HU3D_ATTR_CLUSTER_ON;
ClusterAdjustObject(temp_r31->hsfData, Hu3DMotion[arg1].hsfData);
return i;
}
}
OSReport("Error: Cluster Entry Over\n");
return -1;
}
s16 Hu3DMotionClusterNoSet(s16 arg0, s16 arg1, s16 arg2)
{
ModelData *temp_r31 = &Hu3DData[arg0];
Hu3DMotionClusterReset(arg0, arg2);
temp_r31->unk_10[arg2] = arg1;
temp_r31->unk_A4[arg2] = 0.0f;
temp_r31->unk_B4[arg2] = 1.0f;
temp_r31->attr |= HU3D_ATTR_CLUSTER_ON;
ClusterAdjustObject(temp_r31->hsfData, Hu3DMotion[arg1].hsfData);
return arg2;
}
void Hu3DMotionShapeReset(s16 arg0)
{
Hu3DData[arg0].unk_0E = -1;
}
void Hu3DMotionClusterReset(s16 arg0, s16 arg1)
{
ModelData *temp_r31 = &Hu3DData[arg0];
s16 i;
if (arg1 == -1) {
for (i = 0; i < 4; i++) {
temp_r31->unk_10[i] = -1;
}
temp_r31->attr &= ~HU3D_ATTR_CLUSTER_ON;
}
else {
temp_r31->unk_10[arg1] = -1;
for (i = 0; i < 4; i++) {
if (temp_r31->unk_10[i] != -1) {
return;
}
}
temp_r31->attr &= ~HU3D_ATTR_CLUSTER_ON;
}
}
s16 Hu3DMotionIDGet(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
return temp_r31->unk_08;
}
s16 Hu3DMotionShiftIDGet(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
return temp_r31->unk_0C;
}
void Hu3DMotionTimeSet(s16 arg0, float arg1)
{
ModelData *temp_r31 = &Hu3DData[arg0];
if (Hu3DMotionMaxTimeGet(arg0) <= arg1) {
arg1 = Hu3DMotionMaxTimeGet(arg0);
}
if (arg1 < 0.0f) {
arg1 = 0.0f;
}
temp_r31->unk_64 = arg1;
if (temp_r31->hsfData != (HsfData *)-1 && temp_r31->hsfData->cenvCnt != 0 && (temp_r31->motion_attr & HU3D_MOTATTR_PAUSE)) {
Hu3DMotionExec(arg0, temp_r31->unk_08, arg1, 0);
if (temp_r31->unk_0C != -1) {
Hu3DSubMotionExec(arg0);
}
EnvelopeProc(temp_r31->hsfData);
}
}
float Hu3DMotionTimeGet(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
return temp_r31->unk_64;
}
float Hu3DMotionShiftTimeGet(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
return temp_r31->unk_84;
}
float Hu3DMotionMaxTimeGet(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
MotionData *temp_r30;
HsfMotion *temp_r29;
s16 temp_r28;
if (temp_r31->unk_08 == -1) {
return 0.0f;
}
temp_r30 = &Hu3DMotion[temp_r31->unk_08];
temp_r29 = temp_r30->hsfData->motion;
temp_r28 = 0.0001 + temp_r29->len;
return temp_r28;
}
float Hu3DMotionShiftMaxTimeGet(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
MotionData *temp_r30;
HsfMotion *temp_r29;
s16 temp_r28;
if (temp_r31->unk_0C == -1) {
return 0.0f;
}
temp_r30 = &Hu3DMotion[temp_r31->unk_0C];
temp_r29 = temp_r30->hsfData->motion;
temp_r28 = 0.0001 + temp_r29->len;
return temp_r28;
}
void Hu3DMotionShiftStartEndSet(s16 arg0, float arg1, float arg2)
{
ModelData *temp_r31 = &Hu3DData[arg0];
temp_r31->unk_8C = arg1;
temp_r31->unk_90 = arg2;
}
float Hu3DMotionMotionMaxTimeGet(s16 arg0)
{
MotionData *temp_r31 = &Hu3DMotion[arg0];
HsfMotion *temp_r30;
s16 temp_r29;
if (temp_r31->hsfData == 0) {
return 0.0f;
}
temp_r30 = temp_r31->hsfData->motion;
temp_r29 = 0.0001 + temp_r30->len;
return temp_r29;
}
void Hu3DMotionStartEndSet(s16 arg0, float arg1, float arg2)
{
ModelData *temp_r31 = &Hu3DData[arg0];
temp_r31->unk_6C = arg1;
temp_r31->unk_70 = arg2;
}
s32 Hu3DMotionEndCheck(s16 arg0)
{
if (!(Hu3DData[arg0].motion_attr & HU3D_MOTATTR_REV)) {
return (Hu3DMotionMaxTimeGet(arg0) <= Hu3DMotionTimeGet(arg0));
}
else {
return (Hu3DMotionTimeGet(arg0) <= 0.0f);
}
}
void Hu3DMotionSpeedSet(s16 arg0, float arg1)
{
ModelData *temp_r31 = &Hu3DData[arg0];
temp_r31->unk_68 = arg1;
}
void Hu3DMotionShiftSpeedSet(s16 arg0, float arg1)
{
ModelData *temp_r31 = &Hu3DData[arg0];
temp_r31->unk_88 = arg1;
}
void Hu3DMotionNoMotSet(s16 arg0, char *arg1, u32 arg2)
{
HsfConstData *var_r29;
HsfObject *temp_r3;
temp_r3 = Hu3DModelObjPtrGet(arg0, arg1);
if (temp_r3->constData == 0) {
var_r29 = ObjConstantMake(temp_r3, (u32)Hu3DData[arg0].unk_48);
}
else {
var_r29 = temp_r3->constData;
}
var_r29->flags |= arg2;
if (arg2 & 0x10) {
temp_r3->data.curr.pos.x = temp_r3->data.base.pos.x;
}
if (arg2 & 0x20) {
temp_r3->data.curr.pos.y = temp_r3->data.base.pos.y;
}
if (arg2 & 0x40) {
temp_r3->data.curr.pos.z = temp_r3->data.base.pos.z;
}
if (arg2 & 0x80) {
temp_r3->data.curr.rot.x = temp_r3->data.base.rot.x;
}
if (arg2 & 0x100) {
temp_r3->data.curr.rot.y = temp_r3->data.base.rot.y;
}
if (arg2 & 0x200) {
temp_r3->data.curr.rot.z = temp_r3->data.base.rot.z;
}
}
void Hu3DMotionNoMotReset(s16 arg0, char *arg1, u32 arg2)
{
HsfObject *temp_r31;
HsfConstData *temp_r30;
temp_r31 = Hu3DModelObjPtrGet(arg0, arg1);
temp_r30 = temp_r31->constData;
temp_r30->flags &= ~arg2;
}
void Hu3DMotionForceSet(s16 arg0, char *arg1, u32 arg2, float arg3)
{
HsfConstData *var_r29;
HsfObject *temp_r3;
temp_r3 = Hu3DModelObjPtrGet(arg0, arg1);
if (temp_r3->constData == 0) {
var_r29 = ObjConstantMake(temp_r3, (u32)Hu3DData[arg0].unk_48);
}
else {
var_r29 = temp_r3->constData;
}
var_r29->flags |= arg2;
if (arg2 & 0x10) {
temp_r3->data.curr.pos.x = arg3;
}
if (arg2 & 0x20) {
temp_r3->data.curr.pos.y = arg3;
}
if (arg2 & 0x40) {
temp_r3->data.curr.pos.z = arg3;
}
if (arg2 & 0x80) {
temp_r3->data.curr.rot.x = arg3;
}
if (arg2 & 0x100) {
temp_r3->data.curr.rot.y = arg3;
}
if (arg2 & 0x200) {
temp_r3->data.curr.rot.z = arg3;
}
}
void Hu3DMotionNext(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
HsfMotion *temp_r29;
MotionData *temp_r27;
u32 temp_r28;
s16 i;
temp_r27 = &Hu3DMotion[temp_r31->unk_08];
temp_r29 = temp_r27->hsfData->motion;
temp_r28 = temp_r31->motion_attr;
if (temp_r31->unk_08 != -1) {
temp_r27 = &Hu3DMotion[temp_r31->unk_08];
if (!(temp_r28 & HU3D_MOTATTR_PAUSE)) {
if (!(temp_r28 & HU3D_MOTATTR_REV)) {
temp_r31->unk_64 += temp_r31->unk_68 * minimumVcountf;
}
else {
temp_r31->unk_64 -= temp_r31->unk_68 * minimumVcountf;
}
if (temp_r28 & HU3D_MOTATTR_LOOP) {
if (temp_r31->unk_64 < temp_r31->unk_6C) {
temp_r31->unk_64 = temp_r31->unk_70 - (temp_r31->unk_6C - temp_r31->unk_64);
}
else if (temp_r31->unk_64 >= temp_r31->unk_70) {
temp_r31->unk_64 = temp_r31->unk_6C + (temp_r31->unk_64 - temp_r31->unk_70);
}
}
else if (temp_r31->unk_64 < 0.0f) {
temp_r31->unk_64 = 0.0f;
}
else if (temp_r31->unk_64 >= temp_r31->unk_70) {
temp_r31->unk_64 = temp_r31->unk_70;
}
}
}
if (temp_r31->unk_0A != -1) {
temp_r27 = &Hu3DMotion[temp_r31->unk_0A];
temp_r29 = temp_r27->hsfData->motion;
if (!(temp_r28 & HU3D_MOTATTR_OVL_PAUSE)) {
if (!(temp_r28 & HU3D_MOTATTR_OVL_REV)) {
temp_r31->unk_74 += temp_r31->unk_78 * minimumVcountf;
}
else {
temp_r31->unk_74 -= temp_r31->unk_78 * minimumVcountf;
}
if (temp_r28 & HU3D_MOTATTR_OVL_LOOP) {
if (temp_r31->unk_74 < 0.0f) {
temp_r31->unk_74 = temp_r29->len;
}
else if (temp_r31->unk_74 >= temp_r29->len) {
temp_r31->unk_74 = 0.0f;
}
}
else if (temp_r31->unk_74 < 0.0f) {
temp_r31->unk_74 = 0.0f;
}
else if (temp_r31->unk_74 >= temp_r29->len) {
temp_r31->unk_74 = temp_r29->len;
}
}
}
if (temp_r31->unk_0C != -1) {
temp_r31->unk_7C += minimumVcountf;
if (temp_r31->unk_7C >= temp_r31->unk_80) {
temp_r31->unk_08 = temp_r31->unk_0C;
temp_r31->unk_64 = temp_r31->unk_84;
temp_r31->unk_68 = temp_r31->unk_88;
temp_r31->unk_6C = temp_r31->unk_8C;
temp_r31->unk_70 = temp_r31->unk_90;
temp_r31->unk_0C = -1;
temp_r28 = 0;
if (temp_r31->motion_attr & HU3D_MOTATTR_SHIFT_LOOP) {
temp_r28 |= HU3D_MOTATTR_LOOP;
}
if (temp_r31->motion_attr & HU3D_MOTATTR_SHIFT_PAUSE) {
temp_r28 |= HU3D_MOTATTR_PAUSE;
}
if (temp_r31->motion_attr & HU3D_MOTATTR_SHIFT_REV) {
temp_r28 |= HU3D_MOTATTR_REV;
}
temp_r31->motion_attr &= ~HU3D_MOTATTR_ALL;
temp_r31->motion_attr |= temp_r28;
temp_r31->motion_attr &= ~HU3D_MOTATTR;
return;
}
if (!(temp_r31->motion_attr & HU3D_MOTATTR_SHIFT_PAUSE)) {
temp_r27 = &Hu3DMotion[temp_r31->unk_0C];
if (!(temp_r31->motion_attr & HU3D_MOTATTR_SHIFT_REV)) {
temp_r31->unk_84 += temp_r31->unk_88 * minimumVcountf;
}
else {
temp_r31->unk_84 -= temp_r31->unk_88 * minimumVcountf;
}
if (temp_r31->motion_attr & HU3D_MOTATTR_SHIFT_LOOP) {
if (temp_r31->unk_84 < temp_r31->unk_8C) {
temp_r31->unk_84 = temp_r31->unk_90;
}
else if (temp_r31->unk_84 >= temp_r31->unk_90) {
temp_r31->unk_84 = temp_r31->unk_8C;
}
}
else if (temp_r31->unk_84 < temp_r31->unk_8C) {
temp_r31->unk_84 = temp_r31->unk_8C;
}
else if (temp_r31->unk_84 >= temp_r31->unk_90) {
temp_r31->unk_84 = temp_r31->unk_90;
}
}
}
if (temp_r31->unk_0E != -1 && !(temp_r28 & HU3D_MOTATTR_SHAPE_PAUSE)) {
temp_r27 = &Hu3DMotion[temp_r31->unk_0E];
temp_r29 = temp_r27->hsfData->motion;
if (!(temp_r28 & HU3D_MOTATTR_SHAPE_REV)) {
temp_r31->unk_94 += temp_r31->unk_98 * minimumVcountf;
}
else {
temp_r31->unk_94 -= temp_r31->unk_98 * minimumVcountf;
}
if (temp_r28 & HU3D_MOTATTR_SHAPE_LOOP) {
if (temp_r31->unk_94 < temp_r31->unk_9C) {
temp_r31->unk_94 = temp_r31->unk_A0;
}
else if (temp_r31->unk_94 >= temp_r31->unk_A0) {
temp_r31->unk_94 = temp_r31->unk_9C;
}
}
else if (temp_r31->unk_94 < temp_r31->unk_9C) {
temp_r31->unk_94 = temp_r31->unk_9C;
}
else if (temp_r31->unk_94 >= temp_r31->unk_A0) {
temp_r31->unk_94 = temp_r31->unk_A0;
}
}
if (temp_r31->attr & HU3D_ATTR_CLUSTER_ON) {
for (i = 0; i < 4; i++) {
if (temp_r31->unk_10[i] != -1 && !(temp_r31->cluster_attr[i] & HU3D_CLUSTER_ATTR_PAUSE)) {
temp_r27 = &Hu3DMotion[temp_r31->unk_10[i]];
temp_r29 = temp_r27->hsfData->motion;
if (!(temp_r31->cluster_attr[i] & HU3D_CLUSTER_ATTR_REV)) {
temp_r31->unk_A4[i] += temp_r31->unk_B4[i] * minimumVcountf;
}
else {
temp_r31->unk_A4[i] -= temp_r31->unk_B4[i] * minimumVcountf;
}
if (temp_r31->cluster_attr[i] & HU3D_CLUSTER_ATTR_LOOP) {
if (temp_r31->unk_A4[i] < 0.0f) {
temp_r31->unk_A4[i] = temp_r29->len;
}
else if (temp_r31->unk_A4[i] >= temp_r29->len) {
temp_r31->unk_A4[i] = 0.0f;
}
}
else if (temp_r31->unk_A4[i] < 0.0f) {
temp_r31->unk_A4[i] = 0.0f;
}
else if (temp_r31->unk_A4[i] >= temp_r29->len) {
temp_r31->unk_A4[i] = temp_r29->len;
}
}
}
}
}
void Hu3DMotionExec(s16 arg0, s16 arg1, float arg2, s32 arg3)
{
MotionData *sp18;
HsfData *sp14;
HsfTrack *sp10;
HsfConstData *temp_r28;
HsfData *temp_r29;
HsfMotion *temp_r21;
HsfObject *temp_r31;
HsfObject *var_r19;
HsfCluster *var_r23;
HsfTrack *track;
HsfTrack *temp_r25;
HsfTrack *temp_r22;
HsfTrack *var_r26;
ModelData *temp_r27;
s16 temp_r24;
s16 var_r18;
float *temp_r17;
temp_r27 = &Hu3DData[arg0];
sp18 = &Hu3DMotion[arg1];
temp_r29 = temp_r27->hsfData;
sp14 = sp18->hsfData;
temp_r21 = sp14->motion;
track = temp_r21->track;
var_r19 = temp_r29->object;
if (arg3 == 0) {
for (var_r18 = 0; var_r18 < temp_r29->objectCnt; var_r19++, var_r18++) {
temp_r31 = var_r19;
if (temp_r31->constData) {
temp_r28 = temp_r31->constData;
if (temp_r28->flags & 0x3F0) {
temp_r24 = temp_r28->flags;
if (!(temp_r24 & 0x10)) {
temp_r31->data.curr.pos.x = temp_r31->data.base.pos.x;
}
if (!(temp_r24 & 0x20)) {
temp_r31->data.curr.pos.y = temp_r31->data.base.pos.y;
}
if (!(temp_r24 & 0x40)) {
temp_r31->data.curr.pos.z = temp_r31->data.base.pos.z;
}
if (!(temp_r24 & 0x80)) {
temp_r31->data.curr.rot.x = temp_r31->data.base.rot.x;
}
if (!(temp_r24 & 0x100)) {
temp_r31->data.curr.rot.y = temp_r31->data.base.rot.y;
}
if (!(temp_r24 & 0x200)) {
temp_r31->data.curr.rot.z = temp_r31->data.base.rot.z;
}
}
else {
temp_r31->data.curr = temp_r31->data.base;
}
}
else {
temp_r31->data.curr = temp_r31->data.base;
}
}
}
sp10 = &track[temp_r21->numTracks];
for (; track < sp10; track++) {
switch (track->type) {
case HSF_TRACK_TRANSFORM:
if (track->target < temp_r29->objectCnt && track->target != -1) {
temp_r31 = &temp_r29->object[track->target];
if (track->channel == 0x28) {
temp_r31->data.mesh.baseMorph = GetCurve(track, arg2);
}
else if (temp_r31->type == 7) {
if (temp_r27->attr & HU3D_ATTR_CAMERA_MOTON) {
SetObjCameraMotion(arg0, track, GetCurve(track, arg2));
}
}
else if (temp_r31->type == 8) {
SetObjLightMotion(arg0, track, GetCurve(track, arg2));
}
else if (track->channel == 0x18) {
if (temp_r31->constData) {
temp_r28 = temp_r31->constData;
if (GetCurve(track, arg2) == 1.0f) {
temp_r28->flags &= ~0x1000;
}
else {
temp_r28->flags |= 0x1000;
}
}
}
else if (track->channel == 0x1A) {
if (temp_r31->constData) {
temp_r28 = temp_r31->constData;
if (GetCurve(track, arg2) == 1.0f) {
temp_r28->flags &= ~0x2000;
}
else {
temp_r28->flags |= 0x2000;
}
}
}
else {
temp_r17 = GetObjTRXPtr(temp_r31, track->channel);
if (temp_r17 != (float *)-1) {
*temp_r17 = GetCurve(track, arg2);
}
}
}
break;
case HSF_TRACK_MORPH:
temp_r25 = track;
if (temp_r25->target < temp_r29->objectCnt) {
temp_r31 = &temp_r29->object[temp_r25->target];
temp_r31->data.mesh.morphWeight[temp_r25->channel_s16] = GetCurve(temp_r25, arg2);
}
break;
case HSF_TRACK_MATERIAL:
if (!(temp_r27->attr & HU3D_ATTR_CURVE_MOTOFF)) {
if (track->param < temp_r29->materialCnt) {
SetObjMatMotion(arg0, track, GetCurve(track, arg2));
}
}
break;
case HSF_TRACK_CLUSTER:
if (!(temp_r27->attr & HU3D_ATTR_CURVE_MOTOFF)) {
var_r23 = &temp_r29->cluster[track->target_s16];
var_r23->index = GetClusterCurve(track, arg2);
}
break;
case HSF_TRACK_CLUSTER_WEIGHT:
if (!(temp_r27->attr & HU3D_ATTR_CURVE_MOTOFF)) {
temp_r22 = track;
var_r23 = &temp_r29->cluster[temp_r22->target_s16];
var_r23->weight[temp_r22->unk04] = GetClusterWeightCurve(temp_r22, arg2);
}
break;
case HSF_TRACK_ATTRIBUTE:
var_r26 = track;
if (var_r26->target_s16 != -1 || !(temp_r27->attr & HU3D_ATTR_CURVE_MOTOFF)) {
if (var_r26->param != -1 && var_r26->param < temp_r29->attributeCnt) {
SetObjAttrMotion(arg0, var_r26, GetCurve(var_r26, arg2));
}
}
break;
}
}
}
void Hu3DCameraMotionExec(s16 arg0)
{
ModelData *temp_r30;
MotionData *temp_r28;
HsfData *temp_r27;
HsfMotion *motion;
HsfTrack *track;
HsfTrack *temp_r26;
temp_r30 = &Hu3DData[arg0];
temp_r28 = &Hu3DMotion[temp_r30->unk_08];
temp_r27 = temp_r28->hsfData;
motion = temp_r27->motion;
track = motion->track;
if (temp_r30->attr & HU3D_ATTR_CAMERA_MOTON) {
temp_r26 = &track[motion->numTracks];
for (; track < temp_r26; track++) {
if (track->type == HSF_TRACK_TRANSFORM && track->param_u16 == 7) {
SetObjCameraMotion(arg0, track, GetCurve(track, temp_r30->unk_64));
}
}
}
}
void Hu3DSubMotionExec(s16 arg0)
{
ModelData *temp_r30;
MotionData *temp_r22;
HsfData *temp_r28;
HsfData *temp_r21;
HsfMotion *motion;
HsfTrack *track;
HsfObject *var_r23;
HsfObject *temp_r26;
float *temp_r31;
float var_f30;
float var_f31;
s16 temp_r24;
s16 var_r27;
temp_r30 = &Hu3DData[arg0];
temp_r22 = &Hu3DMotion[temp_r30->unk_0C];
temp_r28 = temp_r30->hsfData;
temp_r21 = temp_r22->hsfData;
motion = temp_r21->motion;
track = motion->track;
var_r23 = temp_r28->object;
if (temp_r30->unk_08 == -1) {
for (var_r27 = 0; var_r27 < temp_r28->objectCnt; var_r23++, var_r27++) {
temp_r26 = var_r23;
temp_r26->data.curr = temp_r26->data.base;
}
}
if (temp_r30->unk_80) {
var_f30 = temp_r30->unk_7C / temp_r30->unk_80;
}
else {
var_f30 = 1.0f;
}
for (var_r27 = 0; var_r27 < motion->numTracks; var_r27++, track++) {
switch (track->type) {
case HSF_TRACK_TRANSFORM:
if (track->target < temp_r28->objectCnt && track->target != -1) {
temp_r26 = &temp_r28->object[track->target];
temp_r24 = track->channel;
temp_r31 = GetObjTRXPtr(temp_r26, temp_r24);
if (temp_r31 != (float *)-1) {
if (temp_r24 == 0x1C || temp_r24 == 0x1D || temp_r24 == 0x1E) {
var_f31 = GetCurve(track, temp_r30->unk_84);
if (var_f31 < 0.0f) {
var_f31 += 360.0f;
}
if (*temp_r31 < 0.0f) {
*temp_r31 += 360.0f;
}
if (var_f31 < 180.0f) {
if (*temp_r31 > (180.0f + var_f31)) {
*temp_r31 -= 360.0f;
}
}
else if (*temp_r31 < (var_f31 - 180.0f)) {
var_f31 -= 360.0f;
}
*temp_r31 = (1.0f - var_f30) * *temp_r31 + var_f30 * var_f31;
}
else {
*temp_r31 = (1.0f - var_f30) * *temp_r31 + var_f30 * GetCurve(track, temp_r30->unk_84);
}
}
}
break;
}
}
}
#ifdef __MWERKS__
__declspec(weak) float *GetObjTRXPtr(HsfObject *arg0, u16 arg1)
{
#else
float *GetObjTRXPtr(HsfObject *arg0, u16 arg1)
{
#endif
HsfConstData *temp_r31 = arg0->constData;
switch (arg1) {
case 8:
if (temp_r31 && (temp_r31->flags & 0x10)) {
return (float *)-1;
}
return &arg0->data.curr.pos.x;
case 9:
if (temp_r31 && (temp_r31->flags & 0x20)) {
return (float *)-1;
}
return &arg0->data.curr.pos.y;
case 10:
if (temp_r31 && (temp_r31->flags & 0x40)) {
return (float *)-1;
}
return &arg0->data.curr.pos.z;
case 28:
if (temp_r31 && (temp_r31->flags & 0x80)) {
return (float *)-1;
}
return &arg0->data.curr.rot.x;
case 29:
if (temp_r31 && (temp_r31->flags & 0x100)) {
return (float *)-1;
}
return &arg0->data.curr.rot.y;
case 30:
if (temp_r31 && (temp_r31->flags & 0x200)) {
return (float *)-1;
}
return &arg0->data.curr.rot.z;
case 31:
return &arg0->data.curr.scale.x;
case 32:
return &arg0->data.curr.scale.y;
case 33:
return &arg0->data.curr.scale.z;
default:
return (float *)-1;
}
}
void SetObjMatMotion(s16 arg0, HsfTrack *arg1, float arg2)
{
HsfMaterial *temp_r31;
HsfData *temp_r29;
ModelData *temp_r30;
float var_f31;
temp_r30 = &Hu3DData[arg0];
temp_r29 = temp_r30->hsfData;
temp_r31 = &temp_r29->material[arg1->param];
var_f31 = arg2;
if (arg2 > 1.0f) {
var_f31 = 1.0f;
}
else if (arg2 < 0.0f) {
var_f31 = 0.0f;
}
switch (arg1->channel) {
case 0:
temp_r31->litColor[0] = var_f31 * 255.0f;
break;
case 1:
temp_r31->litColor[1] = var_f31 * 255.0f;
break;
case 2:
temp_r31->litColor[2] = var_f31 * 255.0f;
break;
case 0x31:
temp_r31->color[0] = var_f31 * 255.0f;
break;
case 0x32:
temp_r31->color[1] = var_f31 * 255.0f;
break;
case 0x33:
temp_r31->color[2] = var_f31 * 255.0f;
break;
case 0x34:
temp_r31->shadowColor[0] = var_f31 * 255.0f;
break;
case 0x35:
temp_r31->shadowColor[1] = var_f31 * 255.0f;
break;
case 0x36:
temp_r31->shadowColor[2] = var_f31 * 255.0f;
break;
case 0x39:
if (!(temp_r30->attr & HU3D_ATTR_TPLVL_SET)) {
temp_r31->invAlpha = var_f31;
}
break;
case 0x3C:
temp_r31->refAlpha = var_f31;
break;
}
}
void SetObjAttrMotion(s16 arg0, HsfTrack *arg1, float arg2)
{
ModelData *temp_r28;
HsfData *temp_r27;
HsfAttribute *temp_r30;
HsfdrawStruct01 *var_r31;
float var_f30;
temp_r28 = &Hu3DData[arg0];
temp_r27 = temp_r28->hsfData;
temp_r30 = &temp_r27->attribute[arg1->param];
var_f30 = arg2;
if (arg2 > 1.0f) {
var_f30 = 1.0f;
}
else if (arg2 < 0.0f) {
var_f30 = 0.0f;
}
switch (arg1->channel) {
case 8:
case 9:
case 0xA:
case 0x1C:
case 0x1D:
case 0x1E:
case 0x1F:
case 0x20:
case 0x21:
case 0x43:
if (temp_r30->unk04 == 0) {
var_r31 = HuMemDirectMallocNum(HEAP_DATA, sizeof(HsfdrawStruct01), (u32)Hu3DData[arg0].unk_48);
temp_r30->unk04 = var_r31;
var_r31->unk00 = 0;
var_r31->unk08 = var_r31->unk0C = var_r31->unk10 = 0.0f;
var_r31->unk14 = var_r31->unk18 = var_r31->unk1C = 0.0f;
var_r31->unk20 = var_r31->unk24 = var_r31->unk28 = 1.0f;
}
else {
var_r31 = temp_r30->unk04;
}
if (arg1->channel != 0x43) {
var_r31->unk00 |= 4;
}
else {
var_r31->unk00 |= 8;
}
break;
}
switch (arg1->channel) {
case 8:
var_r31->unk08 = arg2;
break;
case 9:
var_r31->unk0C = arg2;
break;
case 10:
var_r31->unk10 = arg2;
break;
case 28:
var_r31->unk14 = arg2;
break;
case 29:
var_r31->unk18 = arg2;
break;
case 30:
var_r31->unk1C = arg2;
break;
case 31:
var_r31->unk20 = arg2;
break;
case 32:
var_r31->unk24 = arg2;
break;
case 33:
var_r31->unk28 = arg2;
break;
case 64:
temp_r30->unk20 = var_f30;
break;
case 62:
temp_r30->unk0C = var_f30;
break;
case 63:
temp_r30->unk14 = arg2;
break;
case 67:
var_r31->unk3C = bitMapPtr;
break;
}
}
void SetObjCameraMotion(s16 arg0, HsfTrack *arg1, float arg2)
{
ModelData *temp_r29;
Vec sp18;
Vec spC;
float var_f31;
float var_f30;
s16 var_r30;
s16 temp_r28;
s16 i;
temp_r29 = &Hu3DData[arg0];
temp_r28 = temp_r29->unk_01;
if (temp_r28 != 0) {
var_f31 = arg2;
if (arg2 > 1.0f) {
var_f31 = 1.0f;
}
else if (arg2 < 0.0f) {
var_f31 = 0.0f;
}
switch (arg1->channel) {
case 8:
var_f30 = temp_r29->scale.x * (arg2 + temp_r29->pos.x);
for (i = 0, var_r30 = 1; i < HU3D_CAM_MAX; i++, var_r30 <<= 1) {
if (var_r30 & temp_r28) {
Hu3DCamera[i].pos.x = var_f30;
}
}
break;
case 9:
var_f30 = temp_r29->scale.y * (arg2 + temp_r29->pos.y);
for (i = 0, var_r30 = 1; i < HU3D_CAM_MAX; i++, var_r30 <<= 1) {
if (var_r30 & temp_r28) {
Hu3DCamera[i].pos.y = var_f30;
}
}
break;
case 10:
var_f30 = temp_r29->scale.z * (arg2 + temp_r29->pos.z);
for (i = 0, var_r30 = 1; i < HU3D_CAM_MAX; i++, var_r30 <<= 1) {
if (var_r30 & temp_r28) {
Hu3DCamera[i].pos.z = var_f30;
}
}
break;
case 11:
var_f30 = temp_r29->scale.x * (arg2 + temp_r29->pos.x);
for (i = 0, var_r30 = 1; i < HU3D_CAM_MAX; i++, var_r30 <<= 1) {
if (var_r30 & temp_r28) {
Hu3DCamera[i].target.x = var_f30;
}
}
break;
case 12:
var_f30 = temp_r29->scale.y * (arg2 + temp_r29->pos.y);
for (i = 0, var_r30 = 1; i < HU3D_CAM_MAX; i++, var_r30 <<= 1) {
if (var_r30 & temp_r28) {
Hu3DCamera[i].target.y = var_f30;
}
}
break;
case 13:
var_f30 = temp_r29->scale.z * (arg2 + temp_r29->pos.z);
for (i = 0, var_r30 = 1; i < HU3D_CAM_MAX; i++, var_r30 <<= 1) {
if (var_r30 & temp_r28) {
Hu3DCamera[i].target.z = var_f30;
}
}
break;
case 14:
for (i = 0, var_r30 = 1; i < HU3D_CAM_MAX; i++, var_r30 <<= 1) {
if (var_r30 & temp_r28) {
VECSubtract(&Hu3DCamera[i].pos, &Hu3DCamera[i].target, &spC);
VECNormalize(&spC, &spC);
sp18.x = spC.x * spC.y * (1.0 - cosd(arg2)) - spC.z * sind(arg2);
sp18.y = spC.y * spC.y + (1.0f - spC.y * spC.y) * cosd(arg2);
sp18.z = spC.y * spC.z * (1.0 - cosd(arg2)) + spC.x * sind(arg2);
VECNormalize(&sp18, &Hu3DCamera[i].up);
Hu3DCamera[i].aspect_dupe = arg2;
}
}
break;
case 15:
for (i = 0, var_r30 = 1; i < HU3D_CAM_MAX; i++, var_r30 <<= 1) {
if (var_r30 & temp_r28) {
Hu3DCamera[i].fov = arg2;
}
}
break;
}
}
}
void SetObjLightMotion(s16 arg0, HsfTrack *arg1, float arg2)
{
s16 var_r29;
ModelData *temp_r30;
HsfData *temp_r28;
HsfObject *var_r26;
HsfObject *var_r24;
LightData *temp_r31;
float var_f30;
s16 i;
temp_r30 = &Hu3DData[arg0];
temp_r28 = temp_r30->hsfData;
var_r26 = temp_r28->object;
for (i = var_r29 = 0; i < temp_r28->objectCnt; i++, var_r26++) {
var_r24 = var_r26;
if (var_r24->type == HSF_OBJ_NONE2) {
if (i != arg1->target) {
var_r29++;
}
else {
break;
}
}
}
if (i != temp_r28->objectCnt) {
temp_r31 = &Hu3DGlobalLight[temp_r30->unk_28[var_r29]];
var_f30 = arg2;
if (arg2 > 1.0f) {
var_f30 = 1.0f;
}
else if (arg2 < 0.0f) {
var_f30 = 0.0f;
}
switch (arg1->channel) {
case 8:
temp_r31->unk_1C.x = arg2;
break;
case 9:
temp_r31->unk_1C.y = arg2;
break;
case 10:
temp_r31->unk_1C.z = arg2;
break;
case 11:
temp_r31->unk_34.x = arg2;
Hu3DGLightPosAimSetV(temp_r30->unk_28[var_r29], &temp_r31->unk_1C, &temp_r31->unk_34);
break;
case 12:
temp_r31->unk_34.y = arg2;
Hu3DGLightPosAimSetV(temp_r30->unk_28[var_r29], &temp_r31->unk_1C, &temp_r31->unk_34);
break;
case 13:
temp_r31->unk_34.z = arg2;
Hu3DGLightPosAimSetV(temp_r30->unk_28[var_r29], &temp_r31->unk_1C, &temp_r31->unk_34);
break;
}
}
}
float GetCurve(HsfTrack *track, float arg1)
{
float *var_r30;
switch (track->curveType) {
case HSF_CURVE_LINEAR:
return GetLinear(track->numKeyframes, track->data, arg1);
case HSF_CURVE_BEZIER:
return GetBezier(track->numKeyframes, track, arg1);
case HSF_CURVE_BITMAP:
bitMapPtr = GetBitMap(track->numKeyframes, track->data, arg1);
break;
case HSF_CURVE_CONST:
var_r30 = &track->value;
return *var_r30;
case HSF_CURVE_STEP:
return GetConstant(track->numKeyframes, track->data, arg1);
}
return 0.0f;
}
float GetConstant(s32 arg0, float *arg1, float arg2)
{
float *var_r31;
s16 i;
var_r31 = arg1;
if (arg2 == 0.0f || arg0 == 1) {
return arg1[1];
}
for (i = 0; i < arg0; i++, var_r31 += 2) {
if (arg2 < var_r31[0]) {
return var_r31[-1];
}
}
return var_r31[-1];
}
float GetLinear(s32 arg0, float arg1[][2], float arg2)
{
float var_f31;
float var_f30;
s16 temp_r30;
s16 var_r31;
if (arg2 == 0.0f || arg0 == 1) {
return arg1[0][1];
}
for (var_r31 = 0; var_r31 < arg0; var_r31++) {
if (arg2 < arg1[var_r31][0]) {
temp_r30 = var_r31 - 1;
var_f30 = arg1[var_r31][0] - arg1[temp_r30][0];
var_f31 = arg1[temp_r30][1] + (arg2 - arg1[temp_r30][0]) * ((arg1[var_r31][1] - arg1[temp_r30][1]) / var_f30);
return var_f31;
}
}
return arg1[arg0 - 1][1];
}
#ifdef __MWERKS__
__declspec(weak) float GetBezier(s32 arg0, HsfTrack *arg1, float arg2)
{
#else
float GetBezier(s32 arg0, HsfTrack *arg1, float arg2)
{
#endif
float temp_f24;
float temp_f29;
float temp_f28;
float temp_f27;
float temp_f26;
float temp_f25;
float temp_f30;
float temp_f31;
float(*var_r31)[4];
float(*var_r29)[4];
s32 i;
var_r31 = arg1->data;
if (arg2 == 0.0f || arg0 == 1) {
return var_r31[0][1];
}
i = -1;
if (arg1->start == 0 && arg2 < var_r31[0][0]) {
i = 0;
}
if (i == -1) {
var_r31 = (float(*)[4])arg1->data + arg1->start;
var_r29 = var_r31 - 1;
for (i = arg1->start; i < arg0; i++, var_r31++) {
if (arg2 >= var_r29[0][0] && arg2 < var_r31[0][0]) {
break;
}
var_r29 = var_r31;
}
if (i >= arg0) {
var_r31 = arg1->data;
for (i = 0; i < arg0; i++, var_r31++) {
if (arg2 < var_r31[0][0]) {
break;
}
}
}
}
arg1->start = i;
if (i == arg0) {
return var_r31[-1][1];
}
temp_f24 = var_r31[0][0];
var_r31--;
temp_f29 = var_r31[0][0];
temp_f31 = (arg2 - temp_f29) / (temp_f24 - temp_f29);
temp_f30 = temp_f31 * temp_f31;
temp_f28 = 2.0f * temp_f30;
temp_f27 = 3.0f * temp_f30;
temp_f26 = temp_f31 * temp_f30;
temp_f25 = temp_f31 * temp_f28;
return var_r31[0][1] * (temp_f25 - temp_f27 + 1.0f) + var_r31[1][1] * (-temp_f25 + temp_f27) + var_r31[0][2] * (temp_f26 - temp_f28 + temp_f31)
+ var_r31[1][3] * (temp_f26 - temp_f30);
}
HsfBitmap *GetBitMap(s32 arg0, UnknownHsfMotionStruct01 *arg1, float arg2)
{
s16 var_r31;
if (arg2 == 0.0f || arg0 == 1) {
return arg1->unk04;
}
for (var_r31 = 0; var_r31 < arg0; var_r31++, arg1++) {
if (arg2 < arg1->unk00 * 60.0f) {
break;
}
}
return arg1[-1].unk04;
}
s16 Hu3DJointMotion(s16 arg0, void *arg1)
{
s16 var_r29;
var_r29 = Hu3DMotionCreate(arg1);
JointModel_Motion(arg0, var_r29);
return var_r29;
}
void JointModel_Motion(s16 arg0, s16 arg1)
{
ModelData *temp_r24;
MotionData *temp_r23;
HsfData *temp_r26;
HsfData *temp_r22;
HsfMotion *motion;
HsfTrack *track;
HsfTrack *var_r28;
HsfTrack *var_r27;
HsfTrack *var_r31;
s32 temp_r21;
s32 i;
temp_r24 = &Hu3DData[arg0];
temp_r23 = &Hu3DMotion[arg1];
temp_r26 = temp_r24->hsfData;
temp_r22 = temp_r23->hsfData;
motion = temp_r22->motion;
track = motion->track;
for (i = 0; i < motion->numTracks; i++, track++) {
switch (track->type) {
case HSF_TRACK_TRANSFORM:
var_r28 = track;
var_r28->target = SearchObjectIndex(temp_r26, var_r28->target);
break;
case HSF_TRACK_MORPH:
var_r27 = track;
var_r27->target = SearchObjectIndex(temp_r26, var_r27->target);
break;
case HSF_TRACK_ATTRIBUTE:
var_r31 = track;
if (var_r31->param == -1) {
temp_r21 = SearchAttributeIndex(temp_r26, var_r31->target_s16);
if (temp_r21 != -1) {
var_r31->param = temp_r21;
}
else {
var_r31->param = -1;
}
}
break;
}
}
}
void Hu3DMotionCalc(s16 arg0)
{
ModelData *temp_r31 = &Hu3DData[arg0];
if ((temp_r31->attr & HU3D_ATTR_DISPOFF) || (temp_r31->attr & HU3D_ATTR_HOOK)) {
return;
}
if (temp_r31->unk_08 != -1) {
Hu3DMotionExec(arg0, temp_r31->unk_08, temp_r31->unk_64, 0);
}
if (temp_r31->unk_0C != -1) {
Hu3DSubMotionExec(arg0);
}
if (temp_r31->unk_0A != -1) {
Hu3DMotionExec(arg0, temp_r31->unk_0A, temp_r31->unk_74, 1);
}
if (temp_r31->attr & HU3D_ATTR_CLUSTER_ON) {
ClusterMotionExec(temp_r31);
}
if (temp_r31->unk_0E != -1) {
if (temp_r31->unk_08 == -1) {
Hu3DMotionExec(arg0, temp_r31->unk_0E, temp_r31->unk_94, 0);
}
else {
Hu3DMotionExec(arg0, temp_r31->unk_0E, temp_r31->unk_94, 1);
}
}
if (!(temp_r31->attr & (HU3D_ATTR_ENVELOPE_OFF | HU3D_ATTR_HOOKFUNC)) || !(temp_r31->motion_attr & HU3D_MOTATTR_PAUSE)) {
InitVtxParm(temp_r31->hsfData);
if (temp_r31->unk_0E != -1) {
ShapeProc(temp_r31->hsfData);
}
if (temp_r31->attr & HU3D_ATTR_CLUSTER_ON) {
ClusterProc(temp_r31);
}
if (temp_r31->hsfData->cenvCnt != 0) {
EnvelopeProc(temp_r31->hsfData);
}
PPCSync();
}
temp_r31->attr |= HU3D_ATTR_MOT_EXEC;
}
static s32 SearchObjectIndex(HsfData *arg0, u32 arg1)
{
s32 i;
char *temp_r28;
HsfObject *var_r30;
var_r30 = arg0->object;
temp_r28 = SetName(&arg1);
for (i = 0; i < arg0->objectCnt; i++, var_r30++) {
if (CmpObjectName(var_r30->name, temp_r28) == 0) {
return i;
}
}
return -1;
}
static s32 SearchAttributeIndex(HsfData *arg0, u32 arg1)
{
HsfAttribute *var_r31;
size_t temp_r28;
char *temp_r27;
s32 i;
var_r31 = arg0->attribute;
temp_r27 = SetName(&arg1);
for (i = 0; i < arg0->attributeCnt; i++, var_r31++) {
if (var_r31->name) {
temp_r28 = strlen(var_r31->name);
if (strncmp(var_r31->name, temp_r27, temp_r28) == 0) {
return i;
}
}
}
return -1;
}