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

summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2024-03-17 01:53:46 +1100
committerKae <80987908+Novaenia@users.noreply.github.com>2024-03-17 01:53:46 +1100
commit53c7c3775fae0810b0831297b50aab1b0a1ef4e0 (patch)
treeee8153e55810085d6ed07a64efb6a17c1fa87a2f /source
parent463205c09cc393e92ae2f51b9bc8f61c4e368dea (diff)
Lua: new Image userdata (& cursor mod fix)
Diffstat (limited to 'source')
-rw-r--r--source/base/StarAssets.cpp14
-rw-r--r--source/base/StarMemoryAssetSource.cpp2
-rw-r--r--source/core/CMakeLists.txt2
-rw-r--r--source/core/StarJson.cpp22
-rw-r--r--source/core/StarJson.hpp2
-rw-r--r--source/core/scripting/StarImageLuaBindings.cpp28
-rw-r--r--source/core/scripting/StarImageLuaBindings.hpp17
-rw-r--r--source/game/scripting/StarRootLuaBindings.cpp6
-rw-r--r--source/game/scripting/StarRootLuaBindings.hpp2
9 files changed, 88 insertions, 7 deletions
diff --git a/source/base/StarAssets.cpp b/source/base/StarAssets.cpp
index 784d686..6593d3d 100644
--- a/source/base/StarAssets.cpp
+++ b/source/base/StarAssets.cpp
@@ -19,6 +19,7 @@
#include "StarSha256.hpp"
#include "StarDataStreamDevices.hpp"
#include "StarLua.hpp"
+#include "StarImageLuaBindings.hpp"
#include "StarUtilityLuaBindings.hpp"
namespace Star {
@@ -120,6 +121,14 @@ Assets::Assets(Settings settings, StringList assetSources) {
return String(assetBytes->ptr(), assetBytes->size());
});
+ callbacks.registerCallback("image", [this](String const& path) -> Image {
+ auto assetImage = image(path);
+ if (assetImage->bytesPerPixel() == 3)
+ return assetImage->convert(PixelFormat::RGBA32);
+ else
+ return *assetImage;
+ });
+
callbacks.registerCallback("scan", [this](Maybe<String> const& a, Maybe<String> const& b) -> StringList {
return b ? scan(a.value(), *b) : scan(a.value());
});
@@ -211,6 +220,9 @@ Assets::Assets(Settings settings, StringList assetSources) {
addSource(strf("{}::{}", sourcePath, groupName), memoryAssets);
}
}
+ // clear any caching that may have been trigered by load scripts as they may no longer be valid
+ m_framesSpecifications.clear();
+ m_assetsCache.clear();
};
List<pair<String, AssetSourcePtr>> sources;
@@ -884,7 +896,7 @@ Json Assets::readJson(String const& path) const {
}
} else if (patchJson.isType(Json::Type::Object)) { //Kae: Do a good ol' json merge instead if the .patch file is a Json object
auto patchData = patchJson.toObject();
- result = jsonMerge(result, patchData);
+ result = jsonMergeNulling(result, patchData);
}
}
return result;
diff --git a/source/base/StarMemoryAssetSource.cpp b/source/base/StarMemoryAssetSource.cpp
index 1176f5a..17e3749 100644
--- a/source/base/StarMemoryAssetSource.cpp
+++ b/source/base/StarMemoryAssetSource.cpp
@@ -52,7 +52,7 @@ IODevicePtr MemoryAssetSource::open(String const& path) {
}
ByteArrayPtr assetData;
- StreamOffset assetPos;
+ StreamOffset assetPos = 0;
String name;
};
diff --git a/source/core/CMakeLists.txt b/source/core/CMakeLists.txt
index fb31fca..eda2acc 100644
--- a/source/core/CMakeLists.txt
+++ b/source/core/CMakeLists.txt
@@ -127,6 +127,7 @@ SET (star_core_HEADERS
StarWorkerPool.hpp
StarXXHash.hpp
StarZSTDCompression.hpp
+ scripting/StarImageLuaBindings.hpp
scripting/StarUtilityLuaBindings.hpp
)
@@ -184,6 +185,7 @@ SET (star_core_SOURCES
StarUuid.cpp
StarWorkerPool.cpp
StarZSTDCompression.cpp
+ scripting/StarImageLuaBindings.cpp
scripting/StarUtilityLuaBindings.cpp
)
diff --git a/source/core/StarJson.cpp b/source/core/StarJson.cpp
index 3502996..83b4e67 100644
--- a/source/core/StarJson.cpp
+++ b/source/core/StarJson.cpp
@@ -1026,13 +1026,25 @@ Json jsonMerge(Json const& base, Json const& merger) {
res.first->second = jsonMerge(res.first->second, p.second);
}
return merged;
+ }
+ return merger.type() == Json::Type::Null ? base : merger;
+}
- } else if (merger.type() == Json::Type::Null) {
- return base;
-
- } else {
- return merger;
+Json jsonMergeNulling(Json const& base, Json const& merger) {
+ if (base.type() == Json::Type::Object && merger.type() == Json::Type::Object) {
+ JsonObject merged = base.toObject();
+ for (auto const& p : merger.toObject()) {
+ if (p.second.isNull())
+ merged.erase(p.first);
+ else {
+ auto res = merged.insert(p);
+ if (!res.second)
+ res.first->second = jsonMergeNulling(res.first->second, p.second);
+ }
+ }
+ return merged;
}
+ return merger;
}
bool jsonPartialMatch(Json const& base, Json const& compare) {
diff --git a/source/core/StarJson.hpp b/source/core/StarJson.hpp
index 085fd9f..a533e47 100644
--- a/source/core/StarJson.hpp
+++ b/source/core/StarJson.hpp
@@ -291,6 +291,8 @@ DataStream& operator>>(DataStream& ds, JsonObject& m);
// is the combination of both objects, but for each repeated key jsonMerge is
// called recursively on both values to determine the result.
Json jsonMerge(Json const& base, Json const& merger);
+// Same as above, but applies null mergers.
+Json jsonMergeNulling(Json const& base, Json const& merger);
template <typename... T>
Json jsonMerge(Json const& base, Json const& merger, T const&... rest);
diff --git a/source/core/scripting/StarImageLuaBindings.cpp b/source/core/scripting/StarImageLuaBindings.cpp
new file mode 100644
index 0000000..83fb8d1
--- /dev/null
+++ b/source/core/scripting/StarImageLuaBindings.cpp
@@ -0,0 +1,28 @@
+#include "StarImageLuaBindings.hpp"
+#include "StarLuaConverters.hpp"
+#include "StarImage.hpp"
+
+namespace Star {
+
+LuaMethods<Image> LuaUserDataMethods<Image>::make() {
+ LuaMethods<Image> methods;
+
+ methods.registerMethodWithSignature<Vec2U, Image&>("size", mem_fn(&Image::size));
+ methods.registerMethodWithSignature<void, Image&, Vec2U, Image&>("drawInto", mem_fn(&Image::drawInto));
+ methods.registerMethodWithSignature<void, Image&, Vec2U, Image&>("copyInto", mem_fn(&Image::copyInto));
+ methods.registerMethod("set", [](Image& image, unsigned x, unsigned y, Color const& color) {
+ image.set(x, y, color.toRgba());
+ });
+
+ methods.registerMethod("get", [](Image& image, unsigned x, unsigned y) {
+ return Color::rgba(image.get(x, y));
+ });
+
+ methods.registerMethod("subImage", [](Image& image, Vec2U const& min, Vec2U const& size) {
+ return image.subImage(min, size);
+ });
+
+ return methods;
+}
+
+}
diff --git a/source/core/scripting/StarImageLuaBindings.hpp b/source/core/scripting/StarImageLuaBindings.hpp
new file mode 100644
index 0000000..b49598d
--- /dev/null
+++ b/source/core/scripting/StarImageLuaBindings.hpp
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "StarLua.hpp"
+
+namespace Star {
+
+STAR_CLASS(Image);
+
+template <>
+struct LuaConverter<Image> : LuaUserDataConverter<Image> {};
+
+template <>
+struct LuaUserDataMethods<Image> {
+ static LuaMethods<Image> make();
+};
+
+}
diff --git a/source/game/scripting/StarRootLuaBindings.cpp b/source/game/scripting/StarRootLuaBindings.cpp
index 0c66a7b..a08be7f 100644
--- a/source/game/scripting/StarRootLuaBindings.cpp
+++ b/source/game/scripting/StarRootLuaBindings.cpp
@@ -22,6 +22,7 @@
#include "StarBehaviorDatabase.hpp"
#include "StarDamageDatabase.hpp"
#include "StarDungeonGenerator.hpp"
+#include "StarImageLuaBindings.hpp"
namespace Star {
@@ -31,6 +32,7 @@ LuaCallbacks LuaBindings::makeRootCallbacks() {
auto root = Root::singletonPtr();
callbacks.registerCallbackWithSignature<String, String>("assetData", bind(RootCallbacks::assetData, root, _1));
+ callbacks.registerCallbackWithSignature<Image, String>("assetImage", bind(RootCallbacks::assetImage, root, _1));
callbacks.registerCallbackWithSignature<Json, String>("assetJson", bind(RootCallbacks::assetJson, root, _1));
callbacks.registerCallbackWithSignature<Json, String, Json>("makeCurrentVersionedJson", bind(RootCallbacks::makeCurrentVersionedJson, root, _1, _2));
callbacks.registerCallbackWithSignature<Json, Json, String>("loadVersionedJson", bind(RootCallbacks::loadVersionedJson, root, _1, _2));
@@ -255,6 +257,10 @@ String LuaBindings::RootCallbacks::assetData(Root* root, String const& path) {
return String(bytes->ptr(), bytes->size());
}
+Image LuaBindings::RootCallbacks::assetImage(Root* root, String const& path) {
+ return *root->assets()->image(path);
+}
+
Json LuaBindings::RootCallbacks::assetJson(Root* root, String const& path) {
return root->assets()->json(path);
}
diff --git a/source/game/scripting/StarRootLuaBindings.hpp b/source/game/scripting/StarRootLuaBindings.hpp
index ac8b79f..3979f2f 100644
--- a/source/game/scripting/StarRootLuaBindings.hpp
+++ b/source/game/scripting/StarRootLuaBindings.hpp
@@ -7,12 +7,14 @@
namespace Star {
STAR_CLASS(Root);
+STAR_CLASS(Image);
namespace LuaBindings {
LuaCallbacks makeRootCallbacks();
namespace RootCallbacks {
String assetData(Root* root, String const& path);
+ Image assetImage(Root* root, String const& path);
Json assetJson(Root* root, String const& path);
Json makeCurrentVersionedJson(Root* root, String const& identifier, Json const& content);
Json loadVersionedJson(Root* root, Json const& versionedJson, String const& expectedIdentifier);