Code:
class FFHudTargetIndicator extends HUDKismetSeqAct_RenderObject
DependsOn(HUDKismetSeqAct_RenderTexture);
// Condition to using actual size coordinates
var bool UsingActualSize;
// Condition to using relative size coordinates
var bool UsingRelativeSize;
// Condition to using actual position coordinates
var bool UsingActualPosition;
// Condition to using relative position coordinates
var bool UsingRelativePosition;
// Material to render. Overrided if the user sets the material variable link
var(RenderMaterial) Object Material;
var(RenderMaterial) Object MaterialNear;
// Actual size to render the material
var(RenderMaterial) IntPoint ActualSize<EditCondition=UsingActualSize>;
// Relative size, to the viewport resolution, to render the material
var(RenderMaterial) Vector2D RelativeSize<EditCondition=UsingRelativeSize>;
// Actual position to render the material
var(RenderMaterial) IntPoint ActualPosition<EditCondition=UsingActualPosition>;
// Relative position, to the viewport resolution, to render the material
var(RenderMaterial) Vector2D RelativePosition<EditCondition=UsingRelativePosition>;
// Rotation of the material to render
var(RenderMaterial) TextureRotation Rotation;
// Coordinates of the material to render
var(RenderMaterial) TextureCoords Coords;
var(RenderMaterial) Color textcolor;
var(RenderMaterial) Float XProp,YProp;
function String GetDistanceString(float Units)
{
local float meters;
meters = Units / 105;
if(meters<1)
{
return string(meters)$"m";
}
if(meters<1000)
{
return string(int(meters))$"m";
}
else
{
return string(meters/1000)$"km";
}
}
function DrawObjectiveIndicastor(Vector ObjectiveLocation,PlayerController Player,Canvas canvas, MaterialInterface mat,
MaterialInterface matter,Rotator RR,IntPoint intp,FFPlayerIndicator p)
{
local float ScreenX, ScreenY;
local Vector ProjectedLocation;
local Vector Direction;
local Rotator Rot;
local Rotator Ro;
local Vector difference,point,ctr,nrm;
local float distance,sz1,sz2,xo,yo;
Canvas.Font = class'UTHUD'.static.GetFontSizeIndex(1);
Canvas.DrawColor = MakeColor(0,255,0,128);
Canvas.SetOrigin(canvas.SizeX/2,Canvas.SizeY/2);
Canvas.bNoSmooth = false;
//get raw projected XY in screen coordinates wit top-left origin
ProjectedLocation = Canvas.Project(ObjectiveLocation);
//translate origin to sight and clamp out-of-screen
ScreenX = ProjectedLocation.X - canvas.SizeX/2;
ScreenY = ProjectedLocation.Y - canvas.SizeY/2;
//Project doesn't care behind-view so we need to determine is objective location at front or back
Direction = Normal(ObjectiveLocation - Player.Pawn.Location);
Rot = Player.Pawn.Rotation;
Rot.Pitch = 0;
//in case we're looking at objective X component is ALWAYS greater than 0
Direction = Direction << Rot;
Ro.Pitch = 0;
Ro.Roll = 0;
Ro.Yaw = 0;
point.X = ScreenX;
point.Y = ScreenY;
ctr.X = 0;
ctr.Y = 0;
difference = point - ctr;
distance = Vsize2d(difference);
nrm = Normal(difference);
sz1 = canvas.SizeY / 2 * YProp;
sz2 = canvas.SizeX / 2 * XProp;
RR.Yaw = Rotator(nrm).Yaw + 182*90;
if(Direction.X>0)
{
if(Distance>=canvas.SizeY / 2)
{
Canvas.SetPos(nrm.X * sz2 - intp.X/2 ,nrm.Y * sz1 - intp.Y/2,0); //don't even try to understand what's going on here
Canvas.DrawRotatedMaterialTile(mat,RR,intp.X,intp.Y);
}
else
{
Canvas.SetPos(ScreenX- intp.X/2 ,ScreenY- intp.Y/2 ,0);
Canvas.DrawRotatedMaterialTile(matter,Ro,intp.X,intp.Y);
Canvas.TextSize(GetDistanceString(VSize(Player.Pawn.Location-ObjectiveLocation)),xo,yo);
Canvas.SetPos(ScreenX-xo/2,ScreenY-intp.Y/2,0);
Canvas.SetDrawColor(TextColor.R,TextColor.G,TextColor.B,TextColor.A);
canvas.DrawText(GetDistanceString(VSize(Player.Pawn.Location-ObjectiveLocation)),false);
}
}
else
{
Canvas.SetPos(-nrm.X * sz2 - intp.X/2 ,-nrm.Y * sz1 - intp.Y/2,0);
RR.Yaw -= 182*180;
Canvas.DrawRotatedMaterialTile(mat,RR,intp.X,intp.Y);
}
canvas.SetOrigin(0,0);
}
function Render(Canvas Canvas)
{
local IntPoint RenderPosition;
local IntPoint RenderSize;
local MaterialInterface RenderMaterial;
local MaterialInterface RenderMaterialNear;
local Rotator R;
local SeqVar_Object SeqVar_Object;
local SeqVar_Object SVO;
local WorldInfo wi;
local FFPlayerIndicator cpi;
local UTPlayerController pc;
wi=class'worldinfo'.static.GetWorldInfo();
if (Canvas != None && (UsingActualSize || UsingRelativeSize) && (UsingActualPosition || UsingRelativePosition))
{
// Check if the user has set the material kismet node link
if (VariableLinks[0].LinkedVariables.Length > 0)
{
SeqVar_Object = SeqVar_Object(VariableLinks[0].LinkedVariables[0]);
SVO = SeqVar_Object(VariableLinks[1].LinkedVariables[0]);
if (SeqVar_Object != None)
{
if (MaterialInterface(SeqVar_Object.GetObjectValue()) != None && MaterialInterface(SVO.GetObjectValue()) != None )
{
RenderMaterial = MaterialInterface(SeqVar_Object.GetObjectValue());
RenderMaterialNear = MaterialInterface(SVO.GetObjectValue());
}
else if (MaterialInstanceActor(SeqVar_Object.GetObjectValue()) != None && MaterialInstanceActor(SVO.GetObjectValue()) != None)
{
RenderMaterial = MaterialInstanceActor(SeqVar_Object.GetObjectValue()).MatInst;
RenderMaterialNear = MaterialInstanceActor(SVO.GetObjectValue()).MatInst;
}
}
}
else
{
if (MaterialInterface(Material) != None)
{
RenderMaterial = MaterialInterface(Material);
RenderMaterialNear=MaterialInterface(MaterialNear);
}
else if (MaterialInstanceActor(Material) != None)
{
RenderMaterial = MaterialInstanceActor(Material).MatInst;
RenderMaterialNear=MaterialInstanceActor(MaterialNear).MatInst;
}
}
if (RenderMaterial != None)
{
if (UsingRelativePosition)
{
RenderPosition.X = Canvas.ClipX * RelativePosition.X;
RenderPosition.Y = Canvas.ClipY * RelativePosition.Y;
}
else
{
RenderPosition = ActualPosition;
}
// Calculate the size
if (UsingRelativeSize)
{
RenderSize.X = Canvas.ClipX * RelativeSize.X;
RenderSize.Y = Canvas.ClipY * RelativeSize.Y;
}
else
{
RenderSize = ActualSize;
}
// Set the position to render
Canvas.SetPos(RenderPosition.X, RenderPosition.Y);
// Render the material rotated
R.Pitch = 0;
R.Yaw = 0;
R.Roll = 0;
}
}
foreach wi.AllControllers(class'UTPlayerCOntroller',PC)
{
if(PC!=none)
break;
}
foreach wi.AllNavigationPoints(class'FFPlayerIndicator',cpi)
{
DrawObjectiveIndicastor(cpi.Location,pc,canvas,RenderMaterial,RenderMaterialNear,R,rendersize,cpi);
}
}
defaultproperties
{
}
Bookmarks