private static void WriteEnum(Type type, string s, IntPtr ptr, TypeDecomposer.FieldData fieldData, MemoryBinaryWriter extraBytesStream, long extraByteStreamOffset, UIPropertyWriterContext context) { var parser = typeof(UIPropertyWriterFactory).GetMethod(nameof(TryParseEnum), BindingFlags.Static | BindingFlags.Public).MakeGenericMethod(type).CreateDelegate(typeof(UIPropertyParser <>).MakeGenericType(type)); var writer = Activator.CreateInstance(typeof(UIPropertyWriter <>).MakeGenericType(type), parser) as IUIPropertyWriter; writer.Write(s, ptr, fieldData, extraBytesStream, extraByteStreamOffset, context); }
public unsafe void Write(string s, IntPtr ptr, TypeDecomposer.FieldData fieldData, MemoryBinaryWriter extraBytesStream, long extraByteStreamOffset, UIPropertyWriterContext context) { if (parser.Invoke(s, out TValue result)) { UnsafeUtility.CopyStructureToPtr(ref result, (ptr + fieldData.offset).ToPointer()); } }
private unsafe static void WriteFunctionPointer <TDelegate>(IntPtr ptr, TypeDecomposer.FieldData fieldData, MethodInfo method) where TDelegate : Delegate { var func = (TDelegate)method.CreateDelegate(typeof(TDelegate)); var compiled = BurstCompiler.CompileFunctionPointer <TDelegate>(func); UnsafeUtility.CopyStructureToPtr(ref compiled, (ptr + fieldData.offset).ToPointer()); }
public unsafe void Write(string s, IntPtr ptr, TypeDecomposer.FieldData fieldData, MemoryBinaryWriter extraBytesStream, long extraByteStreamOffset, UIPropertyWriterContext context) { if (context.group != null && context.group.TryGetUVs(s, out Rect uvs)) { var uvData = new UVData { value = new float4(uvs.x, uvs.y, uvs.width, uvs.height) }; UnsafeUtility.CopyStructureToPtr(ref uvData, (ptr + fieldData.offset).ToPointer()); } }
private static void WriteFunctionPointerTypeless(string s, IntPtr ptr, TypeDecomposer.FieldData fieldData, MemoryBinaryWriter extraBytesStream, long extraByteStreamOffset, UIPropertyWriterContext context) { var delegateType = fieldData.type.GenericTypeArguments[0]; var separatorIndex = s.IndexOf('#'); var containerName = s.Substring(0, separatorIndex); var methodName = s.Substring(separatorIndex + 1); var method = FindMethodInfo(containerName, methodName, delegateType); if (method != null) { typeof(UIPropertyWriterFactory).GetMethod(nameof(WriteFunctionPointer), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(delegateType).Invoke(null, new object[] { ptr, fieldData, method }); } }
public unsafe void Write(string s, IntPtr ptr, TypeDecomposer.FieldData fieldData, MemoryBinaryWriter extraBytesStream, long extraByteStreamOffset, UIPropertyWriterContext context) { var current = extraBytesStream.Length; var bytes = Encoding.Unicode.GetBytes(s); extraBytesStream.Write(bytes); var str = new LocalizedStringPtr { offset = current + extraByteStreamOffset, length = (extraBytesStream.Length - current) / 2 }; UnsafeUtility.CopyStructureToPtr(ref str, (ptr + fieldData.offset).ToPointer()); }
private static unsafe void WriteComposite(this IUIPropertyWriter targetWriter, Type type, string s, IntPtr ptr, TypeDecomposer.FieldData fieldData, MemoryBinaryWriter extraBytesStream, long extraByteStreamOffset, UIPropertyWriterContext context) { var elements = s.Split(' ').Where(x => targetWriter.CanParse(x)).Take(4).ToArray(); switch (elements.Length) { case 0: return; case 1: targetWriter.DoCompositeWrite(type, ptr, fieldData, elements[0], elements[0], elements[0], elements[0], extraBytesStream, extraByteStreamOffset, context); return; case 2: targetWriter.DoCompositeWrite(type, ptr, fieldData, elements[0], elements[1], elements[0], elements[1], extraBytesStream, extraByteStreamOffset, context); return; case 3: targetWriter.DoCompositeWrite(type, ptr, fieldData, elements[0], elements[1], elements[1], elements[2], extraBytesStream, extraByteStreamOffset, context); return; default: targetWriter.DoCompositeWrite(type, ptr, fieldData, elements[0], elements[1], elements[2], elements[3], extraBytesStream, extraByteStreamOffset, context); return; } }
private static void DoCompositeWrite(this IUIPropertyWriter targetWriter, Type type, IntPtr ptr, TypeDecomposer.FieldData fieldData, string sx, string sy, string sz, string sw, MemoryBinaryWriter extraBytesStream, long extraByteStreamOffset, UIPropertyWriterContext context) { var size = UnsafeUtility.SizeOf(type); targetWriter.Write(sx, ptr, new TypeDecomposer.FieldData { offset = fieldData.offset, length = size, type = type, isAssetReference = false }, extraBytesStream, extraByteStreamOffset, context); targetWriter.Write(sy, ptr, new TypeDecomposer.FieldData { offset = fieldData.offset + size, length = size, type = type, isAssetReference = false }, extraBytesStream, extraByteStreamOffset, context); targetWriter.Write(sz, ptr, new TypeDecomposer.FieldData { offset = fieldData.offset + (size * 2), length = size, type = type, isAssetReference = false }, extraBytesStream, extraByteStreamOffset, context); targetWriter.Write(sw, ptr, new TypeDecomposer.FieldData { offset = fieldData.offset + (size * 3), length = size, type = type, isAssetReference = false }, extraBytesStream, extraByteStreamOffset, context); }
public static void Write(this Dictionary <Type, IUIPropertyWriter> writers, string s, IntPtr ptr, TypeDecomposer.FieldData fieldData, MemoryBinaryWriter extraBytesStream, long extraByteStreamOffset, UIPropertyWriterContext context) { if (typeof(ICompositeData).IsAssignableFrom(fieldData.type)) { var target = fieldData.type.GenericTypeArguments[0]; if (UnsafeUtility.SizeOf(target) * 4 == UnsafeUtility.SizeOf(fieldData.type)) { writers.FirstOrDefault(x => x.Key.IsAssignableFrom(target)).Value?.WriteComposite(target, s, ptr, fieldData, extraBytesStream, extraByteStreamOffset, context); } } else if (fieldData.type.IsEnum) { WriteEnum(fieldData.type, s, ptr, fieldData, extraBytesStream, extraByteStreamOffset, context); } else if (fieldData.type.IsConstructedGenericType && typeof(FunctionPointer <>).IsAssignableFrom(fieldData.type.GetGenericTypeDefinition())) { WriteFunctionPointerTypeless(s, ptr, fieldData, extraBytesStream, extraByteStreamOffset, context); } else { writers.FirstOrDefault(x => x.Key.IsAssignableFrom(fieldData.type)).Value?.Write(s, ptr, fieldData, extraBytesStream, extraByteStreamOffset, context); } }