Ejemplo n.º 1
0
        /// <summary>
        ///  可在返回数据中添加附加信息,预留字段为FakeStruct[4]
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="instance"></param>
        /// <param name="info"></param>
        /// <returns></returns>
        public DataBuffer Write <T>(object instance, DataInfo info)
        {
            if (info == null)
            {
                if (dataInfo == null)
                {
                    dataInfo = new DataInfo();
                    dataInfo.Analysis(instance.GetType());
                }
            }
            else
            {
                dataInfo = info;
            }
            types = dataInfo.dataTypes;
            DataBuffer db  = new DataBuffer();
            FakeStruct fa  = new FakeStruct(db, 5);//预留一个字段,用于扩展信息
            string     str = instance.ToString();

            fa[0]         = db.AddData(str, DataType.String);
            fa[1]         = WriteObject(str, instance, db);
            fa[2]         = db.AddData(dataInfo.WriteTables(db), DataType.FakeStructArray);
            fa[3]         = DerivedData ? 1 : 0;
            db.fakeStruct = fa;
            objList.Clear();
            return(db);
        }
Ejemplo n.º 2
0
 public static void Save(this Quaternion v, FakeStruct fake, int offset)
 {
     fake.SetFloat(offset, v.x);
     fake.SetFloat(offset + 1, v.y);
     fake.SetFloat(offset + 2, v.z);
     fake.SetFloat(offset + 3, v.w);
 }
Ejemplo n.º 3
0
        int WriteStructList(object value, DataBuffer db, DataTypeInfo info)
        {
            var list = value as IList;

            if (list != null)
            {
                if (list.Count > 0)
                {
                    int    el  = info.ElementLength;
                    int    dl  = info.DataLength;
                    IntPtr ptr = UnsafeOperation.GetObjectAddr(list);
                    ptr = UnsafeOperation.GetListElement(ptr, 0);

                    FakeStructArray fsa = new FakeStructArray(db, el, list.Count);
                    unsafe
                    {
                        FakeStruct fs = new FakeStruct(db, el, fsa.ip);
                        for (int i = 0; i < list.Count; i++)
                        {
                            fs.SetPoint(fsa[i]);
                            WriteStruct(info, ptr, fs);
                            ptr += dl;
                        }
                    }
                    return(db.AddData(fsa, DataType.FakeStructArray));
                }
            }
            return(0);
        }
Ejemplo n.º 4
0
        object ReadObject(string typeName, FakeStruct fake, int dataIndex)
        {
            for (int i = 0; i < objList.Count; i++)
            {
                if (objList[i].index == dataIndex)
                {
                    return(objList[i].instance);
                }
            }
            var dt = dataInfo.FindTypeInfo2(typeName);

            if (dt != null)
            {
                var          obj = dt.Construction();
                ClassContext cc  = new ClassContext();
                cc.instance = obj;
                cc.index    = dataIndex;
                objList.Add(cc);
                IntPtr ptr = UnsafeOperation.GetObjectAddr(obj);
                var    mf  = dt.matchedFields;
                if (mf != null)
                {
                    for (int i = 0; i < mf.Length; i++)
                    {
                        ReadField(fake, 0, mf[i], ptr);
                    }
                }
                return(obj);
            }
            return(null);
        }
Ejemplo n.º 5
0
        object ReadObject(DataTypeInfo dt, FakeStruct fake, int dataIndex)
        {
            for (int i = 0; i < objList.Count; i++)
            {
                if (objList[i].index == dataIndex)
                {
                    return(objList[i].instance);
                }
            }
            var          obj = dt.Construction();
            ClassContext cc  = new ClassContext();

            cc.instance = obj;
            cc.index    = dataIndex;
            objList.Add(cc);
            var mf = dt.matchedFields;

            if (mf != null)
            {
                for (int i = 0; i < mf.Length; i++)
                {
                    ReadField(fake, 0, mf[i], obj);
                }
            }
            return(obj);
        }
