Browse Source

Fixed command-line argument passing, and simplified code to set up callbacks

console
Nico de Poel 5 years ago
parent
commit
0928173a43
  1. 52
      Assets/Scripts/Uniquake.cs

52
Assets/Scripts/Uniquake.cs

@ -9,28 +9,33 @@ public class Uniquake: MonoBehaviour
{ {
private const string DllName = "uniquake.dll"; private const string DllName = "uniquake.dll";
private const int MemSize = 0x4000000; // 64 MB of heap space 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; private QuakeParms quakeParms;
void Start() 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 quakeParms = new QuakeParms
{ {
baseDir = Application.dataPath, baseDir = Application.dataPath,
cacheDir = null, 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), memBase = Marshal.AllocHGlobal(MemSize),
memSize = MemSize, memSize = MemSize,
}; };
@ -45,11 +50,26 @@ public class Uniquake: MonoBehaviour
private void OnDestroy() private void OnDestroy()
{ {
if (quakeParms != null && quakeParms.memBase != IntPtr.Zero)
if (quakeParms != null)
{
if (quakeParms.memBase != IntPtr.Zero)
{ {
Marshal.FreeHGlobal(quakeParms.memBase); Marshal.FreeHGlobal(quakeParms.memBase);
quakeParms.memBase = IntPtr.Zero; 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;
}
}
}
}
} }
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
@ -91,16 +111,16 @@ public class Uniquake: MonoBehaviour
private class UnityCallbacks private class UnityCallbacks
{ {
public delegate void DebugLogCallback([MarshalAs(UnmanagedType.LPStr)] string message); 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 delegate void DebugLogErrorCallback([MarshalAs(UnmanagedType.LPStr)] string message);
public DebugLogErrorCallback DebugLogError;
public DebugLogErrorCallback DebugLogError = Callback_DebugLogError;
public delegate void ApplicationQuitCallback(int exitCode); public delegate void ApplicationQuitCallback(int exitCode);
public ApplicationQuitCallback ApplicationQuit;
public ApplicationQuitCallback ApplicationQuit = Callback_ApplicationQuit;
public delegate double RealtimeSinceStartupCallback(); public delegate double RealtimeSinceStartupCallback();
public RealtimeSinceStartupCallback RealtimeSinceStartup;
public RealtimeSinceStartupCallback RealtimeSinceStartup = Callback_RealtimeSinceStartup;
} }
[StructLayout(LayoutKind.Sequential, Pack = 0)] [StructLayout(LayoutKind.Sequential, Pack = 0)]
@ -114,8 +134,8 @@ public class Uniquake: MonoBehaviour
public int argc; public int argc;
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)]
public string[] argv;
[MarshalAs(UnmanagedType.LPArray, SizeConst = MaxArgs)]
public IntPtr[] argv;
public IntPtr memBase; public IntPtr memBase;

Loading…
Cancel
Save