diff --git a/Assets/Scripts/Uniquake.cs b/Assets/Scripts/Uniquake.cs index acc7a83..859e319 100644 --- a/Assets/Scripts/Uniquake.cs +++ b/Assets/Scripts/Uniquake.cs @@ -9,28 +9,33 @@ 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 UnityCallbacks callbacks; + private UnityCallbacks callbacks = new UnityCallbacks(); private QuakeParms quakeParms; void Start() { - callbacks = new UnityCallbacks + string[] arguments = { - DebugLog = Callback_DebugLog, - DebugLogError = Callback_DebugLogError, - ApplicationQuit = Callback_ApplicationQuit, - RealtimeSinceStartup = Callback_RealtimeSinceStartup, + "", + "-window", + "-width", "1440", + "-height", "1080", }; - string[] args = Environment.GetCommandLineArgs(); + 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.dataPath, cacheDir = null, - argc = 0,//args.Length, - argv = null,//args, // TODO: marshaling of string arrays is still tricky + argc = arguments.Length, + argv = argv, memBase = Marshal.AllocHGlobal(MemSize), memSize = MemSize, }; @@ -45,10 +50,25 @@ public class Uniquake: MonoBehaviour private void OnDestroy() { - if (quakeParms != null && quakeParms.memBase != IntPtr.Zero) + if (quakeParms != null) { - Marshal.FreeHGlobal(quakeParms.memBase); - quakeParms.memBase = IntPtr.Zero; + 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; + } + } + } } } @@ -91,16 +111,16 @@ public class Uniquake: MonoBehaviour private class UnityCallbacks { public delegate void DebugLogCallback([MarshalAs(UnmanagedType.LPStr)] string message); - public DebugLogCallback DebugLog; + public DebugLogCallback DebugLog = Callback_DebugLog; public delegate void DebugLogErrorCallback([MarshalAs(UnmanagedType.LPStr)] string message); - public DebugLogErrorCallback DebugLogError; + public DebugLogErrorCallback DebugLogError = Callback_DebugLogError; public delegate void ApplicationQuitCallback(int exitCode); - public ApplicationQuitCallback ApplicationQuit; + public ApplicationQuitCallback ApplicationQuit = Callback_ApplicationQuit; public delegate double RealtimeSinceStartupCallback(); - public RealtimeSinceStartupCallback RealtimeSinceStartup; + public RealtimeSinceStartupCallback RealtimeSinceStartup = Callback_RealtimeSinceStartup; } [StructLayout(LayoutKind.Sequential, Pack = 0)] @@ -114,8 +134,8 @@ public class Uniquake: MonoBehaviour public int argc; - [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] - public string[] argv; + [MarshalAs(UnmanagedType.LPArray, SizeConst = MaxArgs)] + public IntPtr[] argv; public IntPtr memBase;