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 }