myspace / CommonLua /X /XShaderEffect.lua
sirnii's picture
Upload 1816 files
b6a38d7 verified
raw
history blame
8.68 kB
local UIL = UIL
DefineClass.XFxModifier = {
__parents = { "InitDone" },
properties = {
{ category = "FX", id = "UIEffectModifierId", default = "", editor = "preset_id", preset_class = "UIFxModifierPreset", },
{ category = "FX", id = "UIFXInternalModifierId", default = "", editor = "preset_id", preset_class = "UIFxModifierPreset", help = "Keeps internal state. ", dont_save = true, no_edit = true, },
},
effect_shader_modifier = false,
effect_shader_params = false,
}
function XFxModifier:Init()
if self.UIEffectModifierId and self.UIEffectModifierId ~= "" then
self:SetUIEffectModifierId(self.UIEffectModifierId)
end
end
function XUpdateShaderEffectModifier(fx_id, modifier, params)
local mod_data = UIFxModifierPresets[fx_id]
if not mod_data then return end
modifier = modifier or {}
modifier.modifier_type = const.modShader
modifier.shader_flags = mod_data.shader_flags
local getter = false
if params and next(params) then
getter = function(mod_data, prop_id)
local param_value = params[prop_id]
if param_value then
return param_value
end
return mod_data:GetProperty(prop_id)
end
end
modifier.payload = mod_data:ComposeBuffer(modifier.payload, getter)
return modifier
end
local XUpdateShaderEffectModifier = XUpdateShaderEffectModifier
local ModifiersSetTop = UIL.ModifiersSetTop
local ModifiersGetTop = UIL.ModifiersGetTop
local PushModifier = UIL.PushModifier
function XPushShaderEffectModifier(fx_id, modifier, params)
local mod_data = UIFxModifierPresets[fx_id]
if not mod_data then return end
local pos = ModifiersGetTop()
modifier = XUpdateShaderEffectModifier(fx_id, modifier, params)
PushModifier(modifier)
return pos, modifier
end
function XFxModifier:UpdateUIEffectModifiers()
if self.effect_shader_modifier then
self:RemoveModifier(self.effect_shader_modifier)
end
if self.UIFXInternalModifierId and self.UIFXInternalModifierId ~= "" then
local mod_data = UIFxModifierPresets[self.UIFXInternalModifierId]
if not mod_data then return end
local modifier = XUpdateShaderEffectModifier(self.UIFXInternalModifierId, self.effect_shader_modifier, self.effect_shader_params)
self.effect_shader_modifier = self:AddShaderModifier(modifier)
end
end
function XFxModifier:SetUIEffectModifierId(id)
local current_fx_id = self.UIEffectModifierId or self.UIFXInternalModifierId
local target_fx = UIFxModifierPresets[id]
local current_fx = UIFxModifierPresets[current_fx_id]
self.UIEffectModifierId = id
if current_fx ~= target_fx then
local shader_params = self.effect_shader_params or {}
self.effect_shader_params = shader_params
self:DeleteThread("UIFX")
self:CreateThread("UIFX", function()
if current_fx then
shader_params.UIFXFadeInStartTime = 0
shader_params.UIFXFadeOutStartTime = RealTime()
self.UIFXInternalModifierId = current_fx_id
self:UpdateUIEffectModifiers()
Sleep(current_fx.FadeOut)
end
self.UIFXInternalModifierId = false
self:UpdateUIEffectModifiers()
if target_fx then
Sleep(target_fx.FadeInDelay)
shader_params.UIFXFadeInStartTime = RealTime()
shader_params.UIFXFadeOutStartTime = 0
self.UIFXInternalModifierId = id
self:UpdateUIEffectModifiers()
Sleep(target_fx.FadeIn)
if target_fx.Duration > 0 then
Sleep(target_fx.Duration)
if self.UIEffectModifierId == id then
self.UIEffectModifierId = false
shader_params.UIFXFadeInStartTime = 0
shader_params.UIFXFadeOutStartTime = RealTime()
self:UpdateUIEffectModifiers()
Sleep(target_fx.FadeOut)
self.UIFXInternalModifierId = false
self:UpdateUIEffectModifiers()
end
end
end
end)
end
self:UpdateUIEffectModifiers()
end
DefineClass.UIFxModifierPreset = {
__parents = { "Preset", "MeshParamSet" },
properties = {
{id = "Duration", editor = "number", min = 0, default = 0, scale = 1000, },
{id = "FadeInDelay", editor = "number", min = 0, default = 0, scale = 1000, },
{uniform = true, id = "FadeIn", editor = "number", min = 0, default = 0, scale = 1000, help = "Depends on per-feature implementation."},
{uniform = true, id = "FadeOut", editor = "number", min = 0, default = 0, scale = 1000, help = "Depends on per-feature implementation."},
{uniform = true, id = "UIFXFadeInStartTime", editor = "number", min = 0, default = 0, no_edit = true, dont_save = true, },
{uniform = true, id = "UIFXFadeOutStartTime", editor = "number", min = 0, default = 0, no_edit = true, dont_save = true, },
},
GlobalMap = "UIFxModifierPresets",
EditorMenubar = "Editors.Art",
PresetClass = "UIFxModifierPreset",
}
function UIFxModifierPreset:OnEditorSetProperty(...)
CreateRealTimeThread( function()
local container_list = GetChildrenOfKind(terminal.desktop, "XFxModifier")
for _, mod_window in ipairs(container_list) do
if mod_window.UIEffectModifierId == self.id then
mod_window:UpdateUIEffectModifiers()
mod_window:Invalidate()
end
end
UIL.Invalidate()
end)
Preset.OnEditorSetProperty(self, ...)
end
function TestUIFxModifiers()
local wrapper = XWindow:new({
Dock = "top",
MinWidth = 100,
MinHeight = 100,
MaxWidth = 500,
MaxHeight = 500,
UIEffectModifierId = "Default",
}, terminal.desktop)
XImage:new({
Image = "UI/SplashScreen", HAlign = "center", VAlign = "center",
}, wrapper)
end
DefineClass.UIFxModifierDefault = {
__parents = { "UIFxModifierPreset" },
shader_flags = const.msfUIEnableFX,
properties = {
{ uniform = true, category = "FX", id = "InterlacedStrength", editor = "number", scale = 1000, default = 0, min = 0, max = 1000, slider=true, },
{ uniform = true, category = "FX", id = "AberrationShift", editor = "number", scale = 1000, default = 0, min = 0, max = 1000, slider=true, },
{ uniform = true, category = "FX", id = "AberrationStrength", editor = "number", scale = 1000, default = 0, min = 0, max = 1000, slider=true, },
{ uniform = true, category = "FX", id = "GrainStrength", editor = "number", scale = 255, default = 0, min = 0, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "Desaturate", editor = "number", scale = 255, default = 0, min = 0, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "GroundLoopStrength", editor = "number", scale = 255, default = 0, min = 0, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "GroundLoopShift", editor = "number", scale = 255, default = 0, min = 0, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "GroundLoopFreq", editor = "number", scale = 255, default = 0, min = -255, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "GroundLoopScale", editor = "number", scale = 255, default = 0, min = 0, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "DVDropoutStrength", editor = "number", scale = 255, default = 0, min = 0, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "DVDropoutTileSize", editor = "number", scale = 255, default = 0, min = 0, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "DVDropoutTimeWindow", editor = "number", scale = 255, default = 0, min = 0, max = 255, slider=true, },
{ uniform = true, category = "FX", id = "BaseColor", editor = "color", default = RGB(255,255,255), },
{ uniform = true, category = "FX", id = "LodBias", name = "LodBias (Blur)", editor = "number", scale = 1000, default = 0, min = -10000, max = 10000, slider=true, },
{ uniform = true, category = "FX", id = "Pad01", no_edit = true, editor = "number", default = 0, },
{ uniform = true, category = "FX", id = "Pad02", no_edit = true, editor = "number", default = 0, },
},
}
DefineClass.UIFxFadeoutBox = {
__parents = { "UIFxModifierPreset" },
shader_flags = const.msfFadeoutBoxFX,
properties = {
{ uniform = true, category = "FX", id = "BoxMinX", editor = "number", scale = 1000, default = 0, min = 0, },
{ uniform = true, category = "FX", id = "BoxMinY", editor = "number", scale = 1000, default = 0, min = 0, },
{ uniform = true, category = "FX", id = "BoxMaxX", editor = "number", scale = 1000, default = 0, min = 0, },
{ uniform = true, category = "FX", id = "BoxMaxY", editor = "number", scale = 1000, default = 0, min = 0, },
{ uniform = true, category = "FX", id = "FadeDistance", editor = "number", scale = 1000, default = 0, min = 0, },
{ uniform = true, category = "FX", id = "pad1", editor = "number", scale = 1000, default = 0, min = 0, },
{ uniform = true, category = "FX", id = "pad2", editor = "number", scale = 1000, default = 0, min = 0, },
{ uniform = true, category = "FX", id = "pad3", editor = "number", scale = 1000, default = 0, min = 0, },
},
}