using System; using System.Runtime.InteropServices; using AOT; using UnityEngine; public partial class RenderModule: CallbackHandler { private const int MaxAliasFrames = 256; // Should match MAXALIASFRAMES private void BuildCallbacks() { var callbacks = new Callbacks { target = TargetPtr, UploadAliasModel = CreateCallback(Callback_UploadAliasModel), }; RegisterCallbacks(callbacks); } /// /// This matches unity_modcalls_t from mod_uniquake.c in native code. /// [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, QVec3 boundsMin, QVec3 boundsMax, 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, QVec3 boundsMin, QVec3 boundsMax, QAliasHeader header, IntPtr frames, IntPtr[] poseVerts, IntPtr triangles, IntPtr stVerts) { if (header == null) { Debug.LogWarning($"Uploading invalid alias model, name = {name}"); return 0; } if (frames != IntPtr.Zero) header.frames = frames.ToStructArray(header.numFrames); var poseVertices = new QTriVertex[header.numFrames][]; for (int i = 0; i < header.numFrames && i < MaxAliasFrames; ++i) { poseVertices[i] = poseVerts[i].ToStructArray(header.numVerts); } return GetSelf(target).UploadAliasModel( name, boundsMin, boundsMax, header, poseVertices, triangles.ToStructArray(header.numTriangles), stVerts.ToStructArray(header.numVerts)); } }