Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alternate preset 3D cabviewpoints #863

Merged
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
34 changes: 34 additions & 0 deletions Source/Documentation/Manual/cabs.rst
Expand Up @@ -1154,6 +1154,40 @@ Development Rules
StartDirection ( 12 0 0 )
)

- If also a rear cab is present, a second ``ORTS3DCab`` has to be added,
as follows::

ORTS3DCab(
ORTS3DCabFile ( Cab.s )
ORTS3DCabHeadPos ( 0.9 2.4 5.2 )
RotationLimit ( 40 60 0 )
StartDirection ( 12 180 0 )
)

- Alternate 3D cab viewpoints may be added, as in the example here below::

ORTSAlternate3DCabViewPoints
(
ORTSAlternate3DCabViewPoint(
ORTS3DCabFile ( Cab.s )
ORTS3DCabHeadPos ( 0.9 2.4 5.2 )
RotationLimit ( 40 60 0 )
StartDirection ( 12 0 0 )
)
ORTSAlternate3DCabViewPoint(
ORTS3DCabFile ( Cab.s )
ORTS3DCabHeadPos ( -0.8 2.4 5.2 )
RotationLimit ( 40 60 0 )
StartDirection ( 12 30 0 )
)
)


- To switch between alternate cab viewpoints ``Ctrl-Shift-1`` must be pressed.
If there aren't alternate viewpoints defined, and if there is no rear cab,
pressing ``Ctrl-Shift-1`` toggles between the base viewpoint and a symmetrical
one on the longitudinal axis.

.. index::
single: EXTERNALWIPERS
single: AMMETER
Expand Down
1 change: 1 addition & 0 deletions Source/ORTS.Common/Input/UserCommand.cs
Expand Up @@ -77,6 +77,7 @@ public enum UserCommand

[GetString("Camera Cab")] CameraCab,
[GetString("Camera Change Passenger Viewpoint")] CameraChangePassengerViewPoint,
[GetString("Camera Change 3DCab Viewpoint")] CameraChange3DCabViewPoint,
[GetString("Camera Toggle 3D Cab")] CameraToggleThreeDimensionalCab,
[GetString("Camera Toggle Show Cab")] CameraToggleShowCab,
[GetString("Camera Toggle Letterbox Cab")] CameraToggleLetterboxCab,
Expand Down
1 change: 1 addition & 0 deletions Source/ORTS.Settings/InputSettings.cs
Expand Up @@ -332,6 +332,7 @@ static void InitializeCommands(UserCommandInput[] Commands)
Commands[(int)UserCommand.CameraScrollLeft] = new UserCommandModifiableKeyInput(0x4B, KeyModifiers.Alt);
Commands[(int)UserCommand.CameraScrollRight] = new UserCommandModifiableKeyInput(0x4D, KeyModifiers.Alt);
Commands[(int)UserCommand.CameraChangePassengerViewPoint] = new UserCommandKeyInput(0x06, KeyModifiers.Shift);
Commands[(int)UserCommand.CameraChange3DCabViewPoint] = new UserCommandKeyInput(0x02, KeyModifiers.Control | KeyModifiers.Shift);
Commands[(int)UserCommand.CameraToggleLetterboxCab] = new UserCommandKeyInput(0x02, KeyModifiers.Control);
Commands[(int)UserCommand.CameraToggleShowCab] = new UserCommandKeyInput(0x02, KeyModifiers.Shift);
Commands[(int)UserCommand.CameraTrackside] = new UserCommandKeyInput(0x05);
Expand Down
16 changes: 16 additions & 0 deletions Source/Orts.Simulation/Simulation/RollingStocks/MSTSWagon.cs
Expand Up @@ -1510,6 +1510,13 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
}
else stf.SkipRestOfBlock();
break;
case "wagon(ortsalternate3dcabviewpoints": // accepted only if there is already a 3D cabview
if (Cab3DShapeFileName != null)
{
ParseAlternate3DCabViewPoints(stf);
}
else stf.SkipRestOfBlock();
break;
default:
if (MSTSBrakeSystem != null)
MSTSBrakeSystem.Parse(lowercasetoken, stf);
Expand Down Expand Up @@ -1750,6 +1757,15 @@ protected void ParseAlternatePassengerViewPoints(STFReader stf)
});
}

// parses additional 3Dcab viewpoints, if any
protected void ParseAlternate3DCabViewPoints(STFReader stf)
{
stf.MustMatch("(");
stf.ParseBlock(new[] {
new STFReader.TokenProcessor("ortsalternate3dcabviewpoint", ()=>{ Parse3DCab(stf); }),
});
}

