Render environment probe at player position

This commit is contained in:
Magnus Norddahl 2025-02-16 19:03:45 +01:00
commit 3f01630b8a
10 changed files with 131 additions and 44 deletions

View file

@ -56,6 +56,7 @@ EXTERN_CVAR(Bool, gl_bandedswlight)
EXTERN_CVAR(Bool, lm_dynlights);
CVAR(Bool, gl_raytrace, false, 0/*CVAR_ARCHIVE | CVAR_GLOBALCONFIG*/)
CVAR(Bool, gl_lightprobe, false, 0/*CVAR_ARCHIVE | CVAR_GLOBALCONFIG*/)
extern bool NoInterpolateView;
@ -108,11 +109,11 @@ void CollectLights(FLevelLocals* Level)
//
//-----------------------------------------------------------------------------
sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bounds, float fov, float ratio, float fovratio, bool mainview, bool toscreen)
sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bounds, float fov, float ratio, float fovratio, bool mainview, bool toscreen, int side)
{
auto& RenderState = *screen->RenderState();
R_SetupFrame(mainvp, r_viewwindow, camera);
R_SetupFrame(mainvp, r_viewwindow, camera, side);
if (mainview && toscreen && !(camera->Level->flags3 & LEVEL3_NOSHADOWMAP) && camera->Level->HasDynamicLights && gl_light_shadows > 0 && !lm_dynlights)
{
@ -399,6 +400,22 @@ sector_t* RenderView(player_t* player)
});
});
}
if (gl_lightprobe)
{
// Render the light probes if not found in a lump
// To do: we need light probe actors
AActor* lightprobe = player->camera;
if (lightprobe)
{
screen->RenderEnvironmentMap([=](IntRect& bounds, int side)
{
FRenderViewpoint probevp;
RenderViewpoint(probevp, lightprobe, &bounds, 90.0, 1.0f, 1.0f, false, false, side);
});
}
}
NoInterpolateView = saved_niv;
// now render the main view

View file

@ -375,7 +375,7 @@ private:
};
void CleanSWDrawer();
sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bounds, float fov, float ratio, float fovratio, bool mainview, bool toscreen);
sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bounds, float fov, float ratio, float fovratio, bool mainview, bool toscreen, int side = -1);
void WriteSavePic(player_t* player, FileWriter* file, int width, int height);
sector_t* RenderView(player_t* player);

View file

@ -903,7 +903,7 @@ static void R_DoActorTickerAngleChanges(player_t* const player, DRotator& angles
EXTERN_CVAR(Float, chase_dist)
EXTERN_CVAR(Float, chase_height)
void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AActor* const actor)
void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AActor* const actor, int side)
{
viewPoint.TicFrac = I_GetTimeFrac();
if (cl_capfps || r_NoInterpolate)
@ -1067,6 +1067,41 @@ void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AA
R_InterpolateView(viewPoint, player, viewPoint.TicFrac, iView);
if (side != -1) // Cubemap rendering
{
DRotator cubeside;
cubeside.Roll = DAngle::fromDeg(0);
switch (side)
{
default:
case 0: // +X
cubeside.Yaw = DAngle::fromDeg(0);
cubeside.Pitch = DAngle::fromDeg(0);
break;
case 1: // +Y
cubeside.Yaw = DAngle::fromDeg(90);
cubeside.Pitch = DAngle::fromDeg(0);
break;
case 2: // +Z
cubeside.Yaw = DAngle::fromDeg(0);
cubeside.Pitch = DAngle::fromDeg(90);
break;
case 3: // -X
cubeside.Yaw = DAngle::fromDeg(180);
cubeside.Pitch = DAngle::fromDeg(0);
break;
case 4: // -Y
cubeside.Yaw = DAngle::fromDeg(-90);
cubeside.Pitch = DAngle::fromDeg(0);
break;
case 5: // -Z
cubeside.Yaw = DAngle::fromDeg(0);
cubeside.Pitch = DAngle::fromDeg(-90);
break;
}
viewPoint.Angles = cubeside;
}
viewPoint.SetViewAngle(viewWindow);
// Keep the view within the sector's floor and ceiling

View file

@ -126,8 +126,7 @@ void R_ClearInterpolationPath();
void R_AddInterpolationPoint(const DVector3a &vec);
void R_SetViewSize (int blocks);
void R_SetFOV (FRenderViewpoint &viewpoint, DAngle fov);
void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AActor* const camera);
void R_SetViewAngle (FRenderViewpoint &viewpoint, const FViewWindow &viewwindow);
void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AActor* const camera, int side = -1);
// Called by startup code.
void R_Init (void);