diff options
| author | Robert Günzler <r@gnzler.io> | 2024-11-25 13:30:08 +0100 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2024-11-25 13:58:25 +0100 |
| commit | 18e3848110da0a59843058927ea04b496f5db2a5 (patch) | |
| tree | d54e7e1ab025d61507a0b1c3523c08abf400575d /.config/mpv/mvi/scripts/minimap.lua | |
| parent | 8f29be993dad465c1bb108462dc1bd63706649a5 (diff) | |
update mpv config
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to '.config/mpv/mvi/scripts/minimap.lua')
| -rw-r--r-- | .config/mpv/mvi/scripts/minimap.lua | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/.config/mpv/mvi/scripts/minimap.lua b/.config/mpv/mvi/scripts/minimap.lua new file mode 100644 index 0000000..f1b9a7d --- /dev/null +++ b/.config/mpv/mvi/scripts/minimap.lua @@ -0,0 +1,201 @@ +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) |