diff --git a/Content.Client/_CP14/Wave/CP14WaveShaderComponent.cs b/Content.Client/_CP14/Wave/CP14WaveShaderComponent.cs new file mode 100644 index 0000000000..c65e2aa917 --- /dev/null +++ b/Content.Client/_CP14/Wave/CP14WaveShaderComponent.cs @@ -0,0 +1,15 @@ +namespace Content.Client._CP14.Wave; + +[RegisterComponent] +[Access(typeof(CP14WaveShaderSystem))] +public sealed partial class CP14WaveShaderComponent : Component +{ + [DataField] + public float Speed = 10f; + + [DataField] + public float Dis = 10f; + + [DataField] + public float Offset = 0f; +} diff --git a/Content.Client/_CP14/Wave/CP14WaveShaderSystem.cs b/Content.Client/_CP14/Wave/CP14WaveShaderSystem.cs new file mode 100644 index 0000000000..19f59c25dd --- /dev/null +++ b/Content.Client/_CP14/Wave/CP14WaveShaderSystem.cs @@ -0,0 +1,53 @@ +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Client._CP14.Wave; + +public sealed class CP14WaveShaderSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _protoMan = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + private ShaderInstance _shader = default!; + + public override void Initialize() + { + base.Initialize(); + + _shader = _protoMan.Index("Wave").InstanceUnique(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnBeforeShaderPost); + } + + private void OnStartup(Entity entity, ref ComponentStartup args) + { + entity.Comp.Offset = _random.NextFloat(0, 1000); + SetShader(entity.Owner, _shader); + } + + private void OnShutdown(Entity entity, ref ComponentShutdown args) + { + SetShader(entity.Owner, null); + } + + private void SetShader(Entity entity, ShaderInstance? instance) + { + if (!Resolve(entity, ref entity.Comp, false)) + return; + + entity.Comp.PostShader = instance; + entity.Comp.GetScreenTexture = instance is not null; + entity.Comp.RaiseShaderEvent = instance is not null; + } + + private void OnBeforeShaderPost(Entity entity, ref BeforePostShaderRenderEvent args) + { + _shader.SetParameter("Speed", entity.Comp.Speed); + _shader.SetParameter("Dis", entity.Comp.Dis); + _shader.SetParameter("Offset", entity.Comp.Offset); + } +} diff --git a/Content.Server/Entry/IgnoredComponents.cs b/Content.Server/Entry/IgnoredComponents.cs index d9b81c8e5a..092c947e1e 100644 --- a/Content.Server/Entry/IgnoredComponents.cs +++ b/Content.Server/Entry/IgnoredComponents.cs @@ -4,6 +4,7 @@ namespace Content.Server.Entry public static class IgnoredComponents { public static string[] List => new[] { + "CP14WaveShader", //CP14 Wave shader "ConstructionGhost", "IconSmooth", "InteractionOutline", diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Flora/grasshighbush.yml b/Resources/Prototypes/_CP14/Entities/Structures/Flora/grasshighbush.yml index e0e52e49ae..a87f79b41c 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Flora/grasshighbush.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Flora/grasshighbush.yml @@ -3,6 +3,9 @@ name: high bush description: Very tall and dense thickets. Perhaps someone is watching you from them components: + - type: CP14WaveShader + speed: 2.5 + dis: 4 - type: SpriteFade - type: Clickable - type: Sprite diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml b/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml index 7e6cd09999..80a7b317df 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml @@ -4,6 +4,9 @@ name: tree description: Decades of life and growth, saturating the surrounding nature with fresh air. components: + - type: CP14WaveShader + speed: 1 + dis: 5 - type: SpriteFade - type: Clickable - type: Sprite diff --git a/Resources/Prototypes/_CP14/Shaders/shaders.yml b/Resources/Prototypes/_CP14/Shaders/shaders.yml new file mode 100644 index 0000000000..718e1c926d --- /dev/null +++ b/Resources/Prototypes/_CP14/Shaders/shaders.yml @@ -0,0 +1,4 @@ +- type: shader + id: Wave + kind: source + path: "/Textures/_CP14/Shaders/wave.swsl" \ No newline at end of file diff --git a/Resources/Textures/_CP14/Shaders/wave.swsl b/Resources/Textures/_CP14/Shaders/wave.swsl new file mode 100644 index 0000000000..beed1f4f4c --- /dev/null +++ b/Resources/Textures/_CP14/Shaders/wave.swsl @@ -0,0 +1,24 @@ +preset raw; + +varying highp vec2 Pos; +varying highp vec4 VtxModulate; + +uniform highp float Speed = 3.0; +uniform highp float Dis = 10.0; +uniform highp float Offset = 0.0; + +void fragment() { + // Re-create base mvp + COLOR = zTexture(UV) * VtxModulate; +} + +void vertex() { + vec2 pos = aPos; + pos.x += sin(TIME * Speed + Offset) * Dis * (UV2.y - 1.0); + VERTEX = apply_mvp(pos); + + Pos = (VERTEX + 1.0) / 2.0; + UV = mix(modifyUV.xy, modifyUV.zw, tCoord); + UV2 = tCoord2; + VtxModulate = zFromSrgb(modulate); +} \ No newline at end of file