| 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, }, | |
| }, | |
| } |