|
|
@ -7,6 +7,8 @@ using UnityEngine; |
|
|
|
|
|
|
|
|
public class RenderModule : CallbackHandler<RenderModule> |
|
|
public class RenderModule : CallbackHandler<RenderModule> |
|
|
{ |
|
|
{ |
|
|
|
|
|
private const int MaxAliasFrames = 256; // Should match MAXALIASFRAMES
|
|
|
|
|
|
|
|
|
private readonly UniQuake uq; |
|
|
private readonly UniQuake uq; |
|
|
|
|
|
|
|
|
public RenderModule(UniQuake uniQuake) |
|
|
public RenderModule(UniQuake uniQuake) |
|
|
@ -17,42 +19,54 @@ public class RenderModule : CallbackHandler<RenderModule> |
|
|
{ |
|
|
{ |
|
|
target = SelfPtr, |
|
|
target = SelfPtr, |
|
|
|
|
|
|
|
|
ModUploadModel = CreateCallback<ModUploadModelCallback>(Callback_ModUploadModel), |
|
|
|
|
|
|
|
|
UploadAliasModel = CreateCallback<UploadAliasModelCallback>(Callback_UploadAliasModel), |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
RegisterCallbacks(callbacks); |
|
|
RegisterCallbacks(callbacks); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
|
/// This matches struct unity_syscalls_s from uniquake.h in native code.
|
|
|
|
|
|
|
|
|
/// This matches unity_modcalls_t from mod_uniquake.c in native code.
|
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 0)] |
|
|
[StructLayout(LayoutKind.Sequential, Pack = 0)] |
|
|
private class Callbacks |
|
|
private class Callbacks |
|
|
{ |
|
|
{ |
|
|
public IntPtr target; |
|
|
public IntPtr target; |
|
|
|
|
|
|
|
|
public IntPtr ModUploadModel; |
|
|
|
|
|
|
|
|
public IntPtr UploadAliasModel; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
|
|
|
|
|
private delegate void ModUploadModelCallback(IntPtr target, QModel model, QAliasHeader header, IntPtr frames); |
|
|
|
|
|
|
|
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)] |
|
|
|
|
|
private delegate int UploadAliasModelCallback(IntPtr target, [MarshalAs(UnmanagedType.LPStr)] string name, |
|
|
|
|
|
QAliasHeader header, IntPtr frames, [MarshalAs(UnmanagedType.LPArray, SizeConst = MaxAliasFrames)] |
|
|
|
|
|
IntPtr[] poseVerts, IntPtr triangles, IntPtr stVerts); |
|
|
|
|
|
|
|
|
[MonoPInvokeCallback(typeof(ModUploadModelCallback))] |
|
|
|
|
|
private static void Callback_ModUploadModel(IntPtr target, QModel model, QAliasHeader header, IntPtr frames) |
|
|
|
|
|
|
|
|
[MonoPInvokeCallback(typeof(UploadAliasModelCallback))] |
|
|
|
|
|
private static int Callback_UploadAliasModel(IntPtr target, string name, QAliasHeader header, IntPtr frames, IntPtr[] poseVerts, IntPtr triangles, IntPtr stVerts) |
|
|
|
|
|
{ |
|
|
|
|
|
if (header == null) |
|
|
{ |
|
|
{ |
|
|
if (header != null) |
|
|
|
|
|
|
|
|
Debug.LogWarning($"Uploading invalid alias model, name = {name}"); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (frames != IntPtr.Zero) |
|
|
header.frames = frames.ToStructArray<QAliasFrameDesc>(header.numFrames); |
|
|
header.frames = frames.ToStructArray<QAliasFrameDesc>(header.numFrames); |
|
|
|
|
|
|
|
|
GetSelf(target).UploadModel(model, header); |
|
|
|
|
|
|
|
|
var poseVertices = new QTriVertex[header.numFrames][]; |
|
|
|
|
|
for (int i = 0; i < header.numFrames && i < MaxAliasFrames; ++i) |
|
|
|
|
|
{ |
|
|
|
|
|
poseVertices[i] = poseVerts[i].ToStructArray<QTriVertex>(header.numVerts); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void UploadModel(QModel model, QAliasHeader header) |
|
|
|
|
|
{ |
|
|
|
|
|
Debug.Log($"Model '{model?.name}' of type {model?.type}, num frames = {header?.numFrames}"); |
|
|
|
|
|
if (header?.frames != null) |
|
|
|
|
|
{ |
|
|
|
|
|
string str = string.Join(", ", header.frames.Select(f => f.name)); |
|
|
|
|
|
Debug.Log($"Frame list: {str}"); |
|
|
|
|
|
|
|
|
return GetSelf(target).UploadAliasModel(name, header, poseVertices, |
|
|
|
|
|
triangles.ToStructArray<QTriangle>(header.numTriangles), |
|
|
|
|
|
stVerts.ToStructArray<QSTVert>(header.numVerts)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private int UploadAliasModel(string name, QAliasHeader header, QTriVertex[][] poseVertices, QTriangle[] triangles, QSTVert[] stVertices) |
|
|
|
|
|
{ |
|
|
|
|
|
Debug.Log($"Alias model '{name}' with {header.numVerts} vertices, {header.numTriangles} triangles, {header.numFrames} frame(s)"); |
|
|
|
|
|
return 1; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |