Browse code

Add `vo=gpu-next` `glsl-shader-opts`

Robert Cranston authored on 23/12/2024 11:59:34
Showing 2 changed files

... ...
@@ -4,5 +4,8 @@
4 4
 # information, only the rotation angle.
5 5
 vo=gpu
6 6
 
7
+# Uses `glsl-shader-opts` to change rotation angle.
8
+# vo=gpu-next
9
+
7 10
 # Enable debug printing.
8 11
 # msg-level=gpu_rotate=debug
... ...
@@ -4,6 +4,13 @@ local mp = require("mp")
4 4
 
5 5
 --- Constants
6 6
 
7
+local SHADER_PARAM = [[
8
+//!PARAM angle
9
+//!DESC Rotation angle in degrees
10
+//!TYPE float
11
+0.0
12
+]]
13
+
7 14
 local SHADER_META = [[
8 15
 //!HOOK MAINPRESUB
9 16
 //!DESC GPU rotate
... ...
@@ -29,14 +36,31 @@ vec4 hook()
29 36
 --- State
30 37
 
31 38
 local state = {
32
-    angle  = 0.0,
33
-    shader = nil,
39
+    angle    = 0.0,
40
+    shader   = nil,
41
+    gpu_next = false,
34 42
 }
35 43
 
36 44
 --- Functions
37 45
 
46
+local function shader_param()
47
+    if state.gpu_next then
48
+        return SHADER_PARAM
49
+    else
50
+        return ""
51
+    end
52
+end
53
+
38 54
 local function shader_define()
39
-    return table.concat({SHADER_DEFINE, state.angle}, " ")
55
+    if state.gpu_next then
56
+        return ""
57
+    else
58
+        return table.concat({SHADER_DEFINE, state.angle}, " ")
59
+    end
60
+end
61
+
62
+local function shader_opt()
63
+    return table.concat({"angle", state.angle}, "=")
40 64
 end
41 65
 
42 66
 local function remove()
... ...
@@ -52,21 +76,44 @@ local function append(angle)
52 76
     state.angle = angle % 360
53 77
     local shader = nil
54 78
     if state.angle ~= 0 then
55
-        shader = os.tmpname()
56
-        mp.msg.debug("Writing", shader)
57
-        local file = io.open(shader, "w")
58
-        file:write(table.concat({
59
-            SHADER_META,
60
-            shader_define(),
61
-            SHADER_HOOK,
62
-        }, "\n"))
63
-        file:close()
64
-        mp.commandv("change-list", "glsl-shaders", "append", shader)
79
+        if not state.gpu_next or not state.shader then
80
+            shader = os.tmpname()
81
+            mp.msg.debug("Writing", shader)
82
+            local file = io.open(shader, "w")
83
+            file:write(table.concat({
84
+                shader_param(),
85
+                SHADER_META,
86
+                shader_define(),
87
+                SHADER_HOOK,
88
+            }, "\n"))
89
+            file:close()
90
+            mp.commandv("change-list", "glsl-shaders", "append", shader)
91
+        end
92
+        if state.gpu_next then
93
+            shader = shader or state.shader
94
+            mp.msg.debug("Setting shader opt")
95
+            mp.commandv("change-list", "glsl-shader-opts", "append", shader_opt())
96
+        end
97
+    end
98
+    if state.angle == 0 or not state.gpu_next then
99
+        remove()
65 100
     end
66
-    remove()
67 101
     state.shader = shader
68 102
 end
69 103
 
104
+--- Properties
105
+
106
+local function current_vo(_, vo)
107
+    local gpu_next = vo == "gpu-next"
108
+    if state.gpu_next ~= gpu_next then
109
+        mp.msg.debug("gpu-next", gpu_next)
110
+        state.gpu_next = gpu_next
111
+        remove()
112
+        append(state.angle)
113
+    end
114
+end
115
+mp.observe_property("current-vo", "string", current_vo)
116
+
70 117
 --- Events
71 118
 
72 119
 mp.register_event("shutdown", remove)