SLua: HUD Positioning
HUDs can detect where they are attached and make appropriate adjustments to ensure they are not hidden off the edge of the viewer's window.
There is a bit of magic involved in setting the actual offsets as it depends on the geometry of all of the links in the HUD but the basics are here.
-- HUD Positioing
-- Position HUD at attach-time to ensure it is visible
local VERBOSE = FALSE;
-- HUD Positioning offsets
-- These values are usually tweaked by trial-and-error to match the
-- specific HUD being used. If the root is centered starting with
-- half of the size from the root to each edge usually works well.
-- Offsets of 0.00 put the centerlines at the edge of the window
-- Add half the width or height to get the whole face on-screen
-- and 0.03 to leave a small border from the edge
local top_offset = -0.08;
-- Add about 0.02 to get the center line above the toolbutton bar (SL viewer)
local bot_offset = 0.07;
local left_offset = -0.13;
local right_offset = 0.13;
local center_offset = 0.00;
-- Adjust this higher to put toward the bottom of the 'stack' of HUDs on the screen,
-- and lower to bring it toward the front
local front_offset = 0.00;
last_attach = 0;
function attach(id: uuid)
local attach_point = ll.GetAttached();
if id ~= NULL_KEY and attach_point > 0 and attach_point ~= last_attach then
-- HUD rotation needs to know if we are on top or bottom
attach_bottom = FALSE;
-- Nasty if else block
if attach_point == ATTACH_HUD_TOP_LEFT then
ll.SetPos(vector(front_offset, left_offset, top_offset));
elseif attach_point == ATTACH_HUD_TOP_CENTER then
ll.SetPos(vector(front_offset, center_offset, top_offset));
elseif attach_point == ATTACH_HUD_TOP_RIGHT then
ll.SetPos(vector(front_offset, right_offset, top_offset));
elseif attach_point == ATTACH_HUD_CENTER_1 then
ll.SetPos(vector(front_offset, left_offset, 0.0));
elseif attach_point == ATTACH_HUD_CENTER_2 then
ll.SetPos(vector(front_offset, right_offset, 0.0));
elseif attach_point == ATTACH_HUD_BOTTOM_LEFT then
ll.SetPos(vector(front_offset, left_offset, bot_offset));
elseif attach_point == ATTACH_HUD_BOTTOM then
ll.SetPos(vector(front_offset, center_offset, bot_offset));
elseif attach_point == ATTACH_HUD_BOTTOM_RIGHT then
ll.SetPos(vector(front_offset, right_offset, bot_offset));
end
last_attach = attach_point;
end
end