private static void Configure(UIModel model, int parent, int index, UISchema schema, MemoryBinaryWriter modelWriter, TypeDecomposer decomposer, UIPropertyWriterContext context, List <Type> types, ref long totalSize) { var node = model.nodes[index]; var header = new HeaderConfig { configurationMask = node.mask, schemaIndex = schema.elements.FindIndex((element) => element.identifier == node.identifier), flags = 0, childCount = node.children.Count, parent = parent }; var sizeOffset = modelWriter.Length; var headerOffset = modelWriter.Length + sizeof(int); int size = 0; modelWriter.Write(0); modelWriter.WriteBytes(UnsafeUtility.AddressOf(ref header), UnsafeUtility.SizeOf <HeaderConfig>()); foreach (var child in node.children) { modelWriter.Write(child); } size += UnsafeUtility.SizeOf <HeaderConfig>() + (UnsafeUtility.SizeOf <int>() * node.children.Count); size += ConfigureBlocks(node, modelWriter, decomposer, ref context, types, size, out header.flags); UnsafeUtility.MemCpy((((IntPtr)modelWriter.Data) + sizeOffset).ToPointer(), UnsafeUtility.AddressOf(ref size), UnsafeUtility.SizeOf <int>()); UnsafeUtility.MemCpy((((IntPtr)modelWriter.Data) + headerOffset).ToPointer(), UnsafeUtility.AddressOf(ref header), UnsafeUtility.SizeOf <HeaderConfig>()); totalSize += UnsafeUtility.SizeOf <int>() + size; foreach (var child in node.children) { Configure(model, index, child, schema, modelWriter, decomposer, context, types, ref totalSize); } }
public override void OnInspectorGUI() { if (uiSchemaProperty.objectReferenceValue == null) { if (GUILayout.Button("Create new panel")) { string savePath = EditorUtility.SaveFilePanelInProject( "Save Panel File To ..", defaultName, "asset", "please select a folder and enter the file name"); // get our dialog box and path if (Directory.Exists(Path.GetDirectoryName(savePath))) { UISchema uiSchema = ScriptableObject.CreateInstance <UISchema>(); uiSchema.Panel = PanelSchema.GetDefaults(); if (!File.Exists(savePath)) { AssetDatabase.CreateAsset(uiSchema, savePath); // don't save over existing file } serializedObject.Update(); uiSchemaProperty.objectReferenceValue = uiSchema; serializedObject.ApplyModifiedProperties(); } } } else { base.OnInspectorGUI(); if (Application.isPlaying) { EditorGUILayout.Space(); if (GUILayout.Button("Save Layout")) { string savePath = EditorUtility.SaveFilePanelInProject( "Save Panel File To ..", defaultName, "asset", "please select a folder and enter the file name"); // get our dialog box and path if (Directory.Exists(Path.GetDirectoryName(savePath))) { m_instance.Save(); UISchema uiSchema = (UISchema)uiSchemaProperty.objectReferenceValue; if (!File.Exists(savePath)) { AssetDatabase.CreateAsset(uiSchema, savePath); } serializedObject.Update(); /*uiSchemaProperty.objectReferenceValue = uiSchema; * serializedObject.ApplyModifiedProperties();*/ } } } } }
/// <summary> /// Serializes a UIModel in the following format: /// Total Length: ulong (excluding this field) /// Node Count: int /// For each node present: /// Node Size: int (excluding this field) /// Header Data: HeaderConfig /// Children: int[], total length of children array can be found inside the HeaderConfig. /// ConfigBlocks: Which config blocks are present can be found by querying the configuration mask in the headerconfig /// </summary> public static void Write(this UIModel model, Stream stream, UISchema schema) { Contract.Assert(model.group != null); using var modelWriter = new MemoryBinaryWriter(); modelWriter.Write(0UL); modelWriter.Write(model.nodes.Count); var context = new UIPropertyWriterContext { group = model.group }; var decomposer = new TypeDecomposer(); var types = new List <Type>(); long totalSize = UnsafeUtility.SizeOf <int>(); Configure(model, -1, 0, schema, modelWriter, decomposer, context, types, ref totalSize); /* for (int i = 0; i < model.nodes.Count; i++) { * totalSize += Configure(model.nodes[i], modelWriter, decomposer, context, types) + UnsafeUtility.SizeOf<int>(); * } */ UnsafeUtility.MemCpy(modelWriter.Data, UnsafeUtility.AddressOf(ref totalSize), UnsafeUtility.SizeOf <ulong>()); using var modelStream = new UnmanagedMemoryStream(modelWriter.Data, modelWriter.Length); modelStream.CopyTo(stream); }
protected override void OnCreate() { base.OnCreate(); schema = UIGlobalSettings.GetOrCreateSettings().schema; compiledSchema = this.schema.Compile(Allocator.Persistent); }