From 9186b65b14e1294552c3e10dcbc1eb5ffd974927 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Thu, 3 Jul 2025 21:11:31 -0400 Subject: [PATCH] Validate `ShaderPrototype` IDs (#38728) * Convert all shader prototype string literals to protoids in overlays * Convert more shader prototype literal strings to protoids * Convert ValidatePrototypeId to ProtoId * Later --- Content.Benchmarks/SpawnEquipDeleteBenchmark.cs | 7 +++++-- Content.Client/Atmos/Overlays/GasTileOverlay.cs | 4 +++- .../CombatMode/ColoredScreenBorderOverlay.cs | 4 +++- Content.Client/Cooldown/CooldownGraphic.cs | 4 +++- Content.Client/DoAfter/DoAfterOverlay.cs | 4 +++- Content.Client/Drowsiness/DrowsinessOverlay.cs | 4 +++- Content.Client/Drugs/RainbowOverlay.cs | 4 +++- Content.Client/Drunk/DrunkOverlay.cs | 4 +++- Content.Client/Explosion/ExplosionOverlay.cs | 4 +++- Content.Client/Eye/Blinding/BlindOverlay.cs | 7 +++++-- Content.Client/Eye/Blinding/BlurryVisionOverlay.cs | 7 +++++-- Content.Client/Flash/FlashOverlay.cs | 4 +++- .../Components/InteractionOutlineComponent.cs | 11 ++++------- Content.Client/Interaction/DragDropSystem.cs | 14 ++++++-------- Content.Client/Light/AmbientOcclusionOverlay.cs | 12 ++++++++---- Content.Client/Light/SunShadowOverlay.cs | 4 +++- Content.Client/Mapping/MappingOverlay.cs | 4 +++- .../Movement/Systems/FloorOcclusionSystem.cs | 4 +++- Content.Client/Outline/TargetOutlineSystem.cs | 13 +++++-------- Content.Client/Overlays/BlackAndWhiteOverlay.cs | 4 +++- Content.Client/Overlays/NoirOverlay.cs | 4 +++- .../Overlays/StencilOverlay.RestrictedRange.cs | 4 ++-- Content.Client/Overlays/StencilOverlay.Weather.cs | 4 ++-- Content.Client/Overlays/StencilOverlay.cs | 6 +++++- Content.Client/Paper/UI/StampLabel.xaml.cs | 4 +++- Content.Client/Paper/UI/StampWidget.xaml.cs | 4 +++- .../UI/ParticleAcceleratorControlMenu.xaml.cs | 3 ++- Content.Client/Popups/PopupOverlay.cs | 4 +++- .../Radiation/Overlays/RadiationPulseOverlay.cs | 4 +++- Content.Client/Shuttles/FtlArrivalOverlay.cs | 4 +++- .../Silicons/StationAi/StationAiOverlay.cs | 10 +++++++--- Content.Client/Singularity/SingularityOverlay.cs | 4 +++- Content.Client/StatusIcon/StatusIconOverlay.cs | 4 +++- Content.Client/Stealth/StealthSystem.cs | 4 +++- .../UI/SurveillanceCameraMonitorWindow.xaml.cs | 4 +++- .../DamageOverlays/Overlays/DamageOverlay.cs | 8 +++++--- 36 files changed, 130 insertions(+), 68 deletions(-) diff --git a/Content.Benchmarks/SpawnEquipDeleteBenchmark.cs b/Content.Benchmarks/SpawnEquipDeleteBenchmark.cs index 0638d945aa..9b878eac40 100644 --- a/Content.Benchmarks/SpawnEquipDeleteBenchmark.cs +++ b/Content.Benchmarks/SpawnEquipDeleteBenchmark.cs @@ -8,6 +8,7 @@ using Robust.Shared; using Robust.Shared.Analyzers; using Robust.Shared.GameObjects; using Robust.Shared.Map; +using Robust.Shared.Prototypes; namespace Content.Benchmarks; @@ -18,9 +19,11 @@ namespace Content.Benchmarks; [Virtual, MemoryDiagnoser] public class SpawnEquipDeleteBenchmark { + private static readonly EntProtoId Mob = "MobHuman"; + private static readonly ProtoId CaptainStartingGear = "CaptainGear"; + private TestPair _pair = default!; private StationSpawningSystem _spawnSys = default!; - private const string Mob = "MobHuman"; private StartingGearPrototype _gear = default!; private EntityUid _entity; private EntityCoordinates _coords; @@ -39,7 +42,7 @@ public class SpawnEquipDeleteBenchmark var mapData = await _pair.CreateTestMap(); _coords = mapData.GridCoords; _spawnSys = server.System(); - _gear = server.ProtoMan.Index("CaptainGear"); + _gear = server.ProtoMan.Index(CaptainStartingGear); } [GlobalCleanup] diff --git a/Content.Client/Atmos/Overlays/GasTileOverlay.cs b/Content.Client/Atmos/Overlays/GasTileOverlay.cs index cdbcb5b3f6..d91cc29e4c 100644 --- a/Content.Client/Atmos/Overlays/GasTileOverlay.cs +++ b/Content.Client/Atmos/Overlays/GasTileOverlay.cs @@ -19,6 +19,8 @@ namespace Content.Client.Atmos.Overlays { public sealed class GasTileOverlay : Overlay { + private static readonly ProtoId UnshadedShader = "unshaded"; + private readonly IEntityManager _entManager; private readonly IMapManager _mapManager; private readonly SharedMapSystem _mapSystem; @@ -54,7 +56,7 @@ namespace Content.Client.Atmos.Overlays _mapManager = IoCManager.Resolve(); _mapSystem = entManager.System(); _xformSys = xformSys; - _shader = protoMan.Index("unshaded").Instance(); + _shader = protoMan.Index(UnshadedShader).Instance(); ZIndex = GasOverlayZIndex; _gasCount = system.VisibleGasId.Length; diff --git a/Content.Client/CombatMode/ColoredScreenBorderOverlay.cs b/Content.Client/CombatMode/ColoredScreenBorderOverlay.cs index 9ca94fc3b4..749a6839b6 100644 --- a/Content.Client/CombatMode/ColoredScreenBorderOverlay.cs +++ b/Content.Client/CombatMode/ColoredScreenBorderOverlay.cs @@ -8,6 +8,8 @@ namespace Content.Client.CombatMode { public sealed class ColoredScreenBorderOverlay : Overlay { + private static readonly ProtoId Shader = "ColoredScreenBorder"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public override OverlaySpace Space => OverlaySpace.WorldSpace; @@ -16,7 +18,7 @@ namespace Content.Client.CombatMode public ColoredScreenBorderOverlay() { IoCManager.InjectDependencies(this); - _shader = _prototypeManager.Index("ColoredScreenBorder").Instance(); + _shader = _prototypeManager.Index(Shader).Instance(); } protected override void Draw(in OverlayDrawArgs args) diff --git a/Content.Client/Cooldown/CooldownGraphic.cs b/Content.Client/Cooldown/CooldownGraphic.cs index 25063f8133..6779e4027a 100644 --- a/Content.Client/Cooldown/CooldownGraphic.cs +++ b/Content.Client/Cooldown/CooldownGraphic.cs @@ -7,6 +7,8 @@ namespace Content.Client.Cooldown { public sealed class CooldownGraphic : Control { + private static readonly ProtoId Shader = "CooldownAnimation"; + [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IPrototypeManager _protoMan = default!; @@ -15,7 +17,7 @@ namespace Content.Client.Cooldown public CooldownGraphic() { IoCManager.InjectDependencies(this); - _shader = _protoMan.Index("CooldownAnimation").InstanceUnique(); + _shader = _protoMan.Index(Shader).InstanceUnique(); } /// diff --git a/Content.Client/DoAfter/DoAfterOverlay.cs b/Content.Client/DoAfter/DoAfterOverlay.cs index 6ecd758461..761584e06e 100644 --- a/Content.Client/DoAfter/DoAfterOverlay.cs +++ b/Content.Client/DoAfter/DoAfterOverlay.cs @@ -14,6 +14,8 @@ namespace Content.Client.DoAfter; public sealed class DoAfterOverlay : Overlay { + private static readonly ProtoId UnshadedShader = "unshaded"; + private readonly IEntityManager _entManager; private readonly IGameTiming _timing; private readonly IPlayerManager _player; @@ -50,7 +52,7 @@ public sealed class DoAfterOverlay : Overlay var sprite = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/progress_bar.rsi"), "icon"); _barTexture = _entManager.EntitySysManager.GetEntitySystem().Frame0(sprite); - _unshadedShader = protoManager.Index("unshaded").Instance(); + _unshadedShader = protoManager.Index(UnshadedShader).Instance(); } protected override void Draw(in OverlayDrawArgs args) diff --git a/Content.Client/Drowsiness/DrowsinessOverlay.cs b/Content.Client/Drowsiness/DrowsinessOverlay.cs index 1687216b3e..9c47ec2fbe 100644 --- a/Content.Client/Drowsiness/DrowsinessOverlay.cs +++ b/Content.Client/Drowsiness/DrowsinessOverlay.cs @@ -10,6 +10,8 @@ namespace Content.Client.Drowsiness; public sealed class DrowsinessOverlay : Overlay { + private static readonly ProtoId Shader = "Drowsiness"; + [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; @@ -33,7 +35,7 @@ public sealed class DrowsinessOverlay : Overlay _statusEffects = _sysMan.GetEntitySystem(); - _drowsinessShader = _prototypeManager.Index("Drowsiness").InstanceUnique(); + _drowsinessShader = _prototypeManager.Index(Shader).InstanceUnique(); } protected override void FrameUpdate(FrameEventArgs args) diff --git a/Content.Client/Drugs/RainbowOverlay.cs b/Content.Client/Drugs/RainbowOverlay.cs index bfb3815649..a2a431feb6 100644 --- a/Content.Client/Drugs/RainbowOverlay.cs +++ b/Content.Client/Drugs/RainbowOverlay.cs @@ -12,6 +12,8 @@ namespace Content.Client.Drugs; public sealed class RainbowOverlay : Overlay { + private static readonly ProtoId Shader = "Rainbow"; + [Dependency] private readonly IConfigurationManager _config = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; @@ -41,7 +43,7 @@ public sealed class RainbowOverlay : Overlay _statusEffects = _sysMan.GetEntitySystem(); - _rainbowShader = _prototypeManager.Index("Rainbow").InstanceUnique(); + _rainbowShader = _prototypeManager.Index(Shader).InstanceUnique(); _config.OnValueChanged(CCVars.ReducedMotion, OnReducedMotionChanged, invokeImmediately: true); } diff --git a/Content.Client/Drunk/DrunkOverlay.cs b/Content.Client/Drunk/DrunkOverlay.cs index e01719e62c..1f26e75ffc 100644 --- a/Content.Client/Drunk/DrunkOverlay.cs +++ b/Content.Client/Drunk/DrunkOverlay.cs @@ -10,6 +10,8 @@ namespace Content.Client.Drunk; public sealed class DrunkOverlay : Overlay { + private static readonly ProtoId Shader = "Drunk"; + [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; @@ -30,7 +32,7 @@ public sealed class DrunkOverlay : Overlay public DrunkOverlay() { IoCManager.InjectDependencies(this); - _drunkShader = _prototypeManager.Index("Drunk").InstanceUnique(); + _drunkShader = _prototypeManager.Index(Shader).InstanceUnique(); } protected override void FrameUpdate(FrameEventArgs args) diff --git a/Content.Client/Explosion/ExplosionOverlay.cs b/Content.Client/Explosion/ExplosionOverlay.cs index a005d0317b..18cb8f647a 100644 --- a/Content.Client/Explosion/ExplosionOverlay.cs +++ b/Content.Client/Explosion/ExplosionOverlay.cs @@ -13,6 +13,8 @@ namespace Content.Client.Explosion; [UsedImplicitly] public sealed class ExplosionOverlay : Overlay { + private static readonly ProtoId UnshadedShader = "unshaded"; + [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly IEntityManager _entMan = default!; [Dependency] private readonly IPrototypeManager _proto = default!; @@ -26,7 +28,7 @@ public sealed class ExplosionOverlay : Overlay public ExplosionOverlay(SharedAppearanceSystem appearanceSystem) { IoCManager.InjectDependencies(this); - _shader = _proto.Index("unshaded").Instance(); + _shader = _proto.Index(UnshadedShader).Instance(); _transformSystem = _entMan.System(); _appearance = appearanceSystem; } diff --git a/Content.Client/Eye/Blinding/BlindOverlay.cs b/Content.Client/Eye/Blinding/BlindOverlay.cs index 1949b170ab..906f9c954c 100644 --- a/Content.Client/Eye/Blinding/BlindOverlay.cs +++ b/Content.Client/Eye/Blinding/BlindOverlay.cs @@ -12,6 +12,9 @@ namespace Content.Client.Eye.Blinding { public sealed class BlindOverlay : Overlay { + private static readonly ProtoId GreyscaleShader = "GreyscaleFullscreen"; + private static readonly ProtoId CircleShader = "CircleMask"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; @@ -27,8 +30,8 @@ namespace Content.Client.Eye.Blinding public BlindOverlay() { IoCManager.InjectDependencies(this); - _greyscaleShader = _prototypeManager.Index("GreyscaleFullscreen").InstanceUnique(); - _circleMaskShader = _prototypeManager.Index("CircleMask").InstanceUnique(); + _greyscaleShader = _prototypeManager.Index(GreyscaleShader).InstanceUnique(); + _circleMaskShader = _prototypeManager.Index(CircleShader).InstanceUnique(); } protected override bool BeforeDraw(in OverlayDrawArgs args) { diff --git a/Content.Client/Eye/Blinding/BlurryVisionOverlay.cs b/Content.Client/Eye/Blinding/BlurryVisionOverlay.cs index b56b091309..dccdac2758 100644 --- a/Content.Client/Eye/Blinding/BlurryVisionOverlay.cs +++ b/Content.Client/Eye/Blinding/BlurryVisionOverlay.cs @@ -10,6 +10,9 @@ namespace Content.Client.Eye.Blinding { public sealed class BlurryVisionOverlay : Overlay { + private static readonly ProtoId CataractsShader = "Cataracts"; + private static readonly ProtoId CircleShader = "CircleMask"; + [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; @@ -33,8 +36,8 @@ namespace Content.Client.Eye.Blinding public BlurryVisionOverlay() { IoCManager.InjectDependencies(this); - _cataractsShader = _prototypeManager.Index("Cataracts").InstanceUnique(); - _circleMaskShader = _prototypeManager.Index("CircleMask").InstanceUnique(); + _cataractsShader = _prototypeManager.Index(CataractsShader).InstanceUnique(); + _circleMaskShader = _prototypeManager.Index(CircleShader).InstanceUnique(); _circleMaskShader.SetParameter("CircleMinDist", 0.0f); _circleMaskShader.SetParameter("CirclePow", NoMotion_Pow); diff --git a/Content.Client/Flash/FlashOverlay.cs b/Content.Client/Flash/FlashOverlay.cs index 8e41c382dd..824efb78f3 100644 --- a/Content.Client/Flash/FlashOverlay.cs +++ b/Content.Client/Flash/FlashOverlay.cs @@ -11,6 +11,8 @@ namespace Content.Client.Flash { public sealed class FlashOverlay : Overlay { + private static readonly ProtoId FlashedEffectShader = "FlashedEffect"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; @@ -27,7 +29,7 @@ namespace Content.Client.Flash public FlashOverlay() { IoCManager.InjectDependencies(this); - _shader = _prototypeManager.Index("FlashedEffect").InstanceUnique(); + _shader = _prototypeManager.Index(FlashedEffectShader).InstanceUnique(); _flash = _entityManager.System(); _statusSys = _entityManager.System(); } diff --git a/Content.Client/Interactable/Components/InteractionOutlineComponent.cs b/Content.Client/Interactable/Components/InteractionOutlineComponent.cs index 9803920257..8d1d8cd07d 100644 --- a/Content.Client/Interactable/Components/InteractionOutlineComponent.cs +++ b/Content.Client/Interactable/Components/InteractionOutlineComponent.cs @@ -7,17 +7,14 @@ namespace Content.Client.Interactable.Components [RegisterComponent] public sealed partial class InteractionOutlineComponent : Component { + private static readonly ProtoId ShaderInRange = "SelectionOutlineInrange"; + private static readonly ProtoId ShaderOutOfRange = "SelectionOutline"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entMan = default!; private const float DefaultWidth = 1; - [ValidatePrototypeId] - private const string ShaderInRange = "SelectionOutlineInrange"; - - [ValidatePrototypeId] - private const string ShaderOutOfRange = "SelectionOutline"; - private bool _inRange; private ShaderInstance? _shader; private int _lastRenderScale; @@ -65,7 +62,7 @@ namespace Content.Client.Interactable.Components { var shaderName = inRange ? ShaderInRange : ShaderOutOfRange; - var instance = _prototypeManager.Index(shaderName).InstanceUnique(); + var instance = _prototypeManager.Index(shaderName).InstanceUnique(); instance.SetParameter("outline_width", DefaultWidth * renderScale); return instance; } diff --git a/Content.Client/Interaction/DragDropSystem.cs b/Content.Client/Interaction/DragDropSystem.cs index fe23866535..a1af9f9e20 100644 --- a/Content.Client/Interaction/DragDropSystem.cs +++ b/Content.Client/Interaction/DragDropSystem.cs @@ -29,6 +29,10 @@ namespace Content.Client.Interaction; /// public sealed class DragDropSystem : SharedDragDropSystem { + private static readonly ProtoId ShaderDropTargetInRange = "SelectionOutlineInrange"; + + private static readonly ProtoId ShaderDropTargetOutOfRange = "SelectionOutline"; + [Dependency] private readonly IStateManager _stateManager = default!; [Dependency] private readonly IInputManager _inputManager = default!; [Dependency] private readonly IEyeManager _eyeManager = default!; @@ -54,12 +58,6 @@ public sealed class DragDropSystem : SharedDragDropSystem // mousedown event so it can be treated like a regular click private const float MaxMouseDownTimeForReplayingClick = 0.85f; - [ValidatePrototypeId] - private const string ShaderDropTargetInRange = "SelectionOutlineInrange"; - - [ValidatePrototypeId] - private const string ShaderDropTargetOutOfRange = "SelectionOutline"; - /// /// Current entity being dragged around. /// @@ -113,8 +111,8 @@ public sealed class DragDropSystem : SharedDragDropSystem Subs.CVar(_cfgMan, CCVars.DragDropDeadZone, SetDeadZone, true); - _dropTargetInRangeShader = _prototypeManager.Index(ShaderDropTargetInRange).Instance(); - _dropTargetOutOfRangeShader = _prototypeManager.Index(ShaderDropTargetOutOfRange).Instance(); + _dropTargetInRangeShader = _prototypeManager.Index(ShaderDropTargetInRange).Instance(); + _dropTargetOutOfRangeShader = _prototypeManager.Index(ShaderDropTargetOutOfRange).Instance(); // needs to fire on mouseup and mousedown so we can detect a drag / drop CommandBinds.Builder .BindBefore(EngineKeyFunctions.Use, new PointerInputCmdHandler(OnUse, false, true), new[] { typeof(SharedInteractionSystem) }) diff --git a/Content.Client/Light/AmbientOcclusionOverlay.cs b/Content.Client/Light/AmbientOcclusionOverlay.cs index f771dbe9fc..4caf654494 100644 --- a/Content.Client/Light/AmbientOcclusionOverlay.cs +++ b/Content.Client/Light/AmbientOcclusionOverlay.cs @@ -15,6 +15,10 @@ namespace Content.Client.Light; /// public sealed class AmbientOcclusionOverlay : Overlay { + private static readonly ProtoId UnshadedShader = "unshaded"; + private static readonly ProtoId StencilMaskShader = "StencilMask"; + private static readonly ProtoId StencilEqualDrawShader = "StencilEqualDraw"; + [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly IConfigurationManager _cfgManager = default!; [Dependency] private readonly IEntityManager _entManager = default!; @@ -87,7 +91,7 @@ public sealed class AmbientOcclusionOverlay : Overlay args.WorldHandle.RenderInRenderTarget(_aoTarget, () => { - worldHandle.UseShader(_proto.Index("unshaded").Instance()); + worldHandle.UseShader(_proto.Index(UnshadedShader).Instance()); var invMatrix = _aoTarget.GetWorldToLocalMatrix(viewport.Eye!, scale); foreach (var entry in query.QueryAabb(mapId, worldBounds)) @@ -110,7 +114,7 @@ public sealed class AmbientOcclusionOverlay : Overlay () => { // Don't want lighting affecting it. - worldHandle.UseShader(_proto.Index("unshaded").Instance()); + worldHandle.UseShader(_proto.Index(UnshadedShader).Instance()); foreach (var grid in _mapManager.FindGridsIntersecting(mapId, worldBounds)) { @@ -131,11 +135,11 @@ public sealed class AmbientOcclusionOverlay : Overlay }, Color.Transparent); // Draw the stencil texture to depth buffer. - worldHandle.UseShader(_proto.Index("StencilMask").Instance()); + worldHandle.UseShader(_proto.Index(StencilMaskShader).Instance()); worldHandle.DrawTextureRect(_aoStencilTarget!.Texture, worldBounds); // Draw the Blurred AO texture finally. - worldHandle.UseShader(_proto.Index("StencilEqualDraw").Instance()); + worldHandle.UseShader(_proto.Index(StencilEqualDrawShader).Instance()); worldHandle.DrawTextureRect(_aoTarget!.Texture, worldBounds, color); args.WorldHandle.SetTransform(Matrix3x2.Identity); diff --git a/Content.Client/Light/SunShadowOverlay.cs b/Content.Client/Light/SunShadowOverlay.cs index a296f95479..f30f4c0409 100644 --- a/Content.Client/Light/SunShadowOverlay.cs +++ b/Content.Client/Light/SunShadowOverlay.cs @@ -11,6 +11,8 @@ namespace Content.Client.Light; public sealed class SunShadowOverlay : Overlay { + private static readonly ProtoId MixShader = "Mix"; + public override OverlaySpace Space => OverlaySpace.BeforeLighting; [Dependency] private readonly IClyde _clyde = default!; @@ -150,7 +152,7 @@ public sealed class SunShadowOverlay : Overlay viewport.LightRenderTarget.GetWorldToLocalMatrix(eye, scale); worldHandle.SetTransform(invMatrix); - var maskShader = _protoManager.Index("Mix").Instance(); + var maskShader = _protoManager.Index(MixShader).Instance(); worldHandle.UseShader(maskShader); worldHandle.DrawTextureRect(_target.Texture, worldBounds, Color.Black.WithAlpha(alpha)); diff --git a/Content.Client/Mapping/MappingOverlay.cs b/Content.Client/Mapping/MappingOverlay.cs index ed44b43d52..e461440996 100644 --- a/Content.Client/Mapping/MappingOverlay.cs +++ b/Content.Client/Mapping/MappingOverlay.cs @@ -11,6 +11,8 @@ namespace Content.Client.Mapping; public sealed class MappingOverlay : Overlay { + private static readonly ProtoId UnshadedShader = "unshaded"; + [Dependency] private readonly IEntityManager _entities = default!; [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; @@ -35,7 +37,7 @@ public sealed class MappingOverlay : Overlay _sprite = _entities.System(); _state = state; - _shader = _prototypes.Index("unshaded").Instance(); + _shader = _prototypes.Index(UnshadedShader).Instance(); } protected override void Draw(in OverlayDrawArgs args) diff --git a/Content.Client/Movement/Systems/FloorOcclusionSystem.cs b/Content.Client/Movement/Systems/FloorOcclusionSystem.cs index 44573f8e08..6520d98ac9 100644 --- a/Content.Client/Movement/Systems/FloorOcclusionSystem.cs +++ b/Content.Client/Movement/Systems/FloorOcclusionSystem.cs @@ -8,6 +8,8 @@ namespace Content.Client.Movement.Systems; public sealed class FloorOcclusionSystem : SharedFloorOcclusionSystem { + private static readonly ProtoId HorizontalCut = "HorizontalCut"; + [Dependency] private readonly IPrototypeManager _proto = default!; private EntityQuery _spriteQuery; @@ -48,7 +50,7 @@ public sealed class FloorOcclusionSystem : SharedFloorOcclusionSystem if (!_spriteQuery.Resolve(sprite.Owner, ref sprite.Comp, false)) return; - var shader = _proto.Index("HorizontalCut").Instance(); + var shader = _proto.Index(HorizontalCut).Instance(); if (sprite.Comp.PostShader is not null && sprite.Comp.PostShader != shader) return; diff --git a/Content.Client/Outline/TargetOutlineSystem.cs b/Content.Client/Outline/TargetOutlineSystem.cs index 0d9b9787ae..73d45a17a9 100644 --- a/Content.Client/Outline/TargetOutlineSystem.cs +++ b/Content.Client/Outline/TargetOutlineSystem.cs @@ -15,6 +15,9 @@ namespace Content.Client.Outline; /// public sealed class TargetOutlineSystem : EntitySystem { + private static readonly ProtoId ShaderTargetValid = "SelectionOutlineInrange"; + private static readonly ProtoId ShaderTargetInvalid = "SelectionOutline"; + [Dependency] private readonly IEyeManager _eyeManager = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; @@ -70,12 +73,6 @@ public sealed class TargetOutlineSystem : EntitySystem private Vector2 LookupVector => new(LookupSize, LookupSize); - [ValidatePrototypeId] - private const string ShaderTargetValid = "SelectionOutlineInrange"; - - [ValidatePrototypeId] - private const string ShaderTargetInvalid = "SelectionOutline"; - private ShaderInstance? _shaderTargetValid; private ShaderInstance? _shaderTargetInvalid; @@ -85,8 +82,8 @@ public sealed class TargetOutlineSystem : EntitySystem { base.Initialize(); - _shaderTargetValid = _prototypeManager.Index(ShaderTargetValid).InstanceUnique(); - _shaderTargetInvalid = _prototypeManager.Index(ShaderTargetInvalid).InstanceUnique(); + _shaderTargetValid = _prototypeManager.Index(ShaderTargetValid).InstanceUnique(); + _shaderTargetInvalid = _prototypeManager.Index(ShaderTargetInvalid).InstanceUnique(); } public void Disable() diff --git a/Content.Client/Overlays/BlackAndWhiteOverlay.cs b/Content.Client/Overlays/BlackAndWhiteOverlay.cs index 785d1dad7f..251a9534a2 100644 --- a/Content.Client/Overlays/BlackAndWhiteOverlay.cs +++ b/Content.Client/Overlays/BlackAndWhiteOverlay.cs @@ -6,6 +6,8 @@ namespace Content.Client.Overlays; public sealed partial class BlackAndWhiteOverlay : Overlay { + private static readonly ProtoId Shader = "GreyscaleFullscreen"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public override OverlaySpace Space => OverlaySpace.WorldSpace; @@ -15,7 +17,7 @@ public sealed partial class BlackAndWhiteOverlay : Overlay public BlackAndWhiteOverlay() { IoCManager.InjectDependencies(this); - _greyscaleShader = _prototypeManager.Index("GreyscaleFullscreen").InstanceUnique(); + _greyscaleShader = _prototypeManager.Index(Shader).InstanceUnique(); ZIndex = 10; // draw this over the DamageOverlay, RainbowOverlay etc. } diff --git a/Content.Client/Overlays/NoirOverlay.cs b/Content.Client/Overlays/NoirOverlay.cs index d2a6cbe8b3..f9e468f995 100644 --- a/Content.Client/Overlays/NoirOverlay.cs +++ b/Content.Client/Overlays/NoirOverlay.cs @@ -6,6 +6,8 @@ namespace Content.Client.Overlays; public sealed partial class NoirOverlay : Overlay { + private static readonly ProtoId Shader = "Noir"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public override OverlaySpace Space => OverlaySpace.WorldSpace; @@ -15,7 +17,7 @@ public sealed partial class NoirOverlay : Overlay public NoirOverlay() { IoCManager.InjectDependencies(this); - _noirShader = _prototypeManager.Index("Noir").InstanceUnique(); + _noirShader = _prototypeManager.Index(Shader).InstanceUnique(); ZIndex = 9; // draw this over the DamageOverlay, RainbowOverlay etc, but before the black and white shader } diff --git a/Content.Client/Overlays/StencilOverlay.RestrictedRange.cs b/Content.Client/Overlays/StencilOverlay.RestrictedRange.cs index d29564caa9..a5efacc16c 100644 --- a/Content.Client/Overlays/StencilOverlay.RestrictedRange.cs +++ b/Content.Client/Overlays/StencilOverlay.RestrictedRange.cs @@ -45,13 +45,13 @@ public sealed partial class StencilOverlay }, Color.Transparent); worldHandle.SetTransform(Matrix3x2.Identity); - worldHandle.UseShader(_protoManager.Index("StencilMask").Instance()); + worldHandle.UseShader(_protoManager.Index(StencilMask).Instance()); worldHandle.DrawTextureRect(_blep!.Texture, worldBounds); var curTime = _timing.RealTime; var sprite = _sprite.GetFrame(new SpriteSpecifier.Texture(new ResPath("/Textures/Parallaxes/noise.png")), curTime); // Draw the rain - worldHandle.UseShader(_protoManager.Index("StencilDraw").Instance()); + worldHandle.UseShader(_protoManager.Index(StencilDraw).Instance()); _parallax.DrawParallax(worldHandle, worldAABB, sprite, curTime, position, new Vector2(0.5f, 0f)); } } diff --git a/Content.Client/Overlays/StencilOverlay.Weather.cs b/Content.Client/Overlays/StencilOverlay.Weather.cs index b1a521433a..509b946ad4 100644 --- a/Content.Client/Overlays/StencilOverlay.Weather.cs +++ b/Content.Client/Overlays/StencilOverlay.Weather.cs @@ -55,13 +55,13 @@ public sealed partial class StencilOverlay }, Color.Transparent); worldHandle.SetTransform(Matrix3x2.Identity); - worldHandle.UseShader(_protoManager.Index("StencilMask").Instance()); + worldHandle.UseShader(_protoManager.Index(StencilMask).Instance()); worldHandle.DrawTextureRect(_blep!.Texture, worldBounds); var curTime = _timing.RealTime; var sprite = _sprite.GetFrame(weatherProto.Sprite, curTime); // Draw the rain - worldHandle.UseShader(_protoManager.Index("StencilDraw").Instance()); + worldHandle.UseShader(_protoManager.Index(StencilDraw).Instance()); _parallax.DrawParallax(worldHandle, worldAABB, sprite, curTime, position, Vector2.Zero, modulate: (weatherProto.Color ?? Color.White).WithAlpha(alpha)); worldHandle.SetTransform(Matrix3x2.Identity); diff --git a/Content.Client/Overlays/StencilOverlay.cs b/Content.Client/Overlays/StencilOverlay.cs index e8461ae5a3..0796be08e1 100644 --- a/Content.Client/Overlays/StencilOverlay.cs +++ b/Content.Client/Overlays/StencilOverlay.cs @@ -17,6 +17,10 @@ namespace Content.Client.Overlays; /// public sealed partial class StencilOverlay : Overlay { + private static readonly ProtoId CircleShader = "WorldGradientCircle"; + private static readonly ProtoId StencilMask = "StencilMask"; + private static readonly ProtoId StencilDraw = "StencilDraw"; + [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly IEntityManager _entManager = default!; [Dependency] private readonly IGameTiming _timing = default!; @@ -43,7 +47,7 @@ public sealed partial class StencilOverlay : Overlay _sprite = sprite; _weather = weather; IoCManager.InjectDependencies(this); - _shader = _protoManager.Index("WorldGradientCircle").InstanceUnique(); + _shader = _protoManager.Index(CircleShader).InstanceUnique(); } protected override void Draw(in OverlayDrawArgs args) diff --git a/Content.Client/Paper/UI/StampLabel.xaml.cs b/Content.Client/Paper/UI/StampLabel.xaml.cs index be6d52baea..1750110c4c 100644 --- a/Content.Client/Paper/UI/StampLabel.xaml.cs +++ b/Content.Client/Paper/UI/StampLabel.xaml.cs @@ -10,6 +10,8 @@ namespace Content.Client.Paper.UI; [GenerateTypedNameReferences] public sealed partial class StampLabel : Label { + private static readonly ProtoId PaperStamp = "PaperStamp"; + /// A scale that's applied to the text to ensure it /// fits in the allowed space. private Vector2 _textScaling = Vector2.One; @@ -26,7 +28,7 @@ public sealed partial class StampLabel : Label RobustXamlLoader.Load(this); var prototypes = IoCManager.Resolve(); - _stampShader = prototypes.Index("PaperStamp").InstanceUnique(); + _stampShader = prototypes.Index(PaperStamp).InstanceUnique(); } protected override Vector2 MeasureOverride(Vector2 availableSize) diff --git a/Content.Client/Paper/UI/StampWidget.xaml.cs b/Content.Client/Paper/UI/StampWidget.xaml.cs index 487e0732b4..a462d40e69 100644 --- a/Content.Client/Paper/UI/StampWidget.xaml.cs +++ b/Content.Client/Paper/UI/StampWidget.xaml.cs @@ -12,6 +12,8 @@ namespace Content.Client.Paper.UI; [GenerateTypedNameReferences] public sealed partial class StampWidget : PanelContainer { + private static readonly ProtoId PaperStamp = "PaperStamp"; + private StyleBoxTexture _borderTexture; private ShaderInstance? _stampShader; @@ -42,7 +44,7 @@ public sealed partial class StampWidget : PanelContainer PanelOverride = _borderTexture; var prototypes = IoCManager.Resolve(); - _stampShader = prototypes.Index("PaperStamp").InstanceUnique(); + _stampShader = prototypes.Index(PaperStamp).InstanceUnique(); } protected override void Draw(DrawingHandleScreen handle) diff --git a/Content.Client/ParticleAccelerator/UI/ParticleAcceleratorControlMenu.xaml.cs b/Content.Client/ParticleAccelerator/UI/ParticleAcceleratorControlMenu.xaml.cs index cc5016c4a7..27a585119e 100644 --- a/Content.Client/ParticleAccelerator/UI/ParticleAcceleratorControlMenu.xaml.cs +++ b/Content.Client/ParticleAccelerator/UI/ParticleAcceleratorControlMenu.xaml.cs @@ -262,6 +262,7 @@ public sealed partial class ParticleAcceleratorControlMenu : FancyWindow public sealed class PASegmentControl : Control { + private static readonly ProtoId GreyscaleShaderId = "Greyscale"; private readonly ShaderInstance _greyScaleShader; private readonly TextureRect _base; private readonly TextureRect _unlit; @@ -272,7 +273,7 @@ public sealed class PASegmentControl : Control public PASegmentControl() { - _greyScaleShader = IoCManager.Resolve().Index("Greyscale").Instance(); + _greyScaleShader = IoCManager.Resolve().Index(GreyscaleShaderId).Instance(); AddChild(_base = new TextureRect()); AddChild(_unlit = new TextureRect()); diff --git a/Content.Client/Popups/PopupOverlay.cs b/Content.Client/Popups/PopupOverlay.cs index cf22c8bbd5..3b3e9cd463 100644 --- a/Content.Client/Popups/PopupOverlay.cs +++ b/Content.Client/Popups/PopupOverlay.cs @@ -16,6 +16,8 @@ namespace Content.Client.Popups; /// public sealed class PopupOverlay : Overlay { + private static readonly ProtoId UnshadedShader = "unshaded"; + private readonly IConfigurationManager _configManager; private readonly IEntityManager _entManager; private readonly IPlayerManager _playerMgr; @@ -48,7 +50,7 @@ public sealed class PopupOverlay : Overlay _popup = popup; _controller = controller; - _shader = protoManager.Index("unshaded").Instance(); + _shader = protoManager.Index(UnshadedShader).Instance(); } protected override void Draw(in OverlayDrawArgs args) diff --git a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs index d6e36dd0ad..4cbeaa52f5 100644 --- a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs +++ b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs @@ -13,6 +13,8 @@ namespace Content.Client.Radiation.Overlays { public sealed class RadiationPulseOverlay : Overlay { + private static readonly ProtoId RadiationShader = "Radiation"; + [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; @@ -29,7 +31,7 @@ namespace Content.Client.Radiation.Overlays public RadiationPulseOverlay() { IoCManager.InjectDependencies(this); - _baseShader = _prototypeManager.Index("Radiation").Instance().Duplicate(); + _baseShader = _prototypeManager.Index(RadiationShader).Instance().Duplicate(); } protected override bool BeforeDraw(in OverlayDrawArgs args) diff --git a/Content.Client/Shuttles/FtlArrivalOverlay.cs b/Content.Client/Shuttles/FtlArrivalOverlay.cs index f24a1e9648..185d26f333 100644 --- a/Content.Client/Shuttles/FtlArrivalOverlay.cs +++ b/Content.Client/Shuttles/FtlArrivalOverlay.cs @@ -14,6 +14,8 @@ namespace Content.Client.Shuttles; /// public sealed class FtlArrivalOverlay : Overlay { + private static readonly ProtoId UnshadedShader = "unshaded"; + public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowEntities; private EntityLookupSystem _lookups; @@ -36,7 +38,7 @@ public sealed class FtlArrivalOverlay : Overlay _maps = _entManager.System(); _sprites = _entManager.System(); - _shader = _protos.Index("unshaded").Instance(); + _shader = _protos.Index(UnshadedShader).Instance(); } protected override bool BeforeDraw(in OverlayDrawArgs args) diff --git a/Content.Client/Silicons/StationAi/StationAiOverlay.cs b/Content.Client/Silicons/StationAi/StationAiOverlay.cs index 15a8a3a63f..5c84ce0c93 100644 --- a/Content.Client/Silicons/StationAi/StationAiOverlay.cs +++ b/Content.Client/Silicons/StationAi/StationAiOverlay.cs @@ -12,6 +12,10 @@ namespace Content.Client.Silicons.StationAi; public sealed class StationAiOverlay : Overlay { + private static readonly ProtoId CameraStaticShader = "CameraStatic"; + private static readonly ProtoId StencilMaskShader = "StencilMask"; + private static readonly ProtoId StencilDrawShader = "StencilDraw"; + [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly IEntityManager _entManager = default!; [Dependency] private readonly IGameTiming _timing = default!; @@ -91,7 +95,7 @@ public sealed class StationAiOverlay : Overlay () => { worldHandle.SetTransform(invMatrix); - var shader = _proto.Index("CameraStatic").Instance(); + var shader = _proto.Index(CameraStaticShader).Instance(); worldHandle.UseShader(shader); worldHandle.DrawRect(worldBounds, Color.White); }, @@ -114,11 +118,11 @@ public sealed class StationAiOverlay : Overlay } // Use the lighting as a mask - worldHandle.UseShader(_proto.Index("StencilMask").Instance()); + worldHandle.UseShader(_proto.Index(StencilMaskShader).Instance()); worldHandle.DrawTextureRect(_stencilTexture!.Texture, worldBounds); // Draw the static - worldHandle.UseShader(_proto.Index("StencilDraw").Instance()); + worldHandle.UseShader(_proto.Index(StencilDrawShader).Instance()); worldHandle.DrawTextureRect(_staticTexture!.Texture, worldBounds); worldHandle.SetTransform(Matrix3x2.Identity); diff --git a/Content.Client/Singularity/SingularityOverlay.cs b/Content.Client/Singularity/SingularityOverlay.cs index e71b6e96b8..39b0758bf1 100644 --- a/Content.Client/Singularity/SingularityOverlay.cs +++ b/Content.Client/Singularity/SingularityOverlay.cs @@ -9,6 +9,8 @@ namespace Content.Client.Singularity { public sealed class SingularityOverlay : Overlay, IEntityEventSubscriber { + private static readonly ProtoId Shader = "Singularity"; + [Dependency] private readonly IEntityManager _entMan = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; private SharedTransformSystem? _xformSystem = null; @@ -29,7 +31,7 @@ namespace Content.Client.Singularity public SingularityOverlay() { IoCManager.InjectDependencies(this); - _shader = _prototypeManager.Index("Singularity").Instance().Duplicate(); + _shader = _prototypeManager.Index(Shader).Instance().Duplicate(); _shader.SetParameter("maxDistance", MaxDistance * EyeManager.PixelsPerMeter); _entMan.EventBus.SubscribeEvent(EventSource.Local, this, OnProjectFromScreenToMap); ZIndex = 101; // Should be drawn after the placement overlay so admins placing items near the singularity can tell where they're going. diff --git a/Content.Client/StatusIcon/StatusIconOverlay.cs b/Content.Client/StatusIcon/StatusIconOverlay.cs index aff450e657..4d3be5439c 100644 --- a/Content.Client/StatusIcon/StatusIconOverlay.cs +++ b/Content.Client/StatusIcon/StatusIconOverlay.cs @@ -11,6 +11,8 @@ namespace Content.Client.StatusIcon; public sealed class StatusIconOverlay : Overlay { + private static readonly ProtoId UnshadedShader = "unshaded"; + [Dependency] private readonly IEntityManager _entity = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IGameTiming _timing = default!; @@ -29,7 +31,7 @@ public sealed class StatusIconOverlay : Overlay _sprite = _entity.System(); _transform = _entity.System(); _statusIcon = _entity.System(); - _unshadedShader = _prototype.Index("unshaded").Instance(); + _unshadedShader = _prototype.Index(UnshadedShader).Instance(); } protected override void Draw(in OverlayDrawArgs args) diff --git a/Content.Client/Stealth/StealthSystem.cs b/Content.Client/Stealth/StealthSystem.cs index 940f8f154d..5810b9bc85 100644 --- a/Content.Client/Stealth/StealthSystem.cs +++ b/Content.Client/Stealth/StealthSystem.cs @@ -10,6 +10,8 @@ namespace Content.Client.Stealth; public sealed class StealthSystem : SharedStealthSystem { + private static readonly ProtoId Shader = "Stealth"; + [Dependency] private readonly IPrototypeManager _protoMan = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly SpriteSystem _sprite = default!; @@ -20,7 +22,7 @@ public sealed class StealthSystem : SharedStealthSystem { base.Initialize(); - _shader = _protoMan.Index("Stealth").InstanceUnique(); + _shader = _protoMan.Index(Shader).InstanceUnique(); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnStartup); diff --git a/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorWindow.xaml.cs b/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorWindow.xaml.cs index 0fbaf858da..ac82fbff59 100644 --- a/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorWindow.xaml.cs +++ b/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorWindow.xaml.cs @@ -17,6 +17,8 @@ namespace Content.Client.SurveillanceCamera.UI; [GenerateTypedNameReferences] public sealed partial class SurveillanceCameraMonitorWindow : DefaultWindow { + private static readonly ProtoId CameraStaticShader = "CameraStatic"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IResourceCache _resourceCache = default!; @@ -53,7 +55,7 @@ public sealed partial class SurveillanceCameraMonitorWindow : DefaultWindow // This could be done better. I don't want to deal with stylesheets at the moment. var texture = _resourceCache.GetTexture("/Textures/Interface/Nano/square_black.png"); - var shader = _prototypeManager.Index("CameraStatic").Instance().Duplicate(); + var shader = _prototypeManager.Index(CameraStaticShader).Instance().Duplicate(); CameraView.ViewportSize = new Vector2i(500, 500); CameraView.Eye = _defaultEye; // sure diff --git a/Content.Client/UserInterface/Systems/DamageOverlays/Overlays/DamageOverlay.cs b/Content.Client/UserInterface/Systems/DamageOverlays/Overlays/DamageOverlay.cs index de70fe16f8..3eef88f19b 100644 --- a/Content.Client/UserInterface/Systems/DamageOverlays/Overlays/DamageOverlay.cs +++ b/Content.Client/UserInterface/Systems/DamageOverlays/Overlays/DamageOverlay.cs @@ -9,6 +9,8 @@ namespace Content.Client.UserInterface.Systems.DamageOverlays.Overlays; public sealed class DamageOverlay : Overlay { + private static readonly ProtoId CircleMaskShader = "GradientCircleMask"; + [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; @@ -49,9 +51,9 @@ public sealed class DamageOverlay : Overlay { // TODO: Replace IoCManager.InjectDependencies(this); - _oxygenShader = _prototypeManager.Index("GradientCircleMask").InstanceUnique(); - _critShader = _prototypeManager.Index("GradientCircleMask").InstanceUnique(); - _bruteShader = _prototypeManager.Index("GradientCircleMask").InstanceUnique(); + _oxygenShader = _prototypeManager.Index(CircleMaskShader).InstanceUnique(); + _critShader = _prototypeManager.Index(CircleMaskShader).InstanceUnique(); + _bruteShader = _prototypeManager.Index(CircleMaskShader).InstanceUnique(); } protected override void Draw(in OverlayDrawArgs args)