diff --git a/cvarinfo.txt b/cvarinfo.txt index 5dc18f3..6473a5c 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -20,3 +20,4 @@ user float flak_statussize = 1.0; // 0.5 <-> 1.5 in steps of 0.1 (default 1.0) user bool flak_footsteps = true; server bool flak_translocator = false; user bool flak_noswitchdeemer = true; // don't switch to redeemer when out of ammo +user bool flak_deemershader = false; diff --git a/gldefs.txt b/gldefs.txt index fc91135..2658c6f 100644 --- a/gldefs.txt +++ b/gldefs.txt @@ -573,3 +573,10 @@ Object "UTGoldKey" { Frame "UKEY" { light "UTGoldKeyLight" } } +HardwareShader PostProcess scene +{ + Name "RedeemerView" + Shader "shaders/glsl/RedeemerView.fp" 330 + Texture StaticTexture "textures/static1.png" + Uniform float Timer +} diff --git a/graphics/AroDup.png b/graphics/AroDup.png new file mode 100644 index 0000000..b09503f Binary files /dev/null and b/graphics/AroDup.png differ diff --git a/menudef.txt b/menudef.txt index 06841a1..7312d7e 100644 --- a/menudef.txt +++ b/menudef.txt @@ -23,6 +23,7 @@ OptionMenu "UTOptionMenu" Option "Enforcer Reloading", "flak_enforcerreload", "YesNo" Option "Pulsegun Reloading", "flak_pulsereload", "YesNo" Option "Redeemer Target Visuals", "flak_redeemerreadout", "YesNo" + Option "Redeemer View Shader", "flak_deemershader", "YesNo" Option "No Redeemer Autoswitch", "flak_noswitchdeemer", "YesNo" StaticText " " Option "Enable Translocator", "flak_translocator", "YesNo" diff --git a/shaders/glsl/RedeemerView.fp b/shaders/glsl/RedeemerView.fp new file mode 100644 index 0000000..f849490 --- /dev/null +++ b/shaders/glsl/RedeemerView.fp @@ -0,0 +1,24 @@ +void main() +{ + vec4 tinted = texture(InputTexture,TexCoord); + vec2 nc; + vec2 px = 1.0/textureSize(InputTexture,0); + float cnt = 1.0; + for ( int j=-5; j<=5; j++ ) for ( int i=-5; i<=5; i++ ) + { + nc = TexCoord+px*vec2(i,j); + tinted += texture(InputTexture,nc); + cnt += 1.0; + } + tinted /= cnt; + vec2 coord = TexCoord; + coord *= 4.0; + coord.y *= px.x/px.y; + vec2 tc; + tc.x = coord.x*cos(Timer)-coord.y*sin(Timer); + tc.y = coord.x*sin(Timer)+coord.y*cos(Timer); + tinted = mix(tinted,texture(StaticTexture,tc),0.3); + tinted = pow(tinted,vec4(0.7,1.1,1.3,1.0)); + tinted *= vec4(1.2,0.6,0.5,1.0); + FragColor = tinted; +} diff --git a/zscript/warheadlauncher.zsc b/zscript/warheadlauncher.zsc index 4e793b7..6f43988 100644 --- a/zscript/warheadlauncher.zsc +++ b/zscript/warheadlauncher.zsc @@ -441,29 +441,30 @@ Class RedeemerHUD : HUDMessageBase Actor Camera; Vector3 ViewPos; double ViewAngle, ViewPitch, ViewRoll, LagRoll, LagRoll2; - TextureID reticle1, reticle2, mark, readout; + TextureID reticle1, reticle2, arrow, mark, readout; Font whfont; ThinkerIterator t; MidTracer tr; Array ta; - Shape2D rreticle; + Shape2D sshape, darrow; RedeemerHUD Init() { reticle1 = TexMan.CheckForTexture("GuidedX1",TexMan.Type_Any); reticle2 = TexMan.CheckForTexture("GuidedX2",TexMan.Type_Any); + arrow = TexMan.CheckForTexture("AroDup",TexMan.Type_Any); mark = TexMan.CheckForTexture("Crosshr6",TexMan.Type_Any); readout = TexMan.CheckForTexture("Readout",TexMan.Type_Any); whfont = Font.GetFont('WHFONT'); t = ThinkerIterator.Create("Actor"); tr = new("MidTracer"); - rreticle = new("Shape2D"); - rreticle.PushCoord((0,0)); - rreticle.PushCoord((1,0)); - rreticle.PushCoord((0,1)); - rreticle.PushCoord((1,1)); - rreticle.PushTriangle(0,3,1); - rreticle.PushTriangle(0,2,3); + sshape = new("Shape2D"); + sshape.PushCoord((0,0)); + sshape.PushCoord((1,0)); + sshape.PushCoord((0,1)); + sshape.PushCoord((1,1)); + sshape.PushTriangle(0,3,1); + sshape.PushTriangle(0,2,3); return self; } override bool Tick() @@ -508,24 +509,34 @@ Class RedeemerHUD : HUDMessageBase } // reticle Vector2 vs = (640,640/Screen.GetAspectRatio()); - Vector2 mid, siz; + Vector2 mid, siz, siz2; [mid, siz] = Screen.VirtualToRealCoords(vs*0.5,(128,128),vs,false,false); + [mid, siz2] = Screen.VirtualToRealCoords(vs*0.5,(8,4),vs,false,false); Vector2 verts[4]; verts[0] = (-siz.x,-siz.y); verts[1] = (siz.x,-siz.y); verts[2] = (-siz.x,siz.y); verts[3] = (siz.x,siz.y); - rreticle.Clear(Shape2D.C_Verts); + sshape.Clear(Shape2D.C_Verts); + double rrot = -LagRoll2*2; for ( int i=0; i<4; i++ ) - rreticle.PushVertex(mid+(verts[i].x*cos(LagRoll2)-verts[i].y*sin(LagRoll2),verts[i].x*sin(LagRoll2)+verts[i].y*cos(LagRoll2))); - Screen.DrawShape(reticle1,false,rreticle,DTA_RenderStyle,(1|2<<8|1<<16)); + sshape.PushVertex(mid+(verts[i].x*cos(rrot)-verts[i].y*sin(rrot),verts[i].x*sin(rrot)+verts[i].y*cos(rrot))); + Screen.DrawShape(reticle1,false,sshape,DTA_RenderStyle,(1|2<<8|1<<16)); + sshape.Clear(Shape2D.C_Verts); + verts[0] = (-siz2.x,siz.y+siz2.y); + verts[1] = (siz2.x,siz.y+siz2.y); + verts[2] = (-siz2.x,siz.y+3*siz2.y); + verts[3] = (siz2.x,siz.y+3*siz2.y); + for ( int i=0; i<4; i++ ) + sshape.PushVertex(mid+(verts[i].x*cos(rrot)-verts[i].y*sin(rrot),verts[i].x*sin(rrot)+verts[i].y*cos(rrot))); + Screen.DrawShape(arrow,false,sshape,DTA_RenderStyle,(1|2<<8|1<<16)); Screen.DrawTexture(reticle2,false,vs.x*0.5,vs.y*0.5,DTA_VirtualWidthF,vs.x,DTA_VirtualHeightF,vs.y,DTA_KeepRatio,true,DTA_RenderStyle,(1|2<<8|1<<16)); // faux assembly readout - int numreadouts = Screen.GetHeight()/128+2; + int numreadouts = int(vs.y/128+2); for ( int i=0; i