/// <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); }
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); }
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); }
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); }
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); }
/// <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); }
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)); } }
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); }
public T LoadData <T>(FakeStruct ori) where T : unmanaged { T t = new T(); unsafe { LoadData((byte *)&t, ori.ip); } return(t); }
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(); }
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); }
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); }
/// <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); } }
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); } }
/// <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); } }
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); } }
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); } }
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); }
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); }
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); }
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); }
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); } } }
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; } }
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; } }
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); }
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); }
/// <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); }
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); }