static void GenerateVkStructs(IVkEntityInspector inspector) { if (!Directory.Exists("Structs")) { Directory.CreateDirectory("Structs"); } foreach (var container in inspector.Structs.Values) { using (var interfaceFile = new StreamWriter(Path.Combine("Structs", container.Name + ".cs"), false)) { interfaceFile.WriteLine("using Magnesium;"); interfaceFile.WriteLine("using System;"); interfaceFile.WriteLine("using System.Runtime.InteropServices;"); interfaceFile.WriteLine(""); interfaceFile.WriteLine("namespace Magnesium.Vulkan"); interfaceFile.WriteLine("{"); string tabbedField = "\t"; interfaceFile.WriteLine(tabbedField + "[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]"); interfaceFile.WriteLine(tabbedField + "internal struct {0}", container.Name); interfaceFile.WriteLine(tabbedField + "{"); var methodTabs = tabbedField + "\t"; foreach (var member in container.Members) { interfaceFile.WriteLine(methodTabs + member.GetImplementation()); } interfaceFile.WriteLine(tabbedField + "}"); interfaceFile.WriteLine("}"); } } }
static void GenerateImplementation(VkInterfaceCollection implementation, IVkEntityInspector inspector) { if (!Directory.Exists("Handles")) { Directory.CreateDirectory("Handles"); } foreach (var container in implementation.Interfaces) { VkHandleInfo found; if (inspector.Handles.TryGetValue(container.Name, out found)) { container.Handle = found; } using (var interfaceFile = new StreamWriter(Path.Combine("Handles", container.Name + ".cs"), false)) { interfaceFile.WriteLine("using Magnesium;"); interfaceFile.WriteLine("using System;"); interfaceFile.WriteLine("namespace Magnesium.Vulkan"); interfaceFile.WriteLine("{"); string tabbedField = "\t"; interfaceFile.WriteLine(tabbedField + "public class {0} : {1}", container.Name, container.InterfaceName); interfaceFile.WriteLine(tabbedField + "{"); var methodTabs = tabbedField + "\t"; if (container.Handle != null) { // create internal field interfaceFile.WriteLine(string.Format("{0}internal {1} Handle = {2};", methodTabs, container.Handle.csType, container.Handle.csType == "IntPtr" ? "IntPtr.Zero" : "0L")); // create constructor interfaceFile.WriteLine(string.Format("{0}internal {1}({2} handle)", methodTabs, container.Name, container.Handle.csType)); interfaceFile.WriteLine(methodTabs + "{"); interfaceFile.WriteLine(methodTabs + "\tHandle = handle;"); interfaceFile.WriteLine(methodTabs + "}"); interfaceFile.WriteLine(""); } foreach (var method in container.Methods) { interfaceFile.WriteLine(methodTabs + method.GetImplementation()); interfaceFile.WriteLine(methodTabs + "{"); interfaceFile.WriteLine(methodTabs + "}"); interfaceFile.WriteLine(""); } interfaceFile.WriteLine(tabbedField + "}"); interfaceFile.WriteLine("}"); } } }
public VkCommandParser(IVkEntityInspector inspector) { mInspector = inspector; }