Move freecam state to camera_t

Based on fa89576f34 p1 still controls both cameras for now.
This commit is contained in:
NepDisk 2025-04-01 13:57:27 -04:00
parent 408a64ab4b
commit 911afb22a6
12 changed files with 81 additions and 65 deletions

View file

@ -2255,7 +2255,7 @@ static void Command_View_f(void)
return;
}
if (demo.freecam)
if (camera[viewnum-1].freecam)
return;
displayplayerp = &displayplayers[viewnum-1];

View file

@ -1709,9 +1709,6 @@ void G_ConfirmRewind(tic_t rewindtime)
COM_BufInsertText("renderview on\n");
if (demo.freecam)
return; // don't touch from there
splitscreen = oldss;
displayplayers[0] = olddp1;
displayplayers[1] = olddp2;
@ -3990,7 +3987,13 @@ void G_StopDemo(void)
demo.timing = false;
singletics = false;
demo.freecam = false;
{
UINT8 i;
for (i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
{
camera[i].freecam = false;
}
}
if (gamestate == GS_INTERMISSION)
Y_EndIntermission(); // cleanup

View file

@ -1588,7 +1588,7 @@ boolean G_Responder(event_t *ev)
}
}
if (gamestate == GS_LEVEL && ev->type == ev_keydown && multiplayer && demo.playback && !demo.freecam)
if (gamestate == GS_LEVEL && ev->type == ev_keydown && multiplayer && demo.playback)
{
if (G_ControlBoundToKey(1, gc_viewpoint, ev->data1, false))
{

View file

@ -2617,7 +2617,7 @@ static boolean K_ShowPlayerNametag(player_t *p)
return false;
}
if (demo.playback == true && demo.freecam == true)
if (demo.playback == true && camera[R_GetViewNumber()].freecam == true)
{
return true;
}
@ -3046,7 +3046,7 @@ static void K_drawKartNameTags(void)
if (result.onScreen == true)
{
if (!(demo.playback == true && demo.freecam == true))
if (!(demo.playback == true && camera[cnum].freecam == true))
{
for (j = 0; j <= r_splitscreen; j++)
{
@ -4493,7 +4493,8 @@ void K_drawKartHUD(void)
{
boolean islonesome = false;
boolean battlefullscreen = false;
boolean freecam = demo.freecam; //disable some hud elements w/ freecam
UINT8 viewnum = R_GetViewNumber();
boolean freecam = camera[viewnum].freecam; //disable some hud elements w/ freecam
UINT8 i;
// Define the X and Y for each drawn object
@ -4568,7 +4569,7 @@ void K_drawKartHUD(void)
islonesome = K_drawKartPositionFaces();
}
if (!stplyr->spectator && !demo.freecam) // Bottom of the screen elements, don't need in spectate mode
if (!stplyr->spectator && !freecam) // Bottom of the screen elements, don't need in spectate mode
{
if (demo.title) // Draw title logo instead in demo.titles
{

View file

@ -1457,7 +1457,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
dontforcespb = true;
// This makes the roulette produce the random noises.
if ((player->itemroulette % 3) == 1 && P_IsDisplayPlayer(player) && !demo.freecam)
if ((player->itemroulette % 3) == 1 && P_IsDisplayPlayer(player))
{
#define PLAYROULETTESND S_StartSound(NULL, sfx_itrol1 + ((player->itemroulette / 3) % 8))
for (i = 0; i <= r_splitscreen; i++)
@ -1535,7 +1535,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
//player->itemblinkmode = 1;
player->itemroulette = 0;
player->roulettetype = 0;
if (P_IsDisplayPlayer(player) && !demo.freecam)
if (P_IsDisplayPlayer(player))
S_StartSound(NULL, sfx_itrole);
return;
}
@ -1550,7 +1550,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
player->itemblinkmode = 2;
player->itemroulette = 0;
player->roulettetype = 0;
if (P_IsDisplayPlayer(player) && !demo.freecam)
if (P_IsDisplayPlayer(player))
S_StartSound(NULL, sfx_dbgsal);
return;
}
@ -1712,7 +1712,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
player->itemamount = 1;
}
if (P_IsDisplayPlayer(player) && !demo.freecam)
if (P_IsDisplayPlayer(player))
S_StartSound(NULL, ((player->roulettetype == 1) ? sfx_itrolk : (mashed ? sfx_itrolm : sfx_itrolf)));
player->itemblink = TICRATE;

View file

@ -4220,18 +4220,13 @@ void M_PlaybackToggleFreecam(INT32 choice)
R_ExecuteSetViewSize();
P_InitCameraCmd(); // init camera controls
if (!demo.freecam) // toggle on
UINT8 i;
for (i = 0; i <= r_splitscreen; ++i)
{
demo.freecam = true;
democam.button_a_held = 2;
}
else // toggle off
{
demo.freecam = false;
P_ToggleDemoCamera(i);
}
}
void M_PlaybackQuit(INT32 choice)
{
(void)choice;

View file

@ -95,6 +95,8 @@ void P_UnlinkThinker(thinker_t *thinker);
struct camera_t
{
boolean chase;
boolean freecam;
angle_t aiming;
// Things used by FS cameras.
@ -128,6 +130,11 @@ struct camera_t
// SRB2Kart: camera pitches on slopes
angle_t pitch;
// Freecam: A button was held since entering from menu, so don't move camera
UINT8 button_a_held;
boolean reset_aiming; // camera aiming needs to be reset from chase camera
// Interpolation data
fixed_t old_x, old_y, old_z;
angle_t old_angle, old_aiming;
@ -136,15 +143,6 @@ struct camera_t
UINT8 postimgflags;
};
// demo freecam or something before i commit die
struct demofreecam_s {
UINT8 button_a_held; // A button was held since entering from menu, so don't move camera
boolean reset_aiming; // camera aiming needs to be reset from chase camera
};
extern struct demofreecam_s democam;
// post process types
enum
{
@ -170,6 +168,7 @@ void P_ResetCamera(player_t *player, camera_t *thiscam);
boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam);
void P_SlideCameraMove(camera_t *thiscam);
void P_DemoCameraMovement(camera_t *cam);
void P_ToggleDemoCamera(UINT8 viewnum);
boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled);
void P_InitCameraCmd(void);
void P_CalcChasePostImg(player_t *player, camera_t *thiscam);

View file

@ -1137,17 +1137,17 @@ boolean P_IsDisplayPlayer(player_t *player)
return false;
}
// Freecam still techically has a player in
// displayplayers. But since the camera is detached, it
// would be weird if sounds were heard from that player's
// perspective.
if (demo.freecam)
{
return false;
}
for (i = 0; i <= r_splitscreen; i++) // DON'T skip P1
{
if (camera[i].freecam)
{
// Freecam still techically has a player in
// displayplayers. But since the camera is
// detached, it would be weird if sounds were
// heard from that player's perspective.
continue;
}
if (player == &players[displayplayers[i]])
return true;
}
@ -2644,7 +2644,6 @@ fixed_t t_cam_height[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42};
fixed_t t_cam_rotate[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42};
static ticcmd_t cameracmd;
struct demofreecam_s democam;
// called by m_menu to reinit cam input every time it's toggled
void P_InitCameraCmd(void)
@ -2667,13 +2666,13 @@ void P_DemoCameraMovement(camera_t *cam)
{
cam->aiming += cmd->aiming << TICCMD_REDUCE;
democam.reset_aiming = false;
cam->reset_aiming = false;
}
cam->angle += cmd->turning << TICCMD_REDUCE;
// camera movement:
if (!democam.button_a_held)
if (!cam->button_a_held)
{
if (cmd->buttons & BT_ACCELERATE)
{
@ -2687,19 +2686,19 @@ void P_DemoCameraMovement(camera_t *cam)
}
}
if (!(cmd->buttons & BT_ACCELERATE) && democam.button_a_held)
if (!(cmd->buttons & (BT_ACCELERATE | BT_DRIFT)) && cam->button_a_held)
{
democam.button_a_held--;
cam->button_a_held--;
}
// if you hold item, you will lock on to displayplayer. (The last player you were ""f12-ing"")
if (demo.freecam && cmd->buttons & BT_ATTACK)
if (cam->freecam && cmd->buttons & BT_ATTACK)
{
lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot.
cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y);
cam->aiming = R_PointToAngle2(0, cam->z, R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y), lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads.
democam.reset_aiming = false;
cam->reset_aiming = false;
}
if (cmd->forwardmove != 0)
@ -2713,7 +2712,7 @@ void P_DemoCameraMovement(camera_t *cam)
// forward/back will have a slope. So, as long as democam
// controls haven't been used to alter the vertical angle,
// slowly reset it to flat.
if (democam.reset_aiming && moving)
if ((cam->reset_aiming && moving) || ((cmd->buttons & BT_DRIFT) && !cam->button_a_held))
{
INT32 aiming = cam->aiming;
INT32 smooth = FixedMul(ANGLE_11hh / 4, FCOS(cam->aiming));
@ -2725,7 +2724,7 @@ void P_DemoCameraMovement(camera_t *cam)
else
{
cam->aiming = 0;
democam.reset_aiming = false; // completely smoothed out
cam->reset_aiming = false; // completely smoothed out
}
}
@ -2740,7 +2739,7 @@ void P_DemoCameraMovement(camera_t *cam)
cam->x += FixedMul(cmd->forwardmove*mapobjectscale, FINECOSINE(thrustangle));
cam->y += FixedMul(cmd->forwardmove*mapobjectscale, FINESINE(thrustangle));
if (!democam.reset_aiming)
if (!cam->reset_aiming)
{
cam->z += FixedMul(cmd->forwardmove*mapobjectscale, AIMINGTOSLOPE(cam->aiming));
}
@ -2754,12 +2753,28 @@ void P_DemoCameraMovement(camera_t *cam)
cam->subsector = R_PointInSubsectorFast(cam->x, cam->y);
}
void P_ToggleDemoCamera(UINT8 viewnum)
{
camera_t *cam = &camera[viewnum];
if (!cam->freecam) // toggle on
{
cam->freecam = true;
cam->button_a_held = 2;
cam->reset_aiming = true;
}
else // toggle off
{
cam->freecam = false;
}
}
void P_ResetCamera(player_t *player, camera_t *thiscam)
{
tic_t tries = 0;
fixed_t x, y, z;
if (demo.freecam)
if (thiscam->freecam)
return; // do not reset the camera there.
if (!player->mo)
@ -2828,7 +2843,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
if (thiscam->subsector == NULL || thiscam->subsector->sector == NULL)
return true;
if (demo.freecam || player->spectator)
if (thiscam->freecam || player->spectator)
{
P_DemoCameraMovement(thiscam);
P_CalcChasePostImg(player, thiscam);

View file

@ -914,13 +914,13 @@ void R_ApplyViewMorph(int s)
width*vid.bpp, height, width*vid.bpp, vid.width);
}
angle_t R_ViewRollAngle(const player_t *player)
angle_t R_ViewRollAngle(const player_t *player, UINT8 viewnum)
{
angle_t roll = player->viewrollangle;
if (cv_tilting.value)
{
if (!player->spectator && !demo.freecam)
if (!player->spectator && !camera[viewnum].freecam)
{
roll += player->tilt;
}
@ -1203,13 +1203,14 @@ R_SetupCommonFrame
( player_t * player,
subsector_t * subsector)
{
const UINT8 viewnum = R_GetViewNumber();
newview->player = player;
newview->x += quake.x;
newview->y += quake.y;
newview->z += quake.z;
newview->roll = R_ViewRollAngle(player);
newview->roll = R_ViewRollAngle(player, viewnum);
if (subsector)
newview->sector = subsector->sector;

View file

@ -192,7 +192,7 @@ void R_Init(void);
void R_CheckViewMorph(int split);
void R_ApplyViewMorph(int split);
angle_t R_ViewRollAngle(const player_t *player);
angle_t R_ViewRollAngle(const player_t *player, UINT8 viewnum);
// just sets setsizeneeded true
extern boolean setsizeneeded;

View file

@ -554,7 +554,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
listenmobj[i] = player->mo;
}
if (origin && origin == listenmobj[i] && !demo.freecam)
if (origin && origin == listenmobj[i] && !camera[i].freecam)
{
itsUs = true;
}
@ -871,15 +871,15 @@ void S_UpdateSounds(void)
{
boolean itsUs = false;
if (!demo.freecam)
for (i = r_splitscreen; i >= 0; i--)
{
for (i = r_splitscreen; i >= 0; i--)
{
if (c->origin != listenmobj[i])
continue;
if (camera[i].freecam)
continue;
itsUs = true;
}
if (c->origin != listenmobj[i])
continue;
itsUs = true;
}
if (itsUs == false)

View file

@ -726,6 +726,8 @@ void ST_preLevelTitleCardDrawer(void)
//
static void ST_overlayDrawer(void)
{
const UINT8 viewnum = R_GetViewNumber();
// hu_showscores = auto hide score/time/rings when tab rankings are shown
if (!(hu_showscores && (netgame || multiplayer)))
{
@ -743,7 +745,7 @@ static void ST_overlayDrawer(void)
{
if (cv_showviewpointtext.value)
{
if (!demo.title && !P_IsLocalPlayer(stplyr) && !demo.freecam)
if (!demo.title && !P_IsLocalPlayer(stplyr) && !camera[viewnum].freecam)
{
if (!r_splitscreen)
{