Frame interp: Fix stars

This commit is contained in:
Irastris
2026-04-12 12:17:39 -04:00
parent a8f5fb3899
commit 1f77e2e5e8
5 changed files with 145 additions and 12 deletions
+2 -2
View File
@@ -11042,8 +11042,8 @@ static int camera_draw(camera_process_class* i_this) {
mDoMtx_lookAt(process->view.viewMtx, &process->view.lookat.eye, &process->view.lookat.center,
&process->view.lookat.up, process->view.bank);
#ifdef TARGET_PC
dusk::frame_interp::record_final_mtx_raw(reinterpret_cast<const Mtx*>(process->view.viewMtx),
process->view.viewMtx);
dusk::frame_interp::record_camera(process, camera_id);
dusk::frame_interp::record_final_mtx_raw(reinterpret_cast<const Mtx*>(process->view.viewMtx), process->view.viewMtx);
#endif
#if WIDESCREEN_SUPPORT
+56 -4
View File
@@ -12,6 +12,9 @@
#include "m_Do/m_Do_graphic.h"
#include "m_Do/m_Do_lib.h"
#include <cstring>
#if TARGET_PC
#include "dusk/frame_interpolation.h"
#endif
static void vectle_calc(DOUBLE_POS* i_pos, cXyz* o_out) {
double s = sqrt(i_pos->x * i_pos->x + i_pos->y * i_pos->y + i_pos->z * i_pos->z);
@@ -4107,28 +4110,62 @@ void dKyr_drawStar(Mtx drawMtx, u8** tex) {
color_reg0.b = 0xFF;
color_reg0.a = 0xFF;
#if TARGET_PC
Mtx star_gx_view;
cXyz anchor_eye;
f32 star_fovy = 45.0f;
MtxP gx_load_view = drawMtx;
bool star_use_present_view = false;
if (dusk::getSettings().game.enableFrameInterpolation) {
star_use_present_view = dusk::frame_interp::build_star_view(star_gx_view, camMtx, &anchor_eye, &star_fovy);
}
if (star_use_present_view) {
gx_load_view = star_gx_view;
} else {
if (dComIfGd_getView() != NULL) {
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
anchor_eye = camera->view.lookat.eye;
star_fovy = dComIfGd_getView()->fovy;
} else {
return;
}
}
#else
if (dComIfGd_getView() != NULL) {
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
} else {
return;
}
#endif
if (strcmp(dComIfGp_getStartStageName(), "F_SP200") == 0 && dComIfG_play_c::getLayerNo(0) == 0) {
moon_pos = envlight->moon_pos;
} else {
#if TARGET_PC
moon_pos = anchor_eye + envlight->moon_pos;
#else
moon_pos = camera->view.lookat.eye + envlight->moon_pos;
#endif
if (sp38) {
#if TARGET_PC
moon_pos.x = 3900.0f + anchor_eye.x;
moon_pos.y = 8052.0f + anchor_eye.y;
moon_pos.z = -9072.0f + anchor_eye.z;
#else
moon_pos.x = 3900.0f + camera->view.lookat.eye.x;
moon_pos.y = 8052.0f + camera->view.lookat.eye.y;
moon_pos.z = -9072.0f + camera->view.lookat.eye.z;
#endif
}
}
#if TARGET_PC
#if TARGET_PC
mDoLib_project(&moon_pos, &moon_proj, {0, 0, FB_WIDTH, FB_HEIGHT});
#else
#else
mDoLib_project(&moon_pos, &moon_proj);
#endif
#endif
// Dusk optimization: we use vertex color rather than GX_TEVREG0 to set star color.
// This allows us to merge all the stars into a single draw.
@@ -4156,7 +4193,11 @@ void dKyr_drawStar(Mtx drawMtx, u8** tex) {
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
MTXConcat(camMtx, rotMtx, camMtx);
#if TARGET_PC
GXLoadPosMtxImm(gx_load_view, GX_PNMTX0);
#else
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
#endif
GXSetCurrentMtx(GX_PNMTX0);
rot += 0.65f;
@@ -4164,12 +4205,23 @@ void dKyr_drawStar(Mtx drawMtx, u8** tex) {
rot = 0.0f;
}
#if TARGET_PC
spBC = anchor_eye;
#else
spBC.x = camera->view.lookat.eye.x;
spBC.y = camera->view.lookat.eye.y;
spBC.z = camera->view.lookat.eye.z;
#endif
f32 sp34 = -1.0f;
int sp30 = 0;
#if TARGET_PC
f32 var_f30 = star_fovy / 45.0f;
if (var_f30 >= 1.0f) {
var_f30 = 1.0f;
}
var_f30 = 1.0f - var_f30;
#else
f32 var_f30 = 0.0f;
if (dComIfGd_getView() != NULL) {
@@ -4179,7 +4231,7 @@ void dKyr_drawStar(Mtx drawMtx, u8** tex) {
}
var_f30 = 1.0f - var_f30;
}
#endif
f32 temp_f27 = 0.28f * (1.0f - var_f30);
sp98.x = 0.0f;