Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/client
diff options
context:
space:
mode:
Diffstat (limited to 'source/client')
-rw-r--r--source/client/CMakeLists.txt4
-rw-r--r--source/client/StarClientApplication.cpp55
-rw-r--r--source/client/StarClientApplication.hpp11
-rw-r--r--source/client/StarRenderingLuaBindings.cpp21
-rw-r--r--source/client/StarRenderingLuaBindings.hpp13
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);
+}
+
+}