From c7ea5c5563c0bc474f13db4afeac4882ee39d098 Mon Sep 17 00:00:00 2001 From: maelstrom Date: Tue, 4 Feb 2025 22:32:21 +0100 Subject: [PATCH] feat: added vector3 type --- editor/panes/propertiesmodel.cpp | 2 +- src/datatypes/base.h | 2 +- src/datatypes/meta.h | 4 +++- src/datatypes/vector.cpp | 19 ++++++++++++++++++ src/datatypes/vector.h | 33 ++++++++++++++++++++++++++++++++ src/objects/base/member.h | 2 +- src/objects/part.cpp | 4 +++- src/objects/part.h | 1 + 8 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/datatypes/vector.cpp create mode 100644 src/datatypes/vector.h diff --git a/editor/panes/propertiesmodel.cpp b/editor/panes/propertiesmodel.cpp index c62e8ee..d3223bc 100644 --- a/editor/panes/propertiesmodel.cpp +++ b/editor/panes/propertiesmodel.cpp @@ -31,7 +31,7 @@ QVariant PropertiesModel::data(const QModelIndex &index, int role) const { case Qt::CheckStateRole: if (index.column() == 0) return {}; else if (index.column() == 1 && meta.type == &Data::Bool::TYPE) - return selectedItem->GetPropertyValue(propertyName)->get().value ? Qt::Checked : Qt::Unchecked; + return selectedItem->GetPropertyValue(propertyName)->get() ? Qt::Checked : Qt::Unchecked; return {}; // case Qt::DecorationRole: // return iconOf(item->GetClass()); diff --git a/src/datatypes/base.h b/src/datatypes/base.h index 47c701d..5f5afe7 100644 --- a/src/datatypes/base.h +++ b/src/datatypes/base.h @@ -4,8 +4,8 @@ #define DEF_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE) class CLASS_NAME : public Data::Base { \ -public: \ const WRAPPED_TYPE value; \ +public: \ CLASS_NAME(WRAPPED_TYPE); \ ~CLASS_NAME(); \ operator WRAPPED_TYPE(); \ diff --git a/src/datatypes/meta.h b/src/datatypes/meta.h index a28f842..c3a248e 100644 --- a/src/datatypes/meta.h +++ b/src/datatypes/meta.h @@ -1,6 +1,7 @@ #pragma once #include "base.h" +#include "vector.h" #include // #define __VARIANT_TYPE std::variant< \ @@ -17,7 +18,8 @@ namespace Data { Bool, Int, Float, - String + String, + Vector3 > __VARIANT_TYPE; class Variant { diff --git a/src/datatypes/vector.cpp b/src/datatypes/vector.cpp new file mode 100644 index 0000000..7107924 --- /dev/null +++ b/src/datatypes/vector.cpp @@ -0,0 +1,19 @@ +#include "vector.h" + +Data::Vector3::Vector3(const glm::vec3& src) : vector(src) {}; +Data::Vector3::Vector3(const rp::Vector3& src) : vector(glm::vec3(src.x, src.y, src.z)) {}; +Data::Vector3::Vector3(float x, const float y, float z) : vector(glm::vec3(x, y, z)) {}; + +Data::Vector3::~Vector3() = default; +const Data::TypeInfo Data::Vector3::TYPE = { + .name = "Vector3", +}; + +const Data::TypeInfo& Data::Vector3::GetType() const { return Data::Vector3::TYPE; }; + +const Data::String Data::Vector3::ToString() const { + return std::to_string(X()) + ", " + std::to_string(Y()) + ", " + std::to_string(Z()); +} + +Data::Vector3::operator glm::vec3() const { return vector; }; +Data::Vector3::operator rp::Vector3() const { return rp::Vector3(X(), Y(), Z()); }; \ No newline at end of file diff --git a/src/datatypes/vector.h b/src/datatypes/vector.h new file mode 100644 index 0000000..80154f1 --- /dev/null +++ b/src/datatypes/vector.h @@ -0,0 +1,33 @@ +#pragma once + +#include "base.h" +#include +#include +#include + +namespace rp = reactphysics3d; + +namespace Data { + class Vector3 : Base { + const glm::vec3 vector; + + public: + Vector3(float x, float y, float z); + Vector3(const glm::vec3&); + Vector3(const rp::Vector3&); + ~Vector3(); + + virtual const TypeInfo& GetType() const override; + static const TypeInfo TYPE; + + virtual const Data::String ToString() const override; + + operator glm::vec3() const; + operator rp::Vector3() const; + + inline float X() const { return vector.x; } + inline float Y() const { return vector.y; } + inline float Z() const { return vector.z; } + inline float Magnitude() const { return glm::length(vector); } + }; +} diff --git a/src/objects/base/member.h b/src/objects/base/member.h index 664a346..991c502 100644 --- a/src/objects/base/member.h +++ b/src/objects/base/member.h @@ -17,7 +17,7 @@ struct FieldCodec { template void _writeCodec(Data::Variant source, void* destination) { - *(U*)destination = source.get().value; + *(U*)destination = (U)source.get(); } template diff --git a/src/objects/part.cpp b/src/objects/part.cpp index a503f00..89bd95c 100644 --- a/src/objects/part.cpp +++ b/src/objects/part.cpp @@ -1,6 +1,7 @@ #include "part.h" #include "base/instance.h" #include "datatypes/base.h" +#include "datatypes/vector.h" #include "objects/base/member.h" #include #include @@ -25,7 +26,8 @@ Part::Part(PartConstructParams params): Instance(&TYPE), position(params.positio this->memberMap = std::make_unique(MemberMap { .super = std::move(this->memberMap), .members = { - { "Anchored", { .backingField = &anchored, .type = &Data::Bool::TYPE, .codec = fieldCodecOf(), .updateCallback = memberFunctionOf(&Part::onUpdated, this) } } + { "Anchored", { .backingField = &anchored, .type = &Data::Bool::TYPE, .codec = fieldCodecOf(), .updateCallback = memberFunctionOf(&Part::onUpdated, this) } }, + { "Position", { .backingField = &position, .type = &Data::Vector3::TYPE, .codec = fieldCodecOf(), .updateCallback = memberFunctionOf(&Part::onUpdated, this) } } } }); } diff --git a/src/objects/part.h b/src/objects/part.h index cc9a899..974d279 100644 --- a/src/objects/part.h +++ b/src/objects/part.h @@ -5,6 +5,7 @@ #include #include #include "../rendering/material.h" +#include "datatypes/vector.h" #include namespace rp = reactphysics3d;