diff options
-rw-r--r-- | assets/opensb/interface/opensb/shaders/shaders.lua | 21 | ||||
-rw-r--r-- | assets/opensb/scripts/opensb/universeclient/loadconfig.lua | 14 | ||||
-rw-r--r-- | source/client/StarClientApplication.cpp | 15 | ||||
-rw-r--r-- | source/client/StarClientApplication.hpp | 6 | ||||
-rw-r--r-- | source/client/StarRenderingLuaBindings.cpp | 3 |
5 files changed, 45 insertions, 14 deletions
diff --git a/assets/opensb/interface/opensb/shaders/shaders.lua b/assets/opensb/interface/opensb/shaders/shaders.lua index f9b6a32..befbabf 100644 --- a/assets/opensb/interface/opensb/shaders/shaders.lua +++ b/assets/opensb/interface/opensb/shaders/shaders.lua @@ -184,6 +184,18 @@ local function addOption(data, i, added) end end +local function updateParameter(parameter,oname,value) + if parameter.isPasses then + for k,v in next, parameter.layers do + renderer.setPostProcessLayerPasses(v, value) + end + else + for k,v in next, parameter.effects do + renderer.setEffectParameter(v, oname, value) + end + end +end + function sliderOptionModified(option, odata) local oname = string.sub(option, optionOffset) local parameter = groups[activeGroup].parameters[oname] @@ -191,15 +203,12 @@ function sliderOptionModified(option, odata) widget.setText(fmt("%s.%s",OPTIONS_WIDGET,option.."_value"), fmt(digitRegex(parameter.delta),value)) - for k,v in next, parameter.effects do - renderer.setEffectParameter(v, oname, value) - end + updateParameter(parameter,oname,value) shaderConfig[activeGroup].parameters[oname] = value root.setConfiguration("postProcessGroups",shaderConfig) end function selectOptionPressed(button,bdata) - sb.logInfo(sb.print(bdata)) for k,v in next, bdata.buttons do if v.index ~= bdata.index then @@ -212,9 +221,7 @@ function selectOptionPressed(button,bdata) local oname = bdata.option.name local parameter = groups[activeGroup].parameters[oname] - for k,v in next, parameter.effects do - renderer.setEffectParameter(v, oname, value) - end + updateParameter(parameter,oname,value) shaderConfig[activeGroup].parameters[oname] = value root.setConfiguration("postProcessGroups",shaderConfig) end diff --git a/assets/opensb/scripts/opensb/universeclient/loadconfig.lua b/assets/opensb/scripts/opensb/universeclient/loadconfig.lua index c0fc845..0898bc0 100644 --- a/assets/opensb/scripts/opensb/universeclient/loadconfig.lua +++ b/assets/opensb/scripts/opensb/universeclient/loadconfig.lua @@ -11,9 +11,17 @@ function module.init() local group = postProcessGroups[k] if group and v.parameters then for k2,v2 in next, group.parameters do - if v.parameters[k2] ~= nil then - for _,e in next, v2.effects do - renderer.setEffectParameter(e,k2,v.parameters[k2]) + local param = v.parameters[k2] + if param ~= nil then + if v2.isPasses then + -- this parameter controls passes + for _,l in next, v2.layers do + renderer.setPostProcessLayerPasses(l,param) + end + else + for _,e in next, v2.effects do + renderer.setEffectParameter(e,k2,param) + end end end end diff --git a/source/client/StarClientApplication.cpp b/source/client/StarClientApplication.cpp index 3c7ec8d..7c1af16 100644 --- a/source/client/StarClientApplication.cpp +++ b/source/client/StarClientApplication.cpp @@ -492,6 +492,7 @@ void ClientApplication::renderReload() { // define post process layers and optionally assign them to groups m_postProcessLayers.clear(); + m_labelledPostProcessLayers.clear(); auto postProcessLayers = assets->json("/client.config:postProcessLayers").toArray(); for (auto& layer : postProcessLayers) { auto effects = jsonToStringList(layer.getArray("effects")); @@ -502,18 +503,28 @@ void ClientApplication::renderReload() { if (gname) { group = &m_postProcessGroups.get(gname.value()); } + // I'd think a string map for all of these would be better, but the order does matter here, and does make sense to depend on mod priority, so... + // guess a string map of indices works + // I tried pointers but for whatever reason the behaviour was highly inconsistent and only worked after reload... + auto label = layer.optString("name"); + if (label) { + m_labelledPostProcessLayers.add(label.value(),m_postProcessLayers.count()); + } m_postProcessLayers.append(PostProcessLayer{ std::move(effects), (unsigned)layer.getUInt("passes", 1), group }); } loadEffectConfig("interface"); } -void ClientApplication::setPostProcessGroupEnabled(String group, bool enabled, Maybe<bool> save) { +void ClientApplication::setPostProcessLayerPasses(String const& layer, unsigned const& passes) { + m_postProcessLayers.at(m_labelledPostProcessLayers.get(layer)).passes = passes; +} +void ClientApplication::setPostProcessGroupEnabled(String const& group, bool const& enabled, Maybe<bool> const& save) { m_postProcessGroups.get(group).enabled = enabled; if (save && save.value()) m_root->configuration()->setPath(strf("{}.{}.enabled", postProcessGroupsRoot, group),enabled); } -bool ClientApplication::postProcessGroupEnabled(String group) { +bool ClientApplication::postProcessGroupEnabled(String const& group) { return m_postProcessGroups.get(group).enabled; } diff --git a/source/client/StarClientApplication.hpp b/source/client/StarClientApplication.hpp index 86b50a3..2fcddb7 100644 --- a/source/client/StarClientApplication.hpp +++ b/source/client/StarClientApplication.hpp @@ -19,8 +19,9 @@ STAR_CLASS(Voice); class ClientApplication : public Application { public: - void setPostProcessGroupEnabled(String group, bool enabled, Maybe<bool> save); - bool postProcessGroupEnabled(String group); + void setPostProcessLayerPasses(String const& layer, unsigned const& passes); + void setPostProcessGroupEnabled(String const& group, bool const& enabled, Maybe<bool> const& save); + bool postProcessGroupEnabled(String const& group); Json postProcessGroups(); protected: @@ -116,6 +117,7 @@ private: StringMap<PostProcessGroup> m_postProcessGroups; List<PostProcessLayer> m_postProcessLayers; + StringMap<size_t> m_labelledPostProcessLayers; // Valid if main app state == SinglePlayer UniverseServerPtr m_universeServer; diff --git a/source/client/StarRenderingLuaBindings.cpp b/source/client/StarRenderingLuaBindings.cpp index 39dc1a1..4493f71 100644 --- a/source/client/StarRenderingLuaBindings.cpp +++ b/source/client/StarRenderingLuaBindings.cpp @@ -37,6 +37,9 @@ LuaCallbacks LuaBindings::makeRenderingCallbacks(ClientApplication* app) { auto renderer = app->renderer(); return renderer->getEffectScriptableParameter(effectName, effectParameter); }); + + // not saved; should be loaded by Lua again + callbacks.registerCallbackWithSignature<void, String, unsigned>("setPostProcessLayerPasses", bind(mem_fn(&ClientApplication::setPostProcessLayerPasses), app, _1, _2)); return callbacks; } |