Code: Select all
simulated function float getXY(Canvas C, vector location, out int screenX, out int screenY) {
local vector X, Y, Z, CamLoc, TargetDir, Dir, XY;
local rotator CamRot;
local Actor Camera;
local float TanFOVx, TanFOVy;
local float ret;
C.ViewPort.Actor.PlayerCalcView(Camera, CamLoc, CamRot);
TanFOVx = Tan(C.ViewPort.Actor.FOVAngle / 114.591559); // 360/Pi = 114.5915590...
TanFOVy = (C.ClipY / C.ClipX) * TanFOVx;
GetAxes(CamRot, X, Y, Z);
TargetDir = Location - CamLoc;
ret = X dot TargetDir;
if (ret > 0) {
Dir = X * (X dot TargetDir);
XY = TargetDir - Dir;
screenX = C.ClipX * 0.5 * (1.0 + (XY dot Y) / (VSize(Dir) * TanFOVx));
screenY = C.ClipY * 0.5 * (1.0 - (XY dot Z) / (VSize(Dir) * TanFOVy));
}
return ret;
}
2. Draw text with outline around it:
Code: Select all
simulated function DrawTextClipped(Canvas C, int X, int Y, string text, Color outline) {
local Color old;
old = C.DrawColor;
C.DrawColor = outline;
C.SetPos(X - 1, Y - 1);
C.DrawTextClipped(text, False);
C.SetPos(X + 1, Y + 1);
C.DrawTextClipped(text, False);
C.SetPos(X - 1, Y + 1);
C.DrawTextClipped(text, False);
C.SetPos(X + 1, Y - 1);
C.DrawTextClipped(text, False);
C.DrawColor = old;
C.SetPos(X, Y);
C.DrawTextClipped(text, False);
}
Slow! Don't use often. Better use another approach.
Code: Select all
simulated function DrawLine(Canvas Canvas, int x1, int y1, int x2, int y2) {
local int i, j, n, dx, dy;
local float a, b;
if (x1 == 0 && y1 == 0) return;
if (x2 == 0 && y2 == 0) return;
dx = x2 - x1;
dy = y2 - y1;
if (Abs(dx) > Abs(dy)) {
if (dx == 0) return;
if (dx > 0) j = 1; else j = -1;
n = Min(Canvas.ClipX, Max(0, x2));
a = float(dy)/dx;
b = float(y1) - a*x1;
for (i = Min(Canvas.ClipX, Max(0, x1)); i != n; i += j) {
// canvas.SetPos(i, y1 + dy*(i - x1)/dx);
canvas.SetPos(i, a*i + b);
canvas.DrawRect(Texture'Botpack.FacePanel0', 1, 1);
}
} else {
if (dy == 0) return;
if (dy > 0) j = 1; else j = -1;
n = Min(Canvas.ClipY, Max(0, y2));
a = float(dx)/dy;
b = float(x1) - a*y1;
for (i = Min(Canvas.ClipY, Max(0, y1)); i != n; i += j) {
// canvas.SetPos(x1 + dx*(i - y1)/dy, i);
canvas.SetPos(a*i + b, i);
canvas.DrawRect(Texture'Botpack.FacePanel0', 1, 1);
}
}
}
Code: Select all
simulated function string getVal(Actor actor, string prop) {
local string ret;
Root.Console.ViewPort.Actor.MyHUD.Role = actor.Role; // hack for avoid Enum set issues, here always ROLE_Authority before that
actor.Role = actor.ENetRole.ROLE_Authority;
ret = actor.GetPropertyText(prop);
actor.Role = Root.Console.ViewPort.Actor.MyHUD.Role;
Root.Console.ViewPort.Actor.MyHUD.Role = actor.ENetRole.ROLE_Authority;
return ret;
}