diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-03-17 01:53:46 +1100 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-03-17 01:53:46 +1100 |
commit | 53c7c3775fae0810b0831297b50aab1b0a1ef4e0 (patch) | |
tree | ee8153e55810085d6ed07a64efb6a17c1fa87a2f /source | |
parent | 463205c09cc393e92ae2f51b9bc8f61c4e368dea (diff) |
Lua: new Image userdata (& cursor mod fix)
Diffstat (limited to 'source')
-rw-r--r-- | source/base/StarAssets.cpp | 14 | ||||
-rw-r--r-- | source/base/StarMemoryAssetSource.cpp | 2 | ||||
-rw-r--r-- | source/core/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/core/StarJson.cpp | 22 | ||||
-rw-r--r-- | source/core/StarJson.hpp | 2 | ||||
-rw-r--r-- | source/core/scripting/StarImageLuaBindings.cpp | 28 | ||||
-rw-r--r-- | source/core/scripting/StarImageLuaBindings.hpp | 17 | ||||
-rw-r--r-- | source/game/scripting/StarRootLuaBindings.cpp | 6 | ||||
-rw-r--r-- | source/game/scripting/StarRootLuaBindings.hpp | 2 |
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); |