Matched thpmain, THPSimple, and THPDraw
This commit is contained in:
parent
01c79f14b0
commit
742ddc1f7c
8 changed files with 1121 additions and 9 deletions
252
src/game/thpmain.c
Executable file
252
src/game/thpmain.c
Executable file
|
|
@ -0,0 +1,252 @@
|
|||
#include "game/thpmain.h"
|
||||
#include "game/hsfdraw.h"
|
||||
#include "game/hsfman.h"
|
||||
#include "game/init.h"
|
||||
#include "game/process.h"
|
||||
#include "game/sprite.h"
|
||||
#include "game/THPSimple.h"
|
||||
|
||||
#include "string.h"
|
||||
|
||||
static void THPTestProc(void);
|
||||
static void THPViewFunc(ModelData *arg0, Mtx arg1);
|
||||
static void THPViewSprFunc(SpriteData *arg0);
|
||||
static void THPDecodeFunc(void *param);
|
||||
|
||||
static char THPFileName[64];
|
||||
|
||||
static UnkThpStruct04 audioTrack;
|
||||
static s32 decodeRate;
|
||||
static u8 *decodeStackP;
|
||||
static OSThread *decodeThread;
|
||||
static s16 THPLoopF;
|
||||
static s16 THPStat;
|
||||
static u32 THPFrame;
|
||||
static s16 THPStart;
|
||||
Process *THPProc;
|
||||
|
||||
s16 HuTHPSprCreateVol(char *path, s16 loop, s16 prio, float volume) {
|
||||
s16 temp_r31;
|
||||
|
||||
if (THPProc) {
|
||||
return -1;
|
||||
}
|
||||
THPStart = 0;
|
||||
THPProc = HuPrcCreate(THPTestProc, 0x64, 0x3000, 0);
|
||||
if (THPProc == 0) {
|
||||
return -1;
|
||||
}
|
||||
temp_r31 = HuSprFuncCreate(THPViewSprFunc, prio);
|
||||
if (temp_r31 == -1) {
|
||||
return -1;
|
||||
}
|
||||
THPSimpleInit(2);
|
||||
SimpleControl.unk19C = 0;
|
||||
SimpleControl.unk19E = temp_r31;
|
||||
SimpleControl.unkBC = volume;
|
||||
strcpy(THPFileName, path);
|
||||
THPLoopF = loop;
|
||||
THPStat = 0;
|
||||
THPFrame = 0;
|
||||
return temp_r31;
|
||||
}
|
||||
|
||||
s16 HuTHPSprCreate(char *path, s16 loop, s16 prio) {
|
||||
return HuTHPSprCreateVol(path, loop, prio, 110.0f);
|
||||
}
|
||||
|
||||
s16 HuTHP3DCreateVol(char *path, s16 loop, float volume) {
|
||||
s16 temp_r31;
|
||||
|
||||
if (THPProc) {
|
||||
return;
|
||||
}
|
||||
THPStart = 0;
|
||||
THPProc = HuPrcCreate(THPTestProc, 0x64, 0x3000, 0);
|
||||
if (THPProc == 0) {
|
||||
return -1;
|
||||
}
|
||||
THPSimpleInit(2);
|
||||
SimpleControl.unk19C = 1;
|
||||
temp_r31 = Hu3DHookFuncCreate(&THPViewFunc);
|
||||
SimpleControl.unk19E = temp_r31;
|
||||
SimpleControl.unkBC = volume;
|
||||
strcpy(THPFileName, path);
|
||||
THPLoopF = loop;
|
||||
THPStat = 0;
|
||||
THPFrame = 0;
|
||||
Hu3DModelAttrSet(SimpleControl.unk19E, 1);
|
||||
return temp_r31;
|
||||
}
|
||||
|
||||
s16 HuTHP3DCreate(char *path, s16 loop) {
|
||||
return HuTHP3DCreateVol(path, loop, 110.0f);
|
||||
}
|
||||
|
||||
void HuTHPStop(void) {
|
||||
THPStat = 1;
|
||||
}
|
||||
|
||||
void HuTHPClose(void) {
|
||||
THPStat = 2;
|
||||
}
|
||||
|
||||
void HuTHPRestart(void) {
|
||||
THPStat = 3;
|
||||
}
|
||||
|
||||
BOOL HuTHPEndCheck(void) {
|
||||
s32 temp_r31;
|
||||
|
||||
temp_r31 = THPSimpleGetTotalFrame() - 1;
|
||||
if (temp_r31 <= 0) {
|
||||
return FALSE;
|
||||
}
|
||||
return (temp_r31 <= THPFrame);
|
||||
}
|
||||
|
||||
s32 HuTHPFrameGet(void) {
|
||||
return THPFrame;
|
||||
}
|
||||
|
||||
s32 HuTHPTotalFrameGet(void) {
|
||||
return THPSimpleGetTotalFrame();
|
||||
}
|
||||
|
||||
void HuTHPSetVolume(s32 left, s32 right) {
|
||||
THPSimpleSetVolume(left, right);
|
||||
}
|
||||
|
||||
static void THPTestProc(void) {
|
||||
s32 temp_r29;
|
||||
u32 var_r28;
|
||||
void *temp_r30;
|
||||
|
||||
while (THPSimpleOpen(THPFileName) == 0) {
|
||||
OSReport("THPSimpleOpen fail");
|
||||
HuPrcVSleep();
|
||||
}
|
||||
THPSimpleGetVideoInfo(&audioTrack);
|
||||
temp_r29 = THPSimpleCalcNeedMemory();
|
||||
OSReport("Size %x\n", temp_r29);
|
||||
temp_r30 = HuMemDirectMalloc(HEAP_DATA, temp_r29);
|
||||
memset(temp_r30, 0, temp_r29);
|
||||
DCFlushRange(temp_r30, temp_r29);
|
||||
if (temp_r30 == 0) {
|
||||
OSReport("Can't allocate the memory\n");
|
||||
}
|
||||
THPSimpleSetBuffer(temp_r30);
|
||||
while (THPSimplePreLoad(THPLoopF) == 0) {
|
||||
OSReport("THPSimplePreLoad fail");
|
||||
HuPrcVSleep();
|
||||
}
|
||||
HuPrcVSleep();
|
||||
decodeStackP = HuMemDirectMalloc(HEAP_SYSTEM, 0x2000);
|
||||
decodeThread = OSSetIdleFunction(THPDecodeFunc, NULL, decodeStackP + 0x2000, 0x2000);
|
||||
decodeRate = 0;
|
||||
THPStart = 1;
|
||||
if (SimpleControl.unk19C == 1) {
|
||||
Hu3DModelAttrReset(SimpleControl.unk19E, 1);
|
||||
} else {
|
||||
HuSprAttrReset(SimpleControl.unk19E, 0, 4);
|
||||
}
|
||||
while (1) {
|
||||
if (THPStat == 2) {
|
||||
break;
|
||||
}
|
||||
switch (THPStat) {
|
||||
case 0:
|
||||
var_r28 = 1;
|
||||
THPStat = 4;
|
||||
break;
|
||||
case 1:
|
||||
THPSimpleAudioStop();
|
||||
THPSimpleLoadStop();
|
||||
break;
|
||||
case 3:
|
||||
THPSimpleAudioStop();
|
||||
THPSimpleLoadStop();
|
||||
while (THPSimplePreLoad(THPLoopF) == 0) {
|
||||
OSReport("THPSimplePreLoad fail");
|
||||
HuPrcVSleep();
|
||||
}
|
||||
THPStat = 0;
|
||||
var_r28 = 1;
|
||||
break;
|
||||
}
|
||||
if (var_r28 != 0) {
|
||||
THPSimpleAudioStart();
|
||||
var_r28 = 0;
|
||||
}
|
||||
HuPrcVSleep();
|
||||
}
|
||||
if (SimpleControl.unk19C == 1) {
|
||||
Hu3DModelKill(SimpleControl.unk19E);
|
||||
} else {
|
||||
HuSprKill(SimpleControl.unk19E);
|
||||
}
|
||||
OSCancelThread(decodeThread);
|
||||
HuMemDirectFree(decodeStackP);
|
||||
THPSimpleAudioStop();
|
||||
THPSimpleLoadStop();
|
||||
THPSimpleClose();
|
||||
HuMemDirectFree(temp_r30);
|
||||
THPSimpleQuit();
|
||||
THPProc = NULL;
|
||||
HuPrcKill(HuPrcCurrentGet());
|
||||
while (1) {
|
||||
HuPrcVSleep();
|
||||
}
|
||||
}
|
||||
|
||||
static void THPViewFunc(ModelData *arg0, Mtx arg1) {
|
||||
GXColor spC = { 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
|
||||
if (THPStart != 0) {
|
||||
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
|
||||
GXSetCullMode(GX_CULL_NONE);
|
||||
THPFrame = THPSimpleDrawCurrentFrame(RenderMode, &spC, arg1, -audioTrack.unk00 / 2, audioTrack.unk04 / 2, audioTrack.unk00, -audioTrack.unk04);
|
||||
THPSimpleAudioStart();
|
||||
}
|
||||
}
|
||||
|
||||
static void THPViewSprFunc(SpriteData *arg0) {
|
||||
Vec spC = { 0.0f, 0.0f, 1.0f };
|
||||
GXColor sp8;
|
||||
s32 temp_r30;
|
||||
s32 temp_r29;
|
||||
Mtx sp48;
|
||||
Mtx sp18;
|
||||
|
||||
if (THPStart != 0) {
|
||||
sp8.r = arg0->r;
|
||||
sp8.g = arg0->g;
|
||||
sp8.b = arg0->b;
|
||||
sp8.a = arg0->a;
|
||||
if (arg0->z_rot != 0.0f) {
|
||||
PSMTXRotAxisRad(sp18, &spC, MTXDegToRad(arg0->z_rot));
|
||||
PSMTXScale(sp48, arg0->scale_x, arg0->scale_y, 1.0f);
|
||||
PSMTXConcat(sp18, sp48, sp48);
|
||||
} else {
|
||||
PSMTXScale(sp48, arg0->scale_x, arg0->scale_y, 1.0f);
|
||||
}
|
||||
mtxTransCat(sp48, arg0->x, arg0->y, 0.0f);
|
||||
PSMTXConcat(*arg0->group_mtx, sp48, sp48);
|
||||
temp_r30 = -((s32) audioTrack.unk00 / 2);
|
||||
temp_r29 = -((s32) audioTrack.unk04 / 2);
|
||||
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
|
||||
THPFrame = THPSimpleDrawCurrentFrame(RenderMode, &sp8, sp48, temp_r30, temp_r29, audioTrack.unk00, audioTrack.unk04);
|
||||
}
|
||||
}
|
||||
|
||||
static void THPDecodeFunc(void *param) {
|
||||
while (1) {
|
||||
if (THPStat == 2) {
|
||||
break;
|
||||
}
|
||||
if (THPSimpleDecode() == 1) {
|
||||
OSReport("Fail to decode video data");
|
||||
}
|
||||
VIWaitForRetrace();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue