diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.h b/Source/Engine/Scripting/ManagedCLR/MUtils.h index 793d946ed..c257c4bb2 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.h +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.h @@ -257,6 +257,38 @@ struct MConverter::Val } }; +// Converter for ScriptingObject References. +template +class ScriptingObjectReference; + +template +struct MConverter> +{ + MonoObject* Box(const ScriptingObjectReference& data, MonoClass* klass) + { + return data.GetManagedInstance(); + } + + void Unbox(ScriptingObjectReference& result, MonoObject* data) + { + result = (T*)ScriptingObject::ToNative(data); + } + + void ToManagedArray(MonoArray* result, const Span>& data) + { + for (int32 i = 0; i < data.Length(); i++) + mono_array_setref(result, i, data[i].GetManagedInstance()); + } + + template + void ToNativeArray(Array, AllocationType>& result, MonoArray* data, int32 length) + { + result.Resize(length); + for (int32 i = 0; i < length; i++) + result[i] = (T*)ScriptingObject::ToNative(mono_array_get(data, MonoObject*, i)); + } +}; + // Converter for Asset References. template class AssetReference; diff --git a/Source/Engine/Serialization/ReadStream.h b/Source/Engine/Serialization/ReadStream.h index abbb5f97d..1e5291a9b 100644 --- a/Source/Engine/Serialization/ReadStream.h +++ b/Source/Engine/Serialization/ReadStream.h @@ -5,10 +5,6 @@ #include "Stream.h" #include "Engine/Core/Templates.h" -struct CommonValue; -struct Variant; -struct VariantType; -class ISerializable; extern FLAXENGINE_API class ScriptingObject* FindObject(const Guid& id, class MClass* type); /// @@ -156,6 +152,14 @@ public: data = (T*)::FindObject(*(Guid*)id, T::GetStaticClass()); } + template + FORCE_INLINE void Read(ScriptingObjectReference& v) + { + T* ptr; + Read(ptr); + v = ptr; + } + /// /// Read data array /// diff --git a/Source/Engine/Serialization/Stream.h b/Source/Engine/Serialization/Stream.h index 6dbc8b3ec..ee9660893 100644 --- a/Source/Engine/Serialization/Stream.h +++ b/Source/Engine/Serialization/Stream.h @@ -8,9 +8,15 @@ #define FILESTREAM_BUFFER_SIZE 4096 #define STREAM_MAX_STRING_LENGTH (4*1024) // 4 kB -// Forward declarations class ReadStream; class WriteStream; +struct CommonValue; +struct Variant; +struct VariantType; +class ISerializable; +class ScriptingObject; +template +class ScriptingObjectReference; /// /// Base class for all data streams (memory streams, file streams etc.) diff --git a/Source/Engine/Serialization/WriteStream.h b/Source/Engine/Serialization/WriteStream.h index d32d1f8ab..cab7b21a8 100644 --- a/Source/Engine/Serialization/WriteStream.h +++ b/Source/Engine/Serialization/WriteStream.h @@ -5,12 +5,6 @@ #include "Stream.h" #include "Engine/Core/Templates.h" -struct CommonValue; -struct Variant; -struct VariantType; -class ISerializable; -class ScriptingObject; - /// /// Base class for all data write streams /// @@ -177,6 +171,12 @@ public: WriteBytes(id, sizeof(id)); } + template + FORCE_INLINE void Write(const ScriptingObjectReference& v) + { + Write(v.Get()); + } + template void Write(const Array& data) {