Skip to content

Commit b8c8c9a

Browse files
authored
Merge pull request #1033 from cesarBLG/multiple-light-textures
Multiple signal light textures per signal
2 parents ee9c56d + 7efd355 commit b8c8c9a

File tree

3 files changed

+47
-7
lines changed

3 files changed

+47
-7
lines changed

Source/Documentation/Manual/appendices.rst

+13
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,19 @@ The value speed is the required speed value in dimension as set by the relevant
678678
Inclusion of speed definition is optional and need not be set if only approach control position functions
679679
are used.
680680

681+
Signal light parameters
682+
-----------------------
683+
684+
.. index::
685+
single: ORTSSignalLightTex
686+
687+
It is possible to have different light textures in the same signal, by inserting
688+
the following parameter in the signal light definition::
689+
690+
ORTSSignalLightTex ( "name" )
691+
692+
Where **name** is the name of the texture to be used for the signal light.
693+
681694
Signal aspect parameters
682695
------------------------
683696
The following parameters can be included in signal aspect definitions.

Source/Orts.Formats.Msts/SignalConfigurationFile.cs

+5
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,8 @@ public class SignalLight
889889
public float Radius { get; private set; }
890890
/// <summary>is the SIGLIGHT flag SEMAPHORE_CHANGE set?</summary>
891891
public bool SemaphoreChange { get; private set; }
892+
/// <summary> The name of the texture to use for this light, overriding signal's default </summary>
893+
public string LightTextureName { get; private set; } = String.Empty;
892894

893895
/// <summary>
894896
/// Default constructor used during file parsing.
@@ -917,6 +919,9 @@ public SignalLight(STFReader stf)
917919
default: stf.StepBackOneItem(); STFException.TraceInformation(stf, "Skipped unknown SignalLight flag " + stf.ReadString()); break;
918920
}
919921
}),
922+
new STFReader.TokenProcessor("ortssignallighttex", ()=>{
923+
LightTextureName = stf.ReadStringBlock("").ToLowerInvariant();
924+
}),
920925
});
921926
}
922927

Source/RunActivity/Viewer3D/Signals.cs

