Browse Source
Split off native interop code for the main UniQuake class into a separate partial class file as well
console
Split off native interop code for the main UniQuake class into a separate partial class file as well
console
3 changed files with 87 additions and 78 deletions
-
78Assets/Scripts/UniQuake.Interop.cs
-
3Assets/Scripts/UniQuake.Interop.cs.meta
-
82Assets/Scripts/UniQuake.cs
@ -0,0 +1,78 @@ |
|||
using System; |
|||
using System.IO; |
|||
using System.Runtime.InteropServices; |
|||
using UnityEngine; |
|||
|
|||
public partial class UniQuake |
|||
{ |
|||
#if UNITY_EDITOR
|
|||
private const string DllPath = "Plugins/windows/x86_64/uniquake.dll"; |
|||
#elif UNITY_STANDALONE_WIN
|
|||
#if UNITY_64
|
|||
private const string DllPath = "Plugins/x86_64/uniquake.dll"; |
|||
#else
|
|||
private const string DllPath = "Plugins/x86/uniquake.dll"; |
|||
#endif
|
|||
#endif
|
|||
|
|||
private IntPtr libraryHandle; |
|||
|
|||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
|||
private delegate void UniQuake_InitFunc(IntPtr parms, IntPtr sysCalls, IntPtr glCalls); |
|||
private UniQuake_InitFunc UniQuake_Init; |
|||
|
|||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
|||
private delegate void UniQuake_UpdateFunc(float deltaTime); |
|||
private UniQuake_UpdateFunc UniQuake_Update; |
|||
|
|||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
|||
private delegate void UniQuake_ShutdownFunc(); |
|||
private UniQuake_ShutdownFunc UniQuake_Shutdown; |
|||
|
|||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
|||
private delegate void UniQuake_SetFmodSystemFunc(IntPtr fmodSystem); |
|||
private UniQuake_SetFmodSystemFunc UniQuake_SetFmodSystem; |
|||
|
|||
private void LoadLibrary() |
|||
{ |
|||
string dllFile = Path.Combine(Application.dataPath, DllPath); |
|||
|
|||
// Experimental code to allow running multiple instances of Quake next to each other
|
|||
// string dllName = Path.GetFileNameWithoutExtension(dllFile);
|
|||
// string dllExt = Path.GetExtension(dllFile);
|
|||
// string dllCopy = Path.Combine(Application.persistentDataPath, $"{dllName}{GetInstanceID()}{dllExt}");
|
|||
// File.Copy(dllFile, dllCopy, true);
|
|||
// dllFile = dllCopy;
|
|||
|
|||
libraryHandle = SystemLibrary.LoadLibrary(dllFile); |
|||
if (libraryHandle == IntPtr.Zero) |
|||
{ |
|||
throw new DllNotFoundException($"Failed to load UniQuake library from path: {dllFile}, last error = {Marshal.GetLastWin32Error()}"); |
|||
} |
|||
|
|||
UniQuake_Init = LoadLibraryFunction<UniQuake_InitFunc>("UniQuake_Init"); |
|||
UniQuake_Update = LoadLibraryFunction<UniQuake_UpdateFunc>("UniQuake_Update"); |
|||
UniQuake_Shutdown = LoadLibraryFunction<UniQuake_ShutdownFunc>("UniQuake_Shutdown"); |
|||
UniQuake_SetFmodSystem = LoadLibraryFunction<UniQuake_SetFmodSystemFunc>("UniQuake_SetFmodSystem"); |
|||
} |
|||
|
|||
private TDelegate LoadLibraryFunction<TDelegate>(string functionName) |
|||
{ |
|||
IntPtr procAddress = SystemLibrary.GetProcAddress(libraryHandle, functionName); |
|||
if (procAddress == IntPtr.Zero) |
|||
{ |
|||
throw new DllNotFoundException($"Could not find library function: {functionName}"); |
|||
} |
|||
|
|||
return Marshal.GetDelegateForFunctionPointer<TDelegate>(procAddress); |
|||
} |
|||
|
|||
private void FreeLibrary() |
|||
{ |
|||
if (libraryHandle != IntPtr.Zero) |
|||
{ |
|||
SystemLibrary.FreeLibrary(libraryHandle); |
|||
libraryHandle = IntPtr.Zero; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
fileFormatVersion: 2 |
|||
guid: a22391b0c55941c6b4c6fb0f8510d88e |
|||
timeCreated: 1618223248 |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue