Browse Source

More code organization; putting QuakeParms in its own file and encapsulating the nitty gritty unmanaged code details, to make things overall more readable.

console
Nico de Poel 5 years ago
parent
commit
b3d419d1ad
  1. 60
      Assets/Scripts/QuakeParms.cs
  2. 3
      Assets/Scripts/QuakeParms.cs.meta
  3. 53
      Assets/Scripts/UniQuake.cs

60
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;
}
}
}
}
}

3
Assets/Scripts/QuakeParms.cs.meta

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 88fe123889034941854842da9720545b
timeCreated: 1617028874

53
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;
}
}
Loading…
Cancel
Save