Transform tagging for moon/giants chamber/lost woods particles, fixed missing nfd init

This commit is contained in:
Mr-Wiseguy 2024-04-06 18:04:55 -04:00
parent 45bbd40b12
commit 76ec1f379b
4 changed files with 215 additions and 3 deletions

View File

@ -1,6 +1,7 @@
#include "patches.h"
#include "transform_ids.h"
#include "overlays/actors/ovl_En_Hanabi/z_en_hanabi.h"
#include "overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.h"
extern EffectSsInfo sEffectSsInfo;
@ -174,3 +175,210 @@ void EnHanabi_Draw(Actor* thisx, PlayState* play) {
func_80B22FA8_patched(thisx, this->unk_148, play);
Matrix_Pop();
}
Vec3f kankyo_prev_pos_base[DEMOKANKYO_EFFECT_COUNT] = {0};
// @recomp Patched to draw the lost woods particles outside the 4:3 region and tag their transforms.
void DemoKakyo_DrawLostWoodsSparkle(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
DemoKankyo* this = (DemoKankyo*)thisx;
s16 i;
f32 scaleAlpha;
Vec3f worldPos;
Vec3f screenPos;
// if not underwater
if (!(play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_UNDERWATER)) {
OPEN_DISPS(play->state.gfxCtx);
POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
for (i = 0; i < play->envCtx.precipitation[PRECIP_SNOW_MAX]; i++) {
worldPos.x = this->effects[i].posBase.x + this->effects[i].posOffset.x;
worldPos.y = this->effects[i].posBase.y + this->effects[i].posOffset.y;
worldPos.z = this->effects[i].posBase.z + this->effects[i].posOffset.z;
// @recomp Render the particle regardless of its position on screen.
// Play_GetScreenPos(play, &worldPos, &screenPos);
// // checking if particle is on screen
// if ((screenPos.x >= 0.0f) && (screenPos.x < SCREEN_WIDTH) && (screenPos.y >= 0.0f) &&
// (screenPos.y < SCREEN_HEIGHT)) {
if (true) {
Matrix_Translate(worldPos.x, worldPos.y, worldPos.z, MTXMODE_NEW);
scaleAlpha = this->effects[i].alpha / 50.0f;
if (scaleAlpha > 1.0f) {
scaleAlpha = 1.0f;
}
Matrix_Scale(this->effects[i].scale * scaleAlpha, this->effects[i].scale * scaleAlpha,
this->effects[i].scale * scaleAlpha, MTXMODE_APPLY);
// adjust transparency of this particle
if (i < 32) {
// Skyfish particles
if (this->effects[i].state != DEMO_KANKYO_STATE_SKYFISH) {
// still initializing
if (this->effects[i].alpha > 0) { // NOT DECR
this->effects[i].alpha--;
}
} else if (this->effects[i].alpha < 100) {
this->effects[i].alpha++;
}
} else if (this->effects[i].state != DEMO_KANKYO_STATE_SKYFISH) {
if ((this->effects[i].alphaClock & 31) < 16) {
if (this->effects[i].alpha < 235) {
this->effects[i].alpha += 20;
}
} else if (this->effects[i].alpha > 20) {
this->effects[i].alpha -= 20;
}
} else if ((this->effects[i].alphaClock & 15) < 8) {
if (this->effects[i].alpha < 255) {
this->effects[i].alpha += 100;
}
} else if (this->effects[i].alpha > 10) {
this->effects[i].alpha -= 10;
}
gDPPipeSync(POLY_XLU_DISP++);
switch (i & 1) {
case 0: // gold particles
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 155, this->effects[i].alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 0, this->effects[i].alpha);
break;
case 1: // silver particles
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, this->effects[i].alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 100, 255, this->effects[i].alpha);
break;
}
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZF(DEG_TO_RAD(play->state.frames * 20.0f), MTXMODE_APPLY);
// @recomp Tag the particle's matrix. Skip if the particle's base position changed.
if (this->effects[i].state == DEMO_KANKYO_STATE_SKYFISH || (
kankyo_prev_pos_base[i].x == this->effects[i].posBase.x &&
kankyo_prev_pos_base[i].y == this->effects[i].posBase.y &&
kankyo_prev_pos_base[i].z == this->effects[i].posBase.z)) {
gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW);
}
else {
gEXMatrixGroupDecomposedSkipAll(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE);
}
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
// @recomp Pop the matrix tag and record the particle's current base position.
gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW);
kankyo_prev_pos_base[i] = this->effects[i].posBase;
}
}
CLOSE_DISPS(play->state.gfxCtx);
}
}
extern Gfx gLightOrbMaterial1DL[];
extern Gfx gBubbleDL[];
extern Gfx gLightOrbModelDL[];
// @recomp Patched to draw the lost woods particles outside the 4:3 region and tag their transforms.
void DemoKankyo_DrawMoonAndGiant(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
DemoKankyo* this = (DemoKankyo*)thisx;
s16 i;
f32 alphaScale;
if (this->isSafeToDrawGiants != false) {
Vec3f worldPos;
Vec3f screenPos;
s32 pad;
GraphicsContext* gfxCtx = play->state.gfxCtx;
OPEN_DISPS(gfxCtx);
Gfx_SetupDL25_Xlu(gfxCtx);
for (i = 0; i < play->envCtx.precipitation[PRECIP_SNOW_MAX]; i++) {
worldPos.x = this->effects[i].posBase.x + this->effects[i].posOffset.x;
worldPos.y = this->effects[i].posBase.y + this->effects[i].posOffset.y;
worldPos.z = this->effects[i].posBase.z + this->effects[i].posOffset.z;
// @recomp Render the particle regardless of its position on screen.
// Play_GetScreenPos(play, &worldPos, &screenPos);
// checking if effect is on screen
// if ((screenPos.x >= 0.0f) && (screenPos.x < SCREEN_WIDTH) && (screenPos.y >= 0.0f) &&
// (screenPos.y < SCREEN_HEIGHT)) {
if (true) {
Matrix_Translate(worldPos.x, worldPos.y, worldPos.z, MTXMODE_NEW);
alphaScale = this->effects[i].alpha / 50.0f;
if (alphaScale > 1.0f) {
alphaScale = 1.0f;
}
Matrix_Scale(this->effects[i].scale * alphaScale, this->effects[i].scale * alphaScale,
this->effects[i].scale * alphaScale, MTXMODE_APPLY);
alphaScale = Math_Vec3f_DistXYZ(&worldPos, &play->view.eye) / 300.0f;
alphaScale = CLAMP(1.0f - alphaScale, 0.0f, 1.0f);
if (this->actor.params == DEMO_KANKYO_TYPE_GIANTS) {
this->effects[i].alpha = 255.0f * alphaScale;
} else {
this->effects[i].alpha = 160.0f * alphaScale;
}
gDPPipeSync(POLY_XLU_DISP++);
switch (i & 1) { // half/half slightly different shades of yellow/tan
case 0:
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 230, 230, 220, this->effects[i].alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 230, 230, 30, this->effects[i].alpha);
break;
case 1:
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 200, 200, 190, this->effects[i].alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 30, this->effects[i].alpha);
break;
}
gSPDisplayList(POLY_XLU_DISP++, gLightOrbMaterial1DL);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZF(DEG_TO_RAD(play->state.frames * 20.0f), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the particle's matrix. Skip if the particle's base position changed.
// Allow the Y base position to change if this is a moon particle.
if (kankyo_prev_pos_base[i].x == this->effects[i].posBase.x &&
(kankyo_prev_pos_base[i].y == this->effects[i].posBase.y || this->actor.params == DEMO_KANKYO_TYPE_MOON) &&
kankyo_prev_pos_base[i].z == this->effects[i].posBase.z) {
gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW);
}
else {
gEXMatrixGroupDecomposedSkipAll(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE);
}
if (this->actor.params == DEMO_KANKYO_TYPE_GIANTS) {
gSPDisplayList(POLY_XLU_DISP++, gBubbleDL);
} else {
gSPDisplayList(POLY_XLU_DISP++, gLightOrbModelDL);
}
// @recomp Pop the matrix tag and record the particle's current base position.
gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW);
kankyo_prev_pos_base[i] = this->effects[i].posBase;
}
}
CLOSE_DISPS(gfxCtx);
}
}

