diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-03 08:51:42 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-03 08:51:42 +1000 |
commit | 398a5655f42378176a1e596af6d399a180ffb733 (patch) | |
tree | 88b5d6a9c389a55f5f10a5243188cdf5de7c553a | |
parent | d7ba1136883de9392bb929df5772dba7f8bf49df (diff) |
Add Drawable <-> Lua conversion to LuaGameConverters
-rw-r--r-- | source/core/StarLua.cpp | 4 | ||||
-rw-r--r-- | source/core/StarLua.hpp | 6 | ||||
-rw-r--r-- | source/core/StarLuaConverters.hpp | 8 | ||||
-rw-r--r-- | source/core/StarVector.hpp | 1 | ||||
-rw-r--r-- | source/game/StarDrawable.cpp | 3 | ||||
-rw-r--r-- | source/game/scripting/StarLuaAnimationComponent.hpp | 28 | ||||
-rw-r--r-- | source/game/scripting/StarLuaGameConverters.cpp | 54 | ||||
-rw-r--r-- | source/game/scripting/StarLuaGameConverters.hpp | 7 |
8 files changed, 74 insertions, 37 deletions
diff --git a/source/core/StarLua.cpp b/source/core/StarLua.cpp index 93ed516..3b04fc8 100644 --- a/source/core/StarLua.cpp +++ b/source/core/StarLua.cpp @@ -464,10 +464,10 @@ LuaString LuaEngine::createString(char const* str) { return LuaString(LuaDetail::LuaHandle(RefPtr<LuaEngine>(this), popHandle(m_state))); } -LuaTable LuaEngine::createTable() { +LuaTable LuaEngine::createTable(int narr, int nrec) { lua_checkstack(m_state, 1); - lua_newtable(m_state); + lua_createtable(m_state, narr, nrec); return LuaTable(LuaDetail::LuaHandle(RefPtr<LuaEngine>(this), popHandle(m_state))); } diff --git a/source/core/StarLua.hpp b/source/core/StarLua.hpp index 2c108ef..41310a3 100644 --- a/source/core/StarLua.hpp +++ b/source/core/StarLua.hpp @@ -505,7 +505,7 @@ public: LuaString createString(String const& str); LuaString createString(char const* str); - LuaTable createTable(); + LuaTable createTable(int narr = 0, int nrec = 0); template <typename Container> LuaTable createTable(Container const& map); @@ -1890,7 +1890,7 @@ T LuaEngine::luaTo(LuaValue const& v) { template <typename Container> LuaTable LuaEngine::createTable(Container const& map) { - auto table = createTable(); + auto table = createTable(0, map.size()); for (auto const& p : map) table.set(p.first, p.second); return table; @@ -1898,7 +1898,7 @@ LuaTable LuaEngine::createTable(Container const& map) { template <typename Container> LuaTable LuaEngine::createArrayTable(Container const& array) { - auto table = createTable(); + auto table = createTable(array.size(), 0); int i = 1; for (auto const& elem : array) { table.set(LuaInt(i), elem); diff --git a/source/core/StarLuaConverters.hpp b/source/core/StarLuaConverters.hpp index bf030cd..c20442f 100644 --- a/source/core/StarLuaConverters.hpp +++ b/source/core/StarLuaConverters.hpp @@ -63,10 +63,10 @@ struct LuaConverter<Vector<T, N>> { template <typename T> struct LuaConverter<Matrix3<T>> { static LuaValue from(LuaEngine& engine, Matrix3<T> const& m) { - auto table = engine.createTable(); - table.set(1, luaFrom(engine, m.row1)); - table.set(2, luaFrom(engine, m.row2)); - table.set(3, luaFrom(engine, m.row3)); + auto table = engine.createTable(3, 0); + table.set(1, m[0]); + table.set(2, m[1]); + table.set(3, m[2]); return table; } diff --git a/source/core/StarVector.hpp b/source/core/StarVector.hpp index aaa5909..16d9d42 100644 --- a/source/core/StarVector.hpp +++ b/source/core/StarVector.hpp @@ -212,7 +212,6 @@ public: template <size_t P = N> Enable4DOrHigher<P> setW(T const& t); -private: using Base::size; using Base::empty; }; diff --git a/source/game/StarDrawable.cpp b/source/game/StarDrawable.cpp index c7311ae..08c14be 100644 --- a/source/game/StarDrawable.cpp +++ b/source/game/StarDrawable.cpp @@ -95,7 +95,8 @@ Drawable Drawable::makeImage(AssetPath image, float pixelSize, bool centered, Ve transformation.translate(-imageSize / 2); } - transformation.scale(pixelSize); + if (pixelSize != 1.0f) + transformation.scale(pixelSize); drawable.part = ImagePart{move(image), move(transformation)}; drawable.position = position; diff --git a/source/game/scripting/StarLuaAnimationComponent.hpp b/source/game/scripting/StarLuaAnimationComponent.hpp index 76c3f28..6d94466 100644 --- a/source/game/scripting/StarLuaAnimationComponent.hpp +++ b/source/game/scripting/StarLuaAnimationComponent.hpp @@ -61,36 +61,12 @@ LuaAnimationComponent<Base>::LuaAnimationComponent() { animationCallbacks.registerCallback("clearDrawables", [this]() { m_drawables.clear(); }); - animationCallbacks.registerCallback("addDrawable", [this](LuaTable const& drawableTable, Maybe<String> renderLayerName) { + animationCallbacks.registerCallback("addDrawable", [this](Drawable drawable, Maybe<String> renderLayerName) { Maybe<EntityRenderLayer> renderLayer; if (renderLayerName) renderLayer = parseRenderLayer(*renderLayerName); - Color color = drawableTable.get<Maybe<Color>>("color").value(Color::White); - - Drawable drawable; - if (auto line = drawableTable.get<Maybe<Line2F>>("line")) - drawable = Drawable::makeLine(line.take(), drawableTable.get<float>("width"), color); - else if (auto poly = drawableTable.get<Maybe<PolyF>>("poly")) - drawable = Drawable::makePoly(poly.take(), color); - else if (auto image = drawableTable.get<Maybe<String>>("image")) - drawable = Drawable::makeImage(image.take(), 1.0f / TilePixels, drawableTable.get<Maybe<bool>>("centered").value(true), Vec2F(), color); - else - throw LuaAnimationComponentException("Drawable table must have 'line', 'poly', or 'image'"); - - if (auto transformation = drawableTable.get<Maybe<Mat3F>>("transformation")) - drawable.transform(*transformation); - if (auto rotation = drawableTable.get<Maybe<float>>("rotation")) - drawable.rotate(*rotation); - if (drawableTable.get<bool>("mirrored")) - drawable.scale(Vec2F(-1, 1)); - if (auto scale = drawableTable.get<Maybe<float>>("scale")) - drawable.scale(*scale); - if (auto position = drawableTable.get<Maybe<Vec2F>>("position")) - drawable.translate(*position); - - drawable.fullbright = drawableTable.get<bool>("fullbright"); - + drawable.scale(1.0f / TilePixels); m_drawables.append({move(drawable), renderLayer}); }); animationCallbacks.registerCallback("clearLightSources", [this]() { diff --git a/source/game/scripting/StarLuaGameConverters.cpp b/source/game/scripting/StarLuaGameConverters.cpp index e2fd516..070048e 100644 --- a/source/game/scripting/StarLuaGameConverters.cpp +++ b/source/game/scripting/StarLuaGameConverters.cpp @@ -417,6 +417,60 @@ Maybe<LiquidLevel> LuaConverter<LiquidLevel>::to(LuaEngine& engine, LuaValue con return {}; } +LuaValue LuaConverter<Drawable>::from(LuaEngine& engine, Drawable const& v) { + auto table = engine.createTable(); + if (auto line = v.part.ptr<Drawable::LinePart>()) { + table.set("line", line->line); + table.set("width", line->width); + } else if (auto poly = v.part.ptr<Drawable::PolyPart>()) { + table.set("poly", poly->poly); + } else if (auto image = v.part.ptr<Drawable::ImagePart>()) { + table.set("image", AssetPath::join(image->image)); + table.set("transformation", image->transformation); + } + + table.set("position", v.position); + table.set("color", v.color); + table.set("fullbright", v.fullbright); + + return table; +} + +Maybe<Drawable> LuaConverter<Drawable>::to(LuaEngine& engine, LuaValue const& v) { + if (auto table = v.ptr<LuaTable>()) { + Maybe<Drawable> result; + result.emplace(); + Drawable& drawable = result.get(); + + Color color = table->get<Maybe<Color>>("color").value(Color::White); + + if (auto line = table->get<Maybe<Line2F>>("line")) + drawable = Drawable::makeLine(line.take(), table->get<float>("width"), color); + else if (auto poly = table->get<Maybe<PolyF>>("poly")) + drawable = Drawable::makePoly(poly.take(), color); + else if (auto image = table->get<Maybe<String>>("image")) + drawable = Drawable::makeImage(image.take(), 1.0f, table->get<Maybe<bool>>("centered").value(true), Vec2F(), color); + else + return {}; // throw LuaAnimationComponentException("Drawable table must have 'line', 'poly', or 'image'"); + + if (auto transformation = table->get<Maybe<Mat3F>>("transformation")) + drawable.transform(*transformation); + if (auto rotation = table->get<Maybe<float>>("rotation")) + drawable.rotate(*rotation); + if (table->get<bool>("mirrored")) + drawable.scale(Vec2F(-1, 1)); + if (auto scale = table->get<Maybe<float>>("scale")) + drawable.scale(*scale); + if (auto position = table->get<Maybe<Vec2F>>("position")) + drawable.translate(*position); + + drawable.fullbright = table->get<bool>("fullbright"); + + return result; + } + return {}; +} + LuaValue LuaConverter<Collection>::from(LuaEngine& engine, Collection const& c) { auto table = engine.createTable(); table.set("name", c.name); diff --git a/source/game/scripting/StarLuaGameConverters.hpp b/source/game/scripting/StarLuaGameConverters.hpp index c0f5416..ff84792 100644 --- a/source/game/scripting/StarLuaGameConverters.hpp +++ b/source/game/scripting/StarLuaGameConverters.hpp @@ -9,6 +9,7 @@ #include "StarCollectionDatabase.hpp" #include "StarBehaviorState.hpp" #include "StarSystemWorld.hpp" +#include "StarDrawable.hpp" namespace Star { @@ -98,6 +99,12 @@ struct LuaConverter<LiquidLevel> { static Maybe<LiquidLevel> to(LuaEngine& engine, LuaValue const& v); }; +template <> +struct LuaConverter<Drawable> { + static LuaValue from(LuaEngine& engine, Drawable const& v); + static Maybe<Drawable> to(LuaEngine& engine, LuaValue const& v); +}; + template <typename T> LuaMethods<RpcPromise<T>> LuaUserDataMethods<RpcPromise<T>>::make() { LuaMethods<RpcPromise<T>> methods; |