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

Add RailIndex function for objects #1012

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 17 additions & 17 deletions source/LibRender2/BaseRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -524,14 +524,14 @@ public void Reset()
Initialize();
}

public int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, ObjectDisposalMode AccurateObjectDisposal, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double BlockLength, double TrackPosition, double Brightness)
public int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, ObjectDisposalMode AccurateObjectDisposal, WorldProperties Properties, double BlockLength)
{
Matrix4D Translate = Matrix4D.CreateTranslation(Position.X, Position.Y, -Position.Z);
Matrix4D Rotate = (Matrix4D)new Transformation(LocalTransformation, WorldTransformation);
return CreateStaticObject(Position, Prototype, LocalTransformation, Rotate, Translate, AccurateObjectDisposal, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, BlockLength, TrackPosition, Brightness);
return CreateStaticObject(Position, Prototype, LocalTransformation, Rotate, Translate, AccurateObjectDisposal, Properties, BlockLength);
}

public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transformation LocalTransformation, Matrix4D Rotate, Matrix4D Translate, ObjectDisposalMode AccurateObjectDisposal, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double BlockLength, double TrackPosition, double Brightness)
public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transformation LocalTransformation, Matrix4D Rotate, Matrix4D Translate, ObjectDisposalMode AccurateObjectDisposal, WorldProperties Properties, double BlockLength)
{
if (Prototype == null)
{
Expand Down Expand Up @@ -565,8 +565,8 @@ public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transfor
}
}

startingDistance += (float)AccurateObjectDisposalZOffset;
endingDistance += (float)AccurateObjectDisposalZOffset;
startingDistance += (float)Properties.AccurateObjectDisposalZOffset;
endingDistance += (float)Properties.AccurateObjectDisposalZOffset;
}

const double minBlockLength = 20.0;
Expand All @@ -579,21 +579,21 @@ public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transfor
switch (AccurateObjectDisposal)
{
case ObjectDisposalMode.Accurate:
startingDistance += (float)TrackPosition;
endingDistance += (float)TrackPosition;
double z = BlockLength * Math.Floor(TrackPosition / BlockLength);
StartingDistance = Math.Min(z - BlockLength, startingDistance);
EndingDistance = Math.Max(z + 2.0 * BlockLength, endingDistance);
startingDistance = (float)(BlockLength * Math.Floor(StartingDistance / BlockLength));
endingDistance = (float)(BlockLength * Math.Ceiling(EndingDistance / BlockLength));
startingDistance += (float)Properties.TrackPosition;
endingDistance += (float)Properties.TrackPosition;
double z = BlockLength * Math.Floor(Properties.TrackPosition / BlockLength);
Properties.StartingDistance = Math.Min(z - BlockLength, startingDistance);
Properties.EndingDistance = Math.Max(z + 2.0 * BlockLength, endingDistance);
startingDistance = (float)(BlockLength * Math.Floor(Properties.StartingDistance / BlockLength));
endingDistance = (float)(BlockLength * Math.Ceiling(Properties.EndingDistance / BlockLength));
break;
case ObjectDisposalMode.Legacy:
startingDistance = (float)StartingDistance;
endingDistance = (float)EndingDistance;
startingDistance = (float)Properties.StartingDistance;
endingDistance = (float)Properties.EndingDistance;
break;
case ObjectDisposalMode.Mechanik:
startingDistance = (float) StartingDistance;
endingDistance = (float) EndingDistance + 1500;
startingDistance = (float)Properties.StartingDistance;
endingDistance = (float)Properties.EndingDistance + 1500;
if (startingDistance < 0)
{
startingDistance = 0;
Expand All @@ -605,7 +605,7 @@ public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transfor
Prototype = Prototype,
Translation = Translate,
Rotate = Rotate,
Brightness = Brightness,
Brightness = Properties.Brightness,
StartingDistance = startingDistance,
EndingDistance = endingDistance,
WorldPosition = Position
Expand Down
8 changes: 4 additions & 4 deletions source/ObjectViewer/Hosts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -348,14 +348,14 @@ public override void ExecuteFunctionScript(OpenBveApi.FunctionScripting.Function
FunctionScripts.ExecuteFunctionScript(functionScript, (TrainBase)train, CarIndex, Position, TrackPosition, SectionIndex, IsPartOfTrain, TimeElapsed, CurrentState);
}

public override int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double TrackPosition, double Brightness)
public override int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, WorldProperties Properties)
{
return Program.Renderer.CreateStaticObject(Prototype, Position, WorldTransformation, LocalTransformation, ObjectDisposalMode.Accurate, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, 25.0, TrackPosition, Brightness);
return Program.Renderer.CreateStaticObject(Prototype, Position, WorldTransformation, LocalTransformation, ObjectDisposalMode.Accurate, Properties, 25.0);
}

