SpectatorCamera can now follow the 'tracer' actor. Also added a 'lagdistance' property for lazy follow.

This commit is contained in:
Dileep V. Reddy 2024-01-29 03:19:42 -07:00 committed by Rachael Alexanderson
parent 2b555d7556
commit 7fbb4cd06c
1 changed files with 50 additions and 9 deletions

View File

@ -132,6 +132,11 @@ class AimingCamera : SecurityCamera
class SpectatorCamera : Actor
{
double lagdistance;
bool chasing_tracer;
property lagdistance : lagdistance;
property chasing_tracer : chasing_tracer;
default
{
+NOBLOCKMAP
@ -140,29 +145,65 @@ class SpectatorCamera : Actor
+NOINTERACTION
RenderStyle "None";
CameraHeight 0;
SpectatorCamera.chasing_tracer false;
SpectatorCamera.lagdistance 0.0;
}
void Init(double dist, double yaw, double inpitch, int inflags)
{
if(((inflags > 0) && (inflags & VPSF_ORTHOGRAPHIC)) || ((inflags < 0) && (ViewPos.Flags & VPSF_ORTHOGRAPHIC))) dist *= 3.0;
SetViewPos((-dist*Cos(yaw), -dist*Sin(yaw), dist*Tan(inpitch)-0.5*players[consoleplayer].mo.height), inflags);
// CameraHeight = players[consoleplayer].mo.viewheight; // Not used
double zshift = 0.0;
if(tracer != NULL)
{
if(player != NULL) zshift = -0.5*tracer.height;
else zshift = 0.5*tracer.height;
}
else if (player != NULL && player.mo != NULL) zshift = -0.5*player.mo.height;
SetViewPos((-dist*Cos(yaw), -dist*Sin(yaw), dist*Tan(inpitch)+zshift), inflags);
LookAtSelf(inpitch);
}
void LookAtSelf(double inpitch)
{
if(ViewPos.Offset != (0., 0., 0.))
{
Vector3 negviewpos = (-1.0) * ViewPos.Offset;
angle = negviewpos.Angle();
pitch = inpitch;
}
if(ViewPos.Offset != (0., 0., 0.))
{
Vector3 negviewpos = (-1.0) * ViewPos.Offset;
angle = negviewpos.Angle();
pitch = inpitch;
}
}
override void Tick()
{
if(player != NULL)
if(tracer != NULL)
{
Vector3 distvec = tracer.pos - pos;
double dist = distvec.length();
if((dist <= 4 && chasing_tracer) || lagdistance <= 0.0) // Keep tracer centered on screen
{
SetOrigin(tracer.pos, true);
chasing_tracer = false;
}
else // Lazy follow tracer
{
if(dist >= 2*lagdistance)
{
SetOrigin(tracer.pos, true);
chasing_tracer = false;
}
else if(dist > lagdistance && !chasing_tracer) chasing_tracer = true;
if(chasing_tracer)
{
speed = tracer.vel.xy.length()/dist;
if(speed == 0.0) speed = tracer.speed/dist;
SetOrigin(pos + 2*distvec*speed, true);
}
}
}
else if(player != NULL && player.mo != NULL)
{
cameraFOV = player.FOV;
SetOrigin(player.mo.pos, true);