You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.2 KiB
66 lines
2.2 KiB
using System;
|
|
using System.Runtime.InteropServices;
|
|
using AOT;
|
|
using UnityEngine;
|
|
|
|
public partial class RenderModule: CallbackHandler<RenderModule>
|
|
{
|
|
private const int MaxAliasFrames = 256; // Should match MAXALIASFRAMES
|
|
|
|
private void BuildCallbacks()
|
|
{
|
|
var callbacks = new Callbacks
|
|
{
|
|
target = TargetPtr,
|
|
|
|
UploadAliasModel = CreateCallback<UploadAliasModelCallback>(Callback_UploadAliasModel),
|
|
};
|
|
|
|
RegisterCallbacks(callbacks);
|
|
}
|
|
|
|
/// <summary>
|
|
/// This matches unity_modcalls_t from mod_uniquake.c in native code.
|
|
/// </summary>
|
|
[StructLayout(LayoutKind.Sequential, Pack = 0)]
|
|
private class Callbacks
|
|
{
|
|
public IntPtr target;
|
|
|
|
public IntPtr UploadAliasModel;
|
|
}
|
|
|
|
[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(UploadAliasModelCallback))]
|
|
private static int Callback_UploadAliasModel(IntPtr target,
|
|
string name, QAliasHeader header, IntPtr frames,
|
|
IntPtr[] poseVerts, IntPtr triangles, IntPtr stVerts)
|
|
{
|
|
if (header == null)
|
|
{
|
|
Debug.LogWarning($"Uploading invalid alias model, name = {name}");
|
|
return 0;
|
|
}
|
|
|
|
if (header.numFrames > MaxAliasFrames)
|
|
header.numFrames = MaxAliasFrames;
|
|
|
|
if (frames != IntPtr.Zero)
|
|
header.frames = frames.ToStructArray<QAliasFrameDesc>(header.numFrames);
|
|
|
|
var poseVertices = new QTriVertex[header.numFrames][];
|
|
for (int i = 0; i < header.numFrames; ++i)
|
|
{
|
|
poseVertices[i] = poseVerts[i].ToStructArray<QTriVertex>(header.numVerts);
|
|
}
|
|
|
|
return GetSelf(target).UploadAliasModel(
|
|
name, header, poseVertices,
|
|
triangles.ToStructArray<QTriangle>(header.numTriangles),
|
|
stVerts.ToStructArray<QSTVert>(header.numVerts));
|
|
}
|
|
}
|