Corrected the spin behavior of the Redeemer Missile's outer reticle.

Added optional fancy screen shader to Redeemer.
This commit is contained in:
Marisa the Magician 2018-08-14 21:39:13 +02:00
commit 80ed7e0939
6 changed files with 65 additions and 15 deletions

View file

@ -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;

View file

@ -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
}

BIN
graphics/AroDup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

View file

@ -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"

View file

@ -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;
}

View file

@ -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<TargetActor> 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<numreadouts; i++ )
{
int scroll = (gametic*5)%128;
Screen.DrawTexture(readout,false,0,i*128-scroll,DTA_RenderStyle,(1|2<<8|1<<16));
Screen.DrawTexture(readout,false,0,i*128-scroll,DTA_VirtualWidthF,vs.x,DTA_VirtualHeightF,vs.y,DTA_KeepRatio,true,DTA_RenderStyle,(1|2<<8|1<<16));
}
}
}
@ -558,9 +569,11 @@ Class RedeemerHUDStatic : HUDMessageBase
Class RedeemerHUDHandler : EventHandler
{
ui RedeemerHUD rhud;
transient ui CVar deemershader;
override void RenderOverlay( RenderEvent e )
{
if ( !deemershader ) deemershader = CVar.GetCVar('flak_deemershader',players[consoleplayer]);
if ( e.Camera is 'GuidedWarShell' )
{
if ( !rhud )
@ -573,9 +586,12 @@ Class RedeemerHUDHandler : EventHandler
rhud.ViewAngle = e.ViewAngle;
rhud.ViewPitch = e.ViewPitch;
rhud.ViewRoll = e.ViewRoll;
Shader.SetEnabled(players[consoleplayer],"RedeemerView",deemershader.GetBool());
Shader.SetUniform1f(players[consoleplayer],"RedeemerView","Timer",gametic+e.fractic);
}
else if ( rhud )
{
Shader.SetEnabled(players[consoleplayer],"RedeemerView",false);
StatusBar.DetachMessage(rhud);
rhud.Destroy();
StatusBar.AttachMessage(new("RedeemerHUDStatic").Init(),0,StatusBar.HUDMSGLayer_UnderHUD);
@ -732,3 +748,4 @@ Class WarheadLauncher : UTWeapon replaces BFG9000
Wait;
}
}