public override int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation LocalTransformation, Matrix4D Rotate, Matrix4D Translate, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double TrackPosition, double Brightness)
public override int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation LocalTransformation, Matrix4D Rotate, Matrix4D Translate, WorldProperties Properties)
{
return Program.Renderer.CreateStaticObject(Position, Prototype, LocalTransformation, Rotate, Translate, ObjectDisposalMode.Accurate, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, 25.0, TrackPosition, Brightness);
return Program.Renderer.CreateStaticObject(Position, Prototype, LocalTransformation, Rotate, Translate, ObjectDisposalMode.Accurate, Properties, 25.0);
}

public override void CreateDynamicObject(ref ObjectState internalObject)
Expand Down
2 changes: 1 addition & 1 deletion source/ObjectViewer/ProgramS.cs
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ internal static void RefreshObjects()
{
if (CurrentHost.LoadObject(Files[i], Encoding.UTF8, out UnifiedObject o))
{
o.CreateObject(Vector3.Zero, 0.0, 0.0, 0.0);
o.CreateObject(Vector3.Zero, new WorldProperties());
}

}
Expand Down
4 changes: 2 additions & 2 deletions source/OpenBVE/Graphics/NewRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,15 @@ public override void Initialize()
Program.FileSystem.AppendToLogFile("Renderer initialised successfully.");
}

internal int CreateStaticObject(UnifiedObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, ObjectDisposalMode AccurateObjectDisposal, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double BlockLength, double TrackPosition, double Brightness)
internal int CreateStaticObject(UnifiedObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, ObjectDisposalMode AccurateObjectDisposal, double AccurateObjectDisposalZOffset, WorldProperties Properties, double BlockLength)
{
StaticObject obj = Prototype as StaticObject;
if (obj == null)
{
Interface.AddMessage(MessageType.Error, false, "Attempted to use an animated object where only static objects are allowed.");
return -1;
}
return base.CreateStaticObject(obj, Position, WorldTransformation, LocalTransformation, AccurateObjectDisposal, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, BlockLength, TrackPosition, Brightness);
return base.CreateStaticObject(obj, Position, WorldTransformation, LocalTransformation, AccurateObjectDisposal, Properties, BlockLength);
}

public override void UpdateViewport(int Width, int Height)
Expand Down
8 changes: 4 additions & 4 deletions source/OpenBVE/System/Host.cs
Original file line number Diff line number Diff line change
Expand Up @@ -473,14 +473,14 @@ public override void ExecuteFunctionScript(OpenBveApi.FunctionScripting.Function
FunctionScripts.ExecuteFunctionScript(functionScript, (TrainBase)train, CarIndex, Position, TrackPosition, SectionIndex, IsPartOfTrain, TimeElapsed, CurrentState);
}

public override int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double TrackPosition, double Brightness)
public override int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, WorldProperties Properties)
{
return Program.Renderer.CreateStaticObject(Prototype, Position, WorldTransformation, LocalTransformation, Program.CurrentRoute.AccurateObjectDisposal, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, Program.CurrentRoute.BlockLength, TrackPosition, Brightness);
return Program.Renderer.CreateStaticObject(Prototype, Position, WorldTransformation, LocalTransformation, Program.CurrentRoute.AccurateObjectDisposal, Properties, Program.CurrentRoute.BlockLength);
}

public override int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation LocalTransformation, Matrix4D Rotate, Matrix4D Translate, double AccurateObjectDisposalZOffset, double StartingDistance, double EndingDistance, double TrackPosition, double Brightness)
public override int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation LocalTransformation, Matrix4D Rotate, Matrix4D Translate, WorldProperties Properties)
{
return Program.Renderer.CreateStaticObject(Position, Prototype, LocalTransformation, Rotate, Translate, Program.CurrentRoute.AccurateObjectDisposal, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, Program.CurrentRoute.BlockLength, TrackPosition, Brightness);
return Program.Renderer.CreateStaticObject(Position, Prototype, LocalTransformation, Rotate, Translate, Program.CurrentRoute.AccurateObjectDisposal, Properties, Program.CurrentRoute.BlockLength);
}

