diff --git a/core/src/datatypes/base.cpp b/core/src/datatypes/base.cpp index 8faf6b1..b3519f8 100644 --- a/core/src/datatypes/base.cpp +++ b/core/src/datatypes/base.cpp @@ -2,6 +2,7 @@ #include "meta.h" #include #include +#include "lua.h" #define IMPL_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE, TYPE_NAME) Data::CLASS_NAME::CLASS_NAME(WRAPPED_TYPE in) : value(in) {} \ Data::CLASS_NAME::~CLASS_NAME() = default; \ @@ -32,6 +33,10 @@ Data::Variant Data::Null::Deserialize(pugi::xml_node node) { return Data::Null(); } +void Data::Null::PushLuaValue(lua_State* L) const { + lua_pushnil(L); +} + // IMPL_WRAPPER_CLASS(Bool, bool, "bool") @@ -39,27 +44,50 @@ IMPL_WRAPPER_CLASS(Int, int, "int") IMPL_WRAPPER_CLASS(Float, float, "float") IMPL_WRAPPER_CLASS(String, std::string, "string") +// ToString + const Data::String Data::Bool::ToString() const { return Data::String(value ? "true" : "false"); } -Data::Variant Data::Bool::Deserialize(pugi::xml_node node) { - return Data::Bool(node.text().as_bool()); -} - -std::optional Data::Bool::FromString(std::string string) { - return Data::Bool(string[0] == 't' || string[0] == 'T' || string[0] == '1' || string[0] == 'y' || string[0] == 'Y'); -} - - const Data::String Data::Int::ToString() const { return Data::String(std::to_string(value)); } +const Data::String Data::Float::ToString() const { + std::stringstream stream; + stream << std::noshowpoint << value; + return Data::String(stream.str()); +} + +const Data::String Data::String::ToString() const { + return *this; +} + +// Deserialize + +Data::Variant Data::Bool::Deserialize(pugi::xml_node node) { + return Data::Bool(node.text().as_bool()); +} + Data::Variant Data::Int::Deserialize(pugi::xml_node node) { return Data::Int(node.text().as_int()); } +Data::Variant Data::Float::Deserialize(pugi::xml_node node) { + return Data::Float(node.text().as_float()); +} + +Data::Variant Data::String::Deserialize(pugi::xml_node node) { + return Data::String(node.text().as_string()); +} + +// FromString + +std::optional Data::Bool::FromString(std::string string) { + return Data::Bool(string[0] == 't' || string[0] == 'T' || string[0] == '1' || string[0] == 'y' || string[0] == 'Y'); +} + std::optional Data::Int::FromString(std::string string) { char* endPos; int value = (int)std::strtol(string.c_str(), &endPos, 10); @@ -67,17 +95,6 @@ std::optional Data::Int::FromString(std::string string) { return Data::Int(value); } - -const Data::String Data::Float::ToString() const { - std::stringstream stream; - stream << std::noshowpoint << value; - return Data::String(stream.str()); -} - -Data::Variant Data::Float::Deserialize(pugi::xml_node node) { - return Data::Float(node.text().as_float()); -} - std::optional Data::Float::FromString(std::string string) { char* endPos; float value = std::strtof(string.c_str(), &endPos); @@ -85,15 +102,24 @@ std::optional Data::Float::FromString(std::string string) { return Data::Float(value); } - -const Data::String Data::String::ToString() const { - return *this; -} - -Data::Variant Data::String::Deserialize(pugi::xml_node node) { - return Data::String(node.text().as_string()); -} - std::optional Data::String::FromString(std::string string) { return Data::String(string); +} + +// PushLuaValue + +void Data::Bool::PushLuaValue(lua_State* L) const { + lua_pushboolean(L, *this); +} + +void Data::Int::PushLuaValue(lua_State* L) const { + lua_pushinteger(L, *this); +} + +void Data::Float::PushLuaValue(lua_State* L) const { + lua_pushnumber(L, *this); +} + +void Data::String::PushLuaValue(lua_State* L) const { + lua_pushstring(L, value.c_str()); } \ No newline at end of file diff --git a/core/src/datatypes/base.h b/core/src/datatypes/base.h index bef50a9..743ad3c 100644 --- a/core/src/datatypes/base.h +++ b/core/src/datatypes/base.h @@ -5,6 +5,8 @@ #include #include +extern "C" { typedef struct lua_State lua_State; } + #define DEF_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE) class CLASS_NAME : public Data::Base { \ const WRAPPED_TYPE value; \ public: \ @@ -16,6 +18,8 @@ public: \ \ virtual const Data::String ToString() const override; \ virtual void Serialize(pugi::xml_node node) const override; \ + virtual void PushLuaValue(lua_State*) const override; \ + \ static Data::Variant Deserialize(pugi::xml_node node); \ static std::optional FromString(std::string); \ }; @@ -38,6 +42,7 @@ namespace Data { virtual const TypeInfo& GetType() const = 0; virtual const Data::String ToString() const = 0; virtual void Serialize(pugi::xml_node node) const = 0; + virtual void PushLuaValue(lua_State*) const = 0; }; class Null : Base { @@ -49,6 +54,8 @@ namespace Data { virtual const Data::String ToString() const override; virtual void Serialize(pugi::xml_node node) const override; + virtual void PushLuaValue(lua_State*) const override; + static Data::Variant Deserialize(pugi::xml_node node); }; diff --git a/core/src/datatypes/cframe.cpp b/core/src/datatypes/cframe.cpp index d1d0b76..e52e305 100644 --- a/core/src/datatypes/cframe.cpp +++ b/core/src/datatypes/cframe.cpp @@ -145,4 +145,9 @@ Data::Variant Data::CFrame::Deserialize(pugi::xml_node node) { node.child("R21").text().as_float(), node.child("R22").text().as_float() ); +} + +void Data::CFrame::PushLuaValue(lua_State* L) const { + // TODO: + panic(); } \ No newline at end of file diff --git a/core/src/datatypes/cframe.h b/core/src/datatypes/cframe.h index 645a6fd..4fc94d4 100644 --- a/core/src/datatypes/cframe.h +++ b/core/src/datatypes/cframe.h @@ -35,6 +35,7 @@ namespace Data { virtual const Data::String ToString() const override; virtual void Serialize(pugi::xml_node parent) const override; + virtual void PushLuaValue(lua_State*) const override; static Data::Variant Deserialize(pugi::xml_node node); operator glm::mat4() const; diff --git a/core/src/datatypes/color3.cpp b/core/src/datatypes/color3.cpp index 8117802..f0c9bb7 100644 --- a/core/src/datatypes/color3.cpp +++ b/core/src/datatypes/color3.cpp @@ -1,5 +1,6 @@ #include "color3.h" #include "meta.h" // IWYU pragma: keep +#include "panic.h" Data::Color3::Color3(float r, float g, float b) : r(std::clamp(r, 0.f, 1.f)), g(std::clamp(g, 0.f, 1.f)), b(std::clamp(b, 0.f, 1.f)) {}; Data::Color3::Color3(const glm::vec3& vec) : r(std::clamp(vec.x, 0.f, 1.f)), g(std::clamp(vec.y, 0.f, 1.f)), b(std::clamp(vec.z, 0.f, 1.f)) {}; @@ -45,3 +46,9 @@ void Data::Color3::Serialize(pugi::xml_node node) const { Data::Variant Data::Color3::Deserialize(pugi::xml_node node) { return Color3::FromHex(node.text().get()); } + + +void Data::Color3::PushLuaValue(lua_State* L) const { + // TODO: + panic(); +} \ No newline at end of file diff --git a/core/src/datatypes/color3.h b/core/src/datatypes/color3.h index ba22ef8..42d77b4 100644 --- a/core/src/datatypes/color3.h +++ b/core/src/datatypes/color3.h @@ -26,6 +26,7 @@ namespace Data { virtual const Data::String ToString() const override; std::string ToHex() const; virtual void Serialize(pugi::xml_node node) const override; + virtual void PushLuaValue(lua_State*) const override; static Data::Variant Deserialize(pugi::xml_node node); operator glm::vec3() const; diff --git a/core/src/datatypes/ref.cpp b/core/src/datatypes/ref.cpp index 6a99bf4..fb6a4e7 100644 --- a/core/src/datatypes/ref.cpp +++ b/core/src/datatypes/ref.cpp @@ -32,3 +32,8 @@ void Data::InstanceRef::Serialize(pugi::xml_node node) const { // Data::Variant Color3::Deserialize(pugi::xml_node node) { // return Color3::FromHex(node.text().get()); // } + +void Data::InstanceRef::PushLuaValue(lua_State* L) const { + // TODO: + panic(); +} \ No newline at end of file diff --git a/core/src/datatypes/ref.h b/core/src/datatypes/ref.h index cc4196a..00bac3f 100644 --- a/core/src/datatypes/ref.h +++ b/core/src/datatypes/ref.h @@ -20,6 +20,7 @@ namespace Data { virtual const Data::String ToString() const override; virtual void Serialize(pugi::xml_node node) const override; + virtual void PushLuaValue(lua_State*) const override; // static Data::Variant Deserialize(pugi::xml_node node); }; } diff --git a/core/src/datatypes/vector.cpp b/core/src/datatypes/vector.cpp index 24b7fc8..44e4193 100644 --- a/core/src/datatypes/vector.cpp +++ b/core/src/datatypes/vector.cpp @@ -2,6 +2,7 @@ #include #include #include "meta.h" // IWYU pragma: keep +#include "panic.h" Data::Vector3::Vector3() : vector(glm::vec3(0, 0, 0)) {}; Data::Vector3::Vector3(const glm::vec3& src) : vector(src) {}; @@ -100,4 +101,9 @@ std::optional Data::Vector3::FromString(std::string string) { } return Data::Vector3(components[0], components[1], components[2]); +} + +void Data::Vector3::PushLuaValue(lua_State* L) const { + // TODO: + panic(); } \ No newline at end of file diff --git a/core/src/datatypes/vector.h b/core/src/datatypes/vector.h index ea70ad7..100966f 100644 --- a/core/src/datatypes/vector.h +++ b/core/src/datatypes/vector.h @@ -26,6 +26,7 @@ namespace Data { virtual const Data::String ToString() const override; virtual void Serialize(pugi::xml_node node) const override; + virtual void PushLuaValue(lua_State*) const override; static Data::Variant Deserialize(pugi::xml_node node); static std::optional FromString(std::string);