From fc1c4a06f1f65fa5750677cc2eaae5612e1ff78d Mon Sep 17 00:00:00 2001 From: maelstrom Date: Sat, 3 May 2025 19:12:30 +0200 Subject: [PATCH] feat(autogen): annotated datatypes --- core/src/datatypes/annotation.h | 11 ++++++-- core/src/datatypes/cframe.h | 40 +++++++++++++-------------- core/src/datatypes/color3.h | 19 ++++++------- core/src/datatypes/vector.h | 49 +++++++++++++++++---------------- 4 files changed, 62 insertions(+), 57 deletions(-) diff --git a/core/src/datatypes/annotation.h b/core/src/datatypes/annotation.h index c89a1e8..2e3f1f3 100644 --- a/core/src/datatypes/annotation.h +++ b/core/src/datatypes/annotation.h @@ -7,16 +7,21 @@ #define def_data(...) clang::annotate("OB::def_data", #__VA_ARGS__) #define def_data_prop(...) clang::annotate("OB::def_data_prop", #__VA_ARGS__) #define def_data_method(...) clang::annotate("OB::def_data_method", #__VA_ARGS__) +#define def_data_ctor(...) clang::annotate("OB::def_data_ctor", #__VA_ARGS__) #else #define def_data(...) #define def_data_prop(...) #define def_data_method(...) +#define def_data_ctor(...) +#define def_data_op(...) #endif // Helper macros -#define DEF_DATA [[ def_data() ]] -#define DEF_DATA_PROP [[ def_data_prop() ]] -#define DEF_DATA_METHOD [[ def_data_method() ]] +#define DEF_DATA [[ def_data() ]] // Data declaration +#define DEF_DATA_PROP [[ def_data_prop() ]] // Property. Getter or field +#define DEF_DATA_METHOD [[ def_data_method() ]] // Method +#define DEF_DATA_CTOR [[ def_data_ctor() ]] // Constructor (i.e. .new) +#define DEF_DATA_OP [[ def_data_op() ]] // Operator (e.g. +, -, *) #define AUTOGEN_PREAMBLE_DATA \ public: \ diff --git a/core/src/datatypes/cframe.h b/core/src/datatypes/cframe.h index 70d500b..04d2f9b 100644 --- a/core/src/datatypes/cframe.h +++ b/core/src/datatypes/cframe.h @@ -11,7 +11,7 @@ namespace rp = reactphysics3d; namespace Data { - class CFrame : Base { + class DEF_DATA CFrame : Base { glm::vec3 translation; glm::mat3 rotation; @@ -20,17 +20,17 @@ namespace Data { // CFrame(float x, float y, float z); // CFrame(const glm::vec3&); // CFrame(const rp::Vector3&); - CFrame(); - CFrame(float x, float y, float z, float R00, float R01, float R02, float R10, float R11, float R12, float R20, float R21, float R22); + DEF_DATA_CTOR CFrame(); + DEF_DATA_CTOR CFrame(float x, float y, float z, float R00, float R01, float R02, float R10, float R11, float R12, float R20, float R21, float R22); + DEF_DATA_CTOR CFrame(Vector3 , Vector3 lookAt, Vector3 up = Vector3(0, 1, 0)); CFrame(const rp::Transform&); CFrame(Vector3 position, glm::quat quat); - CFrame(Vector3 position, Vector3 lookAt, Vector3 up = Vector3(0, 1, 0)); ~CFrame(); // Same as CFrame(position, position + toward), but makes sure that up and toward are not linearly dependant static CFrame pointToward(Vector3 position, Vector3 toward); - static const CFrame IDENTITY; + DEF_DATA_PROP static const CFrame IDENTITY; static const CFrame YToZ; virtual const TypeInfo& GetType() const override; @@ -45,25 +45,25 @@ namespace Data { operator rp::Transform() const; //inline static CFrame identity() { } - inline Vector3 Position() const { return translation; } - inline CFrame Rotation() const { return CFrame { glm::vec3(0, 0, 0), rotation }; } - CFrame Inverse() const; - inline float X() const { return translation.x; } - inline float Y() const { return translation.y; } - inline float Z() const { return translation.z; } + DEF_DATA_METHOD inline Vector3 Position() const { return translation; } + DEF_DATA_METHOD inline CFrame Rotation() const { return CFrame { glm::vec3(0, 0, 0), rotation }; } + DEF_DATA_METHOD CFrame Inverse() const; + DEF_DATA_PROP inline float X() const { return translation.x; } + DEF_DATA_PROP inline float Y() const { return translation.y; } + DEF_DATA_PROP inline float Z() const { return translation.z; } - inline Vector3 RightVector() { return glm::column(rotation, 0); } - inline Vector3 UpVector() { return glm::column(rotation, 1); } - inline Vector3 LookVector() { return -glm::column(rotation, 2); } + DEF_DATA_PROP inline Vector3 RightVector() { return glm::column(rotation, 0); } + DEF_DATA_PROP inline Vector3 UpVector() { return glm::column(rotation, 1); } + DEF_DATA_PROP inline Vector3 LookVector() { return -glm::column(rotation, 2); } - Vector3 ToEulerAnglesXYZ(); - static CFrame FromEulerAnglesXYZ(Vector3); + DEF_DATA_METHOD Vector3 ToEulerAnglesXYZ(); + DEF_DATA_METHOD static CFrame FromEulerAnglesXYZ(Vector3); // Operators - Data::CFrame operator *(Data::CFrame) const; - Vector3 operator *(Vector3) const; - Data::CFrame operator +(Vector3) const; - Data::CFrame operator -(Vector3) const; + DEF_DATA_OP Data::CFrame operator *(Data::CFrame) const; + DEF_DATA_OP Vector3 operator *(Vector3) const; + DEF_DATA_OP Data::CFrame operator +(Vector3) const; + DEF_DATA_OP Data::CFrame operator -(Vector3) const; }; } diff --git a/core/src/datatypes/color3.h b/core/src/datatypes/color3.h index 42d77b4..d8ff28f 100644 --- a/core/src/datatypes/color3.h +++ b/core/src/datatypes/color3.h @@ -1,39 +1,38 @@ #pragma once #include "base.h" +#include "datatypes/annotation.h" #include #include #include -namespace rp = reactphysics3d; - namespace Data { - class Color3 : Base { + class DEF_DATA Color3 : Base { float r; float g; float b; public: - Color3(float r, float g, float b); - Color3(const glm::vec3&); + DEF_DATA_CTOR Color3(float r, float g, float b); + DEF_DATA_CTOR Color3(const glm::vec3&); ~Color3(); - static Color3 FromHex(std::string hex); + DEF_DATA_METHOD static Color3 FromHex(std::string hex); virtual const TypeInfo& GetType() const override; static const TypeInfo TYPE; virtual const Data::String ToString() const override; - std::string ToHex() const; + DEF_DATA_METHOD 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; - inline float R() const { return r; } - inline float G() const { return g; } - inline float B() const { return b; } + DEF_DATA_PROP inline float R() const { return r; } + DEF_DATA_PROP inline float G() const { return g; } + DEF_DATA_PROP inline float B() const { return b; } }; } diff --git a/core/src/datatypes/vector.h b/core/src/datatypes/vector.h index 3442bc1..b251234 100644 --- a/core/src/datatypes/vector.h +++ b/core/src/datatypes/vector.h @@ -1,6 +1,7 @@ #pragma once #include "base.h" +#include "datatypes/annotation.h" #include #include #include @@ -8,21 +9,21 @@ namespace rp = reactphysics3d; namespace Data { - class Vector3 : Base { + class DEF_DATA Vector3 : Base { glm::vec3 vector; public: - Vector3(); - Vector3(float x, float y, float z); - Vector3(const glm::vec3&); - Vector3(const rp::Vector3&); + DEF_DATA_CTOR Vector3(); + DEF_DATA_CTOR Vector3(float x, float y, float z); + DEF_DATA_CTOR Vector3(const glm::vec3&); + DEF_DATA_CTOR Vector3(const rp::Vector3&); ~Vector3(); virtual const TypeInfo& GetType() const override; static const TypeInfo TYPE; - static Data::Vector3 ZERO; - static Data::Vector3 ONE; + DEF_DATA_PROP static Data::Vector3 ZERO; + DEF_DATA_PROP static Data::Vector3 ONE; virtual const Data::String ToString() const override; virtual void Serialize(pugi::xml_node node) const override; @@ -34,28 +35,28 @@ namespace Data { 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); } - inline Data::Vector3 Unit() const { return glm::normalize(vector); } - inline Data::Vector3 Abs() const { return glm::abs(vector); } + DEF_DATA_PROP inline float X() const { return vector.x; } + DEF_DATA_PROP inline float Y() const { return vector.y; } + DEF_DATA_PROP inline float Z() const { return vector.z; } + DEF_DATA_METHOD inline float Magnitude() const { return glm::length(vector); } + DEF_DATA_METHOD inline Data::Vector3 Unit() const { return glm::normalize(vector); } + DEF_DATA_METHOD inline Data::Vector3 Abs() const { return glm::abs(vector); } - Data::Vector3 Cross(Data::Vector3) const; - float Dot(Data::Vector3) const; + DEF_DATA_METHOD Data::Vector3 Cross(Data::Vector3) const; + DEF_DATA_METHOD float Dot(Data::Vector3) const; // Operators - Data::Vector3 operator *(float) const; - Data::Vector3 operator /(float) const; - Data::Vector3 operator *(Data::Vector3) const; // Component-wise - Data::Vector3 operator +(Data::Vector3) const; - Data::Vector3 operator -(Data::Vector3) const; - Data::Vector3 operator -() const; + DEF_DATA_OP Data::Vector3 operator *(float) const; + DEF_DATA_OP Data::Vector3 operator /(float) const; + DEF_DATA_OP Data::Vector3 operator *(Data::Vector3) const; // Component-wise + DEF_DATA_OP Data::Vector3 operator +(Data::Vector3) const; + DEF_DATA_OP Data::Vector3 operator -(Data::Vector3) const; + DEF_DATA_OP Data::Vector3 operator -() const; - bool operator <(Data::Vector3) const; - bool operator >(Data::Vector3) const; + DEF_DATA_OP bool operator <(Data::Vector3) const; + DEF_DATA_OP bool operator >(Data::Vector3) const; - bool operator ==(Data::Vector3) const; + DEF_DATA_OP bool operator ==(Data::Vector3) const; }; }