5 using System.Collections.Generic;
6 using System.Runtime.InteropServices;
11 [StructLayout(LayoutKind.Sequential)]
19 [StructLayout(LayoutKind.Sequential)]
31 Plane =
new Plane(xform.forward, xform.position);
34 Center = xform.position,
35 Extents = xform.localScale / 2,
36 Rotation = xform.rotation
65 Transform = meshFilter.transform.localToWorldMatrix;
66 Verts = meshFilter.sharedMesh.vertices;
67 Normals = meshFilter.sharedMesh.normals;
68 Indices = meshFilter.sharedMesh.triangles;
95 IntPtr pinnedMeshData = PinMeshDataForMarshalling(meshes);
96 DLLImports.FindSubPlanes(meshes.Count, pinnedMeshData, snapToGravityThreshold, out planeCount, out planesPtr);
97 return MarshalBoundedPlanesFromIntPtr(planesPtr, planeCount);
101 FinishPlaneFinding();
133 DLLImports.MergeSubPlanes(subPlanes.Length, PinObject(subPlanes), minArea, snapToGravityThreshold, out planeCount, out planesPtr);
134 return MarshalBoundedPlanesFromIntPtr(planesPtr, planeCount);
138 FinishPlaneFinding();
161 public static BoundedPlane[]
FindPlanes(List<MeshData> meshes,
float snapToGravityThreshold = 0.0f,
float minArea = 0.0f)
169 IntPtr pinnedMeshData = PinMeshDataForMarshalling(meshes);
170 DLLImports.FindPlanes(meshes.Count, pinnedMeshData, minArea, snapToGravityThreshold, out planeCount, out planesPtr);
171 return MarshalBoundedPlanesFromIntPtr(planesPtr, planeCount);
175 FinishPlaneFinding();
183 private static bool findPlanesRunning =
false;
184 private static System.Object findPlanesLock =
new System.Object();
185 private static DLLImports.ImportedMeshData[] reusedImportedMeshesForMarshalling;
186 private static List<GCHandle> reusedPinnedMemoryHandles =
new List<GCHandle>();
194 private static void StartPlaneFinding()
196 lock (findPlanesLock)
198 if (findPlanesRunning)
200 throw new Exception(
"PlaneFinding is already running. You can not call these APIs from multiple threads.");
202 findPlanesRunning =
true;
210 private static void FinishPlaneFinding()
213 findPlanesRunning =
false;
221 private static IntPtr PinObject(
System.Object obj)
223 GCHandle h = GCHandle.Alloc(obj, GCHandleType.Pinned);
224 reusedPinnedMemoryHandles.Add(h);
225 return h.AddrOfPinnedObject();
231 private static void UnpinAllObjects()
233 for (
int i = 0; i < reusedPinnedMemoryHandles.Count; ++i)
235 reusedPinnedMemoryHandles[i].Free();
237 reusedPinnedMemoryHandles.Clear();
246 private static IntPtr PinMeshDataForMarshalling(List<MeshData> meshes)
249 if (reusedImportedMeshesForMarshalling == null || reusedImportedMeshesForMarshalling.Length < meshes.Count)
251 reusedImportedMeshesForMarshalling =
new DLLImports.ImportedMeshData[meshes.Count];
254 for (
int i = 0; i < meshes.Count; ++i)
256 reusedImportedMeshesForMarshalling[i] =
new DLLImports.ImportedMeshData
258 transform = meshes[i].Transform,
259 vertCount = meshes[i].Verts.Length,
260 indexCount = meshes[i].Indices.Length,
261 verts = PinObject(meshes[i].Verts),
262 normals = PinObject(meshes[i].Normals),
263 indices = PinObject(meshes[i].Indices),
267 return PinObject(reusedImportedMeshesForMarshalling);
276 private static BoundedPlane[] MarshalBoundedPlanesFromIntPtr(IntPtr outArray,
int size)
279 #pragma warning disable 618 281 #pragma warning restore 618 282 IntPtr current = outArray;
283 for (
int i = 0; i < size; i++)
285 #pragma warning disable 618 287 #pragma warning restore 618 288 current = (IntPtr)((
long)current + structsize);
290 Marshal.FreeCoTaskMem(outArray);
297 private class DLLImports
299 [StructLayout(LayoutKind.Sequential)]
310 [DllImport(
"PlaneFinding")]
311 public static extern void FindPlanes(
315 [In]
float snapToGravityThreshold,
316 [Out] out
int planeCount,
317 [Out] out IntPtr planesPtr);
319 [DllImport(
"PlaneFinding")]
320 public static extern void FindSubPlanes(
323 [In]
float snapToGravityThreshold,
324 [Out] out
int planeCount,
325 [Out] out IntPtr planesPtr);
327 [DllImport(
"PlaneFinding")]
328 public static extern void MergeSubPlanes(
329 [In]
int subPlaneCount,
330 [In] IntPtr subPlanes,
332 [In]
float snapToGravityThreshold,
333 [Out] out
int planeCount,
334 [Out] out IntPtr planesPtr);