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 }