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:
Andrei Gagua
2026-05-24 10:12:31 +03:00
parent 00e4b09e7e
commit f8d436ca75
19 changed files with 876 additions and 16 deletions
+49 -4
View File
@@ -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;
}