Initialize Screenshot Editor addon

This commit is contained in:
Chev 2023-01-01 11:58:19 -08:00
parent d41cd5d11a
commit 1ccbab200f
22 changed files with 4703 additions and 0 deletions

View file

@ -0,0 +1,163 @@
screenshot_editor = screenshot_editor or {}
local SCREENSHOT_FILES = {}
local SCREENSHOT_ITERATE_ACTIVE = false
-- Not a fantastic method, but it's a little smoother than file.Find("*.*")
local function IterateScreenshotFiles()
local fileQueue = {}
--local ctime = SysTime()
-- a through z
for i = 97, 97 + 25 do
for j = 97, 97 + 25 do
local fileBeginner = string.char(i, j)
local foundScreenshotFiles = file.Find("screenshots/" .. fileBeginner .. "*.*", "MOD")
table.Add(fileQueue, foundScreenshotFiles)
--[[if #foundScreenshotFiles > 0 then
print(fileBeginner, #foundScreenshotFiles)
end]]
coroutine.yield()
end
end
while #fileQueue > 0 do
for i = 1, 200 do
if #fileQueue == 0 then continue end
local fileName = table.remove(fileQueue, 1)
if string.EndsWith(fileName, ".tga") then continue end
local fullFileName = "screenshots/" .. fileName
SCREENSHOT_FILES[fullFileName] = file.Time(fullFileName, "MOD")
end
coroutine.yield()
end
SCREENSHOT_ITERATE_ACTIVE = false
hook.Run("ScreenshotEditorProcessingFinished")
end
local fileCo
hook.Add("Think", "GatherScreenshotFiles", function()
if SCREENSHOT_ITERATE_ACTIVE and (not fileCo or not coroutine.resume(fileCo)) then
fileCo = coroutine.create(IterateScreenshotFiles)
coroutine.resume(fileCo)
end
end)
function screenshot_editor.ProcessScreenshots()
SCREENSHOT_FILES = {}
SCREENSHOT_ITERATE_ACTIVE = true
end
function screenshot_editor.IsProcessingScreenshots()
return SCREENSHOT_ITERATE_ACTIVE
end
function screenshot_editor.GetScreenshots()
return SCREENSHOT_FILES
end
-- Start this immediately, so we get screenshots processed ASAP
screenshot_editor.ProcessScreenshots()
--[[
Filter API
]]
local FILTER_DATA = {}
function screenshot_editor.GetFilter(index)
return FILTER_DATA[index]
end
function screenshot_editor.GetFilters()
return FILTER_DATA
end
function screenshot_editor.AddFilter(filterData)
if not filterData.FilterName then
error("screenshot_editor.AddFrame: Missing \'FilterName\' parameter!")
end
if not filterData.FilterCallback then
error("screenshot_editor.AddFrame: Missing \'FilterCallback\' parameter!")
end
FILTER_DATA[#FILTER_DATA + 1] = {
FilterName = filterData.FilterName,
FilterCallback = filterData.FilterCallback
}
end
--[[
Frame API
]]
local FRAME_DATA = {}
function screenshot_editor.GetFrame(index)
return FRAME_DATA[index]
end
function screenshot_editor.GetFrames()
return FRAME_DATA
end
function screenshot_editor.AddFrame(frameData)
if not frameData.FrameName then
error("screenshot_editor.AddFrame: Missing \'FrameName\' parameter!")
end
if not frameData.MaterialPath then
error("screenshot_editor.AddFrame: Missing \'MaterialPath\' parameter!")
end
FRAME_DATA[#FRAME_DATA + 1] = {
FrameName = frameData.FrameName,
MaterialPath = frameData.MaterialPath
}
end
include("screenshoteditor/cl_filters_basic.lua")
include("screenshoteditor/cl_frames_basic.lua")
-- Sandbox Context Menu
list.Set("DesktopWindows", "ScreenshotEditor", {
title = "Screenshot Edit",
icon = "icon64/screenshot_editor.png",
width = 960,
height = 700,
onewindow = true,
init = function(icon, window)
-- Remove basic frame and replace with our custom VGUI element
window:Remove()
if IsValid(screenshot_editor.PANEL) then screenshot_editor.PANEL:Remove() end
local mainWindow = vgui.Create("DScreenshotEditor")
screenshot_editor.PANEL = mainWindow
icon.Window = mainWindow
end
})
concommand.Add("screenshot_editor", function(ply, cmd, args, argStr)
if IsValid(screenshot_editor.PANEL) then screenshot_editor.PANEL:Remove() end
local mainWindow = vgui.Create("DScreenshotEditor")
screenshot_editor.PANEL = mainWindow
end)
hook.Add("Initialize", "RunScreenshotEditorInitialize", function()
hook.Run("ScreenshotEditorInitialize")
end)
hook.Run("ScreenshotEditorInitialize")

View file

@ -0,0 +1,2 @@
AddCSLuaFile("screenshoteditor/cl_filters_basic.lua")
AddCSLuaFile("screenshoteditor/cl_frames_basic.lua")

View file

@ -0,0 +1,487 @@
--[[
Comic Book
]]
local CB_COLOR_1 = color_white:ToVector()
local CB_COLOR_2_TOP = Vector(1, 0.96, 0.28)
local CB_COLOR_2_BOTTOM = Vector(0.24, 0.622, 0.88)
local CB_COLOR_3_TOP = Color(142, 45, 226):ToVector()
local CB_COLOR_3_BOTTOM = Color(74, 0, 224):ToVector()
local ComicBookBuffer = GetRenderTarget("ComicBookBuffer", ScrW(), ScrH())
local MaterialComicBookBuffer = MaterialComicBookBuffer or CreateMaterial("ComicBookScreen", "UnlitGeneric", {
["$basetexture"] = ComicBookBuffer:GetName(),
})
local MaterialComicBookTop = CreateMaterial("ComicBookTopGradient", "UnlitGeneric", {
["$basetexture"] = "vgui/white",
["$translucent"] = "1",
["$color"] = "{255 0 0}"
})
local MaterialComicBookBottom = CreateMaterial("ComicBookBottomGradient", "UnlitGeneric", {
["$basetexture"] = "vgui/gradient_up",
["$translucent"] = "1",
["$color"] = "{0 255 0}"
})
local function DrawComicBookNoBuffer(threshold, colortop, colorbottom, material)
render.PushRenderTarget(ComicBookBuffer)
render.Clear(0, 0, 0, 255)
render.ClearDepth()
surface.SetDrawColor(255, 255, 255, 255)
surface.SetMaterial(material)
surface.DrawTexturedRect(0, 0, ScrW(), ScrH())
DrawSobel(threshold)
-- Contrast to black and white only
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 45,
["$pp_colour_colour"] = 0,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
render.PopRenderTarget()
-- Draw gradient
render.SetMaterial(MaterialComicBookTop)
MaterialComicBookTop:SetVector("$color", colortop)
render.DrawScreenQuad()
render.SetMaterial(MaterialComicBookBottom)
MaterialComicBookBottom:SetVector("$color", colorbottom)
render.DrawScreenQuad()
render.OverrideBlend(true, BLEND_DST_COLOR, BLEND_ZERO, BLENDFUNC_ADD, BLEND_ONE, BLEND_ZERO, BLENDFUNC_ADD)
-- Draw sobel effect
render.SetMaterial(MaterialComicBookBuffer)
render.DrawScreenQuad()
render.OverrideBlend(false)
end
--[[
Texturize
]]
local MAT_TEXTURIZE_PATTERN1 = Material("pp/texturize/pattern1.png")
local MAT_TEXTURIZE_LINES = Material("pp/texturize/lines.png")
local MAT_TEXTURIZE_RAINBOW = Material("pp/texturize/rainbow.png")
local MAT_TEXTURIZE_SQUAREDO = Material("pp/texturize/squaredo.png")
--[[
Chromatic Aberration
]]
local MAT_CA_RED = CreateMaterial("pp/ca/red", "UnlitGeneric", {
["$basetexture"] = "_rt_FullFrameFB",
["$color2"] = "[1 0 0]",
["$ignorez"] = "1",
["$additive"] = "1"
})
local MAT_CA_GREEN = CreateMaterial("pp/ca/green", "UnlitGeneric", {
["$basetexture"] = "_rt_FullFrameFB",
["$color2"] = "[0 1 0]",
["$ignorez"] = "1",
["$additive"] = "1"
})
local MAT_CA_BLUE = CreateMaterial("pp/ca/blue", "UnlitGeneric", {
["$basetexture"] = "_rt_FullFrameFB",
["$color2"] = "[0 0 1]",
["$ignorez"] = "1",
["$additive"] = "1"
})
local MAT_CA_BASE = Material("vgui/black")
local function DrawChromaticAberration(rx, ry, gx, gy, bx, by)
render.UpdateScreenEffectTexture()
MAT_CA_RED:SetTexture("$basetexture", render.GetScreenEffectTexture())
MAT_CA_GREEN:SetTexture("$basetexture", render.GetScreenEffectTexture())
MAT_CA_BLUE:SetTexture("$basetexture", render.GetScreenEffectTexture())
render.SetMaterial(MAT_CA_BASE)
render.DrawScreenQuad()
render.SetMaterial(MAT_CA_RED)
render.DrawScreenQuadEx(-rx / 2, -ry / 2, ScrW() + rx, ScrH() + ry)
render.SetMaterial(MAT_CA_GREEN)
render.DrawScreenQuadEx(-gx / 2, -gy / 2, ScrW() + gx, ScrH() + gy)
render.SetMaterial(MAT_CA_BLUE)
render.DrawScreenQuadEx(-bx / 2, -by / 2, ScrW() + bx, ScrH() + by)
end
--[[
Negate
]]
local MAT_NEGATIVE = CreateMaterial("MaterialNegativeBuffer" .. math.floor(CurTime() * 1000), "UnlitGeneric", {
["$basetexture"] = "vgui/white",
["$translucent"] = "0",
["$color"] = "[1 1 1]"
})
local function DrawNegative()
render.UpdateScreenEffectTexture()
MAT_NEGATIVE:SetTexture("$basetexture", render.GetScreenEffectTexture(0))
render.SetMaterial(MAT_NEGATIVE)
render.DrawScreenQuad()
render.OverrideBlend(true, BLEND_ONE_MINUS_DST_COLOR, BLEND_ZERO, BLENDFUNC_ADD)
render.SetColorMaterial()
render.DrawScreenQuad()
render.OverrideBlend(false)
end
-- Add basic screenshot editor filters
hook.Add("ScreenshotEditorInitialize", "ScreenshotEditor_AddBasicFilters", function()
screenshot_editor.AddFilter({
FilterName = "None",
FilterCallback = function(width, height)
end
})
screenshot_editor.AddFilter({
FilterName = "Black & White",
FilterCallback = function(width, height)
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 0,
})
end
})
screenshot_editor.AddFilter({
FilterName = "Vibrant",
FilterCallback = function(width, height)
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 1.6,
})
end
})
screenshot_editor.AddFilter({
FilterName = "Deep Fried",
FilterCallback = function(width, height)
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 3,
})
DrawSharpen(3, 1)
end
})
screenshot_editor.AddFilter({
FilterName = "Super Deep Fried",
FilterCallback = function(width, height)
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 5,
})
DrawSharpen(6, 1)
end
})
screenshot_editor.AddFilter({
FilterName = "Sharpen",
FilterCallback = function(width, height)
DrawSharpen(1.3, 1)
end
})
screenshot_editor.AddFilter({
FilterName = "Toy Town",
FilterCallback = function(width, height)
DrawToyTown(2, ScrH() / 2)
end
})
screenshot_editor.AddFilter({
FilterName = "Bloom",
FilterCallback = function(width, height)
DrawBloom(0.65, 1, 2, 2, 3, 1, 1, 1, 1)
end
})
screenshot_editor.AddFilter({
FilterName = "Rising Heat",
FilterCallback = function(width, height)
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 0,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
DrawColorModify({
["$pp_colour_addr"] = 155 / 255,
["$pp_colour_addg"] = 39 / 255,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 1,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
end
})
screenshot_editor.AddFilter({
FilterName = "Lovely",
FilterCallback = function(width, height)
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 0,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
DrawColorModify({
["$pp_colour_addr"] = 255 / 800,
["$pp_colour_addg"] = 140 / 800,
["$pp_colour_addb"] = 243 / 500,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 1,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
end
})
screenshot_editor.AddFilter({
FilterName = "Cold",
FilterCallback = function(width, height)
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 0,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
DrawColorModify({
["$pp_colour_addr"] = 107 / 800,
["$pp_colour_addg"] = 193 / 800,
["$pp_colour_addb"] = 255 / 800,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 1,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
end
})
screenshot_editor.AddFilter({
FilterName = "Radioactive",
FilterCallback = function(width, height)
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 0,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 255 / 800,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 1,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
end
})
screenshot_editor.AddFilter({
FilterName = "Texturize #1",
FilterCallback = function(width, height, mat)
DrawTexturize(1, MAT_TEXTURIZE_PATTERN1)
end
})
screenshot_editor.AddFilter({
FilterName = "Texturize #2",
FilterCallback = function(width, height, mat)
DrawTexturize(1, MAT_TEXTURIZE_LINES)
end
})
screenshot_editor.AddFilter({
FilterName = "Texturize #3",
FilterCallback = function(width, height, mat)
DrawTexturize(1, MAT_TEXTURIZE_RAINBOW)
end
})
screenshot_editor.AddFilter({
FilterName = "Texturize #4",
FilterCallback = function(width, height, mat)
DrawTexturize(1, MAT_TEXTURIZE_SQUAREDO)
end
})
screenshot_editor.AddFilter({
FilterName = "Comic Book #1",
FilterCallback = function(width, height, mat)
DrawComicBookNoBuffer(0.1, CB_COLOR_1, CB_COLOR_1, mat)
end
})
screenshot_editor.AddFilter({
FilterName = "Comic Book #2",
FilterCallback = function(width, height, mat)
DrawComicBookNoBuffer(0.1, CB_COLOR_2_TOP, CB_COLOR_2_BOTTOM, mat)
end
})
screenshot_editor.AddFilter({
FilterName = "Comic Book #3",
FilterCallback = function(width, height, mat)
DrawComicBookNoBuffer(0.1, CB_COLOR_3_TOP, CB_COLOR_3_BOTTOM, mat)
end
})
screenshot_editor.AddFilter({
FilterName = "High Contrast",
FilterCallback = function(width, height, mat)
DrawComicBookNoBuffer(0.1, CB_COLOR_1, CB_COLOR_1, mat)
DrawNegative()
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 10,
["$pp_colour_colour"] = 1,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
end
})
screenshot_editor.AddFilter({
FilterName = "FAITH",
FilterCallback = function(width, height, mat)
DrawComicBookNoBuffer(0.1, CB_COLOR_1, CB_COLOR_1, mat)
DrawNegative()
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 10,
["$pp_colour_colour"] = 1,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
DrawColorModify({
["$pp_colour_addr"] = -(18 / 255),
["$pp_colour_addg"] = -(177 / 255),
["$pp_colour_addb"] = -(227 / 255),
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 1,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
DrawChromaticAberration(6, 6, 0, 0, 0, 0)
end
})
screenshot_editor.AddFilter({
FilterName = "Chromatic Aberration (Red / Cyan)",
FilterCallback = function(width, height, mat)
DrawChromaticAberration(6, 6, 0, 0, 0, 0)
end
})
screenshot_editor.AddFilter({
FilterName = "Chromatic Aberration (Green / Purple)",
FilterCallback = function(width, height, mat)
DrawChromaticAberration(0, 0, 6, 6, 0, 0)
end
})
screenshot_editor.AddFilter({
FilterName = "Chromatic Aberration (Blue / Yellow)",
FilterCallback = function(width, height, mat)
DrawChromaticAberration(0, 0, 0, 0, 6, 6)
end
})
end)

View file

@ -0,0 +1,78 @@
-- Add basic screenshot editor frames
hook.Add("ScreenshotEditorInitialize", "ScreenshotEditor_AddBasicFrames", function()
-- Generic/Unthemed/Miscellaneous
screenshot_editor.AddFrame({
FrameName = "None",
MaterialPath = "chev/frames/none.png"
})
screenshot_editor.AddFrame({
FrameName = "Vignette",
MaterialPath = "chev/frames/vignette.png"
})
screenshot_editor.AddFrame({
FrameName = "Action",
MaterialPath = "chev/frames/action.png"
})
screenshot_editor.AddFrame({
FrameName = "Comic Book",
MaterialPath = "chev/frames/comicbook.png"
})
-- Garry's Mod
screenshot_editor.AddFrame({
FrameName = "Garry's Mod Logo (White)",
MaterialPath = "chev/frames/gmod_logo_white.png"
})
screenshot_editor.AddFrame({
FrameName = "Garry's Mod Logo (Black)",
MaterialPath = "chev/frames/gmod_logo_black.png"
})
-- Holiday/seasonal
screenshot_editor.AddFrame({
FrameName = "Hearts",
MaterialPath = "chev/frames/hearts.png"
})
screenshot_editor.AddFrame({
FrameName = "Season's Greetings",
MaterialPath = "chev/frames/seasons_greetings.png"
})
screenshot_editor.AddFrame({
FrameName = "Icicles",
MaterialPath = "chev/frames/icicles.png"
})
screenshot_editor.AddFrame({
FrameName = "Fire",
MaterialPath = "chev/frames/fire.png"
})
-- Shitposts
screenshot_editor.AddFrame({
FrameName = "Epic Fail",
MaterialPath = "chev/frames/epic_fail.png"
})
screenshot_editor.AddFrame({
FrameName = "Quote Bubble",
MaterialPath = "chev/frames/quote_bubble.png"
})
screenshot_editor.AddFrame({
FrameName = "Clickbait",
MaterialPath = "chev/frames/clickbait.png"
})
screenshot_editor.AddFrame({
FrameName = "Soy Point",
MaterialPath = "chev/frames/soy_point.png"
})
screenshot_editor.AddFrame({
FrameName = "Highly Toxic",
MaterialPath = "chev/frames/highly_toxic.png"
})
screenshot_editor.AddFrame({
FrameName = "Tom Scott",
MaterialPath = "chev/frames/tom_scott.png"
})
screenshot_editor.AddFrame({
FrameName = "Clearly you don't own an air fryer",
MaterialPath = "chev/frames/air_fryer_demotivator.png"
})
end)

View file

@ -0,0 +1,525 @@
local PANEL = {}
local BLUR_MATERIAL = Material("pp/blurscreen")
local BUTTON_COLOR_NORMAL = Color(50, 50, 50, 200)
local BUTTON_COLOR_HOVER = Color(70, 70, 70, 200)
local BUTTON_COLOR_DOWN = Color(90, 90, 90, 200)
local BUTTON_COLOR_DISABLED = Color(30, 30, 30, 200)
local BUTTON_PAINT = function(panel, w, h)
local col = BUTTON_COLOR_NORMAL
if panel.Depressed then
col = BUTTON_COLOR_DOWN
elseif panel:IsHovered() then
col = BUTTON_COLOR_HOVER
end
draw.RoundedBox(8, 0, 0, w, h, col)
end
local BUTTON_COLOR_OUTLINE = Color(0, 0, 0)
local BUTTON_COLOR_OUTLINE_FLASH = Color(0, 0, 0)
local BUTTON_PAINT_OUTLINE = function(panel, w, h)
local col = BUTTON_COLOR_NORMAL
local outlineCol = BUTTON_COLOR_OUTLINE
if panel.Depressed then
col = BUTTON_COLOR_DOWN
elseif panel:IsHovered() then
col = BUTTON_COLOR_HOVER
end
if not panel:IsEnabled() then
col = BUTTON_COLOR_DISABLED
local curBright = math.Remap(math.sin(SysTime() * 5), -1, 1, 50, 80)
BUTTON_COLOR_OUTLINE_FLASH.r = curBright
BUTTON_COLOR_OUTLINE_FLASH.g = curBright
BUTTON_COLOR_OUTLINE_FLASH.b = curBright
outlineCol = BUTTON_COLOR_OUTLINE_FLASH
end
draw.RoundedBox(8, 0, 0, w, h, outlineCol)
draw.RoundedBox(6, 2, 2, w - 4, h - 4, col)
end
surface.CreateFont("ScreenshotEditorLabel", {
font = "Roboto",
size = 16,
weight = 500,
antialias = true,
})
surface.CreateFont("ScreenshotEditorProcessing", {
font = "Roboto",
size = 32,
weight = 500,
antialias = true,
})
surface.CreateFont("ScreenshotEditorArrow", {
font = "Consolas",
size = 24,
weight = 500,
antialias = true
})
function PANEL:Init()
local FILTER_DATA = screenshot_editor.GetFilters()
local FRAME_DATA = screenshot_editor.GetFrames()
local width, height = ScrW(), ScrH()
self:SetSize(width, height)
self:DockPadding(16, 16, 16, 16)
self.CurrentScreenshot = Material("lights/white")
self.CurrentFilter = 0
self.CurrentFrame = 0
self.ShowEditedScreenshots = true
self.SearchFilter = ""
local toggleButtonSize = 32
local controlsBase = vgui.Create("DPanel", self)
controlsBase:SetSize(width * 0.225, height)
controlsBase:AlignLeft(0)
controlsBase:DockPadding(8, 8, 8, 8)
controlsBase.Paint = function(panel, w, h)
w = w - (toggleButtonSize + 16)
-- Blur
render.SetScissorRect(panel:GetX(), 0, w + panel:GetX(), h, true)
local x, y = panel:LocalToScreen(0, 0)
surface.SetDrawColor(255, 255, 255, 255)
surface.SetMaterial(BLUR_MATERIAL)
for i = 0.33, 1, 0.33 do
BLUR_MATERIAL:SetFloat("$blur", 8 * i)
BLUR_MATERIAL:Recompute()
render.UpdateScreenEffectTexture()
surface.DrawTexturedRect(-x, -y, ScrW(), ScrH())
end
render.SetScissorRect(0, 0, 0, 0, false)
-- Darken BG
surface.SetDrawColor(0, 0, 0, 200)
surface.DrawRect(0, 0, w, h)
end
self.ControlsBase = controlsBase
local toggleButtonMargin = (height - 16 - 32) / 2
local toggleControlsButton = vgui.Create("DButton", controlsBase)
toggleControlsButton:DockMargin(16, toggleButtonMargin, 0, toggleButtonMargin)
toggleControlsButton:Dock(RIGHT)
toggleControlsButton:SetFont("ScreenshotEditorArrow")
toggleControlsButton:SetText("<")
toggleControlsButton:SetWide(32)
toggleControlsButton:SetTextColor(color_white)
toggleControlsButton:SetTooltip("Hide Controls Menu")
toggleControlsButton.IsHidden = false
toggleControlsButton.Paint = BUTTON_PAINT
toggleControlsButton.DoClick = function(panel)
panel.IsHidden = not panel.IsHidden
local xPos = panel.IsHidden and -self.ControlsBase:GetWide() + (toggleButtonSize + 16) or 0
self.ControlsBase:MoveTo(xPos, 0, 0.5, 0, 0.5)
panel:SetText(panel.IsHidden and ">" or "<")
panel:SetTooltip(panel.IsHidden and "Show Controls Menu" or "Hide Controls Menu")
end
--[[
Filter control
]]
local filterTall = 48
local filterPadding = 4
local filterBase = vgui.Create("DPanel", controlsBase)
filterBase:Dock(TOP)
filterBase:DockMargin(0, 0, 0, 8)
filterBase:SetTall(filterTall)
filterBase:DockPadding(filterPadding, filterPadding, filterPadding, filterPadding)
filterBase.Paint = function(panel, w, h)
draw.RoundedBox(8, 0, 0, w, h, Color(0, 0, 0, 240))
end
local filterButtonLeft = vgui.Create("DButton", filterBase)
filterButtonLeft:DockMargin(0, 0, 8, 0)
filterButtonLeft:Dock(LEFT)
filterButtonLeft:SetWide(filterTall - (filterPadding * 2))
filterButtonLeft:SetFont("ScreenshotEditorArrow")
filterButtonLeft:SetText("<")
filterButtonLeft:SetTextColor(color_white)
filterButtonLeft.Paint = BUTTON_PAINT
filterButtonLeft.DoClick = function(panel)
self.CurrentFilter = (self.CurrentFilter - 1) % #FILTER_DATA
self.CurrentFilterLabel:SetText("Current Filter: " .. FILTER_DATA[self.CurrentFilter + 1].FilterName)
end
local filterButtonRight = vgui.Create("DButton", filterBase)
filterButtonRight:DockMargin(8, 0, 0, 0)
filterButtonRight:Dock(RIGHT)
filterButtonRight:SetWide(filterTall - (filterPadding * 2))
filterButtonRight:SetFont("ScreenshotEditorArrow")
filterButtonRight:SetText(">")
filterButtonRight:SetTextColor(color_white)
filterButtonRight.Paint = BUTTON_PAINT
filterButtonRight.DoClick = function(panel)
self.CurrentFilter = (self.CurrentFilter + 1) % #FILTER_DATA
self.CurrentFilterLabel:SetText("Current Filter: " .. FILTER_DATA[self.CurrentFilter + 1].FilterName)
end
local currentFilterName = vgui.Create("DLabel", filterBase)
currentFilterName:SetFont("ScreenshotEditorLabel")
currentFilterName:SetText("Current Filter: None")
currentFilterName:Dock(FILL)
currentFilterName:SetContentAlignment(5)
self.CurrentFilterLabel = currentFilterName
--[[
Frame control
]]
local frameBase = vgui.Create("DPanel", controlsBase)
frameBase:Dock(TOP)
frameBase:DockMargin(0, 0, 0, 8)
frameBase:SetTall(filterTall)
frameBase:DockPadding(filterPadding, filterPadding, filterPadding, filterPadding)
frameBase.Paint = function(panel, w, h)
draw.RoundedBox(8, 0, 0, w, h, Color(0, 0, 0, 240))
end
local frameButtonLeft = vgui.Create("DButton", frameBase)
frameButtonLeft:DockMargin(0, 0, 8, 0)
frameButtonLeft:Dock(LEFT)
frameButtonLeft:SetWide(filterTall - (filterPadding * 2))
frameButtonLeft:SetFont("ScreenshotEditorArrow")
frameButtonLeft:SetText("<")
frameButtonLeft:SetTextColor(color_white)
frameButtonLeft.Paint = BUTTON_PAINT
frameButtonLeft.DoClick = function(panel)
self.CurrentFrame = (self.CurrentFrame - 1) % #FRAME_DATA
self.CurrentFrameLabel:SetText("Current Frame: " .. FRAME_DATA[self.CurrentFrame + 1].FrameName)
end
local frameButtonRight = vgui.Create("DButton", frameBase)
frameButtonRight:DockMargin(8, 0, 0, 0)
frameButtonRight:Dock(RIGHT)
frameButtonRight:SetWide(filterTall - (filterPadding * 2))
frameButtonRight:SetFont("ScreenshotEditorArrow")
frameButtonRight:SetText(">")
frameButtonRight:SetTextColor(color_white)
frameButtonRight.Paint = BUTTON_PAINT
frameButtonRight.DoClick = function(panel)
self.CurrentFrame = (self.CurrentFrame + 1) % #FRAME_DATA
self.CurrentFrameLabel:SetText("Current Frame: " .. FRAME_DATA[self.CurrentFrame + 1].FrameName)
end
local currentFrameName = vgui.Create("DLabel", frameBase)
currentFrameName:SetFont("ScreenshotEditorLabel")
currentFrameName:SetText("Current Frame: None")
currentFrameName:Dock(FILL)
currentFrameName:SetContentAlignment(5)
self.CurrentFrameLabel = currentFrameName
--[[
List filters
]]
local showEditedScreenshots = vgui.Create("DCheckBoxLabel", controlsBase)
showEditedScreenshots:DockMargin(0, 0, 0, 8)
showEditedScreenshots:Dock(TOP)
showEditedScreenshots:SetText("Show Edited Screenshots")
showEditedScreenshots:SetValue(true)
showEditedScreenshots.OnChange = function(panel, isChecked)
self.ShowEditedScreenshots = isChecked
self:FilterScreenshotsList()
end
local searchFilter = vgui.Create("DTextEntry", controlsBase)
searchFilter:DockMargin(0, 0, 0, 8)
searchFilter:Dock(TOP)
searchFilter:SetPlaceholderText("Search...")
searchFilter:SetUpdateOnType(true)
searchFilter.OnValueChange = function(panel, text)
self.SearchFilter = text
self:FilterScreenshotsList()
end
--[[
Save & close buttons
]]
local closeButton = vgui.Create("DButton", controlsBase)
closeButton:Dock(BOTTOM)
closeButton:SetTall(32)
closeButton:SetText("Close")
closeButton:SetTextColor(color_white)
closeButton.Paint = BUTTON_PAINT_OUTLINE
closeButton.DoClick = function()
self:Remove()
end
local saveButton = vgui.Create("DButton", controlsBase)
saveButton:Dock(BOTTOM)
saveButton:DockMargin(0, 0, 0, 8)
saveButton:SetTall(32)
saveButton:SetText("Save")
saveButton:SetTextColor(color_white)
saveButton.Paint = BUTTON_PAINT_OUTLINE
saveButton.DoClick = function(panel)
local fileName = game.GetMap() .. "_" .. os.time() .. "_" .. FrameNumber() .. "_edit"
RunConsoleCommand("jpeg", fileName, "100")
timer.Simple(FrameTime(), function()
if IsValid(panel) then
panel:SetText("Screenshot saved!")
end
end)
timer.Simple(3, function()
if IsValid(panel) then
panel:SetText("Save")
end
end)
end
--[[
Refresh screenshots button
]]
local refreshScreenshotsButton = vgui.Create("DButton", controlsBase)
refreshScreenshotsButton:Dock(BOTTOM)
refreshScreenshotsButton:DockMargin(0, 0, 0, 8)
refreshScreenshotsButton:SetTall(32)
refreshScreenshotsButton:SetText("Refresh Screenshots List")
refreshScreenshotsButton:SetTextColor(color_white)
refreshScreenshotsButton.Paint = BUTTON_PAINT_OUTLINE
refreshScreenshotsButton.DoClick = function(panel)
local fcScroll = self.FileScroll
if not IsValid(fcScroll) then return end
panel:SetText("Refreshing Screenshots...")
panel:SetEnabled(false)
fcScroll:Clear()
local processingLabel = vgui.Create("DLabel", fcScroll)
processingLabel:Dock(TOP)
processingLabel:SetText("Processing...")
processingLabel:SetFont("ScreenshotEditorProcessing")
processingLabel:SizeToContentsX()
processingLabel:SetTall(128)
processingLabel:SetContentAlignment(5)
if not screenshot_editor.IsProcessingScreenshots() then
screenshot_editor.ProcessScreenshots()
end
hook.Add("ScreenshotEditorProcessingFinished", "ScreenshotEditorRefreshScreenshots", function()
if IsValid(fcScroll) then
fcScroll:Clear()
end
if IsValid(self) then
self:AddScreenshotsToList()
end
if IsValid(panel) then
panel:SetText("Refresh Screenshots List")
panel:SetEnabled(true)
end
end)
end
--[[
File chooser control
]]
local fcScroll = vgui.Create("DScrollPanel", controlsBase)
fcScroll:DockMargin(0, 0, 0, 8)
fcScroll:Dock(FILL)
--fcScroll:SetTall(height * 0.5)
fcScroll.OnItemSelected = function(panel, item)
panel.VBar:Stop()
panel.VBar:AnimateTo(item:GetY(), 0.3, 0, 0.4)
self.CurrentScreenshot = Material("../screenshots/" .. item.FileName, "smooth")
end
self.FileScroll = fcScroll
controlsBase:SetRenderInScreenshots(false)
self:SetKeyboardInputEnabled(true)
self:Center()
self:MakePopup()
-- In case screenshots are still being processed
if screenshot_editor.IsProcessingScreenshots() then
refreshScreenshotsButton:DoClick()
else
self:AddScreenshotsToList()
end
end
-- Add screenshots to the DListView
function PANEL:AddScreenshotsToList()
local fileScroll = self.FileScroll
if not IsValid(fileScroll) then return end
fileScroll:Clear()
for fileName, fileTime in pairs(screenshot_editor.GetScreenshots()) do
fileName = fileName:Replace("screenshots/", "")
local fileEntry = self.FileScroll:Add("DScreenshotFileEntry")
fileEntry:DockMargin(0, 0, 4, 4)
fileEntry:Dock(TOP)
fileEntry:SetWide(self.ControlsBase:GetWide() - 16)
fileEntry:SetFileName(fileName)
fileEntry:SetDateCreated(fileTime)
fileEntry.LayoutPanel = self.FileScroll
end
local fileEntries = self.FileScroll:GetCanvas():GetChildren()
table.sort(fileEntries, function(a, b)
return (a.FileDateCreated or 0) > (b.FileDateCreated or 0)
end)
for index, fileEntry in ipairs(fileEntries) do
if fileEntry:GetName() ~= "DScreenshotFileEntry" then continue end
if index == 1 then
fileEntry:OnMouseReleased(MOUSE_LEFT)
end
fileEntry:SetZPos(index)
end
self:FilterScreenshotsList()
end
function PANEL:FilterScreenshotsList()
local showEdited = self.ShowEditedScreenshots
local fileScrollCanvas = self.FileScroll:GetCanvas()
for _, child in ipairs(fileScrollCanvas:GetChildren()) do
if child:GetName() ~= "DScreenshotFileEntry" then continue end
local fileName = string.StripExtension(child.FileName)
local shouldShow = true
if fileName:EndsWith("_edit") then
shouldShow = shouldShow and showEdited
end
local searchMatched = string.find(fileName:lower(), self.SearchFilter:lower(), nil, true)
shouldShow = shouldShow and searchMatched
child:SetVisible(shouldShow)
end
fileScrollCanvas:InvalidateLayout()
end
function PANEL:PaintScreenshot(width, height)
surface.SetDrawColor(255, 255, 255, 255)
surface.SetMaterial(self.CurrentScreenshot)
surface.DrawTexturedRect(0, 0, width, height)
local currentFilterData = screenshot_editor.GetFilter(self.CurrentFilter + 1)
if currentFilterData and currentFilterData.FilterCallback then
currentFilterData.FilterCallback(width, height, self.CurrentScreenshot)
end
local currentFrameData = screenshot_editor.GetFrame(self.CurrentFrame + 1)
if currentFrameData then
if not currentFrameData.Material then
currentFrameData.Material = Material(currentFrameData.MaterialPath, "smooth mips")
end
render.PushFilterMin(TEXFILTER.ANISOTROPIC)
render.PushFilterMag(TEXFILTER.ANISOTROPIC)
local frameMat = currentFrameData.Material
surface.SetMaterial(frameMat)
surface.DrawTexturedRect(0, 0, width, height)
render.PopFilterMin()
render.PopFilterMag()
end
end
function PANEL:Paint(width, height)
surface.SetDrawColor(20, 20, 20, 255)
surface.DrawRect(0, 0, width, height)
self:PaintScreenshot(width, height)
end
function PANEL:OnKeyCodePressed(keyCode)
local pressedUpKey = (keyCode == KEY_W) or (keyCode == KEY_UP)
local pressedDownKey = (keyCode == KEY_S) or (keyCode == KEY_DOWN)
if pressedUpKey or pressedDownKey then
local selectedLine = 1
local fileEntries = self.FileScroll:GetCanvas():GetChildren()
for index, line in ipairs(fileEntries) do
if line.Targeted then
selectedLine = index
break
end
end
local lineIdToSelect = selectedLine
-- Bit of a weird workaround to deal with entries that aren't visible
for i = selectedLine + (pressedUpKey and -1 or 1), (pressedUpKey and 0 or #fileEntries), (pressedUpKey and -1 or 1) do
local iLine = fileEntries[i]
if IsValid(iLine) and iLine:IsVisible() then
lineIdToSelect = i
break
end
end
if selectedLine ~= lineIdToSelect then
local lineToSelect = fileEntries[lineIdToSelect]
if IsValid(lineToSelect) then
lineToSelect:OnMouseReleased(MOUSE_LEFT)
end
end
end
end
derma.DefineControl("DScreenshotEditor", "Screenshot Editor", PANEL, "EditablePanel")

View file

@ -0,0 +1,122 @@
local PANEL = {}
local BG_COLOR_NORMAL = Color(0, 0, 0, 230)
local BG_COLOR_HOVERED = Color(20, 20, 20, 230)
local BG_COLOR_SELECTED = Color(40, 40, 40, 230)
local BG_COLOR_TARGETED = Color(30, 106, 156, 230)
surface.CreateFont("DScreenshotFileEntry_FileName", {
font = system.IsOSX() and "Helvetica" or "Tahoma",
size = 16,
weight = 500
})
surface.CreateFont("DScreenshotFileEntry_DateCreated", {
font = system.IsOSX() and "Helvetica" or "Tahoma",
size = 16,
weight = 500
})
function PANEL:Init()
self.FileName = nil
self.FileDateCreated = nil
self:SetSize(ScrW() * 0.2, 48)
local fnLabel = vgui.Create("DLabel", self)
fnLabel:SetText("file_name.jpg")
fnLabel:SetFont("DScreenshotFileEntry_FileName")
self.FileNameLabel = fnLabel
local dcLabel = vgui.Create("DLabel", self)
dcLabel:SetText("Created January 1st, 1970")
dcLabel:SetFont("DScreenshotFileEntry_DateCreated")
self.DateCreatedLabel = dcLabel
self:SetMouseInputEnabled(true)
self:SetCursor("hand")
self.Depressed = false
self.Targeted = false
end
function PANEL:OnMousePressed(keyCode)
if keyCode == MOUSE_LEFT then
self.Depressed = true
end
end
function PANEL:OnMouseReleased(keyCode)
if keyCode == MOUSE_LEFT then
if IsValid(self.LayoutPanel) then
for _, child in ipairs(self.LayoutPanel:GetCanvas():GetChildren()) do
child.Targeted = false
end
end
self.Targeted = true
self:DoClick()
end
self.Depressed = false
end
function PANEL:OnCursorExited()
self.Depressed = false
end
function PANEL:DoClick()
if IsValid(self.LayoutPanel) then
self.LayoutPanel:OnItemSelected(self)
end
end
function PANEL:Paint(width, height)
local col = BG_COLOR_NORMAL
if self.Depressed then
col = BG_COLOR_SELECTED
elseif self:IsHovered() then
col = BG_COLOR_HOVERED
end
if self.Targeted then
col = BG_COLOR_TARGETED
end
draw.RoundedBox(8, 0, 0, width, height, col)
end
function PANEL:PerformLayout(width, height)
self.FileNameLabel:CenterVertical(0.3)
self.FileNameLabel:AlignLeft(8)
self.DateCreatedLabel:CenterVertical(0.7)
self.DateCreatedLabel:AlignRight(8)
end
function PANEL:SetFileName(fileName)
self.FileName = fileName
self.FileNameLabel:SetText(fileName)
self.FileNameLabel:SizeToContents()
end
function PANEL:SetDateCreated(time)
self.FileDateCreated = time
local dayFormat = tonumber(os.date("%d", time))
local dateFormat = os.date("Created %B %%s, %Y", time)
dateFormat = Format(
dateFormat,
dayFormat .. STNDRD(dayFormat)
)
self.DateCreatedLabel:SetText(dateFormat)
self.DateCreatedLabel:SizeToContents()
end
derma.DefineControl("DScreenshotFileEntry", "Screenshot Editor File Entry", PANEL, "DPanel")

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 948 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

3326
images/screenshot_editor.pdn Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 KiB