View File

@ -951,7 +951,6 @@ void func_800A6A40(EnItem00* this, PlayState* play) {
// @recomp Use custom flag 1 to check if this actor has been in this state before.
if (!actor_get_custom_flag_1(&this->actor)) {
recomp_printf("First frame picked up\n");
// It hasn't, so skip interpolation this frame and set custom flag 1.
actor_set_interpolation_skipped(&this->actor);
actor_set_custom_flag_1(&this->actor);

View File

@ -7,6 +7,8 @@
#include <numeric>
#include <stdexcept>
#include "nfd.h"
#include "../../ultramodern/ultra64.h"
#include "../../ultramodern/ultramodern.hpp"
#define SDL_MAIN_HANDLED
@ -219,6 +221,9 @@ int main(int argc, char** argv) {
// Set up console output to accept UTF-8 on windows
SetConsoleOutputCP(CP_UTF8);
// Initialize native file dialogs.
NFD_Init();
// Change to a font that supports Japanese characters
CONSOLE_FONT_INFOEX cfi;
cfi.cbSize = sizeof cfi;
@ -260,6 +265,8 @@ int main(int argc, char** argv) {
};
recomp::start({}, audio_callbacks, input_callbacks, gfx_callbacks);
NFD_Quit();
return EXIT_SUCCESS;
}

View File

@ -16,8 +16,6 @@ void select_rom() {
nfdresult_t result = NFD_OpenDialogN(&native_path, nullptr, 0, nullptr);
if (result == NFD_OKAY) {
printf("Path: %ls\n", native_path);
std::filesystem::path path{native_path};
NFD_FreePathN(native_path);