diff --git a/Assets/Scripts/QuakeParms.cs b/Assets/Scripts/QuakeParms.cs new file mode 100644 index 0000000..c492c07 --- /dev/null +++ b/Assets/Scripts/QuakeParms.cs @@ -0,0 +1,60 @@ +using System; +using System.Runtime.InteropServices; + +[StructLayout(LayoutKind.Sequential, Pack = 0)] +public class QuakeParms +{ + private const int MaxArgs = 50; // Corresponds with MAX_NUM_ARGVS in engine + + [MarshalAs(UnmanagedType.LPStr)] + public string baseDir; + + [MarshalAs(UnmanagedType.LPStr)] + public string cacheDir; + + public int argc; + + [MarshalAs(UnmanagedType.LPArray, SizeConst = MaxArgs)] + public IntPtr[] argv; + + public IntPtr memBase; + + public int memSize; + + public void SetArguments(string[] arguments) + { + argc = arguments.Length; + argv = new IntPtr[MaxArgs]; + for (int i = 0; i < arguments.Length && i < MaxArgs; ++i) + { + argv[i] = Marshal.StringToHGlobalAnsi(arguments[i]); + } + } + + public void AllocateMemory(int memorySize) + { + memSize = memorySize; + memBase = Marshal.AllocHGlobal(memorySize); + } + + public void Destroy() + { + if (memBase != IntPtr.Zero) + { + Marshal.FreeHGlobal(memBase); + memBase = IntPtr.Zero; + } + + if (argv != null) + { + for (int i = 0; i < argv.Length; ++i) + { + if (argv[i] != IntPtr.Zero) + { + Marshal.FreeHGlobal(argv[i]); + argv[i] = IntPtr.Zero; + } + } + } + } +} diff --git a/Assets/Scripts/QuakeParms.cs.meta b/Assets/Scripts/QuakeParms.cs.meta new file mode 100644 index 0000000..7d6f27b --- /dev/null +++ b/Assets/Scripts/QuakeParms.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 88fe123889034941854842da9720545b +timeCreated: 1617028874 \ No newline at end of file diff --git a/Assets/Scripts/UniQuake.cs b/Assets/Scripts/UniQuake.cs index 46b21cd..fb6ba8d 100644 --- a/Assets/Scripts/UniQuake.cs +++ b/Assets/Scripts/UniQuake.cs @@ -1,6 +1,4 @@ using System; -using System.Collections; -using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; @@ -8,7 +6,6 @@ public class UniQuake: MonoBehaviour { private const string DllName = "uniquake.dll"; private const int MemSize = 0x4000000; // 64 MB of heap space - private const int MaxArgs = 50; // Corresponds with MAX_NUM_ARGVS in engine private QuakeParms quakeParms; private SysCalls sysCalls; @@ -23,21 +20,13 @@ public class UniQuake: MonoBehaviour "-height", "1080", }; - IntPtr[] argv = new IntPtr[MaxArgs]; - for (int i = 0; i < arguments.Length && i < MaxArgs; ++i) - { - argv[i] = Marshal.StringToHGlobalAnsi(arguments[i]); - } - quakeParms = new QuakeParms { baseDir = Application.persistentDataPath, cacheDir = null, - argc = arguments.Length, - argv = argv, - memBase = Marshal.AllocHGlobal(MemSize), - memSize = MemSize, }; + quakeParms.SetArguments(arguments); + quakeParms.AllocateMemory(MemSize); sysCalls = new SysCalls(this); @@ -55,23 +44,8 @@ public class UniQuake: MonoBehaviour if (quakeParms != null) { - if (quakeParms.memBase != IntPtr.Zero) - { - Marshal.FreeHGlobal(quakeParms.memBase); - quakeParms.memBase = IntPtr.Zero; - } - - if (quakeParms.argv != null) - { - for (int i = 0; i < quakeParms.argv.Length; ++i) - { - if (quakeParms.argv[i] != IntPtr.Zero) - { - Marshal.FreeHGlobal(quakeParms.argv[i]); - quakeParms.argv[i] = IntPtr.Zero; - } - } - } + quakeParms.Destroy(); + quakeParms = null; } } @@ -80,23 +54,4 @@ public class UniQuake: MonoBehaviour [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] private static extern void UniQuake_Update(float deltaTime); - - [StructLayout(LayoutKind.Sequential, Pack = 0)] - private class QuakeParms - { - [MarshalAs(UnmanagedType.LPStr)] - public string baseDir; - - [MarshalAs(UnmanagedType.LPStr)] - public string cacheDir; - - public int argc; - - [MarshalAs(UnmanagedType.LPArray, SizeConst = MaxArgs)] - public IntPtr[] argv; - - public IntPtr memBase; - - public int memSize; - } }