dotfiles/.config/mvi/scripts/minimap.lua

202 lines
4.8 KiB
Lua
Raw Permalink Normal View History

2025-12-31 15:03:07 +01:00
local opts = {
enabled = true,
center = "92,92",
scale = 12,
max_size = "16,16",
image_opacity = "88",
image_color = "BBBBBB",
view_opacity = "BB",
view_color = "222222",
view_above_image = true,
hide_when_full_image_in_view = true,
}
local msg = require 'mp.msg'
local assdraw = require 'mp.assdraw'
local options = require 'mp.options'
options.read_options(opts, nil, function(c)
if c["enabled"] then
if opts.enabled then
enable()
else
disable()
end
end
mark_stale()
end)
function split_comma(input)
local ret = {}
for str in string.gmatch(input, "([^,]+)") do
ret[#ret + 1] = tonumber(str)
end
return ret
end
local active = false
local refresh = true
function draw_ass(ass)
local ww, wh = mp.get_osd_size()
mp.set_osd_ass(ww, wh, ass)
end
function mark_stale()
refresh = true
end
function refresh_minimap()
if not refresh then return end
refresh = false
local dim = mp.get_property_native("osd-dimensions")
if not dim then
draw_ass("")
return
end
local ww, wh = dim.w, dim.h
if not (ww > 0 and wh > 0) then return end
if opts.hide_when_full_image_in_view then
if dim.mt >= 0 and dim.mb >= 0 and dim.ml >= 0 and dim.mr >= 0 then
draw_ass("")
return
end
end
local center = split_comma(opts.center)
center[1] = center[1] * 0.01 * ww
center[2] = center[2] * 0.01 * wh
local cutoff = split_comma(opts.max_size)
cutoff[1] = cutoff[1] * 0.01 * ww * 0.5
cutoff[2] = cutoff[2] * 0.01 * wh * 0.5
local a = assdraw.ass_new()
local draw = function(x, y, w, h, opacity, color)
a:new_event()
a:pos(center[1], center[2])
a:append("{\\bord0}")
a:append("{\\shad0}")
a:append("{\\c&" .. color .. "&}")
a:append("{\\2a&HFF}")
a:append("{\\3a&HFF}")
a:append("{\\4a&HFF}")
a:append("{\\1a&H" .. opacity .. "}")
w = w * 0.5
h = h * 0.5
a:draw_start()
local rounded = {true,true,true,true} -- tl, tr, br, bl
local x0,y0,x1,y1 = x-w, y-h, x+w, y+h
if x0 < -cutoff[1] then
x0 = -cutoff[1]
rounded[4] = false
rounded[1] = false
end
if y0 < -cutoff[2] then
y0 = -cutoff[2]
rounded[1] = false
rounded[2] = false
end
if x1 > cutoff[1] then
x1 = cutoff[1]
rounded[2] = false
rounded[3] = false
end
if y1 > cutoff[2] then
y1 = cutoff[2]
rounded[3] = false
rounded[4] = false
end
local r = 3
local c = 0.551915024494 * r
if rounded[0] then
a:move_to(x0 + r, y0)
else
a:move_to(x0,y0)
end
if rounded[1] then
a:line_to(x1 - r, y0)
a:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r)
else
a:line_to(x1, y0)
end
if rounded[2] then
a:line_to(x1, y1 - r)
a:bezier_curve(x1, y1 - r + c, x1 - r + c, y1, x1 - r, y1)
else
a:line_to(x1, y1)
end
if rounded[3] then
a:line_to(x0 + r, y1)
a:bezier_curve(x0 + r - c, y1, x0, y1 - r + c, x0, y1 - r)
else
a:line_to(x0, y1)
end
if rounded[4] then
a:line_to(x0, y0 + r)
a:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0)
else
a:line_to(x0, y0)
end
a:draw_stop()
end
local image = function()
draw((dim.ml/2 - dim.mr/2) / opts.scale,
(dim.mt/2 - dim.mb/2) / opts.scale,
(ww - dim.ml - dim.mr) / opts.scale,
(wh - dim.mt - dim.mb) / opts.scale,
opts.image_opacity,
opts.image_color)
end
local view = function()
draw(0,
0,
ww / opts.scale,
wh / opts.scale,
opts.view_opacity,
opts.view_color)
end
if opts.view_above_image then
image()
view()
else
view()
image()
end
draw_ass(a.text)
end
function enable()
if active then return end
active = true
mp.observe_property("osd-dimensions", nil, mark_stale)
mp.register_idle(refresh_minimap)
mark_stale()
end
function disable()
if not active then return end
active = false
mp.unobserve_property(mark_stale)
mp.unregister_idle(refresh_minimap)
draw_ass("")
end
function toggle()
if active then
disable()
else
enable()
end
end
if opts.enabled then
enable()
end
mp.add_key_binding(nil, "minimap-enable", enable)
mp.add_key_binding(nil, "minimap-disable", disable)
mp.add_key_binding(nil, "minimap-toggle", toggle)