1 module unecht.core.object; 2 3 import std.uuid; 4 5 public import unecht.core.hideFlags; 6 import unecht.core.serialization.serializer; 7 import unecht.core.serialization.mixins; 8 import unecht.meta.uda; 9 version(UEIncludeEditor)import unecht.core.componentManager:IComponentEditor; 10 11 /// 12 static struct UECustomSerializeUUID 13 { 14 import sdlang; 15 16 private static void serialize(ref UUID v, ref UESerializer serializer, Tag parent) 17 { 18 serializer.serializeMember(v.toString(), parent); 19 } 20 21 private static void deserialize(ref UUID v, ref UEDeserializer serializer, Tag parent) 22 { 23 string uuidStr; 24 serializer.deserializeMember(uuidStr, parent); 25 v = UUID(uuidStr); 26 } 27 } 28 29 /// base class for all serializable objects 30 abstract class UEObject 31 { 32 /// 33 this() 34 { 35 //TODO: find out why this is called at compile time (#87) 36 if(!__ctfe) 37 { 38 newInstanceId(); 39 } 40 } 41 42 /// 43 public void hideFlags(HideFlagSet v) { _hideFlags = v; } 44 /// 45 public ref HideFlagSet hideFlags() { return _hideFlags; } 46 /// 47 public UUID instanceId() const { return _instanceId; } 48 /// 49 public void newInstanceId() { _instanceId = randomUUID(); } 50 /// 51 public @property bool hideInHirarchie() const { return _hideFlags.isSet(HideFlags.hideInHirarchie); } 52 53 /// 54 version(UEIncludeEditor)public abstract @property string typename(); 55 /// 56 version(UEIncludeEditor)public abstract IComponentEditor createEditor(); 57 58 /// 59 public void serialize(ref UESerializer serializer) 60 { 61 if(hideFlags.isSet(HideFlags.dontSaveInScene)) 62 return; 63 64 iterateAllSerializables!(UEObject)(this, serializer); 65 } 66 67 /// 68 public void deserialize(ref UEDeserializer serializer, string uid=null) 69 { 70 if(uid != null) 71 _instanceId = UUID(uid); 72 73 iterateAllSerializables!(UEObject)(this, serializer); 74 } 75 76 ///TBD 77 static UEObject instantiate(UEObject obj) 78 { 79 //TODO: 80 return null; 81 } 82 83 private: 84 mixin generateObjectSerializeFunc!(serializeMember, UESerializer, "serialize"); 85 mixin generateObjectSerializeFunc!(deserializeMember, UEDeserializer, "deserialize"); 86 87 void serializeMember(T,M)(string m,ref M member, ref UESerializer serializer, UECustomFuncSerialize!M customFunc=null) 88 { 89 serializer.serializeObjectMember!(T,M)(this, m, member, customFunc); 90 } 91 92 void deserializeMember(T,M)(string m, ref M member, ref UEDeserializer serializer, UECustomFuncDeserialize!M customFunc=null) 93 { 94 string uid = null; 95 96 if(_instanceId != UUID.init) 97 uid = _instanceId.toString(); 98 99 serializer.deserializeObjectMember!(T,M)(this, uid, m, member, customFunc); 100 } 101 102 @Serialize 103 { 104 @CustomSerializer("UECustomSerializeUUID") 105 UUID _instanceId; 106 HideFlagSet _hideFlags; 107 } 108 }