New: Add interface-filtered object references
Add native hard and soft reference types for scene objects that implement a scripting interface: - ScriptingObjectInterfaceReference<T> - SoftObjectInterfaceReference<T>
This commit is contained in:
@@ -133,6 +133,14 @@ public:
|
||||
v = ptr;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
FORCE_INLINE void Read(ScriptingObjectInterfaceReference<T>& v)
|
||||
{
|
||||
uint32 id[4];
|
||||
ReadBytes(id, sizeof(id));
|
||||
v = *(Guid*)id;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
FORCE_INLINE void Read(SoftObjectReference<T>& v)
|
||||
{
|
||||
@@ -141,6 +149,14 @@ public:
|
||||
v.Set(*(Guid*)id);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
FORCE_INLINE void Read(SoftObjectInterfaceReference<T>& v)
|
||||
{
|
||||
uint32 id[4];
|
||||
ReadBytes(id, sizeof(id));
|
||||
v.Set(*(Guid*)id);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
FORCE_INLINE void Read(AssetReference<T>& v)
|
||||
{
|
||||
|
||||
@@ -14,8 +14,12 @@ struct VariantType;
|
||||
template<typename T>
|
||||
class ScriptingObjectReference;
|
||||
template<typename T>
|
||||
class ScriptingObjectInterfaceReference;
|
||||
template<typename T>
|
||||
class SoftObjectReference;
|
||||
template<typename T>
|
||||
class SoftObjectInterfaceReference;
|
||||
template<typename T>
|
||||
class AssetReference;
|
||||
template<typename T>
|
||||
class WeakAssetReference;
|
||||
@@ -454,7 +458,6 @@ namespace Serialization
|
||||
}
|
||||
|
||||
FLAXENGINE_API bool ShouldSerializeRef(const SceneObject* v, const SceneObject* other);
|
||||
|
||||
template<typename T>
|
||||
inline typename TEnableIf<TAnd<TIsBaseOf<ScriptingObject, T>, TNot<TIsBaseOf<SceneObject, T>>>::Value, bool>::Type ShouldSerialize(const T* v, const void* otherObj)
|
||||
{
|
||||
@@ -470,7 +473,7 @@ namespace Serialization
|
||||
{
|
||||
Guid id;
|
||||
Deserialize(stream, id, modifier);
|
||||
modifier->IdsMapping.TryGet(id, id);
|
||||
modifier->IdsMapping.TryGet(id, id);
|
||||
v = (T*)::FindObject(id, T::GetStaticClass());
|
||||
}
|
||||
|
||||
@@ -497,7 +500,28 @@ namespace Serialization
|
||||
{
|
||||
Guid id;
|
||||
Deserialize(stream, id, modifier);
|
||||
modifier->IdsMapping.TryGet(id, id);
|
||||
modifier->IdsMapping.TryGet(id, id);
|
||||
v = id;
|
||||
}
|
||||
|
||||
// Scripting Interface Reference
|
||||
|
||||
template<typename T>
|
||||
inline bool ShouldSerialize(const ScriptingObjectInterfaceReference<T>& v, const void* otherObj)
|
||||
{
|
||||
return !otherObj || ShouldSerializeRef(v.GetObject(), ((ScriptingObjectInterfaceReference<T>*)otherObj)->GetObject());
|
||||
}
|
||||
template<typename T>
|
||||
inline void Serialize(ISerializable::SerializeStream& stream, const ScriptingObjectInterfaceReference<T>& v, const void* otherObj)
|
||||
{
|
||||
stream.Guid(v.GetID());
|
||||
}
|
||||
template<typename T>
|
||||
inline void Deserialize(ISerializable::DeserializeStream& stream, ScriptingObjectInterfaceReference<T>& v, ISerializeModifier* modifier)
|
||||
{
|
||||
Guid id;
|
||||
Deserialize(stream, id, modifier);
|
||||
modifier->IdsMapping.TryGet(id, id);
|
||||
v = id;
|
||||
}
|
||||
|
||||
@@ -518,7 +542,28 @@ namespace Serialization
|
||||
{
|
||||
Guid id;
|
||||
Deserialize(stream, id, modifier);
|
||||
modifier->IdsMapping.TryGet(id, id);
|
||||
modifier->IdsMapping.TryGet(id, id);
|
||||
v = id;
|
||||
}
|
||||
|
||||
// Soft Object Interface Reference
|
||||
|
||||
template<typename T>
|
||||
inline bool ShouldSerialize(const SoftObjectInterfaceReference<T>& v, const void* otherObj)
|
||||
{
|
||||
return !otherObj || ShouldSerializeRef(v.GetObject(), ((SoftObjectInterfaceReference<T>*)otherObj)->GetObject());
|
||||
}
|
||||
template<typename T>
|
||||
inline void Serialize(ISerializable::SerializeStream& stream, const SoftObjectInterfaceReference<T>& v, const void* otherObj)
|
||||
{
|
||||
stream.Guid(v.GetID());
|
||||
}
|
||||
template<typename T>
|
||||
inline void Deserialize(ISerializable::DeserializeStream& stream, SoftObjectInterfaceReference<T>& v, ISerializeModifier* modifier)
|
||||
{
|
||||
Guid id;
|
||||
Deserialize(stream, id, modifier);
|
||||
modifier->IdsMapping.TryGet(id, id);
|
||||
v = id;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,8 +17,12 @@ class ScriptingObject;
|
||||
template<typename T>
|
||||
class ScriptingObjectReference;
|
||||
template<typename T>
|
||||
class ScriptingObjectInterfaceReference;
|
||||
template<typename T>
|
||||
class SoftObjectReference;
|
||||
template<typename T>
|
||||
class SoftObjectInterfaceReference;
|
||||
template<typename T>
|
||||
class AssetReference;
|
||||
template<typename T>
|
||||
class WeakAssetReference;
|
||||
|
||||
@@ -156,11 +156,29 @@ public:
|
||||
{
|
||||
Write(v.Get());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
FORCE_INLINE void Write(const ScriptingObjectInterfaceReference<T>& v)
|
||||
{
|
||||
uint32 id[4];
|
||||
v.CopyID(id);
|
||||
WriteBytes(id, sizeof(id));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
FORCE_INLINE void Write(const SoftObjectReference<T>& v)
|
||||
{
|
||||
Write(v.Get());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
FORCE_INLINE void Write(const SoftObjectInterfaceReference<T>& v)
|
||||
{
|
||||
uint32 id[4];
|
||||
v.CopyID(id);
|
||||
WriteBytes(id, sizeof(id));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
FORCE_INLINE void Write(const AssetReference<T>& v)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user