public override void CreateDynamicObject(ref ObjectState internalObject)
Expand Down
47 changes: 47 additions & 0 deletions source/OpenBveApi/Objects/Helpers/WorldProperties.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
namespace OpenBveApi.Objects
{
/// <summary>A helper struct describing the world properties of an object</summary>
public struct WorldProperties
{
/// <summary>The key of the rail on which the object is placed</summary>
public int RailKey;
/// <summary>The absolute track position at which the object is placed</summary>
public double TrackPosition;
/// <summary>The track distance at which this is displayed by the renderer</summary>
public double StartingDistance;
/// <summary>The ending distance at which this is hidden by the renderer</summary>
public double EndingDistance;
/// <summary>The brightness value of this object</summary>
public double Brightness;
/// <summary>The index of the signalling section this object is attached to</summary>
public int SectionIndex;
/// <summary>The Z-Offset used for accurate object disposal</summary>
/// <remarks>This is only valid for child objects contained within an animated container</remarks>
public double AccurateObjectDisposalZOffset;

/// <summary>Creates a new instance of this struct</summary>
public WorldProperties(int railKey, double trackPosition, double startingDistance, double endingDistance, int sectionIndex = -1, double brightness = 1.0)
{
RailKey = railKey;
TrackPosition = trackPosition;
StartingDistance = startingDistance;
EndingDistance = endingDistance;
Brightness = brightness;
SectionIndex = sectionIndex;
AccurateObjectDisposalZOffset = 0;
}

/// <summary>Creates a new instance of this struct</summary>
public WorldProperties(double trackPosition, int sectionIndex, double brightness)
{
RailKey = 0;
TrackPosition = trackPosition;
SectionIndex = sectionIndex;
Brightness = brightness;
// Mechanik visibility- not used
StartingDistance = 0;
EndingDistance = 0;
AccurateObjectDisposalZOffset = 0;
}
}
}
33 changes: 17 additions & 16 deletions source/OpenBveApi/Objects/ObjectTypes/AnimatedObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -737,14 +737,15 @@ public void Update(AbstractTrain Train, int CarIndex, double TrackPosition, Vect
}
}

/// <summary>Creates the animated object within the game world</summary>
/// <param name="Position">The absolute position</param>
/// <param name="WorldTransformation">The world transformation to apply (e.g. ground, rail)</param>
/// <param name="LocalTransformation">The local transformation to apply in order to rotate the model</param>
/// <param name="sectionIndex">The index of the section if placed using a SigF command</param>
/// <param name="TrackPosition">The absolute track position</param>
/// <param name="Brightness">The brightness value at the track position</param>
public void CreateObject(Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, int sectionIndex, double TrackPosition, double Brightness)
/// <summary>Creates the animated object within the game world</summary>
/// <param name="Position">The absolute position</param>
/// <param name="WorldTransformation">The world transformation to apply (e.g. ground, rail)</param>
/// <param name="LocalTransformation">The local transformation to apply in order to rotate the model</param>
/// <param name="sectionIndex">The index of the section if placed using a SigF command</param>
/// <param name="railIndex">The rail index the object is placed on</param>
/// <param name="TrackPosition">The absolute track position</param>
/// <param name="Brightness">The brightness value at the track position</param>
public void CreateObject(Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, WorldProperties Properties)
{

int a = currentHost.AnimatedWorldObjectsUsed;
Expand All @@ -762,11 +763,11 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
Up = FinalTransformation.Y,
Side = FinalTransformation.X,
Object = o,
TrackPosition = TrackPosition,
TrackPosition = Properties.TrackPosition,
};

currentObject.FrontAxleFollower.TrackPosition = TrackPosition + FrontAxlePosition;
currentObject.RearAxleFollower.TrackPosition = TrackPosition + RearAxlePosition;
currentObject.FrontAxleFollower.TrackPosition = Properties.TrackPosition + FrontAxlePosition;
currentObject.RearAxleFollower.TrackPosition = Properties.TrackPosition + RearAxlePosition;
currentObject.FrontAxlePosition = FrontAxlePosition;
currentObject.RearAxlePosition = RearAxlePosition;
currentObject.FrontAxleFollower.UpdateWorldCoordinates(false);
Expand All @@ -779,7 +780,7 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
}
}

currentObject.Object.internalObject.Brightness = Brightness;
currentObject.Object.internalObject.Brightness = Properties.Brightness;

double r = 0.0;
for (int i = 0; i < currentObject.Object.States.Length; i++)
Expand All @@ -800,16 +801,16 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
{
var o = this.Clone();
currentHost.CreateDynamicObject(ref o.internalObject);
o.SectionIndex = sectionIndex;
o.SectionIndex = Properties.SectionIndex;
AnimatedWorldObject currentObject = new AnimatedWorldObject(currentHost)
{
Position = Position,
Direction = FinalTransformation.Z,
Up = FinalTransformation.Y,
Side = FinalTransformation.X,
Object = o,
SectionIndex = sectionIndex,
TrackPosition = TrackPosition,
SectionIndex = Properties.SectionIndex,
TrackPosition = Properties.TrackPosition,
};
for (int i = 0; i < currentObject.Object.States.Length; i++)
{
Expand All @@ -819,7 +820,7 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
}
}

currentObject.Object.internalObject.Brightness = Brightness;
currentObject.Object.internalObject.Brightness = Properties.Brightness;

double r = 0.0;
for (int i = 0; i < currentObject.Object.States.Length; i++)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ public AnimatedObjectCollection(HostInterface Host)

/// <inheritdoc/>
public override void CreateObject(Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation,
int SectionIndex, double StartingDistance, double EndingDistance,
double TrackPosition, double Brightness, bool DuplicateMaterials = false)
WorldProperties Properties, bool DuplicateMaterials = false)
{
bool[] free = new bool[Objects.Length];
bool anyfree = false;
Expand Down Expand Up @@ -65,13 +64,12 @@ public override void CreateObject(Vector3 Position, Transformation WorldTransfor
Matrix4D mat = Matrix4D.Identity;
mat *= Objects[i].States[0].Translation;
mat *= transformationMatrix;
double zOffset = Objects[i].States[0].Translation.ExtractTranslation().Z * -1.0; //To calculate the Z-offset within the object, we want the untransformed co-ordinates, not the world co-ordinates

currentHost.CreateStaticObject(Objects[i].States[0].Prototype, Position, LocalTransformation, mat, Matrix4D.CreateTranslation(Position.X, Position.Y, -Position.Z), zOffset, StartingDistance, EndingDistance, TrackPosition, Brightness);
Properties.AccurateObjectDisposalZOffset = Objects[i].States[0].Translation.ExtractTranslation().Z * -1.0; //To calculate the Z-offset within the object, we want the untransformed co-ordinates, not the world co-ordinates
currentHost.CreateStaticObject(Objects[i].States[0].Prototype, Position, LocalTransformation, mat, Matrix4D.CreateTranslation(Position.X, Position.Y, -Position.Z), Properties);
}
else
{
Objects[i].CreateObject(Position, WorldTransformation, LocalTransformation, SectionIndex, TrackPosition, Brightness);
Objects[i].CreateObject(Position, WorldTransformation, LocalTransformation, Properties);
}
}
}
Expand All @@ -82,7 +80,7 @@ public override void CreateObject(Vector3 Position, Transformation WorldTransfor
{
if (Objects[i].States.Length != 0)
{
Objects[i].CreateObject(Position, WorldTransformation, LocalTransformation, SectionIndex, TrackPosition, Brightness);
Objects[i].CreateObject(Position, WorldTransformation, LocalTransformation, Properties);
}
}
}
Expand All @@ -100,8 +98,8 @@ public override void CreateObject(Vector3 Position, Transformation WorldTransfor
Vector3 v = Sounds[i].Position;
v.Rotate(LocalTransformation);
v.Rotate(WorldTransformation);
(Sounds[i] as WorldSound)?.CreateSound(Position + v, WorldTransformation, LocalTransformation, SectionIndex, TrackPosition);
(Sounds[i] as AnimatedWorldObjectStateSound)?.Create(Position + v, WorldTransformation, LocalTransformation, SectionIndex, TrackPosition, Brightness);
(Sounds[i] as WorldSound)?.CreateSound(Position + v, WorldTransformation, LocalTransformation, Properties);
(Sounds[i] as AnimatedWorldObjectStateSound)?.Create(Position + v, WorldTransformation, LocalTransformation, Properties);
}
}

Expand Down
Loading