Skip to content

Commit 8f543c6

Browse files
committed
Refactor: Use helper struct to avoid passing so many parameters on object create
1 parent 46d1393 commit 8f543c6

33 files changed

+218
-192
lines changed

source/LibRender2/BaseRenderer.cs

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

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

533-
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)
533+
public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transformation LocalTransformation, Matrix4D Rotate, Matrix4D Translate, ObjectDisposalMode AccurateObjectDisposal, double AccurateObjectDisposalZOffset, WorldProperties Properties, double BlockLength)
534534
{
535535
if (Prototype == null)
536536
{
@@ -578,21 +578,21 @@ public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transfor
578578
switch (AccurateObjectDisposal)
579579
{
580580
case ObjectDisposalMode.Accurate:
581-
startingDistance += (float)TrackPosition;
582-
endingDistance += (float)TrackPosition;
583-
double z = BlockLength * Math.Floor(TrackPosition / BlockLength);
584-
StartingDistance = Math.Min(z - BlockLength, startingDistance);
585-
EndingDistance = Math.Max(z + 2.0 * BlockLength, endingDistance);
586-
startingDistance = (float)(BlockLength * Math.Floor(StartingDistance / BlockLength));
587-
endingDistance = (float)(BlockLength * Math.Ceiling(EndingDistance / BlockLength));
581+
startingDistance += (float)Properties.TrackPosition;
582+
endingDistance += (float)Properties.TrackPosition;
583+
double z = BlockLength * Math.Floor(Properties.TrackPosition / BlockLength);
584+
Properties.StartingDistance = Math.Min(z - BlockLength, startingDistance);
585+
Properties.EndingDistance = Math.Max(z + 2.0 * BlockLength, endingDistance);
586+
startingDistance = (float)(BlockLength * Math.Floor(Properties.StartingDistance / BlockLength));
587+
endingDistance = (float)(BlockLength * Math.Ceiling(Properties.EndingDistance / BlockLength));
588588
break;
589589
case ObjectDisposalMode.Legacy:
590-
startingDistance = (float)StartingDistance;
591-
endingDistance = (float)EndingDistance;
590+
startingDistance = (float)Properties.StartingDistance;
591+
endingDistance = (float)Properties.EndingDistance;
592592
break;
593593
case ObjectDisposalMode.Mechanik:
594-
startingDistance = (float) StartingDistance;
595-
endingDistance = (float) EndingDistance + 1500;
594+
startingDistance = (float)Properties.StartingDistance;
595+
endingDistance = (float)Properties.EndingDistance + 1500;
596596
if (startingDistance < 0)
597597
{
598598
startingDistance = 0;
@@ -604,7 +604,7 @@ public int CreateStaticObject(Vector3 Position, StaticObject Prototype, Transfor
604604
Prototype = Prototype,
605605
Translation = Translate,
606606
Rotate = Rotate,
607-
Brightness = Brightness,
607+
Brightness = Properties.Brightness,
608608
StartingDistance = startingDistance,
609609
EndingDistance = endingDistance,
610610
WorldPosition = Position

source/ObjectViewer/Hosts.cs

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

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

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

316316
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
@@ -405,14 +405,14 @@ public override void ExecuteFunctionScript(OpenBveApi.FunctionScripting.Function
405405
FunctionScripts.ExecuteFunctionScript(functionScript, (TrainBase)train, CarIndex, Position, TrackPosition, SectionIndex, IsPartOfTrain, TimeElapsed, CurrentState);
406406
}
407407

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

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

418418
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
@@ -732,14 +732,15 @@ public void Update(AbstractTrain Train, int CarIndex, double TrackPosition, Vect
732732
}
733733
}
734734

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

745746
int a = currentHost.AnimatedWorldObjectsUsed;
@@ -757,11 +758,11 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
757758
Up = FinalTransformation.Y,
758759
Side = FinalTransformation.X,
759760
Object = o,
760-
TrackPosition = TrackPosition,
761+
TrackPosition = Properties.TrackPosition,
761762
};
762763

763-
currentObject.FrontAxleFollower.TrackPosition = TrackPosition + FrontAxlePosition;
764-
currentObject.RearAxleFollower.TrackPosition = TrackPosition + RearAxlePosition;
764+
currentObject.FrontAxleFollower.TrackPosition = Properties.TrackPosition + FrontAxlePosition;
765+
currentObject.RearAxleFollower.TrackPosition = Properties.TrackPosition + RearAxlePosition;
765766
currentObject.FrontAxlePosition = FrontAxlePosition;
766767
currentObject.RearAxlePosition = RearAxlePosition;
767768
currentObject.FrontAxleFollower.UpdateWorldCoordinates(false);
@@ -774,7 +775,7 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
774775
}
775776
}
776777

777-
currentObject.Object.internalObject.Brightness = Brightness;
778+
currentObject.Object.internalObject.Brightness = Properties.Brightness;
778779

779780
double r = 0.0;
780781
for (int i = 0; i < currentObject.Object.States.Length; i++)
@@ -795,16 +796,16 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
795796
{
796797
var o = this.Clone();
797798
currentHost.CreateDynamicObject(ref o.internalObject);
798-
o.SectionIndex = sectionIndex;
799+
o.SectionIndex = Properties.SectionIndex;
799800
AnimatedWorldObject currentObject = new AnimatedWorldObject(currentHost)
800801
{
801802
Position = Position,
802803
Direction = FinalTransformation.Z,
803804
Up = FinalTransformation.Y,
804805
Side = FinalTransformation.X,
805806
Object = o,
806-
SectionIndex = sectionIndex,
807-
TrackPosition = TrackPosition,
807+
SectionIndex = Properties.SectionIndex,
808+
TrackPosition = Properties.TrackPosition,
808809
};
809810
for (int i = 0; i < currentObject.Object.States.Length; i++)
810811
{
@@ -814,7 +815,7 @@ public void CreateObject(Vector3 Position, Transformation WorldTransformation, T
814815
}
815816
}
816817

817-
currentObject.Object.internalObject.Brightness = Brightness;
818+
currentObject.Object.internalObject.Brightness = Properties.Brightness;
818819

819820
double r = 0.0;
820821
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)