diff --git a/src/d_netcmd.c b/src/d_netcmd.c index c1d60fa5b..7d830ae48 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2255,7 +2255,7 @@ static void Command_View_f(void) return; } - if (demo.freecam) + if (camera[viewnum-1].freecam) return; displayplayerp = &displayplayers[viewnum-1]; diff --git a/src/g_demo.c b/src/g_demo.c index 3f8ab63c6..93e54cbad 100644 --- a/src/g_demo.c +++ b/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 diff --git a/src/g_game.c b/src/g_game.c index e3fe917e0..67024a729 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -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)) { diff --git a/src/k_hud.c b/src/k_hud.c index 3602bab6c..f5693c400 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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 { diff --git a/src/k_kart.c b/src/k_kart.c index e4dfbcfdd..0f0d30d94 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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; diff --git a/src/m_menu.c b/src/m_menu.c index e023026ea..d5fe7d032 100644 --- a/src/m_menu.c +++ b/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; diff --git a/src/p_local.h b/src/p_local.h index e61057ef5..7598a7647 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -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); diff --git a/src/p_user.c b/src/p_user.c index 0a56b9bcf..4475b9c2c 100644 --- a/src/p_user.c +++ b/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); diff --git a/src/r_main.cpp b/src/r_main.cpp index dc4799b49..678da36f6 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -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; diff --git a/src/r_main.h b/src/r_main.h index c3dd7a5b4..cf4b02c0c 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -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; diff --git a/src/s_sound.c b/src/s_sound.c index 14b9ba89c..21369732a 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -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) diff --git a/src/st_stuff.c b/src/st_stuff.c index 74e6bfce7..2e404b3e8 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -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) {