Mesen2/UI/Debugger/Utilities/LuaScripts/ModifyScreen.lua
2023-01-25 16:03:56 -05:00

115 lines
2.8 KiB
Lua

-----------------------
-- Name: Modify Screen
-- Author: spiiin
-----------------------
-- Alters the screen buffer to create various video filters
-- Press 0 to 4 to select a filter
-----------------------
shaderType = 0
frameCount = 0
function getCurrentFrame()
frameCount = frameCount + 1
return frameCount
end
function makeRed()
local buffer = emu.getScreenBuffer()
for i = 1, #buffer do
buffer[i] = buffer[i] & 0xFFFF0000
end
emu.setScreenBuffer(buffer)
end
function onlyOddLines()
local size = emu.getScreenSize()
local buffer = emu.getScreenBuffer()
for i = 0, size.height - 1 do
if i % 2 == 0 then
local start = i * size.width
for j = 1, size.width do
buffer[start + j] = 0x00000000
end
end
end
emu.setScreenBuffer(buffer)
end
function blink()
local buffer = emu.getScreenBuffer()
local frame = getCurrentFrame()
local blinkPeriod = 24*5
local blinkTime = 10
if frame % blinkPeriod < blinkTime then
for i = 1, #buffer do
buffer[i] = 0x0000FF00
end
end
emu.setScreenBuffer(buffer)
end
function waves()
local frame = getCurrentFrame()
local maxWave = 40
local waveSpeed = 4
local anim = (frame // waveSpeed % maxWave)
local animTable = {
-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
0,-1,-2,-3,-4,-5,-6,-7,-8,-9,
}
anim = animTable[anim+1]
local width = emu.getScreenSize().width
local buffer = emu.getScreenBuffer()
local buffer2 = emu.getScreenBuffer()
for i = 1, #buffer do
local x = i % width
local y = i // width
if y % 2 == 0 then
buffer[i] = buffer2[i+anim]
else
buffer[i] = buffer2[i-anim]
end
end
emu.setScreenBuffer(buffer)
end
function endFrame()
if shaderType == 1 then
makeRed()
elseif shaderType == 2 then
onlyOddLines()
elseif shaderType == 3 then
blink()
elseif shaderType == 4 then
waves()
end
end
function checkKeys()
if emu.isKeyPressed("0") and shaderType ~= 0 then
shaderType = 0
emu.displayMessage("Info", "No shader selected")
elseif emu.isKeyPressed("1") and shaderType ~= 1 then
shaderType = 1
emu.displayMessage("Info", "Shader Red selected")
elseif emu.isKeyPressed("2") and shaderType ~= 2 then
shaderType = 2
emu.displayMessage("Info", "Shader OddLines selected")
elseif emu.isKeyPressed("3") and shaderType ~= 3 then
shaderType = 3
emu.displayMessage("Info", "Shader Blink selected")
elseif emu.isKeyPressed("4") and shaderType ~= 4 then
shaderType = 4
emu.displayMessage("Info", "Shader Waves selected")
end
end
emu.addEventCallback(endFrame, emu.eventType.endFrame)
emu.addEventCallback(checkKeys, emu.eventType.inputPolled)
local infoStr = "Press keys from 0 to 4 to change shaders"
emu.displayMessage("Info", infoStr)
emu.log(infoStr)