|
|
|
@ -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; |
|
|
|
|
|
|
|
|