1
0
KF2-Dev-Scripts/UDKBase/classes/MobileHUDExt.uc

382 lines
11 KiB
Ucode
Raw Normal View History

2020-12-13 15:01:13 +00:00
/**
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class MobileHUDExt extends MobileHUD native;
/** Texture to use for 'tap-to-move' screen space effect */
var Texture2D TapToMoveTexture;
/** Last time that we were asked to draw the tap to move effect */
var float LastTapToMoveEffectTime;
var Vector2D TapToMoveEffectPos;
var bool bFlashJoysticks;
var float FlashTime;
/** The font to use for displaying benchmark results */
var font BenchmarkFont;
/** Background texture for displaying the benchmark results */
var Texture2D BenchmarkBackground;
var TextureUVs BenchmarkBackgroundUVs;
var float BenchmarkResolutionScale;
var int BenchmarkFeatureLevel;
native function UpdateBenchmarkInformation();
/** Starts drawing a transparent circle at the specified location for a brief moment (with animation) */
function StartTapToMoveEffect( float X, float Y )
{
// Store time that we were asked to draw the effect. This effectively "turns on" the effect.
LastTapToMoveEffectTime = WorldInfo.RealTimeSeconds;
TapToMoveEffectPos.X = X;
TapToMoveEffectPos.Y = Y;
}
/** Draws the tap to move effect if we need to */
function ConditionallyDrawTapToMoveEffect()
{
local float EffectDuration;
local float EffectSize;
local float EffectOpacity;
local float FadeInPercent;
local float FadeOutPercent;
local float EffectProgress;
local float AnimatedSize;
local float AnimatedOpacity;
// How long the effect should last
EffectDuration = 0.25;
FadeInPercent = 0.1;
FadeOutPercent = 0.6;
// How big the effect should be
EffectSize = 64.0;
// Maximum opacity of the effect
EffectOpacity = 0.3;
// Is it time to draw the effect?
if( WorldInfo.RealTimeSeconds - LastTapToMoveEffectTime < EffectDuration )
{
EffectProgress = FClamp( ( WorldInfo.RealTimeSeconds - LastTapToMoveEffectTime ) / EffectDuration, 0.0, 1.0 );
EffectProgress = FInterpEaseIn( 0.0, 1.0, EffectProgress, 1.5 );
AnimatedSize = EffectSize * 0.15 + EffectSize * EffectProgress * 0.85;
AnimatedOpacity = EffectOpacity;
// Fade in over the first bit of the effect
if( EffectProgress < FadeInPercent )
{
AnimatedOpacity *= ( EffectProgress / FadeInPercent );
}
// Fade out over the tail end of the effect
if( EffectProgress > ( 1.0 - FadeOutPercent ) )
{
AnimatedOpacity *= 1.0 - ( EffectProgress - ( 1.0 - FadeOutPercent ) ) / FadeOutPercent;
}
Canvas.SetPos( TapToMoveEffectPos.X - AnimatedSize * 0.5, TapToMoveEffectPos.Y - AnimatedSize * 0.5 );
Canvas.SetDrawColor( 255, 255, 255, AnimatedOpacity * 255.0 );
Canvas.DrawTile( TapToMoveTexture, AnimatedSize, AnimatedSize, 0.0, 0.0, TapToMoveTexture.GetSurfaceWidth(), TapToMoveTexture.GetSurfaceHeight() );
}
}
function bool ShowMobileHud()
{
// Show the mobile HUD if we are allowed to and if we don't have the HUD disabled via cinematic mode.
return bShowMobileHud && bShowHud;
}
function PostRender()
{
local CastlePC PC;
Instigator = PlayerOwner.Pawn;
super.PostRender();
PC = CastlePC(PlayerOwner);
if (PC.bIsInAttractMode)
{
PostRenderAttractMode();
}
// Display benchmark information
if (PC.bIsInBenchmarkMode)
{
// If the benchmark loop has completed, then display the results of the benchmark loop
if( PC.bBenchmarkLoopCompleted )
{
PostRenderBenchmarkModeCompleted();
}
else
{
PostRenderBenchmarkModeRunning();
}
}
if ( bShowHud && !PC.bIsInAttractMode)
return;
// Draw the tap to move HUD animation, if we need to
ConditionallyDrawTapToMoveEffect();
}
function PostRenderAttractMode()
{
local float Scale,w,h;
Scale = Canvas.ClipX / 960;
w = 124 * Scale;
h = w * 1.193548387096774;
Canvas.SetPos(Canvas.ClipX - 192*Scale, Canvas.ClipY - 171*Scale);
Canvas.DrawColor = WhiteColor;
Canvas.DrawTile(Texture2D'CastleUI.menus.T_CastleMenu2',w,h,0,1518,248,296);
}
function PostRenderBenchmarkModeCompleted()
{
local CastlePC PC;
local int fps, ScreenCenterX, BGTop, BGWidth, BGHeight, ScaledWindowWidth, ScaledWindowHeight;
local float StringWidth, StringHeight, TextScale;
local string PerformanceString;
UpdateBenchmarkInformation();
Canvas.Font = BenchmarkFont;
PC = CastlePC(PlayerOwner);
TextScale = 1.5f;
ScreenCenterX = PC.ViewportSize.X / 2;
BGTop = PC.ViewportSize.Y * 0.28;
BGWidth = PC.ViewportSize.Y * 1.0;
BGHeight = PC.ViewportSize.Y * 0.55;
// Draw background
Canvas.SetPos(ScreenCenterX - BGWidth/2, BGTop);
Canvas.DrawTile(BenchmarkBackground, BGWidth, BGHeight, BenchmarkBackgroundUVs.U, BenchmarkBackgroundUVs.V, BenchmarkBackgroundUVs.UL, BenchmarkBackgroundUVs.VL);
// Draw benchmark results header
Canvas.DrawColor = WhiteColor;
Canvas.StrLen( "Benchmark Results", StringWidth, StringHeight );
Canvas.SetPos( ScreenCenterX - StringWidth/2 * TextScale, BGTop + BGHeight * 0.1 );
Canvas.DrawText( "Benchmark Results", true, TextScale, TextScale );
// Draw result fields here
fps = 10 * PC.BenchmarkNumFrames / PC.BenchmarkElapsedTime;
Canvas.StrLen( "Average FPS: " $ (fps/10) $ "." $ (fps%10), StringWidth, StringHeight );
Canvas.SetPos( ScreenCenterX - StringWidth/2 * TextScale, BGTop + (BGHeight * 0.25) );
Canvas.DrawText( "Average FPS: " $ (fps/10) $ "." $ (fps%10), false, TextScale, TextScale );
// Draw benchmark information
ScaledWindowWidth = SizeX * BenchmarkResolutionScale;
ScaledWindowHeight = SizeY * BenchmarkResolutionScale;
Canvas.StrLen( "Resolution: " $ ScaledWindowWidth $ "x" $ ScaledWindowHeight, StringWidth, StringHeight );
Canvas.SetPos( ScreenCenterX - StringWidth/2 * TextScale, BGTop + (BGHeight * 0.4) );
Canvas.DrawText( "Resolution: " $ ScaledWindowWidth $ "x" $ ScaledWindowHeight, false, TextScale, TextScale );
Canvas.StrLen( "Performance Level: ", StringWidth, StringHeight );
Canvas.SetPos( ScreenCenterX - StringWidth/2 * TextScale, BGTop + (BGHeight * 0.55) );
Canvas.DrawText( "Performance Level: ", false, TextScale, TextScale );
switch (BenchmarkFeatureLevel)
{
case 1:
PerformanceString = "High Quality";
break;
case 0:
default:
PerformanceString = "High Performance";
break;
}
Canvas.StrLen( PerformanceString, StringWidth, StringHeight );
Canvas.SetPos( ScreenCenterX - StringWidth/2 * TextScale, BGTop + (BGHeight * 0.7) );
Canvas.DrawText( PerformanceString, false, TextScale, TextScale );
}
function PostRenderBenchmarkModeRunning()
{
local CastlePC PC;
local float Scale;
local int fps, ScreenCenterX;
local float StringWidth, StringHeight, MaxFPSWidth, FpsY;
Canvas.Font = BenchmarkFont;
PC = CastlePC(PlayerOwner);
Scale = PC.PauseMenu.Scale;
ScreenCenterX = PC.ViewportSize.X / 2;
// Draw the frame rate of the current frame
fps = 1 / WorldInfo.DeltaSeconds;
Canvas.StrLen( "Benchmarking...", StringWidth, StringHeight );
Canvas.SetPos( ScreenCenterX - (StringWidth / 2), PC.PauseMenu.Height );
Canvas.DrawColor = WhiteColor;
Canvas.DrawText( "Benchmarking...", false );
// Draw fps information
Canvas.StrLen( "100", MaxFPSWidth, StringHeight );
Canvas.StrLen( fps, StringWidth, StringHeight );
FpsY = PC.ViewportSize.Y - StringHeight * Scale - 20 * Scale;
Canvas.SetPos( 30 * Scale - StringWidth + MaxFPSWidth, FpsY );
Canvas.DrawText( fps, false );
Canvas.SetPos( 45 * Scale + MaxFPSWidth, FpsY );
Canvas.DrawText( "FPS", false );
}
function DrawMobileZone_Slider(MobileInputZone Zone)
{
local TextureUVs UVs;
local Texture2D Tex;
local float Ofs,Scale;
// First, look up the Texture
Tex = SliderImages[int(Zone.SlideType)];
UVs = SliderUVs[int(Zone.SlideType)];
// Now, figure out where we have to draw.
Scale = CastlePC(PlayerOwner).PauseMenu.Scale;
Ofs = 16 *Scale;
Canvas.SetPos(Zone.CurrentLocation.X, Zone.CurrentLocation.Y-Ofs);
Canvas.DrawTile(Tex,Zone.ActiveSizeX, Zone.ActiveSizeY, UVs.U, UVs.V, UVs.UL, UVs.VL);
}
function DrawMobileZone_Joystick(MobileInputZone Zone)
{
local int X, Y, Width, Height;
local Color LineColor;
local float ClampedX, ClampedY, Scale;
local Color TempColor;
local float FlashScale;
if (bFlashJoysticks)
{
FlashScale = FInterpEaseOut(3.0,1.0,FlashTime/0.75,2);
FlashTime += RenderDelta;
if (FlashTime > 0.75)
{
bFlashJoysticks = false;
}
}
else
{
FlashScale = 1.0;
}
if (JoystickBackground != none)
{
Width = Zone.ActiveSizeX * FlashScale;
Height = Zone.ActiveSizeY * FlashScale;
X = Zone.CurrentCenter.X - (Width /2);
Y = Zone.CurrentCenter.Y - (Height /2);
Canvas.SetPos(X,Y);
Canvas.DrawTile(JoystickBackground, Width, Height, JoystickBackgroundUVs.U, JoystickBackgroundUVs.V, JoystickBackgroundUVs.UL, JoystickBackgroundUVs.VL);
}
// Draw the Hat
if (JoystickHat != none)
{
// Compute X and Y clamped to the size of the zone for the joystick
ClampedX = Zone.CurrentLocation.X - Zone.CurrentCenter.X;
ClampedY = Zone.CurrentLocation.Y - Zone.CurrentCenter.Y;
Scale = 1.0f;
if ( ClampedX != 0 || ClampedY != 0 )
{
Scale = Min( Zone.ActiveSizeX, Zone.ActiveSizeY ) / ( 2.0 * Sqrt(ClampedX * ClampedX + ClampedY * ClampedY) );
Scale = FMin( 1.0, Scale );
}
ClampedX = ClampedX * Scale + Zone.CurrentCenter.X;
ClampedY = ClampedY * Scale + Zone.CurrentCenter.Y;
if (Zone.bRenderGuides)
{
TempColor = Canvas.DrawColor;
LineColor.R = 128;
LineColor.G = 128;
LineColor.B = 128;
LineColor.A = 255;
Canvas.Draw2DLine(Zone.CurrentCenter.X, Zone.CurrentCenter.Y, ClampedX, ClampedY, LineColor);
Canvas.DrawColor = TempColor;
}
// The size of the indicator will be a fraction of the background's total size
Width = Zone.ActiveSizeX * 0.65 * FlashScale;
Height = Zone.ActiveSizeY * 0.65 * FlashScale;
Canvas.SetPos( ClampedX - Width / 2, ClampedY - Height / 2);
Canvas.DrawTile(JoystickHat, Width, Height, JoystickHatUVs.U, JoystickHatUVs.V, JoystickHatUVs.UL, JoystickHatUVs.VL);
}
}
function FlashSticks()
{
bFlashJoysticks = true;
FlashTime = 0;
}
defaultproperties
{
JoystickBackground=Texture2D'MobileResources.T_MobileControls_texture'
JoystickBackgroundUVs=(U=0,V=0,UL=126,VL=126)
JoystickHat=Texture2D'MobileResources.T_MobileControls_texture'
JoystickHatUVs=(U=128,V=0,UL=78,VL=78)
ButtonImages(0)=Texture2D'MobileResources.HUD.MobileHUDButton3'
ButtonImages(1)=Texture2D'MobileResources.HUD.MobileHUDButton3'
ButtonUVs(0)=(U=0,V=0,UL=32,VL=32)
ButtonUVs(1)=(U=0,V=0,UL=32,VL=32)
TrackballBackground=none
TrackballTouchIndicator=Texture2D'MobileResources.T_MobileControls_texture'
TrackballTouchIndicatorUVs=(U=160,V=0,UL=92,VL=92)
ButtonFont = Font'EngineFonts.SmallFont'
ButtonCaptionColor=(R=0,G=0,B=0,A=255);
SliderImages(0)=Texture2D'CastleUI.menus.T_CastleMenu2'
SliderImages(1)=Texture2D'CastleUI.menus.T_CastleMenu2'
SliderImages(2)=Texture2D'CastleUI.menus.T_CastleMenu2'
SliderImages(3)=Texture2D'CastleUI.menus.T_CastleMenu2'
SliderUVs(0)=(U=1282,V=440,UL=322,VL=150)
SliderUVs(1)=(U=1282,V=440,UL=322,VL=150)
SliderUVs(2)=(U=1282,V=440,UL=322,VL=150)
SliderUVs(3)=(U=1282,V=440,UL=322,VL=150)
LastTapToMoveEffectTime=-99999.0
TapToMoveTexture=Texture2D'CastleHUD.HUD_TouchToMove'
BenchmarkFont=Font'UI_Fonts.MultiFonts.MF_LargeFont'
BenchmarkBackground=Texture2D'CastleUIExt.T_CastleMenu2Ext'
BenchmarkBackgroundUVs=(U=19,V=335,UL=996,VL=322)
}