public static float ParseFloat(string token)
{ // is there a better way to ignore any suffix?
while (token.Length > 0)
Expand Down
5 changes: 3 additions & 2 deletions Source/Orts.Simulation/Simulation/RollingStocks/TrainCar.cs
Expand Up @@ -2275,8 +2275,9 @@ public bool HasRear3DCab
{
var loco = this as MSTSLocomotive;
var i = (int)CabViewType.Rear;
if (loco == null || loco.CabView3D == null) return false;
return (loco.CabView3D.ViewPointList.Count > i);
if (loco == null || loco.CabView3D == null || loco.CabView3D.ViewPointList.Count <= i) return false;
var cabViewAngle = loco.CabView3D.ViewPointList[i].StartDirection.Y;
return ((cabViewAngle >= 90 && cabViewAngle <= 270) || (cabViewAngle <= -90 && cabViewAngle >= -270));
}
}

Expand Down
26 changes: 20 additions & 6 deletions Source/RunActivity/Viewer3D/Cameras.cs
Expand Up @@ -1758,6 +1758,12 @@ public override void Reset()
XRadians = StartViewPointRotationXRadians;
YRadians = StartViewPointRotationYRadians;
}

public void SwitchSideCameraCar(TrainCar car)
{
attachedLocation.X = -attachedLocation.X;
RotationYRadians = -RotationYRadians;
}
}

public class PassengerCamera : InsideThreeDimCamera
Expand Down Expand Up @@ -1814,12 +1820,6 @@ public override void HandleUserInput(ElapsedTime elapsedTime)
new CameraChangePassengerViewPointCommand(Viewer.Log);
}

public void SwitchSideCameraCar(TrainCar car)
{
attachedLocation.X = -attachedLocation.X;
RotationYRadians = -RotationYRadians;
}

public void ChangePassengerViewPoint(TrainCar car)
{
ActViewPoint++;
Expand Down Expand Up @@ -1925,6 +1925,20 @@ public override bool IsUnderground
return attachedCar.WorldPosition.Location.Y + TerrainAltitudeMargin < elevationAtCameraTarget || attachedCar.CarTunnelData.LengthMOfTunnelAheadFront > 0;
}
}

public override void HandleUserInput(ElapsedTime elapsedTime)
{
base.HandleUserInput(elapsedTime);
if (UserInput.IsPressed(UserCommand.CameraChange3DCabViewPoint))
new CameraChange3DCabViewPointCommand(Viewer.Log);
}

public void Change3DCabViewPoint(TrainCar car)
{
ActViewPoint++;
if (ActViewPoint >= car.CabViewpoints.Count) ActViewPoint = 0;
SetCameraCar(car);
}
}

public class HeadOutCamera : NonTrackingCamera
Expand Down
18 changes: 18 additions & 0 deletions Source/RunActivity/Viewer3D/Commands.cs
Expand Up @@ -947,6 +947,24 @@ public override void Redo()
}
}

[Serializable()]
public sealed class CameraChange3DCabViewPointCommand : UseCameraCommand
{

public CameraChange3DCabViewPointCommand(CommandLog log)
: base(log)
{
Redo();
}

public override void Redo()
{
if (Receiver.Camera.AttachedCar.CabViewpoints.Count == 1)
Receiver.ThreeDimCabCamera.SwitchSideCameraCar(Receiver.Camera.AttachedCar);
else Receiver.ThreeDimCabCamera.Change3DCabViewPoint(Receiver.Camera.AttachedCar);
// Report();
}
}
[Serializable()]
public sealed class ToggleBrowseBackwardsCommand : UseCameraCommand
{
Expand Down
2 changes: 1 addition & 1 deletion Source/RunActivity/Viewer3D/Viewer.cs
Expand Up @@ -121,7 +121,7 @@ public class Viewer
/// <summary>
/// Camera #1, 3D cab. Swaps with <see cref="CabCamera"/> with Alt+1.
/// </summary>
private readonly ThreeDimCabCamera ThreeDimCabCamera;
public readonly ThreeDimCabCamera ThreeDimCabCamera;
public HeadOutCamera HeadOutForwardCamera { get; private set; } // Camera 1+Up
public HeadOutCamera HeadOutBackCamera { get; private set; } // Camera 2+Down
public TrackingCamera FrontCamera { get; private set; } // Camera 2
Expand Down