From 398a5655f42378176a1e596af6d399a180ffb733 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Mon, 3 Jul 2023 08:51:42 +1000 Subject: [PATCH] Add Drawable <-> Lua conversion to LuaGameConverters --- source/core/StarLua.cpp | 4 +- source/core/StarLua.hpp | 6 +-- source/core/StarLuaConverters.hpp | 8 +-- source/core/StarVector.hpp | 1 - source/game/StarDrawable.cpp | 3 +- .../scripting/StarLuaAnimationComponent.hpp | 28 +--------- .../game/scripting/StarLuaGameConverters.cpp | 54 +++++++++++++++++++ .../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(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(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 LuaTable createTable(Container const& map); @@ -1890,7 +1890,7 @@ T LuaEngine::luaTo(LuaValue const& v) { template 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 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> { template struct LuaConverter> { static LuaValue from(LuaEngine& engine, Matrix3 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 Enable4DOrHigher

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::LuaAnimationComponent() { animationCallbacks.registerCallback("clearDrawables", [this]() { m_drawables.clear(); }); - animationCallbacks.registerCallback("addDrawable", [this](LuaTable const& drawableTable, Maybe renderLayerName) { + animationCallbacks.registerCallback("addDrawable", [this](Drawable drawable, Maybe renderLayerName) { Maybe renderLayer; if (renderLayerName) renderLayer = parseRenderLayer(*renderLayerName); - Color color = drawableTable.get>("color").value(Color::White); - - Drawable drawable; - if (auto line = drawableTable.get>("line")) - drawable = Drawable::makeLine(line.take(), drawableTable.get("width"), color); - else if (auto poly = drawableTable.get>("poly")) - drawable = Drawable::makePoly(poly.take(), color); - else if (auto image = drawableTable.get>("image")) - drawable = Drawable::makeImage(image.take(), 1.0f / TilePixels, drawableTable.get>("centered").value(true), Vec2F(), color); - else - throw LuaAnimationComponentException("Drawable table must have 'line', 'poly', or 'image'"); - - if (auto transformation = drawableTable.get>("transformation")) - drawable.transform(*transformation); - if (auto rotation = drawableTable.get>("rotation")) - drawable.rotate(*rotation); - if (drawableTable.get("mirrored")) - drawable.scale(Vec2F(-1, 1)); - if (auto scale = drawableTable.get>("scale")) - drawable.scale(*scale); - if (auto position = drawableTable.get>("position")) - drawable.translate(*position); - - drawable.fullbright = drawableTable.get("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 LuaConverter::to(LuaEngine& engine, LuaValue con return {}; } +LuaValue LuaConverter::from(LuaEngine& engine, Drawable const& v) { + auto table = engine.createTable(); + if (auto line = v.part.ptr()) { + table.set("line", line->line); + table.set("width", line->width); + } else if (auto poly = v.part.ptr()) { + table.set("poly", poly->poly); + } else if (auto image = v.part.ptr()) { + 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 LuaConverter::to(LuaEngine& engine, LuaValue const& v) { + if (auto table = v.ptr()) { + Maybe result; + result.emplace(); + Drawable& drawable = result.get(); + + Color color = table->get>("color").value(Color::White); + + if (auto line = table->get>("line")) + drawable = Drawable::makeLine(line.take(), table->get("width"), color); + else if (auto poly = table->get>("poly")) + drawable = Drawable::makePoly(poly.take(), color); + else if (auto image = table->get>("image")) + drawable = Drawable::makeImage(image.take(), 1.0f, table->get>("centered").value(true), Vec2F(), color); + else + return {}; // throw LuaAnimationComponentException("Drawable table must have 'line', 'poly', or 'image'"); + + if (auto transformation = table->get>("transformation")) + drawable.transform(*transformation); + if (auto rotation = table->get>("rotation")) + drawable.rotate(*rotation); + if (table->get("mirrored")) + drawable.scale(Vec2F(-1, 1)); + if (auto scale = table->get>("scale")) + drawable.scale(*scale); + if (auto position = table->get>("position")) + drawable.translate(*position); + + drawable.fullbright = table->get("fullbright"); + + return result; + } + return {}; +} + LuaValue LuaConverter::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 { static Maybe to(LuaEngine& engine, LuaValue const& v); }; +template <> +struct LuaConverter { + static LuaValue from(LuaEngine& engine, Drawable const& v); + static Maybe to(LuaEngine& engine, LuaValue const& v); +}; + template LuaMethods> LuaUserDataMethods>::make() { LuaMethods> methods;