5 using System.Collections.Generic;
6 using System.Runtime.InteropServices;
38 Transform = meshFilter.transform.localToWorldMatrix;
39 Verts = meshFilter.sharedMesh.vertices;
40 Normals = meshFilter.sharedMesh.normals;
41 Indices = meshFilter.sharedMesh.triangles;
44 public void CopyFrom(MeshFilter meshFilter,
int meshID = 0,
int lastUpdateID = 0)
47 LastUpdateID = lastUpdateID;
49 if (meshFilter != null)
51 Transform = meshFilter.transform.localToWorldMatrix;
55 Verts = meshFilter.sharedMesh.vertices;
56 Normals = meshFilter.sharedMesh.normals;
57 Indices = meshFilter.sharedMesh.triangles;
64 private List<GCHandle> reusedPinnedMemoryHandles =
new List<GCHandle>();
67 private IntPtr reusedRaycastResultPtr;
70 private IntPtr reusedPlayspaceStatsPtr;
73 private IntPtr reusedPlayspaceAlignmentPtr;
76 private IntPtr reusedObjectPlacementResultPtr;
85 GCHandle h = GCHandle.Alloc(obj, GCHandleType.Pinned);
86 reusedPinnedMemoryHandles.Add(h);
87 return h.AddrOfPinnedObject();
96 byte[] obj =
System.Text.Encoding.ASCII.GetBytes(str);
97 GCHandle h = GCHandle.Alloc(obj, GCHandleType.Pinned);
98 reusedPinnedMemoryHandles.Add(h);
99 return h.AddrOfPinnedObject();
107 for (
int i = 0; i < reusedPinnedMemoryHandles.Count; ++i)
109 reusedPinnedMemoryHandles[i].Free();
111 reusedPinnedMemoryHandles.Clear();
123 if (reusedMeshesForMarshalling == null || reusedMeshesForMarshalling.Length < meshes.Count)
128 for (
int i = 0; i < meshes.Count; ++i)
130 IntPtr pinnedVerts = (meshes[i].Verts != null) && (meshes[i].Verts.Length > 0) ? PinObject(meshes[i].Verts) : IntPtr.Zero;
131 IntPtr pinnedNormals = (meshes[i].Verts != null) && (meshes[i].Verts.Length > 0) ? PinObject(meshes[i].Normals) : IntPtr.Zero;
132 IntPtr pinnedIndices = (meshes[i].Indices != null) && (meshes[i].Indices.Length > 0) ? PinObject(meshes[i].Indices) : IntPtr.Zero;
135 meshID = meshes[i].MeshID,
136 lastUpdateID = meshes[i].LastUpdateID,
137 transform = meshes[i].Transform,
138 vertCount = (meshes[i].Verts != null) ? meshes[i].Verts.Length : 0,
139 indexCount = (meshes[i].Indices != null) ? meshes[i].Indices.Length : 0,
141 normals = pinnedNormals,
142 indices = pinnedIndices,
146 return PinObject(reusedMeshesForMarshalling);
155 if (reusedRaycastResultPtr == IntPtr.Zero)
157 GCHandle h = GCHandle.Alloc(reusedRaycastResult, GCHandleType.Pinned);
158 reusedRaycastResultPtr = h.AddrOfPinnedObject();
160 return reusedRaycastResultPtr;
168 return reusedRaycastResult;
177 if (reusedPlayspaceStatsPtr == IntPtr.Zero)
179 GCHandle h = GCHandle.Alloc(reusedPlayspaceStats, GCHandleType.Pinned);
180 reusedPlayspaceStatsPtr = h.AddrOfPinnedObject();
182 return reusedPlayspaceStatsPtr;
190 return reusedPlayspaceStats;
199 if (reusedPlayspaceAlignmentPtr == IntPtr.Zero)
201 GCHandle h = GCHandle.Alloc(reusedPlayspaceAlignment, GCHandleType.Pinned);
202 reusedPlayspaceAlignmentPtr = h.AddrOfPinnedObject();
204 return reusedPlayspaceAlignmentPtr;
212 return reusedPlayspaceAlignment;
221 if (reusedObjectPlacementResultPtr == IntPtr.Zero)
223 GCHandle h = GCHandle.Alloc(reusedObjectPlacementResult, GCHandleType.Pinned);
224 reusedObjectPlacementResultPtr = h.AddrOfPinnedObject();
226 return reusedObjectPlacementResultPtr;
234 return reusedObjectPlacementResult;
241 public T[] MarshalArrayFromIntPtr<T>(IntPtr outArray,
int count)
243 T[] resultArray =
new T[count];
246 #if UNITY_EDITOR || !UNITY_WSA 247 Marshal.SizeOf(typeof(T));
252 IntPtr current = outArray;
256 for (
int i = 0; i < count; i++)
259 #if UNITY_EDITOR || !UNITY_WSA 260 (T)Marshal.PtrToStructure(current, typeof(T));
262 Marshal.PtrToStructure<T>(current);
265 current = (IntPtr)((
long)current + structSize);
270 Marshal.FreeCoTaskMem(outArray);
281 [StructLayout(LayoutKind.Sequential, Pack = 1)]
296 [StructLayout(LayoutKind.Sequential, Pack = 1)]
325 [StructLayout(LayoutKind.Sequential, Pack = 1)]
339 [StructLayout(LayoutKind.Sequential, Pack = 1)]
365 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
366 public static extern int SpatialUnderstanding_Init();
370 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
371 public static extern void SpatialUnderstanding_Term();
387 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
388 public static extern void GeneratePlayspace_InitScan(
389 [In]
float camPos_X, [In]
float camPos_Y, [In]
float camPos_Z,
390 [In]
float camFwd_X, [In]
float camFwd_Y, [In]
float camFwd_Z,
391 [In]
float camUp_X, [In]
float camUp_Y, [In]
float camUp_Z,
392 [In]
float searchDst, [In]
float optimalSize);
410 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
411 public static extern int GeneratePlayspace_UpdateScan(
412 [In]
int meshCount, [In] IntPtr meshes,
413 [In]
float camPos_X, [In]
float camPos_Y, [In]
float camPos_Z,
414 [In]
float camFwd_X, [In]
float camFwd_Y, [In]
float camFwd_Z,
415 [In]
float camUp_X, [In]
float camUp_Y, [In]
float camUp_Z,
416 [In]
float deltaTime);
423 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
424 public static extern void GeneratePlayspace_RequestFinish();
435 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
436 public static extern int GeneratePlayspace_ExtractMesh_Setup(
437 [Out] out
int vertexCount,
438 [Out] out
int indexCount);
450 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
451 public static extern int GeneratePlayspace_ExtractMesh_Extract(
452 [In]
int bufferVertexCount,
453 [In] IntPtr verticesPos,
454 [In] IntPtr verticesNormal,
455 [In]
int bufferIndexCount,
456 [In] IntPtr indices);
463 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
464 public static extern int QueryPlayspaceStats(
465 [In] IntPtr playspaceStats);
472 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
473 public static extern int QueryPlayspaceAlignment(
474 [In] IntPtr playspaceAlignment);
488 [DllImport(
"SpatialUnderstanding", CallingConvention = CallingConvention.Cdecl)]
489 public static extern int PlayspaceRaycast(
490 [In]
float rayPos_X, [In]
float rayPos_Y, [In]
float rayPos_Z,
491 [In]
float rayVec_X, [In]
float rayVec_Y, [In]
float rayVec_Z,