diff options
Diffstat (limited to 'source/client')
-rw-r--r-- | source/client/CMakeLists.txt | 4 | ||||
-rw-r--r-- | source/client/StarClientApplication.cpp | 55 | ||||
-rw-r--r-- | source/client/StarClientApplication.hpp | 11 | ||||
-rw-r--r-- | source/client/StarRenderingLuaBindings.cpp | 21 | ||||
-rw-r--r-- | source/client/StarRenderingLuaBindings.hpp | 13 |
5 files changed, 97 insertions, 7 deletions
diff --git a/source/client/CMakeLists.txt b/source/client/CMakeLists.txt index 57b8231..a6773d3 100644 --- a/source/client/CMakeLists.txt +++ b/source/client/CMakeLists.txt @@ -12,10 +12,12 @@ INCLUDE_DIRECTORIES ( SET (star_client_HEADERS StarClientApplication.hpp + StarRenderingLuaBindings.hpp ) SET (star_client_SOURCES StarClientApplication.cpp + StarRenderingLuaBindings.cpp ) IF (STAR_SYSTEM_WINDOWS) @@ -37,4 +39,4 @@ IF(UNIX) set_target_properties (starbound PROPERTIES LINK_FLAGS "-Wl,-rpath,'$ORIGIN'") ENDIF() -TARGET_LINK_LIBRARIES (starbound ${STAR_EXT_LIBS} ${STAR_EXT_GUI_LIBS})
\ No newline at end of file +TARGET_LINK_LIBRARIES (starbound ${STAR_EXT_LIBS} ${STAR_EXT_GUI_LIBS}) diff --git a/source/client/StarClientApplication.cpp b/source/client/StarClientApplication.cpp index 71bec5d..09ebf0c 100644 --- a/source/client/StarClientApplication.cpp +++ b/source/client/StarClientApplication.cpp @@ -24,6 +24,7 @@ #include "StarVoiceLuaBindings.hpp" #include "StarCameraLuaBindings.hpp" #include "StarClipboardLuaBindings.hpp" +#include "StarRenderingLuaBindings.hpp" #if defined STAR_SYSTEM_WINDOWS #include <windows.h> @@ -405,10 +406,12 @@ void ClientApplication::render() { auto size = Vec2F(renderer->screenSize()); auto quad = renderFlatRect(RectF::withSize(size / -2, size), Vec4B::filled(0), 0.0f); for (auto& layer : m_postProcessLayers) { - for (unsigned i = 0; i < layer.passes; i++) { - for (auto& effect : layer.effects) { - renderer->switchEffectConfig(effect); - renderer->render(quad); + if (layer.group ? layer.group->enabled : true) { + for (unsigned i = 0; i < layer.passes; i++) { + for (auto& effect : layer.effects) { + renderer->switchEffectConfig(effect); + renderer->render(quad); + } } } } @@ -434,6 +437,8 @@ void ClientApplication::getAudioData(int16_t* sampleData, size_t frameCount) { } } +auto postProcessGroupsRoot = "postProcessGroups"; + void ClientApplication::renderReload() { auto assets = m_root->assets(); auto renderer = Application::renderer(); @@ -464,18 +469,55 @@ void ClientApplication::renderReload() { loadEffectConfig("world"); + // define post process groups and set them to be enabled/disabled based on config + + auto config = m_root->configuration(); + if (!config->get(postProcessGroupsRoot).isType(Json::Type::Object)) + config->set(postProcessGroupsRoot, JsonObject()); + auto groupsConfig = config->get(postProcessGroupsRoot); + + m_postProcessGroups.clear(); + auto postProcessGroups = assets->json("/client.config:postProcessGroups").toObject(); + for (auto& pair : postProcessGroups) { + auto name = pair.first; + auto groupConfig = groupsConfig.opt(name); + auto def = pair.second.getBool("enabledDefault",true); + if (!groupConfig) + config->setPath(strf("{}.{}", postProcessGroupsRoot, name),JsonObject()); + m_postProcessGroups.add(name,PostProcessGroup{ groupConfig ? groupConfig.value().getBool("enabled", def) : def }); + } + + // define post process layers and optionally assign them to groups m_postProcessLayers.clear(); auto postProcessLayers = assets->json("/client.config:postProcessLayers").toArray(); for (auto& layer : postProcessLayers) { auto effects = jsonToStringList(layer.getArray("effects")); for (auto& effect : effects) loadEffectConfig(effect); - m_postProcessLayers.append(PostProcessLayer{ std::move(effects), (unsigned)layer.getUInt("passes", 1) }); + PostProcessGroup* group = nullptr; + auto gname = layer.optString("group"); + if (gname) { + group = &m_postProcessGroups.get(gname.value()); + } + 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) { + m_postProcessGroups.get(group).enabled = enabled; + if (save && save.value()) + m_root->configuration()->setPath(strf("{}.{}.enabled", postProcessGroupsRoot, group),enabled); +} +bool ClientApplication::postProcessGroupEnabled(String group) { + return m_postProcessGroups.get(group).enabled; +} + +Json ClientApplication::postProcessGroups() { + return m_root->assets()->json("/client.config:postProcessGroups"); +} + void ClientApplication::changeState(MainAppState newState) { MainAppState oldState = m_state; m_state = newState; @@ -543,6 +585,7 @@ void ClientApplication::changeState(MainAppState newState) { m_universeClient->setLuaCallbacks("input", LuaBindings::makeInputCallbacks()); m_universeClient->setLuaCallbacks("voice", LuaBindings::makeVoiceCallbacks()); m_universeClient->setLuaCallbacks("camera", LuaBindings::makeCameraCallbacks(&m_worldPainter->camera())); + m_universeClient->setLuaCallbacks("renderer", LuaBindings::makeRenderingCallbacks(this)); Json alwaysAllow = m_root->configuration()->getPath("safe.alwaysAllowClipboard"); m_universeClient->setLuaCallbacks("clipboard", LuaBindings::makeClipboardCallbacks(appController(), alwaysAllow && alwaysAllow.toBool())); @@ -568,7 +611,7 @@ void ClientApplication::changeState(MainAppState newState) { }; m_mainMixer->setUniverseClient(m_universeClient); - m_titleScreen = make_shared<TitleScreen>(m_playerStorage, m_mainMixer->mixer()); + m_titleScreen = make_shared<TitleScreen>(m_playerStorage, m_mainMixer->mixer(), m_universeClient); if (auto renderer = Application::renderer()) m_titleScreen->renderInit(renderer); } diff --git a/source/client/StarClientApplication.hpp b/source/client/StarClientApplication.hpp index 840dc9a..323f2b7 100644 --- a/source/client/StarClientApplication.hpp +++ b/source/client/StarClientApplication.hpp @@ -18,6 +18,11 @@ STAR_CLASS(Input); STAR_CLASS(Voice); class ClientApplication : public Application { +public: + void setPostProcessGroupEnabled(String group, bool enabled, Maybe<bool> save); + bool postProcessGroupEnabled(String group); + Json postProcessGroups(); + protected: virtual void startup(StringList const& cmdLineArgs) override; virtual void shutdown() override; @@ -53,9 +58,14 @@ private: String password; }; + struct PostProcessGroup { + bool enabled; + }; + struct PostProcessLayer { List<String> effects; unsigned passes; + PostProcessGroup* group; }; void renderReload(); @@ -104,6 +114,7 @@ private: WorldRenderData m_renderData; MainInterfacePtr m_mainInterface; + StringMap<PostProcessGroup> m_postProcessGroups; List<PostProcessLayer> m_postProcessLayers; // Valid if main app state == SinglePlayer diff --git a/source/client/StarRenderingLuaBindings.cpp b/source/client/StarRenderingLuaBindings.cpp new file mode 100644 index 0000000..4c9e7a2 --- /dev/null +++ b/source/client/StarRenderingLuaBindings.cpp @@ -0,0 +1,21 @@ +#include "StarRenderingLuaBindings.hpp" +#include "StarLuaConverters.hpp" +#include "StarClientApplication.hpp" + +namespace Star { + +LuaCallbacks LuaBindings::makeRenderingCallbacks(ClientApplication* app) { + LuaCallbacks callbacks; + + // if the last argument is defined and true, this change will also be saved to starbound.config and read on next game start, use for things such as an interface that does this + callbacks.registerCallbackWithSignature<void, String, bool, Maybe<bool>>("setPostProcessGroupEnabled", bind(mem_fn(&ClientApplication::setPostProcessGroupEnabled), app, _1, _2, _3)); + callbacks.registerCallbackWithSignature<bool, String>("postProcessGroupEnabled", bind(mem_fn(&ClientApplication::postProcessGroupEnabled), app, _1)); + + // not entirely necessary (root.assetJson can achieve the same purpose) but may as well + callbacks.registerCallbackWithSignature<Json>("postProcessGroups", bind(mem_fn(&ClientApplication::postProcessGroups), app)); + + return callbacks; +} + + +} diff --git a/source/client/StarRenderingLuaBindings.hpp b/source/client/StarRenderingLuaBindings.hpp new file mode 100644 index 0000000..68e709f --- /dev/null +++ b/source/client/StarRenderingLuaBindings.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "StarLua.hpp" + +namespace Star { + +STAR_CLASS(ClientApplication); + +namespace LuaBindings { + LuaCallbacks makeRenderingCallbacks(ClientApplication* app); +} + +} |