Ejemplo n.º 6
0
        /// <summary>
        ///  可在返回数据中添加附加信息,预留字段为FakeStruct[4]
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="instance"></param>
        /// <param name="info"></param>
        /// <returns></returns>
        public DataBuffer Write <T>(object instance, DataInfo info)
        {
#if ENABLE_IL2CPP
            UnityEngine.Debug.LogError("IL2CPP Not supported");
            return(null);
#endif
            if (instance == null)
            {
                return(null);
            }
            if (info == null)
            {
                if (dataInfo == null)
                {
                    dataInfo = new DataInfo();
                    dataInfo.Analysis(instance.GetType());
                }
            }
            else
            {
                dataInfo = info;
            }
            types = dataInfo.dataTypes;
            DataBuffer db  = new DataBuffer();
            FakeStruct fa  = new FakeStruct(db, 5);//预留一个字段,用于扩展信息
            string     str = instance.ToString();
            fa[0]         = db.AddData(str, DataType.String);
            fa[1]         = WriteObject(str, instance, db);
            fa[2]         = db.AddData(dataInfo.WriteTables(db), DataType.FakeStructArray);
            fa[3]         = DerivedData ? 1 : 0;
            db.fakeStruct = fa;
            objList.Clear();
            return(db);
        }
Ejemplo n.º 7
0
 void WriteValue(FakeStruct fake, int offset, DataFieldInfo info, object instance)
 {
     if (info.DBType < 6)
     {
         fake[offset] = Convert.ToInt32(info.field.GetValue(instance));
     }
     else if (info.DBType == DataType2.Float)
     {
         fake.SetFloat(offset, Convert.ToSingle(info.field.GetValue(instance)));
     }
     else if (info.DBType < 8)
     {
         fake.SetInt64(offset, Convert.ToInt64(info.field.GetValue(instance)));
     }
     else if (info.DBType == DataType2.Double)
     {
         fake.SetDouble(offset, Convert.ToDouble(info.field.GetValue(instance)));
     }
     else if (info.DBType == DataType2.Decimal)
     {
         fake.SetDecimal(offset, Convert.ToDecimal(info.field.GetValue(instance)));
     }
     else if (info.DBType == DataType2.Boolean)
     {
         fake[offset] = Convert.ToInt32(info.field.GetValue(instance));
     }
     else if (info.DBType == 12)
     {
         WriteStruct(fake, offset, info, info.field.GetValue(instance));
     }
 }
Ejemplo n.º 8
0
 public static void Save(this Color v, FakeStruct fake, int offset)
 {
     fake.SetFloat(offset, v.r);
     fake.SetFloat(offset + 1, v.g);
     fake.SetFloat(offset + 2, v.b);
     fake.SetFloat(offset + 3, v.a);
 }
Ejemplo n.º 9
0
        public T LoadData <T>(FakeStruct ori) where T : unmanaged
        {
            T t = new T();

            unsafe { LoadData((byte *)&t, ori.ip); }
            return(t);
        }
Ejemplo n.º 10
0
        public void SetOriginModel(FakeStruct fake)
        {
            if (fake == null)
            {
                OriInfos = null;
                indexs   = null;
                return;
            }
            int c = fake.Length;
            int u = c / 3;

            OriInfos = new FakeInfo[u];
            int s  = 1;
            int os = 0;

            for (int i = 0; i < u; i++)
            {
                OriInfos[i].Offset = os;
                OriInfos[i].Size   = fake[s];
                os += fake[s];
                s++;
                OriInfos[i].Type = fake.GetData <string>(s);
                s++;
                OriInfos[i].Name = fake.GetData <string>(s);
                s++;
            }
            Order();
        }
Ejemplo n.º 11
0
        public static FakeStruct CreateTable <T>(DataBuffer buffer) where T : unmanaged
        {
            int c = 0;

            unsafe { c = sizeof(T); }
            Type       type = typeof(T);
            var        fs   = type.GetFields();
            FakeStruct fsa  = new FakeStruct(buffer, fs.Length * 3 + 1);

            fsa.SetData(0, type.Name);
            int s = 1;

            for (int i = 0; i < fs.Length; i++)
            {
                string typ  = fs[i].FieldType.Name;
                string name = fs[i].Name;
                if (fs[i].FieldType.IsEnum)
                {
                    fsa[s] = 4;
                }
                else
                {
                    fsa[s] = Marshal.SizeOf(fs[i].FieldType);
                }
                s++;
                fsa.SetData(s, typ);
                s++;
                fsa.SetData(s, name);
                s++;
            }
            return(fsa);
        }
