From e806655c9d78c0cc026b1a49f20b1eb4c9178ea6 Mon Sep 17 00:00:00 2001 From: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:27:09 +1000 Subject: [PATCH] Wave shader WIP (#288) * Created wave shader * more to _CP14 folders * add to tree * fix * pipiipi * Provided shader uniform to component fields * Fixed wave shader shit * goodies --------- Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Ed --- .../_CP14/Wave/CP14WaveShaderComponent.cs | 15 ++++++ .../_CP14/Wave/CP14WaveShaderSystem.cs | 53 +++++++++++++++++++ Content.Server/Entry/IgnoredComponents.cs | 1 + .../Structures/Flora/grasshighbush.yml | 3 ++ .../_CP14/Entities/Structures/Flora/trees.yml | 3 ++ .../Prototypes/_CP14/Shaders/shaders.yml | 4 ++ Resources/Textures/_CP14/Shaders/wave.swsl | 24 +++++++++ 7 files changed, 103 insertions(+) create mode 100644 Content.Client/_CP14/Wave/CP14WaveShaderComponent.cs create mode 100644 Content.Client/_CP14/Wave/CP14WaveShaderSystem.cs create mode 100644 Resources/Prototypes/_CP14/Shaders/shaders.yml create mode 100644 Resources/Textures/_CP14/Shaders/wave.swsl 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