// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Core/ISerializable.h" #include "Engine/Core/Math/Vector3.h" #include "Engine/Core/Collections/Array.h" #include "Engine/Scripting/ScriptingObject.h" #include "Engine/Scripting/SerializableScriptingObject.h" // Test compilation with nested types. API_CLASS() class TestNesting : public SerializableScriptingObject { DECLARE_SCRIPTING_TYPE(TestNesting); API_AUTO_SERIALIZATION(); // Structure API_STRUCT() struct TestAttribute : public ISerializable { DECLARE_SCRIPTING_TYPE_MINIMAL(TestAttribute); API_AUTO_SERIALIZATION(); // Enumeration API_ENUM() enum TestEnum { E1, E2, }; // Enum API_FIELD() TestEnum Enum = E1; }; // Attributes API_FIELD() Array Attributes; // Enum API_FIELD() TestAttribute::TestEnum Enum = TestAttribute::E1; }; // Test compilation with nested types. API_CLASS() class TestNesting2 : public SerializableScriptingObject { DECLARE_SCRIPTING_TYPE(TestNesting2); API_AUTO_SERIALIZATION(); // Structure API_STRUCT() struct TestAttribute { DECLARE_SCRIPTING_TYPE_MINIMAL(TestAttribute); // Enumeration API_ENUM() enum TestEnum { E1, E2, }; }; // Attributes API_FIELD() Array Attributes; // Enum API_FIELD() TestNesting::TestAttribute::TestEnum Enum = TestNesting::TestAttribute::E1; }; // Test structure. API_STRUCT(NoDefault) struct TestStruct : public ISerializable { API_AUTO_SERIALIZATION(); DECLARE_SCRIPTING_TYPE_MINIMAL(TestStruct); // Var API_FIELD() Float3 Vector = Float3::One; // Ref API_FIELD() ScriptingObject* Object = nullptr; friend bool operator==(const TestStruct& lhs, const TestStruct& rhs) { return lhs.Vector == rhs.Vector && lhs.Object == rhs.Object; } }; // Test structure. API_STRUCT(NoDefault) struct TestStructPOD { DECLARE_SCRIPTING_TYPE_MINIMAL(TestStructPOD); // Var API_FIELD() Float3 Vector = Float3::One; }; template<> struct TIsPODType { enum { Value = true }; }; // Test interface. API_INTERFACE() class ITestInterface { DECLARE_SCRIPTING_TYPE_MINIMAL(ITestInterface); ~ITestInterface() = default; // Test abstract method API_FUNCTION() virtual int32 TestInterfaceMethod(const String& str) = 0; }; // Test class. API_CLASS() class TestClassNative : public ScriptingObject, public ISerializable, public ITestInterface { API_AUTO_SERIALIZATION(); DECLARE_SCRIPTING_TYPE(TestClassNative); public: // Test value API_FIELD() int32 SimpleField = 1; // Test struct API_FIELD() TestStruct SimpleStruct; // Test event API_EVENT() Delegate&, Array&> SimpleEvent; // Test virtual method API_FUNCTION() virtual int32 TestMethod(const String& str, API_PARAM(Ref) TestStructPOD& pod, API_PARAM(Ref) TestStruct& nonPod, const Array& struct1, API_PARAM(Ref) Array& struct2, API_PARAM(Out) Array& objects) { if (nonPod.Vector != Float3::One) return -1; nonPod.Object = this; nonPod.Vector = Float3::UnitY; return str.Length(); } int32 TestInterfaceMethod(const String& str) override { return str.Length(); } };