scripts/gpu_rotate.lua
ca63b185
 --- Require
 
 local mp = require("mp")
 
 --- Constants
 
 local SHADER_META = [[
 //!HOOK MAINPRESUB
 //!DESC GPU rotate
 //!BIND HOOKED
 ]]
 
 local SHADER_DEFINE = "#define angle"
 
 local SHADER_HOOK = [[
 vec4 hook()
 {
     float rad = radians(angle);
     float c   = cos(rad);
     float s   = sin(rad);
     mat2  rot = mat2(c, -s, s, c);
     vec2  pos = rot * ((HOOKED_pos - 0.5) * HOOKED_size) * HOOKED_pt + 0.5;
     if (!all(equal(pos, clamp(pos, 0.0, 1.0))))
         return vec4(0.0);
     return HOOKED_tex(pos);
 }
 ]]
 
 --- State
 
 local state = {
     angle  = 0.0,
     shader = nil,
 }
 
 --- Functions
 
 local function shader_define()
     return table.concat({SHADER_DEFINE, state.angle}, " ")
 end
 
 local function remove()
     if state.shader then
         mp.msg.debug("Removing", state.shader)
         mp.commandv("change-list", "glsl-shaders", "remove", state.shader)
         os.remove(state.shader)
         state.shader = nil
     end
 end
 
 local function append(angle)
     state.angle = angle % 360
9ac9e7c4
     local shader = os.tmpname()
     mp.msg.debug("Writing", shader)
     local file = io.open(shader, "w")
ca63b185
     file:write(table.concat({
         SHADER_META,
         shader_define(),
         SHADER_HOOK,
     }, "\n"))
     file:close()
9ac9e7c4
     mp.commandv("change-list", "glsl-shaders", "append", shader)
     remove()
     state.shader = shader
ca63b185
 end
 
 --- Events
 
 mp.register_event("shutdown", remove)
 
 --- Script messages
 
 local function set(angle) append(angle)               end
 local function add(angle) append(angle + state.angle) end
 mp.register_script_message("set", set)
 mp.register_script_message("add", add)