summary refs log tree commit diff
path: root/.config/mpv/mvi/scripts/minimap.lua
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2024-11-25 13:30:08 +0100
committerRobert Günzler <r@gnzler.io>2024-11-25 13:58:25 +0100
commit18e3848110da0a59843058927ea04b496f5db2a5 (patch)
treed54e7e1ab025d61507a0b1c3523c08abf400575d /.config/mpv/mvi/scripts/minimap.lua
parent8f29be993dad465c1bb108462dc1bd63706649a5 (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.lua201
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)