WIP screen slice effect

This commit is contained in:
Fexty12573 2024-06-09 18:50:32 +02:00
parent 85b4248398
commit b58a6f737e
3 changed files with 65 additions and 67 deletions

View File

@ -92,15 +92,15 @@ typedef struct UnkStruct_ov5_021DE374 {
BOOL *unk_44;
} UnkStruct_ov5_021DE374;
typedef struct UnkStruct_ov5_021DDF74 {
QuadraticInterpolationTaskFX32 unk_00;
u32 unk_18;
u32 unk_1C;
typedef struct ScreenSliceEffect {
QuadraticInterpolationTaskFX32 interpolationTask;
u32 pixelsPerSlice;
u32 state;
UnkStruct_ov5_021EF3BC *unk_20;
UnkStruct_ov5_021EF43C *unk_24;
SysTask *unk_28;
BOOL *unk_2C;
} UnkStruct_ov5_021DDF74;
} ScreenSliceEffect;
typedef struct UnkStruct_ov5_021DED04 {
LinearInterpolationTaskS32 unk_00;
@ -130,10 +130,10 @@ BOOL QuadraticInterpolationTaskFX32_Update(QuadraticInterpolationTaskFX32 *param
void BrightnessFadeTask_ApplyBrightnessToScreen(int screen, int brightness);
void BrightnessFadeTask_Init(BrightnessFadeTask *task, s32 startValue, s32 endValue, s32 screen, s32 sync);
BOOL BrightnessFadeTask_Update(BrightnessFadeTask *task);
UnkStruct_ov5_021DDF74 *ov5_021DDF38(void);
void ov5_021DDF74(UnkStruct_ov5_021DDF74 *param0);
void ov5_021DDF9C(EncounterEffect *param0, UnkStruct_ov5_021DDF74 *param1, u8 param2, u32 param3, int param4, int param5, fx32 param6);
void ov5_021DE058(EncounterEffect *param0, UnkStruct_ov5_021DDF74 *param1, u8 param2, u32 param3, int param4, int param5, fx32 param6);
ScreenSliceEffect *ScreenSliceEffect_Alloc(void);
void ScreenSliceEffect_Delete(ScreenSliceEffect *param0);
void EncounterEffect_ScreenSlice(EncounterEffect *encEffect, ScreenSliceEffect *screenSliceEfx, u8 pixelsPerSlice, u32 numSteps, fx32 startX, fx32 endX, fx32 initialSpeed);
void ov5_021DE058(EncounterEffect *param0, ScreenSliceEffect *param1, u8 param2, u32 param3, int param4, int param5, fx32 param6);
UnkStruct_ov5_021DE374 *ov5_021DE1CC(void);
void ov5_021DE218(UnkStruct_ov5_021DE374 *param0);
void ov5_021DE240(EncounterEffect *param0, UnkStruct_ov5_021DE374 *param1, u32 param2, fx32 param3, fx32 param4);

View File

@ -98,7 +98,7 @@ static void EncounterEffect_ExecuteFlash(SysTask *task, void *param);
static void ov5_021DE028(SysTask *param0, void *param1);
static void ov5_021DE088(SysTask *param0, void *param1);
static void ov5_021DE14C(UnkStruct_ov5_021EF43C *param0, void *param1);
static void ov5_021DE0F0(UnkStruct_ov5_021DDF74 *param0);
static void ov5_021DE0F0(ScreenSliceEffect *param0);
static void ov5_021DE2AC(SysTask *param0, void *param1);
static void ov5_021DE2DC(SysTask *param0, void *param1);
static void ov5_021DE344(UnkStruct_ov5_021EF43C *param0, void *param1);
@ -401,84 +401,82 @@ static void BrightnessFadeTask_SetBrightness(SysTask *task, void *param)
SysTask_Done(task);
}
UnkStruct_ov5_021DDF74 *ov5_021DDF38(void)
ScreenSliceEffect *ScreenSliceEffect_Alloc(void)
{
UnkStruct_ov5_021DDF74 *v0;
ScreenSliceEffect *efx = Heap_AllocFromHeap(HEAP_ID_FIELD, sizeof(ScreenSliceEffect));
memset(efx, 0, sizeof(ScreenSliceEffect));
v0 = Heap_AllocFromHeap(4, sizeof(UnkStruct_ov5_021DDF74));
memset(v0, 0, sizeof(UnkStruct_ov5_021DDF74));
G2_SetWnd0InsidePlane(GX_WND_PLANEMASK_BG0 | GX_WND_PLANEMASK_BG1 | GX_WND_PLANEMASK_BG2 | GX_WND_PLANEMASK_BG3 | GX_WND_PLANEMASK_OBJ, TRUE);
G2_SetWnd1InsidePlane(GX_WND_PLANEMASK_NONE, FALSE);
G2_SetWnd0InsidePlane(GX_WND_PLANEMASK_BG0 | GX_WND_PLANEMASK_BG1 | GX_WND_PLANEMASK_BG2 | GX_WND_PLANEMASK_BG3 | GX_WND_PLANEMASK_OBJ, 1);
G2_SetWnd1InsidePlane(GX_WND_PLANEMASK_NONE, 0);
return v0;
return efx;
}
void ov5_021DDF74(UnkStruct_ov5_021DDF74 *param0)
void ScreenSliceEffect_Delete(ScreenSliceEffect *efx)
{
if (param0->unk_24 != NULL) {
ov5_021DE0F0(param0);
if (efx->unk_24 != NULL) {
ov5_021DE0F0(efx);
}
GX_SetVisibleWnd(GX_WNDMASK_NONE);
Heap_FreeToHeap(param0);
Heap_FreeToHeap(efx);
}
void ov5_021DDF9C(EncounterEffect *param0, UnkStruct_ov5_021DDF74 *param1, u8 param2, u32 param3, int param4, int param5, fx32 param6)
void EncounterEffect_ScreenSlice(EncounterEffect *encEffect, ScreenSliceEffect *screenSliceEfx, u8 pixelsPerSlice, u32 numSteps, fx32 startX, fx32 endX, fx32 initialSpeed)
{
GF_ASSERT(param1->unk_24 == NULL);
GF_ASSERT(screenSliceEfx->unk_24 == NULL);
param0->unk_18 = 0;
param1->unk_20 = param0->fieldSystem->unk_04->unk_1C;
param1->unk_18 = param2;
param1->unk_1C = 0;
param1->unk_2C = &param0->unk_18;
encEffect->unk_18 = 0;
screenSliceEfx->unk_20 = encEffect->fieldSystem->unk_04->unk_1C;
screenSliceEfx->pixelsPerSlice = pixelsPerSlice;
screenSliceEfx->state = 0;
screenSliceEfx->unk_2C = &encEffect->unk_18;
QuadraticInterpolationTaskFX32_Init(&param1->unk_00, param4, param5, param6, param3);
QuadraticInterpolationTaskFX32_Init(&screenSliceEfx->interpolationTask, startX, endX, initialSpeed, numSteps);
if (param4 >= 0) {
G2_SetWnd0Position(0, 0, 255 - param4, 192);
G2_SetWnd1Position(0, 0, 1 + param4, 192);
if (startX >= 0) {
G2_SetWnd0Position(0, 0, 255 - startX, 192);
G2_SetWnd1Position(0, 0, 1 + startX, 192);
} else {
G2_SetWnd0Position(0, 0, 255 + param4, 192);
G2_SetWnd1Position(0, 0, 1 - param4, 192);
G2_SetWnd0Position(0, 0, 255 + startX, 192);
G2_SetWnd1Position(0, 0, 1 - startX, 192);
}
CoreSys_ExecuteDuringVBlank(ov5_021DE028, param1, 1024);
CoreSys_ExecuteDuringVBlank(ov5_021DE028, screenSliceEfx, 1024);
}
static void ov5_021DE028(SysTask *param0, void *param1)
static void ov5_021DE028(SysTask *task, void *param)
{
UnkStruct_ov5_021DDF74 *v0 = param1;
ScreenSliceEffect *screenSliceEfx = param;
v0->unk_28 = CoreSys_ExecuteDuringVBlank(ov5_021DE088, v0, 1024);
v0->unk_24 = ov5_021EF418(v0->unk_20, ov5_021DE14C, v0);
screenSliceEfx->unk_28 = CoreSys_ExecuteDuringVBlank(ov5_021DE088, screenSliceEfx, 1024);
screenSliceEfx->unk_24 = ov5_021EF418(screenSliceEfx->unk_20, ov5_021DE14C, screenSliceEfx);
SysTask_Done(param0);
SysTask_Done(task);
}
void ov5_021DE058(EncounterEffect *param0, UnkStruct_ov5_021DDF74 *param1, u8 param2, u32 param3, int param4, int param5, fx32 param6)
void ov5_021DE058(EncounterEffect *param0, ScreenSliceEffect *param1, u8 param2, u32 param3, int param4, int param5, fx32 param6)
{
GF_ASSERT(ov5_021DDD7C(param0) == 0);
param1->unk_18 = param2;
param1->unk_1C = 0;
param1->pixelsPerSlice = param2;
param1->state = 0;
QuadraticInterpolationTaskFX32_Init(&param1->unk_00, param4, param5, param6, param3);
QuadraticInterpolationTaskFX32_Init(&param1->interpolationTask, param4, param5, param6, param3);
}
static void ov5_021DE088(SysTask *param0, void *param1)
{
UnkStruct_ov5_021DDF74 *v0 = param1;
ScreenSliceEffect *v0 = param1;
s32 v1;
switch (v0->unk_1C) {
switch (v0->state) {
case 0:
if (QuadraticInterpolationTaskFX32_Update(&v0->unk_00)) {
v0->unk_1C++;
if (QuadraticInterpolationTaskFX32_Update(&v0->interpolationTask)) {
v0->state++;
}
v1 = v0->unk_00.currentValue >> FX32_SHIFT;
v1 = v0->interpolationTask.currentValue >> FX32_SHIFT;
if (v1 >= 0) {
G2_SetWnd0Position(0, 0, 255 - v1, 192);
@ -494,7 +492,7 @@ static void ov5_021DE088(SysTask *param0, void *param1)
}
}
static void ov5_021DE0F0(UnkStruct_ov5_021DDF74 *param0)
static void ov5_021DE0F0(ScreenSliceEffect *param0)
{
G2_SetWnd0InsidePlane(GX_WND_PLANEMASK_BG0 | GX_WND_PLANEMASK_BG1 | GX_WND_PLANEMASK_BG2 | GX_WND_PLANEMASK_BG3 | GX_WND_PLANEMASK_OBJ, 1);
G2_SetWndOutsidePlane(GX_WND_PLANEMASK_NONE, 0);
@ -511,16 +509,16 @@ static void ov5_021DE0F0(UnkStruct_ov5_021DDF74 *param0)
static void ov5_021DE14C(UnkStruct_ov5_021EF43C *param0, void *param1)
{
UnkStruct_ov5_021DDF74 *v0 = param1;
ScreenSliceEffect *v0 = param1;
int v1;
int v2;
v1 = GX_GetVCount();
if (((v1 / v0->unk_18) % 2) == 0) {
v2 = v0->unk_00.currentValue >> FX32_SHIFT;
if (((v1 / v0->pixelsPerSlice) % 2) == 0) {
v2 = v0->interpolationTask.currentValue >> FX32_SHIFT;
} else {
v2 = -v0->unk_00.currentValue >> FX32_SHIFT;
v2 = -v0->interpolationTask.currentValue >> FX32_SHIFT;
}
G2_SetBG0Offset(v2, 0);

View File

@ -49,13 +49,13 @@
typedef struct {
UnkStruct_020203AC * unk_00;
QuadraticInterpolationTaskFX32 unk_04;
UnkStruct_ov5_021DDF74 * unk_1C;
ScreenSliceEffect * unk_1C;
} UnkStruct_ov5_021E2338;
typedef struct {
UnkStruct_020203AC * unk_00;
QuadraticInterpolationTaskFX32 unk_04;
UnkStruct_ov5_021DDF74 * unk_1C;
ScreenSliceEffect * unk_1C;
} UnkStruct_ov5_021E24A8;
typedef struct {
@ -103,7 +103,7 @@ void ov5_021E2338 (SysTask * param0, void * param1)
v0->unk_0C = Heap_AllocFromHeap(4, sizeof(UnkStruct_ov5_021E2338));
memset(v0->unk_0C, 0, sizeof(UnkStruct_ov5_021E2338));
v1 = v0->unk_0C;
v1->unk_1C = ov5_021DDF38();
v1->unk_1C = ScreenSliceEffect_Alloc();
v0->unk_00++;
break;
case 1:
@ -114,7 +114,7 @@ void ov5_021E2338 (SysTask * param0, void * param1)
if (v0->unk_04) {
v0->unk_04 = 0;
v0->unk_00++;
ov5_021DDF9C(v0, v1->unk_1C, 2, 6 + 1, 0, (-3 * FX32_ONE), (FX32_ONE * -12));
EncounterEffect_ScreenSlice(v0, v1->unk_1C, 2, 6 + 1, 0, (-3 * FX32_ONE), (FX32_ONE * -12));
v1->unk_00 = v0->fieldSystem->unk_24;
v2 = sub_02020A90(v1->unk_00);
QuadraticInterpolationTaskFX32_Init(&v1->unk_04, v2, v2 + (FX32_ONE * 50), (FX32_ONE * 30), 6);
@ -152,7 +152,7 @@ void ov5_021E2338 (SysTask * param0, void * param1)
*(v0->done) = 1;
}
ov5_021DDF74(v1->unk_1C);
ScreenSliceEffect_Delete(v1->unk_1C);
EncounterEffect_Finish(v0, param0);
break;
default:
@ -172,7 +172,7 @@ void ov5_021E24A8 (SysTask * param0, void * param1)
v0->unk_0C = Heap_AllocFromHeap(4, sizeof(UnkStruct_ov5_021E24A8));
memset(v0->unk_0C, 0, sizeof(UnkStruct_ov5_021E24A8));
v1 = v0->unk_0C;
v1->unk_1C = ov5_021DDF38();
v1->unk_1C = ScreenSliceEffect_Alloc();
v0->unk_00++;
break;
case 1:
@ -183,7 +183,7 @@ void ov5_021E24A8 (SysTask * param0, void * param1)
if (v0->unk_04) {
v0->unk_04 = 0;
v0->unk_00++;
ov5_021DDF9C(v0, v1->unk_1C, 5, 6 + 1, 0, (-2 * FX32_ONE), (FX32_ONE * -12));
EncounterEffect_ScreenSlice(v0, v1->unk_1C, 5, 6 + 1, 0, (-2 * FX32_ONE), (FX32_ONE * -12));
v1->unk_00 = v0->fieldSystem->unk_24;
v2 = sub_02020A90(v1->unk_00);
QuadraticInterpolationTaskFX32_Init(&v1->unk_04, v2, v2 + (FX32_ONE * 50), (FX32_ONE * 30), 6);
@ -221,7 +221,7 @@ void ov5_021E24A8 (SysTask * param0, void * param1)
*(v0->done) = 1;
}
ov5_021DDF74(v1->unk_1C);
ScreenSliceEffect_Delete(v1->unk_1C);
EncounterEffect_Finish(v0, param0);
break;
default:
@ -511,7 +511,7 @@ typedef struct {
QuadraticInterpolationTaskFX32 unk_00;
LinearInterpolationTaskS32 unk_18;
QuadraticInterpolationTaskFX32 unk_2C;
UnkStruct_ov5_021DDF74 * unk_44;
ScreenSliceEffect * unk_44;
UnkStruct_ov5_021DE47C unk_48;
UnkStruct_ov5_021DE5A4 unk_1E8;
GraphicElementData * unk_21C[2];
@ -607,7 +607,7 @@ void ov5_021E2B54 (SysTask * param0, void * param1)
v1->unk_224 = v0->fieldSystem->unk_24;
v1->unk_44 = ov5_021DDF38();
v1->unk_44 = ScreenSliceEffect_Alloc();
ov5_021DE47C(&v1->unk_48, 2, 1);
@ -684,7 +684,7 @@ void ov5_021E2B54 (SysTask * param0, void * param1)
case 5:
ov5_021DDF9C(v0, v1->unk_44, 96, 6, 0, (255 * FX32_ONE), (FX32_ONE * 10));
EncounterEffect_ScreenSlice(v0, v1->unk_44, 96, 6, 0, (255 * FX32_ONE), (FX32_ONE * 10));
SpriteActor_SetSpriteAnimActive(
v1->unk_21C[0], 1);
@ -742,7 +742,7 @@ void ov5_021E2B54 (SysTask * param0, void * param1)
}
ov5_021DE5A4(&v1->unk_48, &v1->unk_1E8);
ov5_021DE4AC(&v1->unk_48);
ov5_021DDF74(v1->unk_44);
ScreenSliceEffect_Delete(v1->unk_44);
EncounterEffect_Finish(v0, param0);
break;
}