feat(autogen): annotated datatypes

This commit is contained in:
maelstrom 2025-05-03 19:12:30 +02:00
parent 66f7f0bea6
commit fc1c4a06f1
4 changed files with 62 additions and 57 deletions

View file

@ -7,16 +7,21 @@
#define def_data(...) clang::annotate("OB::def_data", #__VA_ARGS__) #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_prop(...) clang::annotate("OB::def_data_prop", #__VA_ARGS__)
#define def_data_method(...) clang::annotate("OB::def_data_method", #__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 #else
#define def_data(...) #define def_data(...)
#define def_data_prop(...) #define def_data_prop(...)
#define def_data_method(...) #define def_data_method(...)
#define def_data_ctor(...)
#define def_data_op(...)
#endif #endif
// Helper macros // Helper macros
#define DEF_DATA [[ def_data() ]] #define DEF_DATA [[ def_data() ]] // Data declaration
#define DEF_DATA_PROP [[ def_data_prop() ]] #define DEF_DATA_PROP [[ def_data_prop() ]] // Property. Getter or field
#define DEF_DATA_METHOD [[ def_data_method() ]] #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 \ #define AUTOGEN_PREAMBLE_DATA \
public: \ public: \

View file

@ -11,7 +11,7 @@
namespace rp = reactphysics3d; namespace rp = reactphysics3d;
namespace Data { namespace Data {
class CFrame : Base { class DEF_DATA CFrame : Base {
glm::vec3 translation; glm::vec3 translation;
glm::mat3 rotation; glm::mat3 rotation;
@ -20,17 +20,17 @@ namespace Data {
// CFrame(float x, float y, float z); // CFrame(float x, float y, float z);
// CFrame(const glm::vec3&); // CFrame(const glm::vec3&);
// CFrame(const rp::Vector3&); // CFrame(const rp::Vector3&);
CFrame(); DEF_DATA_CTOR 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(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(const rp::Transform&);
CFrame(Vector3 position, glm::quat quat); CFrame(Vector3 position, glm::quat quat);
CFrame(Vector3 position, Vector3 lookAt, Vector3 up = Vector3(0, 1, 0));
~CFrame(); ~CFrame();
// Same as CFrame(position, position + toward), but makes sure that up and toward are not linearly dependant // 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 CFrame pointToward(Vector3 position, Vector3 toward);
static const CFrame IDENTITY; DEF_DATA_PROP static const CFrame IDENTITY;
static const CFrame YToZ; static const CFrame YToZ;
virtual const TypeInfo& GetType() const override; virtual const TypeInfo& GetType() const override;
@ -45,25 +45,25 @@ namespace Data {
operator rp::Transform() const; operator rp::Transform() const;
//inline static CFrame identity() { } //inline static CFrame identity() { }
inline Vector3 Position() const { return translation; } DEF_DATA_METHOD inline Vector3 Position() const { return translation; }
inline CFrame Rotation() const { return CFrame { glm::vec3(0, 0, 0), rotation }; } DEF_DATA_METHOD inline CFrame Rotation() const { return CFrame { glm::vec3(0, 0, 0), rotation }; }
CFrame Inverse() const; DEF_DATA_METHOD CFrame Inverse() const;
inline float X() const { return translation.x; } DEF_DATA_PROP inline float X() const { return translation.x; }
inline float Y() const { return translation.y; } DEF_DATA_PROP inline float Y() const { return translation.y; }
inline float Z() const { return translation.z; } DEF_DATA_PROP inline float Z() const { return translation.z; }
inline Vector3 RightVector() { return glm::column(rotation, 0); } DEF_DATA_PROP inline Vector3 RightVector() { return glm::column(rotation, 0); }
inline Vector3 UpVector() { return glm::column(rotation, 1); } DEF_DATA_PROP inline Vector3 UpVector() { return glm::column(rotation, 1); }
inline Vector3 LookVector() { return -glm::column(rotation, 2); } DEF_DATA_PROP inline Vector3 LookVector() { return -glm::column(rotation, 2); }
Vector3 ToEulerAnglesXYZ(); DEF_DATA_METHOD Vector3 ToEulerAnglesXYZ();
static CFrame FromEulerAnglesXYZ(Vector3); DEF_DATA_METHOD static CFrame FromEulerAnglesXYZ(Vector3);
// Operators // Operators
Data::CFrame operator *(Data::CFrame) const; DEF_DATA_OP Data::CFrame operator *(Data::CFrame) const;
Vector3 operator *(Vector3) const; DEF_DATA_OP Vector3 operator *(Vector3) const;
Data::CFrame operator +(Vector3) const; DEF_DATA_OP Data::CFrame operator +(Vector3) const;
Data::CFrame operator -(Vector3) const; DEF_DATA_OP Data::CFrame operator -(Vector3) const;
}; };
} }

View file

@ -1,39 +1,38 @@
#pragma once #pragma once
#include "base.h" #include "base.h"
#include "datatypes/annotation.h"
#include <glm/ext/quaternion_geometric.hpp> #include <glm/ext/quaternion_geometric.hpp>
#include <glm/ext/vector_float3.hpp> #include <glm/ext/vector_float3.hpp>
#include <reactphysics3d/reactphysics3d.h> #include <reactphysics3d/reactphysics3d.h>
namespace rp = reactphysics3d;
namespace Data { namespace Data {
class Color3 : Base { class DEF_DATA Color3 : Base {
float r; float r;
float g; float g;
float b; float b;
public: public:
Color3(float r, float g, float b); DEF_DATA_CTOR Color3(float r, float g, float b);
Color3(const glm::vec3&); DEF_DATA_CTOR Color3(const glm::vec3&);
~Color3(); ~Color3();
static Color3 FromHex(std::string hex); DEF_DATA_METHOD static Color3 FromHex(std::string hex);
virtual const TypeInfo& GetType() const override; virtual const TypeInfo& GetType() const override;
static const TypeInfo TYPE; static const TypeInfo TYPE;
virtual const Data::String ToString() const override; 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 Serialize(pugi::xml_node node) const override;
virtual void PushLuaValue(lua_State*) const override; virtual void PushLuaValue(lua_State*) const override;
static Data::Variant Deserialize(pugi::xml_node node); static Data::Variant Deserialize(pugi::xml_node node);
operator glm::vec3() const; operator glm::vec3() const;
inline float R() const { return r; } DEF_DATA_PROP inline float R() const { return r; }
inline float G() const { return g; } DEF_DATA_PROP inline float G() const { return g; }
inline float B() const { return b; } DEF_DATA_PROP inline float B() const { return b; }
}; };
} }

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "base.h" #include "base.h"
#include "datatypes/annotation.h"
#include <glm/ext/quaternion_geometric.hpp> #include <glm/ext/quaternion_geometric.hpp>
#include <glm/ext/vector_float3.hpp> #include <glm/ext/vector_float3.hpp>
#include <reactphysics3d/reactphysics3d.h> #include <reactphysics3d/reactphysics3d.h>
@ -8,21 +9,21 @@
namespace rp = reactphysics3d; namespace rp = reactphysics3d;
namespace Data { namespace Data {
class Vector3 : Base { class DEF_DATA Vector3 : Base {
glm::vec3 vector; glm::vec3 vector;
public: public:
Vector3(); DEF_DATA_CTOR Vector3();
Vector3(float x, float y, float z); DEF_DATA_CTOR Vector3(float x, float y, float z);
Vector3(const glm::vec3&); DEF_DATA_CTOR Vector3(const glm::vec3&);
Vector3(const rp::Vector3&); DEF_DATA_CTOR Vector3(const rp::Vector3&);
~Vector3(); ~Vector3();
virtual const TypeInfo& GetType() const override; virtual const TypeInfo& GetType() const override;
static const TypeInfo TYPE; static const TypeInfo TYPE;
static Data::Vector3 ZERO; DEF_DATA_PROP static Data::Vector3 ZERO;
static Data::Vector3 ONE; DEF_DATA_PROP static Data::Vector3 ONE;
virtual const Data::String ToString() const override; virtual const Data::String ToString() const override;
virtual void Serialize(pugi::xml_node node) const override; virtual void Serialize(pugi::xml_node node) const override;
@ -34,28 +35,28 @@ namespace Data {
operator glm::vec3() const; operator glm::vec3() const;
operator rp::Vector3() const; operator rp::Vector3() const;
inline float X() const { return vector.x; } DEF_DATA_PROP inline float X() const { return vector.x; }
inline float Y() const { return vector.y; } DEF_DATA_PROP inline float Y() const { return vector.y; }
inline float Z() const { return vector.z; } DEF_DATA_PROP inline float Z() const { return vector.z; }
inline float Magnitude() const { return glm::length(vector); } DEF_DATA_METHOD inline float Magnitude() const { return glm::length(vector); }
inline Data::Vector3 Unit() const { return glm::normalize(vector); } DEF_DATA_METHOD inline Data::Vector3 Unit() const { return glm::normalize(vector); }
inline Data::Vector3 Abs() const { return glm::abs(vector); } DEF_DATA_METHOD inline Data::Vector3 Abs() const { return glm::abs(vector); }
Data::Vector3 Cross(Data::Vector3) const; DEF_DATA_METHOD Data::Vector3 Cross(Data::Vector3) const;
float Dot(Data::Vector3) const; DEF_DATA_METHOD float Dot(Data::Vector3) const;
// Operators // Operators
Data::Vector3 operator *(float) const; DEF_DATA_OP Data::Vector3 operator *(float) const;
Data::Vector3 operator /(float) const; DEF_DATA_OP Data::Vector3 operator /(float) const;
Data::Vector3 operator *(Data::Vector3) const; // Component-wise DEF_DATA_OP Data::Vector3 operator *(Data::Vector3) const; // Component-wise
Data::Vector3 operator +(Data::Vector3) const; DEF_DATA_OP Data::Vector3 operator +(Data::Vector3) const;
Data::Vector3 operator -(Data::Vector3) const; DEF_DATA_OP Data::Vector3 operator -(Data::Vector3) const;
Data::Vector3 operator -() const; DEF_DATA_OP Data::Vector3 operator -() const;
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;
bool operator ==(Data::Vector3) const; DEF_DATA_OP bool operator ==(Data::Vector3) const;
}; };
} }