+29-7
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ void renderEffect(Material material)
374374
{
375375
frame.AddPrimitive(material, slp, RenderPrimitiveGroup.Lights, ref xnaMatrix, ShapeFlags.None, state);
376376
}
377-
renderEffect(SignalTypeData.Material);
377+
renderEffect(slp.Material);
378378
if (Viewer.Settings.SignalLightGlow)
379379
renderEffect(SignalTypeData.GlowMaterial);
380380
}
@@ -465,7 +465,6 @@ public class SignalTypeData
465465
{
466466
readonly Viewer Viewer;
467467

468-
public readonly Material Material;
469468
public readonly Material GlowMaterial;
470469
#if DEBUG_SIGNAL_SHAPES
471470
public readonly SignalTypeDataType Type;
@@ -488,7 +487,6 @@ public SignalTypeData(Viewer viewer, SignalType mstsSignalType)
488487
if (!viewer.SIGCFG.LightTextures.ContainsKey(mstsSignalType.LightTextureName))
489488
{
490489
Trace.TraceWarning("Skipped invalid light texture {1} for signal type {0}", mstsSignalType.Name, mstsSignalType.LightTextureName);
491-
Material = viewer.MaterialManager.Load("missing-signal-light");
492490
#if DEBUG_SIGNAL_SHAPES
493491
Type = SignalTypeDataType.Normal;
494492
#endif
@@ -498,7 +496,7 @@ public SignalTypeData(Viewer viewer, SignalType mstsSignalType)
498496
else
499497
{
500498
var mstsLightTexture = viewer.SIGCFG.LightTextures[mstsSignalType.LightTextureName];
501-
Material = viewer.MaterialManager.Load("SignalLight", Helpers.GetRouteTextureFile(viewer.Simulator, Helpers.TextureFlags.None, mstsLightTexture.TextureFile));
499+
var defaultMaterial = viewer.MaterialManager.Load("SignalLight", Helpers.GetRouteTextureFile(viewer.Simulator, Helpers.TextureFlags.None, mstsLightTexture.TextureFile));
502500
GlowMaterial = viewer.MaterialManager.Load("SignalLightGlow");
503501
#if DEBUG_SIGNAL_SHAPES
504502
Type = (SignalTypeDataType)mstsSignalType.FnType;
@@ -535,7 +533,20 @@ public SignalTypeData(Viewer viewer, SignalType mstsSignalType)
535533
continue;
536534
}
537535
var mstsLight = viewer.SIGCFG.LightsTable[mstsSignalLight.Name];
538-
Lights.Add(new SignalLightPrimitive(viewer, new Vector3(-mstsSignalLight.X, mstsSignalLight.Y, mstsSignalLight.Z), mstsSignalLight.Radius, new Color(mstsLight.r, mstsLight.g, mstsLight.b, mstsLight.a), glowDay, glowNight, mstsLightTexture.u0, mstsLightTexture.v0, mstsLightTexture.u1, mstsLightTexture.v1));
536+
var material = defaultMaterial;
537+
if (!string.IsNullOrEmpty(mstsSignalLight.LightTextureName))
538+
{
539+
if (!viewer.SIGCFG.LightTextures.ContainsKey(mstsSignalLight.LightTextureName))
540+
{
541+
Trace.TraceWarning("Skipped invalid light texture {0} for signal light {1} in signal type {2}", mstsSignalLight.LightTextureName, mstsSignalLight.Name, mstsSignalType.Name);
542+
}
543+
else
544+
{
545+
var texture = viewer.SIGCFG.LightTextures[mstsSignalLight.LightTextureName];
546+
material = viewer.MaterialManager.Load("SignalLight", Helpers.GetRouteTextureFile(viewer.Simulator, Helpers.TextureFlags.None, texture.TextureFile));
547+
}
548+
}
549+
Lights.Add(new SignalLightPrimitive(viewer, new Vector3(-mstsSignalLight.X, mstsSignalLight.Y, mstsSignalLight.Z), mstsSignalLight.Radius, new Color(mstsLight.r, mstsLight.g, mstsLight.b, mstsLight.a), glowDay, glowNight, mstsLightTexture.u0, mstsLightTexture.v0, mstsLightTexture.u1, mstsLightTexture.v1, material));
539550
LightsSemaphoreChange.Add(mstsSignalLight.SemaphoreChange);
540551
}
541552
}
@@ -555,7 +566,10 @@ public SignalTypeData(Viewer viewer, SignalType mstsSignalType)
555566
public void Mark()
556567
{
557568
Viewer.SignalTypeDataManager.Mark(this);
558-
Material.Mark();
569+
foreach (var light in Lights)
570+
{
571+
light.Mark();
572+
}
559573
GlowMaterial?.Mark();
560574
}
561575
}
@@ -647,8 +661,9 @@ public class SignalLightPrimitive : RenderPrimitive
647661
internal readonly float GlowIntensityDay;
648662
internal readonly float GlowIntensityNight;
649663
readonly VertexBuffer VertexBuffer;
664+
public readonly Material Material;
650665

651-
public SignalLightPrimitive(Viewer viewer, Vector3 position, float radius, Color color, float glowDay, float glowNight, float u0, float v0, float u1, float v1)
666+
public SignalLightPrimitive(Viewer viewer, Vector3 position, float radius, Color color, float glowDay, float glowNight, float u0, float v0, float u1, float v1, Material material)
652667
{
653668
Position = position;
654669
GlowIntensityDay = glowDay;
@@ -663,13 +678,20 @@ public SignalLightPrimitive(Viewer viewer, Vector3 position, float radius, Color
663678

664679
VertexBuffer = new VertexBuffer(viewer.GraphicsDevice, typeof(VertexPositionColorTexture), verticies.Length, BufferUsage.WriteOnly);
665680
VertexBuffer.SetData(verticies);
681+
682+
Material = material;
666683
}
667684

668685
public override void Draw(GraphicsDevice graphicsDevice)
669686
{
670687
graphicsDevice.SetVertexBuffer(VertexBuffer);
671688
graphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
672689
}
690+
691+
public void Mark()
692+
{
693+
Material.Mark();
694+
}
673695
}
674696

675697
public class SignalLightMaterial : Material

0 commit comments

Comments
 (0)