Ejemplo n.º 12
0
        public static Vector2 LoadVector2(FakeStruct fake, int offset)
        {
            Vector2 v = new Vector2();

            v.x = fake.GetFloat(offset);
            v.y = fake.GetFloat(offset + 1);
            return(v);
        }
        /// <summary>
        /// 克隆一个预制体对象
        /// </summary>
        /// <param name="fake"></param>
        public GameObject Clone(FakeStruct fake)
        {
            long id = fake.GetInt64(0);
            var  go = CreateNew(id);

            types[0].loader.LoadToObject(fake, go.transform);
            return(go);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// 写入结构体的数据
        /// </summary>
        /// <param name="typeIndex"></param>
        /// <param name="instance"></param>
        /// <param name="fake"></param>
        void WriteStruct(DataTypeInfo info, IntPtr ptr, FakeStruct fake)
        {
            var dts = info.dataFeilds;

            for (int i = 0; i < dts.Count; i++)
            {
                WriteField(fake, 0, dts[i], ptr);
            }
        }
Ejemplo n.º 15
0
        void WriteStruct(FakeStruct fake, int start, DataFieldInfo info, IntPtr ptr)
        {
            var dts = info.typeInfo.dataFeilds;

            for (int i = 0; i < dts.Count; i++)
            {
                WriteField(fake, start, dts[i], ptr);
            }
        }
Ejemplo n.º 16
0
        /// <summary>
        /// 写入结构体的数据
        /// </summary>
        /// <param name="typeIndex"></param>
        /// <param name="instance"></param>
        /// <param name="fake"></param>
        void WriteStruct(DataTypeInfo info, object instance, FakeStruct fake)
        {
            var dts = info.dataFeilds;

            for (int i = 0; i < dts.Count; i++)
            {
                WriteField(fake, 0, dts[i], instance);
            }
        }
Ejemplo n.º 17
0
        void WriteStruct(FakeStruct fake, int start, DataFieldInfo info, object instance)
        {
            var dts = info.typeInfo.dataFeilds;

            for (int i = 0; i < dts.Count; i++)
            {
                WriteField(fake, start, dts[i], instance);
            }
        }
Ejemplo n.º 18
0
        public unsafe override void LoadToObject(FakeStruct fake, Component com, Initializer initializer)
        {
            var transfrom = (TransfromData *)fake.ip;
            var buff      = fake.buffer;
            var trans     = com as Transform;

            com.name = buff.GetData(transfrom->name) as string;
            com.tag  = buff.GetData(transfrom->tag) as string;
            trans.localEulerAngles = transfrom->localEulerAngles;
            trans.localPosition    = transfrom->localPosition;
            trans.localScale       = transfrom->localScale;
            trans.gameObject.layer = transfrom->layer;

            Int16[] chi = fake.buffer.GetData(transfrom->child) as Int16[];
            if (chi != null)
            {
                for (int i = 0; i < chi.Length; i++)
                {
                    var fs = buff.GetData(chi[i]) as FakeStruct;
                    if (fs != null)
                    {
                        var go = gameobjectBuffer.CreateNew(fs.GetInt64(0));
                        if (go != null)
                        {
                            go.transform.SetParent(trans);
                            this.LoadToObject(fs, go.transform, initializer);
                        }
                    }
                }
            }

            Int16[] coms = buff.GetData(transfrom->coms) as Int16[];
            if (coms != null)
            {
                for (int i = 0; i < coms.Length; i++)
                {
                    int index = coms[i];
                    i++;
                    int type = coms[i];
                    var fs   = buff.GetData(index) as FakeStruct;
                    if (fs != null)
                    {
                        var loader = gameobjectBuffer.GetDataLoader(type);
                        if (loader != null)
                        {
                            loader.LoadToComponent(fs, com, fake);
                        }
                    }
                }
            }

            if (initializer != null)
            {
                initializer.Initialiezd(fake, trans);
            }
        }
Ejemplo n.º 19
0
        public static Color LoadColor(FakeStruct fake, int offset)
        {
            Color v = new Color();

            v.r = fake.GetFloat(offset);
            v.g = fake.GetFloat(offset + 1);
            v.b = fake.GetFloat(offset + 2);
            v.a = fake.GetFloat(offset + 3);
            return(v);
        }
Ejemplo n.º 20
0
        public static Quaternion LoadQuaternion(FakeStruct fake, int offset)
        {
            Quaternion v = new Quaternion();

            v.x = fake.GetFloat(offset);
            v.y = fake.GetFloat(offset + 1);
            v.z = fake.GetFloat(offset + 2);
            v.w = fake.GetFloat(offset + 3);
            return(v);
        }
Ejemplo n.º 21
0
        public static Vector4 LoadVector4(FakeStruct fake, int offset)
        {
            Vector4 v = new Vector4();

            v.x = fake.GetFloat(offset);
            v.y = fake.GetFloat(offset + 1);
            v.z = fake.GetFloat(offset + 2);
            v.w = fake.GetFloat(offset + 3);
            return(v);
        }
        public override unsafe FakeStruct LoadFromObject(Component com, DataBuffer buffer)
        {
            var trans = com as Transform;

            if (trans == null)
            {
                return(null);
            }
            FakeStruct     fake = new FakeStruct(buffer, TransfromData.ElementSize);
            TransfromData *td   = (TransfromData *)fake.ip;

            td->localEulerAngles = trans.localEulerAngles;
            td->localPosition    = trans.localPosition;
            td->localScale       = trans.localScale;
            td->name             = buffer.AddData(trans.name);
            td->tag = buffer.AddData(trans.tag);
            var coms = com.GetComponents <Component>();

            td->type = gameobjectBuffer.GetTypeID(coms);
            List <Int16> tmp = new List <short>();

            for (int i = 0; i < coms.Length; i++)
            {
                if (!(coms[i] is Transform))
                {
                    Int32 type   = gameobjectBuffer.GetTypeIndex(coms[i]);
                    var   loader = gameobjectBuffer.GetDataLoader(type);
                    if (loader != null)
                    {
                        var fs = loader.LoadFromObject(coms[i], buffer);
                        tmp.Add((Int16)buffer.AddData(fs));
                    }
                    else
                    {
                        tmp.Add(0);
                    }
                    tmp.Add((Int16)type);
                }
            }
            td->coms = buffer.AddData(tmp.ToArray());
            int c = trans.childCount;

            if (c > 0)
            {
                Int16[] buf = new short[c];
                for (int i = 0; i < c; i++)
                {
                    var fs = LoadFromObject(trans.GetChild(i), buffer);
                    buf[i] = (Int16)buffer.AddData(fs);
                }
                td->child = buffer.AddData(buf);
            }
            return(fake);
        }
Ejemplo n.º 23
0
        object ReadArray2(DataFieldInfo info, FakeStruct fake, int offset)
        {
            Int16[] tmp = fake.GetData <Int16[]>(offset);
            if (tmp == null)
            {
                return(null);
            }
            var   buf  = fake.buffer;
            Array arry = info.ArrayConstruction2(tmp.Length) as Array;
            int   a    = info.DBType;

            a &= 0x1f;
            switch (a)
            {
            case DataType2.Class:
            case DataType2.Struct:
                for (int i = 0; i < tmp.Length; i++)
                {
                    var v = buf.GetData(tmp[i]);
                    if (v != null)
                    {
                        var obj = ReadObjectArray(info, buf, v);
                        if (obj != null)
                        {
                            arry.SetValue(obj, i);
                        }
                    }
                }
                break;

            case DataType2.String:
                for (int i = 0; i < tmp.Length; i++)
                {
                    var v = buf.GetData(tmp[i]) as FakeStringArray;
                    if (v != null)
                    {
                        arry.SetValue(v.Data, i);
                    }
                }
                break;

            default:
                for (int i = 0; i < tmp.Length; i++)
                {
                    var v = buf.GetData(tmp[i]);
                    if (v != null)
                    {
                        arry.SetValue(v, i);
                    }
                }
                break;
            }
            return(arry);
        }
Ejemplo n.º 24
0
        void ReadStruct(DataTypeInfo dt, FakeStruct fake, int offset, IntPtr ptr)
        {
            var mf = dt.matchedFields;

            if (mf != null)
            {
                for (int i = 0; i < mf.Length; i++)
                {
                    ReadField(fake, offset, mf[i], ptr);
                }
            }
        }
Ejemplo n.º 25
0
        void WriteArray2(FakeStruct fake, int offset, DataFieldInfo info, IntPtr ptr)
        {
            var    buffer = fake.buffer;
            object value;

            value = UnsafeOperation.GetObject(ptr + info.MemOffset);
            if (value == null)
            {
                return;
            }
            int a = info.DBType & 31;

            switch (a)
            {
            case DataType2.Byte:
                fake[offset] = WriteArray2 <byte>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Int16:
                fake[offset] = WriteArray2 <Int16>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Int32:
                fake[offset] = WriteArray2 <Int32>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Float:
                fake[offset] = WriteArray2 <float>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.String:
                fake[offset] = WriteStringArray2(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Int64:
                fake[offset] = WriteArray2 <Int64>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Double:
                fake[offset] = WriteArray2 <Double>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Class:
                fake[offset] = WriteClassArray2(value, fake.buffer, info);
                break;

            case DataType2.Struct:
                fake[offset] = WriteStructArray2(value, fake.buffer, info);
                break;
            }
        }
Ejemplo n.º 26
0
        void WriteArray2(FakeStruct fake, int offset, DataFieldInfo info, object instance)
        {
            var buffer = fake.buffer;
            var value  = info.field.GetValue(instance);

            if (value == null)
            {
                return;
            }
            int a = info.DBType & 31;

            switch (a)
            {
            case DataType2.Byte:
                fake[offset] = WriteArray2 <byte>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Int16:
                fake[offset] = WriteArray2 <Int16>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Int32:
                fake[offset] = WriteArray2 <Int32>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Float:
                fake[offset] = WriteArray2 <float>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.String:
                fake[offset] = WriteStringArray2(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Int64:
                fake[offset] = WriteArray2 <Int64>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Double:
                fake[offset] = WriteArray2 <Double>(value, buffer, DataType.ByteArray);
                break;

            case DataType2.Class:
                fake[offset] = WriteClassArray2(info.field.GetValue(instance), fake.buffer, info);
                break;

            case DataType2.Struct:
                fake[offset] = WriteStructArray2(info.field.GetValue(instance), fake.buffer, info);
                break;
            }
        }
Ejemplo n.º 27
0
        object ReadStruct(DataTypeInfo dt, FakeStruct fake, int offset)
        {
            var obj = dt.Construction();
            var mf  = dt.matchedFields;

            if (mf != null)
            {
                for (int i = 0; i < mf.Length; i++)
                {
                    ReadField(fake, offset, mf[i], obj);
                }
            }
            return(obj);
        }
Ejemplo n.º 28
0
        object ReadStructToObject(DataTypeInfo dt, FakeStruct fake, int start)
        {
            var    obj = dt.Construction();
            IntPtr ptr = UnsafeOperation.GetObjectAddr(obj);
            var    mf  = dt.matchedFields;

            if (mf != null)
            {
                for (int i = 0; i < mf.Length; i++)
                {
                    ReadField(fake, start, mf[i], ptr);
                }
            }
            return(obj);
        }
Ejemplo n.º 29
0
        /// <summary>
        /// 写入类的数据
        /// </summary>
        /// <param name="typeIndex"></param>
        /// <param name="instance"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        int WriteObject(DataTypeInfo dt, object instance, DataBuffer db)
        {
            if (instance == null)
            {
                return(0);
            }
            for (int i = 0; i < objList.Count; i++)
            {
                if (objList[i].instance == instance)
                {
                    return(objList[i].index);
                }
            }
            int typeIndex = dt.typeIndex;

            if (HaveDerived)
            {
                string fullName = instance.ToString();
                if (fullName != dt.fullName)
                {
                    dt = dataInfo.FindTypeInfo2(fullName);
                }
                if (dt == null)
                {
                    return(0);
                }
                else
                {
                    DerivedData = true;
                    typeIndex   = dt.typeIndex;
                }
            }
            FakeStruct   fake = new FakeStruct(db, types[typeIndex].ElementLength);
            int          r    = db.AddData(fake, DataType.FakeStruct);
            ClassContext cc   = new ClassContext();

            cc.instance = instance;
            cc.index    = typeIndex << 16 | r;
            objList.Add(cc);
            var    dts = dt.dataFeilds;
            IntPtr ptr = UnsafeOperation.GetObjectAddr(instance);

            for (int i = 0; i < dts.Count; i++)
            {
                WriteField(fake, 0, dts[i], ptr);
            }
            return(cc.index);
        }
Ejemplo n.º 30
0
        public GameObject Clone(FakeStruct fake, Initializer initializer)
        {
            if (fake == null)
            {
                return(null);
            }
            long id = fake.GetInt64(0);
            var  go = CreateNew(id);

            types[0].loader.LoadToObject(fake, go.transform, initializer);
            if (initializer != null)
            {
                initializer.Done();
            }
            return(go);
        }