Skip to content

Commit 4a0a657

Browse files
committed
Fix the lack of sync between camera 2/3 and F9.
1 parent 30bcba4 commit 4a0a657

File tree

4 files changed

+146
-35
lines changed

4 files changed

+146
-35
lines changed

Source/RunActivity/Viewer3D/Cameras.cs

Lines changed: 71 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
using Orts.Simulation.Physics;
3030
using Orts.Simulation.RollingStocks;
3131
using Orts.Simulation.Signalling;
32+
using Orts.Viewer3D;
3233
using Orts.Viewer3D.Popups;
3334
using ORTS.Common;
3435
using ORTS.Common.Input;
@@ -992,6 +993,14 @@ public enum AttachedTo { Front, Rear }
992993
protected float HighWagonOffsetLimit;
993994
public int oldCarPosition;
994995
public bool IsCameraFront;
996+
public bool IsVisibleTrainCarViewerOrWebpage;
997+
public bool IsVisibleTrainCarWebPage;
998+
public bool IsDownCameraOutsideFront;
999+
public bool IsDownCameraOutsideRear;
1000+
public UserCommand? CameraCommand;
1001+
private static UserCommand? GetPressedKey(params UserCommand[] keysToTest) => keysToTest
1002+
.Where((UserCommand key) => UserInput.IsDown(key))
1003+
.FirstOrDefault();
9951004
public override bool IsUnderground
9961005
{
9971006
get
@@ -1072,46 +1081,64 @@ protected override void OnActivate(bool sameCamera)
10721081
var isDownCameraOutsideFront = UserInput.IsDown(UserCommand.CameraOutsideFront);
10731082
var isDownCameraOutsideRear = UserInput.IsDown(UserCommand.CameraOutsideRear);
10741083

1075-
bool isVisibleTrainCarViewerOrWebpage;
10761084
if (Viewer.TrainCarOperationsWebpage == null)
10771085
{
10781086
// when starting Open Rails by means of a restore Viewer.TrainCarOperationsWebpage not yet available
1079-
isVisibleTrainCarViewerOrWebpage = Viewer.TrainCarOperationsViewerWindow.Visible;
1087+
IsVisibleTrainCarViewerOrWebpage = Viewer.TrainCarOperationsViewerWindow.Visible;
10801088
}
10811089
else
10821090
{
1083-
isVisibleTrainCarViewerOrWebpage = (Viewer.TrainCarOperationsWindow.Visible && !Viewer.TrainCarOperationsViewerWindow.Visible) || Viewer.TrainCarOperationsViewerWindow.Visible || (Viewer.TrainCarOperationsWebpage?.Connections > 0 && Viewer.TrainCarOperationsWebpage.TrainCarSelected);
1091+
IsVisibleTrainCarViewerOrWebpage = (Viewer.TrainCarOperationsWindow.Visible && !Viewer.TrainCarOperationsViewerWindow.Visible) || Viewer.TrainCarOperationsViewerWindow.Visible || (Viewer.TrainCarOperationsWebpage?.Connections > 0 && Viewer.TrainCarOperationsWebpage.TrainCarSelected);
10841092
}
10851093

1086-
if (isVisibleTrainCarViewerOrWebpage)
1094+
if (IsVisibleTrainCarViewerOrWebpage)
10871095
{
10881096
// Update the camera view
10891097
oldCarPosition = oldCarPosition == 0 && carPosition == 0 ? -1 : oldCarPosition;
10901098
}
10911099

1092-
if (attachedCar != null && !isVisibleTrainCarViewerOrWebpage)
1100+
if (attachedCar != null && !IsVisibleTrainCarViewerOrWebpage)
10931101
{ // Reset behaviour of camera 2 and camera 3, after closing F9-window and F9-web.
1094-
var attachedCarPosition = attachedCar.Train.Cars.TakeWhile(x => x.CarID != attachedCar.CarID).Count();
1095-
if (Front && attachedCarPosition == carPosition)
1102+
var attachedCarPosition = Front ? Viewer.CameraOutsideFrontPosition : Viewer.CameraOutsideRearPosition;
1103+
1104+
Viewer.FirstLoop = false;
1105+
if (Front)
10961106
{
1097-
attachedCar = trainCars.First();
1107+
SetCameraCar(trainCars[Viewer.CameraOutsideFrontPosition]);
1108+
Viewer.CameraFrontUpdated = true;
10981109
}
1099-
if (!Front && attachedCarPosition == carPosition)
1110+
else
11001111
{
1101-
attachedCar = trainCars.Last();
1112+
if (Viewer.CameraOutsideRearPosition == 0)
1113+
{
1114+
SetCameraCar(GetCameraCars().Last());
1115+
}
1116+
else
1117+
{
1118+
if (Viewer.CameraOutsideRearPosition < trainCars.Count)
1119+
{
1120+
SetCameraCar(trainCars[Viewer.CameraOutsideRearPosition]);
1121+
}
1122+
else
1123+
{
1124+
SetCameraCar(trainCars[trainCars.Count - 1]);
1125+
}
1126+
}
1127+
Viewer.CameraRearUpdated = true;
11021128
}
1129+
Viewer.IsCameraPositionUpdated = Viewer.CameraFrontUpdated && Viewer.CameraRearUpdated;
11031130
}
11041131

11051132
if (attachedCar == null || attachedCar.Train != Viewer.SelectedTrain || carPosition != oldCarPosition)
11061133
{
11071134
if (Front)
11081135
{
1109-
if (!isVisibleTrainCarViewerOrWebpage && isDownCameraOutsideFront)
1136+
if (!IsVisibleTrainCarViewerOrWebpage && isDownCameraOutsideFront)
11101137
{
1111-
SetCameraCar(GetCameraCars().First());
1138+
if (Viewer.CameraOutsideFrontPosition == 0) SetCameraCar(GetCameraCars().First());
11121139
oldCarPosition = 0;
11131140
}
1114-
else if (isVisibleTrainCarViewerOrWebpage && carPosition >= 0)
1141+
else if (IsVisibleTrainCarViewerOrWebpage && carPosition >= 0)
11151142
{
11161143
if (carPosition < trainCars.Count)
11171144
{
@@ -1130,12 +1157,12 @@ protected override void OnActivate(bool sameCamera)
11301157
}
11311158
else
11321159
{
1133-
if (!isVisibleTrainCarViewerOrWebpage && isDownCameraOutsideRear)
1160+
if (!IsVisibleTrainCarViewerOrWebpage && isDownCameraOutsideRear)
11341161
{
1135-
SetCameraCar(GetCameraCars().Last());
1162+
if (Viewer.CameraOutsideRearPosition == 0) SetCameraCar(GetCameraCars().Last());
11361163
oldCarPosition = 0;
11371164
}
1138-
else if (carPosition < trainCars.Count && isVisibleTrainCarViewerOrWebpage && carPosition >= 0)
1165+
else if (carPosition < trainCars.Count && IsVisibleTrainCarViewerOrWebpage && carPosition >= 0)
11391166
{
11401167
SetCameraCar(trainCars[carPosition]);
11411168
oldCarPosition = carPosition;
@@ -1151,6 +1178,24 @@ protected override void OnActivate(bool sameCamera)
11511178
BrowseDistance = attachedCar.CarLengthM * 0.5f;
11521179
}
11531180
base.OnActivate(sameCamera);
1181+
CameraOutsidePosition();
1182+
}
1183+
1184+
public void CameraOutsidePosition()
1185+
{
1186+
if (!IsVisibleTrainCarViewerOrWebpage)
1187+
{
1188+
var attachedCarIdPos = attachedCar.Train.Cars.TakeWhile(x => x.CarID != attachedCar.CarID).Count();
1189+
if (Front)
1190+
{
1191+
Viewer.CameraOutsideFrontPosition = attachedCarIdPos;
1192+
}
1193+
else if (!Front)
1194+
{
1195+
Viewer.CameraOutsideRearPosition = attachedCarIdPos;
1196+
}
1197+
}
1198+
Viewer.IsCameraPositionUpdated = !IsVisibleTrainCarViewerOrWebpage;
11541199
}
11551200

11561201
protected override bool IsCameraFlipped()
@@ -1230,6 +1275,16 @@ public override void HandleUserInput(ElapsedTime elapsedTime)
12301275
new ToggleBrowseBackwardsCommand(Viewer.Log);
12311276
if (UserInput.IsPressed(UserCommand.CameraBrowseForwards))
12321277
new ToggleBrowseForwardsCommand(Viewer.Log);
1278+
1279+
UserCommand? CameraCommand = GetPressedKey(UserCommand.CameraCarPrevious, UserCommand.CameraCarNext,
1280+
UserCommand.CameraCarFirst, UserCommand.CameraCarLast);
1281+
1282+
if (CameraCommand == UserCommand.CameraCarPrevious || CameraCommand == UserCommand.CameraCarNext || CameraCommand == UserCommand.CameraCarFirst
1283+
|| CameraCommand == UserCommand.CameraCarLast)
1284+
{ // updates camera out side car position
1285+
CameraOutsidePosition();
1286+
Viewer.IsDownCameraChanged = IsDownCameraOutsideFront = IsDownCameraOutsideRear = false;
1287+
}
12331288
}
12341289

12351290
public override void Update(ElapsedTime elapsedTime)

Source/RunActivity/Viewer3D/Popups/TrainCarOperationsWindow.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,9 @@ public override void PrepareFrame(ElapsedTime elapsedTime, bool updateFull)
553553
{
554554
base.PrepareFrame(elapsedTime, updateFull);
555555

556-
if (UserInput.IsPressed(UserCommand.CameraCarNext) || UserInput.IsPressed(UserCommand.CameraCarPrevious) || UserInput.IsPressed(UserCommand.CameraCarFirst) || UserInput.IsPressed(UserCommand.CameraCarLast))
556+
if (UserInput.IsPressed(UserCommand.CameraCarNext) || UserInput.IsPressed(UserCommand.CameraCarPrevious)
557+
|| UserInput.IsPressed(UserCommand.CameraCarFirst) || UserInput.IsPressed(UserCommand.CameraCarLast)
558+
|| UserInput.IsDown(UserCommand.CameraOutsideFront) || UserInput.IsDown(UserCommand.CameraOutsideRear))
557559
CarPositionChanged = true;
558560

559561
if (OldLocation != Location)
@@ -575,6 +577,32 @@ public override void PrepareFrame(ElapsedTime elapsedTime, bool updateFull)
575577
SetCameraView();
576578
}
577579

580+
if (!Owner.Viewer.FirstLoop || Owner.Viewer.IsCameraPositionUpdated)
581+
{
582+
Owner.Viewer.CameraF9Reference = Owner.Viewer.FrontCamera.IsCameraFront;
583+
var currentCameraCarID = Owner.Viewer.Camera.AttachedCar.CarID;
584+
var currentCameraPosition = 0;
585+
if (PlayerTrain != null)
586+
{
587+
currentCameraPosition = PlayerTrain.Cars.TakeWhile(x => x.CarID != currentCameraCarID).Count();
588+
}
589+
590+
Owner.Viewer.FirstLoop = true;
591+
if (Owner.Viewer.CameraF9Reference)
592+
{
593+
SelectedCarPosition = SelectedCarPosition == 0 ? Owner.Viewer.CameraOutsideFrontPosition
594+
: SelectedCarPosition != 0 ? SelectedCarPosition
595+
: currentCameraPosition;
596+
}
597+
else
598+
{
599+
SelectedCarPosition = Owner.Viewer.CameraOutsideRearPosition;
600+
}
601+
CarPositionChanged = true;
602+
trainCarViewer.CouplerChanged = false;
603+
Owner.Viewer.IsCameraPositionUpdated = false;
604+
}
605+
578606
// Allows interaction with <Alt>+<PageDown> and <Alt>+<PageUP>.
579607
if (CarPositionChanged && Owner.Viewer.Camera.AttachedCar != null && !(Owner.Viewer.Camera is CabCamera) && Owner.Viewer.Camera != Owner.Viewer.ThreeDimCabCamera && (trainCarViewer.Visible || Visible))
580608
{
@@ -741,7 +769,7 @@ public void SetCameraView()
741769
BackActive = false;
742770
FrontActive = true;
743771
}
744-
if (Owner.Viewer.BackCamera.AttachedCar != null)
772+
else if (Owner.Viewer.BackCamera.AttachedCar != null)
745773
{
746774
Owner.Viewer.BackCamera.Activate();
747775
BackActive = true;

Source/RunActivity/Viewer3D/Viewer.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,14 @@ public bool IsBeforeNoon
272272
public static double DbfEvalIniAutoPilotTimeS = 0;//Debrief eval
273273
public static bool DbfEvalAutoPilot = false;//DebriefEval
274274
public bool IsFormationReversed; //Avoid flickering when reversal using TrainCarOperations window
275+
public int CameraOutsideFrontPosition { get; set; }
276+
public int CameraOutsideRearPosition { get; set; }
277+
public bool CameraF9Reference { get; set; }
278+
public bool FirstLoop { get; set; } = false;
279+
public bool IsDownCameraChanged { get; set; }
280+
public bool IsCameraPositionUpdated { get; set; } = false;
281+
public bool CameraFrontUpdated { get; set; }
282+
public bool CameraRearUpdated { get; set; }
275283

276284
/// <summary>
277285
/// Finds time of last entry to set ReplayEndsAt and provide the Replay started message.

Source/RunActivity/Viewer3D/WebServices/TrainCarOperationsWebpage.cs

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,21 @@
1717
//
1818

1919
using System;
20+
using System.Collections.Generic;
2021
using System.Diagnostics;
22+
using System.IO;
23+
using System.Linq;
24+
using System.Reflection;
2125
using System.Threading.Tasks;
2226
using EmbedIO.WebSockets;
2327
using Newtonsoft.Json;
24-
using System.Reflection;
25-
using Orts.Viewer3D.Popups;
26-
using Orts.Simulation.RollingStocks.SubSystems.PowerSupplies;
27-
using Orts.Simulation.RollingStocks;
28-
using System.Linq;
29-
using System.Collections.Generic;
3028
using Orts.Common;
29+
using Orts.Simulation.RollingStocks;
3130
using Orts.Simulation.RollingStocks.SubSystems.Brakes.MSTS;
31+
using Orts.Simulation.RollingStocks.SubSystems.PowerSupplies;
32+
using Orts.Viewer3D.Popups;
33+
using Orts.Viewer3D.RollingStock;
3234
using ORTS.Scripting.Api;
33-
using System.IO;
3435

3536
namespace Orts.Viewer3D.WebServices
3637
{
@@ -81,7 +82,7 @@ public OperationsStatus(int amountOfCars)
8182
public static int TrainCarSelectedPositionFromRestore;
8283

8384
public bool TrainCarSelected;
84-
public int TrainCarSelectedPosition;
85+
public int TrainCarSelectedPosition { get; set; }
8586
public string CurrentCarID { get; set; }
8687

8788
public int Connections = 0;
@@ -483,6 +484,8 @@ private void fillAndSendAsync(OperationsStatus statusCurrent, OperationsStatus s
483484
//
484485
private void fillStatusArrowLeft(int carPosition)
485486
{
487+
TrainCarOperationsWindow TrainCar = Viewer.TrainCarOperationsWindow;
488+
TrainCarOperationsViewerWindow TrainCarViewer = Viewer.TrainCarOperationsViewerWindow;
486489
string filename;
487490

488491
if (TrainCarFromRestore)
@@ -508,6 +511,7 @@ private void fillStatusArrowLeft(int carPosition)
508511
{
509512
TrainCarSelected = true;
510513
TrainCarSelectedPosition = Viewer.PlayerTrain.Cars.TakeWhile(x => x.CarID != currentCameraCarID).Count();
514+
TrainCarViewer.CarPosition = TrainCar.SelectedCarPosition = TrainCarSelectedPosition;
511515
}
512516
}
513517
}
@@ -698,18 +702,28 @@ public void buttonCouplerFrontClick(int carPosition)
698702
}
699703
else
700704
{
705+
// Uncouple only the selected car indicated by left yellow arrow
706+
if (TrainCarSelectedPosition != carPosition)
707+
return;
708+
701709
if (TrainCarSelectedPosition >= carPosition)
702710
{
703-
TrainCarSelected = false;
711+
TrainCarSelected = !TrainCar.Visible;
704712
}
705713

706714
new UncoupleCommand(Viewer.Log, carPosition - 1);
707715

708-
TrainCarViewer.CouplerChanged = TrainCar.CouplerClicked = true;
716+
TrainCarViewer.CouplerChanged = TrainCar.CouplerClicked = Viewer.IsDownCameraChanged = true;// Update the car's position
709717
TrainCarViewer.NewCarPosition = carPosition - 1;
710718
if (Viewer.CarOperationsWindow.CarPosition > carPosition - 1)
719+
{
711720
Viewer.CarOperationsWindow.Visible = false;
712-
Viewer.TrainCarOperationsWindow.SelectedCarPosition = 0;
721+
}
722+
if (TrainCarSelectedPosition >= carPosition)
723+
{
724+
TrainCarSelectedPosition = TrainCarViewer.NewCarPosition;
725+
}
726+
Viewer.FrontCamera.CameraOutsidePosition();
713727
}
714728
}
715729

@@ -741,13 +755,13 @@ public void buttonLocoClick(int carPosition)
741755
{
742756
if (TrainCarSelectedPosition == carPosition)
743757
{
744-
TrainCarSelected = false;
758+
TrainCarSelected = !TrainCar.Visible;
745759
}
746760
else
747761
{
748762
TrainCarSelectedPosition = carPosition;
749763
}
750-
}
764+
}
751765
else
752766
{
753767
TrainCarSelected = true;
@@ -799,17 +813,23 @@ public void buttonCouplerRearClick(int carPosition)
799813
}
800814
else
801815
{
802-
if (TrainCarSelectedPosition > carPosition)
816+
// Uncouple only the selected car indicated by left yellow arrow
817+
if (TrainCarSelectedPosition != carPosition)
818+
return;
819+
820+
if (TrainCarSelectedPosition >= carPosition)
803821
{
804-
TrainCarSelected = false;
822+
TrainCarSelected = !TrainCar.Visible;
805823
}
806824

807825
new UncoupleCommand(Viewer.Log, carPosition);
808826

809-
TrainCarViewer.CouplerChanged = TrainCar.CouplerClicked = true;
827+
TrainCarViewer.CouplerChanged = TrainCar.CouplerClicked = Viewer.IsDownCameraChanged = true;// Update the car's position
810828
if (Viewer.CarOperationsWindow.CarPosition > carPosition)
811829
Viewer.CarOperationsWindow.Visible = false;
812-
Viewer.TrainCarOperationsWindow.SelectedCarPosition = 0;
830+
831+
TrainCarViewer.NewCarPosition = carPosition;
832+
Viewer.FrontCamera.CameraOutsidePosition();
813833
}
814834
}
815835

0 commit comments

Comments
 (0)