202 lines
4.8 KiB
Lua
202 lines
4.8 KiB
Lua
|
|
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)
|