Move freecam state to camera_t
Based on fa89576f34 p1 still controls both cameras for now.
This commit is contained in:
parent
408a64ab4b
commit
911afb22a6
12 changed files with 81 additions and 65 deletions
|
|
@ -2255,7 +2255,7 @@ static void Command_View_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (demo.freecam)
|
||||
if (camera[viewnum-1].freecam)
|
||||
return;
|
||||
|
||||
displayplayerp = &displayplayers[viewnum-1];
|
||||
|
|
|
|||
11
src/g_demo.c
11
src/g_demo.c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
11
src/m_menu.c
11
src/m_menu.c
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
57
src/p_user.c
57
src/p_user.c
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue