Skip to content

Commit bc921f7

Browse files
committed
Refactor: Use helper struct to avoid passing so many parameters on object create
1 parent eade701 commit bc921f7

33 files changed

+218
-192
lines changed

source/LibRender2/BaseRenderer.cs

+15-15
Original file line numberDiff line numberDiff line change
@@ -524,14 +524,14 @@ public void Reset()
524524
Initialize();
525525
}
526526

527-
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)
527+
public int CreateStaticObject(StaticObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, ObjectDisposalMode AccurateObjectDisposal, double AccurateObjectDisposalZOffset, WorldProperties Properties, double BlockLength)
528528
{
529529
Matrix4D Translate = Matrix4D.CreateTranslation(Position.X, Position.Y, -Position.Z);
530530
Matrix4D Rotate = (Matrix4D)new Transformation(LocalTransformation, WorldTransformation);
531-
return CreateStaticObject(Position, Prototype, LocalTransformation, Rotate, Translate, AccurateObjectDisposal, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, BlockLength, TrackPosition, Brightness);
531+
return CreateStaticObject(Position, Prototype, LocalTransformation, Rotate, Translate, AccurateObjectDisposal, AccurateObjectDisposalZOffset, Properties, BlockLength);
532532
}
533533

534-
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)
534+
public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transformation LocalTransformation, Matrix4D Rotate, Matrix4D Translate, ObjectDisposalMode AccurateObjectDisposal, double AccurateObjectDisposalZOffset, WorldProperties Properties, double BlockLength)
535535
{
536536
if (Prototype == null)
537537
{
@@ -579,21 +579,21 @@ public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transfor
579579
switch (AccurateObjectDisposal)
580580
{
581581
case ObjectDisposalMode.Accurate:
582-
startingDistance += (float)TrackPosition;
583-
endingDistance += (float)TrackPosition;
584-
double z = BlockLength * Math.Floor(TrackPosition / BlockLength);
585-
StartingDistance = Math.Min(z - BlockLength, startingDistance);
586-
EndingDistance = Math.Max(z + 2.0 * BlockLength, endingDistance);
587-
startingDistance = (float)(BlockLength * Math.Floor(StartingDistance / BlockLength));
588-
endingDistance = (float)(BlockLength * Math.Ceiling(EndingDistance / BlockLength));
582+
startingDistance += (float)Properties.TrackPosition;
583+
endingDistance += (float)Properties.TrackPosition;
584+
double z = BlockLength * Math.Floor(Properties.TrackPosition / BlockLength);
585+
Properties.StartingDistance = Math.Min(z - BlockLength, startingDistance);
586+
Properties.EndingDistance = Math.Max(z + 2.0 * BlockLength, endingDistance);
587+
startingDistance = (float)(BlockLength * Math.Floor(Properties.StartingDistance / BlockLength));
588+
endingDistance = (float)(BlockLength * Math.Ceiling(Properties.EndingDistance / BlockLength));
589589
break;
590590
case ObjectDisposalMode.Legacy:
591-
startingDistance = (float)StartingDistance;
592-
endingDistance = (float)EndingDistance;
591+
startingDistance = (float)Properties.StartingDistance;
592+
endingDistance = (float)Properties.EndingDistance;
593593
break;
594594
case ObjectDisposalMode.Mechanik:
595-
startingDistance = (float) StartingDistance;
596-
endingDistance = (float) EndingDistance + 1500;
595+
startingDistance = (float)Properties.StartingDistance;
596+
endingDistance = (float)Properties.EndingDistance + 1500;
597597
if (startingDistance < 0)
598598
{
599599
startingDistance = 0;
@@ -605,7 +605,7 @@ public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transfor
605605
Prototype = Prototype,
606606
Translation = Translate,
607607
Rotate = Rotate,
608-
Brightness = Brightness,
608+
Brightness = Properties.Brightness,
609609
StartingDistance = startingDistance,
610610
EndingDistance = endingDistance,
611611
WorldPosition = Position

source/ObjectViewer/Hosts.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -348,14 +348,14 @@ public override void ExecuteFunctionScript(OpenBveApi.FunctionScripting.Function
348348
FunctionScripts.ExecuteFunctionScript(functionScript, (TrainBase)train, CarIndex, Position, TrackPosition, SectionIndex, IsPartOfTrain, TimeElapsed, CurrentState);
349349
}
350350

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

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

361361
public override void CreateDynamicObject(ref ObjectState internalObject)

source/ObjectViewer/ProgramS.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ internal static void RefreshObjects()
316316
{
317317
if (CurrentHost.LoadObject(Files[i], Encoding.UTF8, out UnifiedObject o))
318318
{
319-
o.CreateObject(Vector3.Zero, 0.0, 0.0, 0.0);
319+
o.CreateObject(Vector3.Zero, new WorldProperties());
320320
}
321321

322322
}

source/OpenBVE/Graphics/NewRenderer.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ public override void Initialize()
8787
Program.FileSystem.AppendToLogFile("Renderer initialised successfully.");
8888
}
8989

90-
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)
90+
internal int CreateStaticObject(UnifiedObject Prototype, Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation, ObjectDisposalMode AccurateObjectDisposal, double AccurateObjectDisposalZOffset, WorldProperties Properties, double BlockLength)
9191
{
9292
StaticObject obj = Prototype as StaticObject;
9393
if (obj == null)
9494
{
9595
Interface.AddMessage(MessageType.Error, false, "Attempted to use an animated object where only static objects are allowed.");
9696
return -1;
9797
}
98-
return base.CreateStaticObject(obj, Position, WorldTransformation, LocalTransformation, AccurateObjectDisposal, AccurateObjectDisposalZOffset, StartingDistance, EndingDistance, BlockLength, TrackPosition, Brightness);
98+
return base.CreateStaticObject(obj, Position, WorldTransformation, LocalTransformation, AccurateObjectDisposal, AccurateObjectDisposalZOffset, Properties, BlockLength);
9999
}
100100

101101
public override void UpdateViewport(int Width, int Height)

source/OpenBVE/System/Host.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -473,14 +473,14 @@ public override void ExecuteFunctionScript(OpenBveApi.FunctionScripting.Function
473473
FunctionScripts.ExecuteFunctionScript(functionScript, (TrainBase)train, CarIndex, Position, TrackPosition, SectionIndex, IsPartOfTrain, TimeElapsed, CurrentState);
474474
}
475475

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

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

486486
public override void CreateDynamicObject(ref ObjectState internalObject)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
namespace OpenBveApi.Objects
2+
{
3+
/// <summary>A helper struct describing the world properties of an object</summary>
4+
public struct WorldProperties
5+
{
6+
/// <summary>The key of the rail on which the object is placed</summary>
7+
public int RailKey;
8+
/// <summary>The absolute track position at which the object is placed</summary>
9+
public double TrackPosition;
10+
/// <summary>The track distance at which this is displayed by the renderer</summary>
11+
public double StartingDistance;
12+
/// <summary>The ending distance at which this is hidden by the renderer</summary>
13+
public double EndingDistance;
14+
/// <summary>The brightness value of this object</summary>
15+
public double Brightness;
16+
/// <summary>The index of the signalling section this object is attached to</summary>
17+
public int SectionIndex;
18+
19+
/// <summary>Creates a new instance of this struct</summary>
20+
public WorldProperties(int railKey, double trackPosition, double startingDistance, double endingDistance, int sectionIndex = -1, double brightness = 1.0)
21+
{
22+
RailKey = railKey;
23+
TrackPosition = trackPosition;
24+
StartingDistance = startingDistance;
25+
EndingDistance = endingDistance;
26+
Brightness = brightness;
27+
SectionIndex = sectionIndex;
28+
}
29+
30+
/// <summary>Creates a new instance of this struct</summary>
31+
public WorldProperties(double trackPosition, int sectionIndex, double brightness)
32+
{
33+
RailKey = 0;
34+
TrackPosition = trackPosition;
35+
SectionIndex = sectionIndex;
36+
Brightness = brightness;
37+
// Mechanik visibility- not used
38+
StartingDistance = 0;
39+
EndingDistance = 0;
40+
}
41+
}
42+
}

source/OpenBveApi/Objects/ObjectTypes/AnimatedObject.cs

+17-16
Original file line numberDiff line numberDiff line change
@@ -737,14 +737,15 @@ public void Update(AbstractTrain Train, int CarIndex, double TrackPosition, Vect
737737
}
738738
}
739739

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

750751
int a = currentHost.AnimatedWorldObjectsUsed;
@@ -762,11 +763,11 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
762763
Up = FinalTransformation.Y,
763764
Side = FinalTransformation.X,
764765
Object = o,
765-
TrackPosition = TrackPosition,
766+
TrackPosition = Properties.TrackPosition,
766767
};
767768

768-
currentObject.FrontAxleFollower.TrackPosition = TrackPosition + FrontAxlePosition;
769-
currentObject.RearAxleFollower.TrackPosition = TrackPosition + RearAxlePosition;
769+
currentObject.FrontAxleFollower.TrackPosition = Properties.TrackPosition + FrontAxlePosition;
770+
currentObject.RearAxleFollower.TrackPosition = Properties.TrackPosition + RearAxlePosition;
770771
currentObject.FrontAxlePosition = FrontAxlePosition;
771772
currentObject.RearAxlePosition = RearAxlePosition;
772773
currentObject.FrontAxleFollower.UpdateWorldCoordinates(false);
@@ -779,7 +780,7 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
779780
}
780781
}
781782

782-
currentObject.Object.internalObject.Brightness = Brightness;
783+
currentObject.Object.internalObject.Brightness = Properties.Brightness;
783784

784785
double r = 0.0;
785786
for (int i = 0; i < currentObject.Object.States.Length; i++)
@@ -800,16 +801,16 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
800801
{
801802
var o = this.Clone();
802803
currentHost.CreateDynamicObject(ref o.internalObject);
803-
o.SectionIndex = sectionIndex;
804+
o.SectionIndex = Properties.SectionIndex;
804805
AnimatedWorldObject currentObject = new AnimatedWorldObject(currentHost)
805806
{
806807
Position = Position,
807808
Direction = FinalTransformation.Z,
808809
Up = FinalTransformation.Y,
809810
Side = FinalTransformation.X,
810811
Object = o,
811-
SectionIndex = sectionIndex,
812-
TrackPosition = TrackPosition,
812+
SectionIndex = Properties.SectionIndex,
813+
TrackPosition = Properties.TrackPosition,
813814
};
814815
for (int i = 0; i < currentObject.Object.States.Length; i++)
815816
{
@@ -819,7 +820,7 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
819820
}
820821
}
821822

822-
currentObject.Object.internalObject.Brightness = Brightness;
823+
currentObject.Object.internalObject.Brightness = Properties.Brightness;
823824

824825
double r = 0.0;
825826
for (int i = 0; i < currentObject.Object.States.Length; i++)

source/OpenBveApi/Objects/ObjectTypes/AnimatedObjectCollection.cs

+6-7
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ public AnimatedObjectCollection(HostInterface Host)
2424

2525
/// <inheritdoc/>
2626
public override void CreateObject(Vector3 Position, Transformation WorldTransformation, Transformation LocalTransformation,
27-
int SectionIndex, double StartingDistance, double EndingDistance,
28-
double TrackPosition, double Brightness, bool DuplicateMaterials = false)
27+
WorldProperties Properties, bool DuplicateMaterials = false)
2928
{
3029
bool[] free = new bool[Objects.Length];
3130
bool anyfree = false;
@@ -67,11 +66,11 @@ public override void CreateObject(Vector3 Position, Transformation WorldTransfor
6766
mat *= transformationMatrix;
6867
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
6968

70-
currentHost.CreateStaticObject(Objects[i].States[0].Prototype, Position, LocalTransformation, mat, Matrix4D.CreateTranslation(Position.X, Position.Y, -Position.Z), zOffset, StartingDistance, EndingDistance, TrackPosition, Brightness);
69+
currentHost.CreateStaticObject(Objects[i].States[0].Prototype, Position, LocalTransformation, mat, Matrix4D.CreateTranslation(Position.X, Position.Y, -Position.Z), zOffset, Properties);
7170
}
7271
else
7372
{
74-
Objects[i].CreateObject(Position, WorldTransformation, LocalTransformation, SectionIndex, TrackPosition, Brightness);
73+
Objects[i].CreateObject(Position, WorldTransformation, LocalTransformation, Properties);
7574
}
7675
}
7776
}
@@ -82,7 +81,7 @@ public override void CreateObject(Vector3 Position, Transformation WorldTransfor
8281
{
8382
if (Objects[i].States.Length != 0)
8483
{
85-
Objects[i].CreateObject(Position, WorldTransformation, LocalTransformation, SectionIndex, TrackPosition, Brightness);
84+
Objects[i].CreateObject(Position, WorldTransformation, LocalTransformation, Properties);
8685
}
8786
}
8887
}
@@ -100,8 +99,8 @@ public override void CreateObject(Vector3 Position, Transformation WorldTransfor
10099
Vector3 v = Sounds[i].Position;
101100
v.Rotate(LocalTransformation);
102101
v.Rotate(WorldTransformation);
103-
(Sounds[i] as WorldSound)?.CreateSound(Position + v, WorldTransformation, LocalTransformation, SectionIndex, TrackPosition);
104-
(Sounds[i] as AnimatedWorldObjectStateSound)?.Create(Position + v, WorldTransformation, LocalTransformation, SectionIndex, TrackPosition, Brightness);
102+
(Sounds[i] as WorldSound)?.CreateSound(Position + v, WorldTransformation, LocalTransformation, Properties);
103+
(Sounds[i] as AnimatedWorldObjectStateSound)?.Create(Position + v, WorldTransformation, LocalTransformation, Properties);
105104
}
106105
}
107106

0 commit comments

Comments
 (0)