using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; namespace AwesomeTechnologies.Utility { //public unsafe class ManagedNativeFloatArray //{ // public NativeSlice NativeArray; // public AtomicSafetyHandle SafetyHandle; // public GCHandle GcHandle; // public ManagedNativeFloatArray(float[,] managedArray) // { // SafetyHandle = new AtomicSafetyHandle(); // GcHandle = GCHandle.Alloc(managedArray, GCHandleType.Pinned); // int length = managedArray.GetLength(0) * managedArray.GetLength(1); // NativeArray = // NativeSliceUnsafeUtility.ConvertExistingDataToNativeSlice((void*) GcHandle.AddrOfPinnedObject(),4,length); // NativeSliceUnsafeUtility.SetAtomicSafetyHandle(ref NativeArray, SafetyHandle); // } // public void Dispose() // { // AtomicSafetyHandle.Release(SafetyHandle); // GcHandle.Free(); // } //} //private static readonly Matrix4x4 SizeMatrix = Matrix4x4.identity; //public static readonly int SizeOfMatrix4X4 = Marshal.SizeOf(SizeMatrix); //private static readonly Vector4 SizeVector4 = Vector4.zero; //public static readonly int SizeOffVector4 = Marshal.SizeOf(SizeVector4); //public static unsafe void NativeToManagedMatrix(Matrix4x4[] targetMatrixArray, NativeSlice sourceSlice) //{ // void* memoryPointer = sourceSlice.GetUnsafeReadOnlyPtr(); //NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(sourceNativeArray); // GCHandle handle = GCHandle.Alloc(targetMatrixArray, GCHandleType.Pinned); // try // { // IntPtr pointer = handle.AddrOfPinnedObject(); // CopyMemory(pointer,(IntPtr)memoryPointer, sourceSlice.Length * 16 * 4); // //Buffer.MemoryCopy(memoryPointer, (void*)pointer, sourceSlice.Length * 16 * 4, sourceSlice.Length * 16 * 4); // } // finally // { // if (handle.IsAllocated) // handle.Free(); // } //} //#if PLATFORM_STANDALONE_WIN // [DllImport("msvcrt.dll", EntryPoint = "memcpy")] // public static extern void CopyMemory(IntPtr pDest, IntPtr pSrc, int length); //#endif //public static unsafe void CopyNativeToManagedMatrixArray(byte[] tempByteArray, Matrix4x4[] targetMatrixArray, // NativeArray sourceNativeArray) //{ // void* memoryPointer = NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(sourceNativeArray); // Marshal.Copy((IntPtr) memoryPointer, tempByteArray, 0, sourceNativeArray.Length * 16 * 4); // Matrix4X4FromByteArray(targetMatrixArray, tempByteArray); //} //public static unsafe void CopyNativeToManagedMatrixArray(byte[] tempByteArray, Matrix4x4[] targetMatrixArray, // NativeSlice sourceSlice) //{ // void* memoryPointer = sourceSlice.GetUnsafeReadOnlyPtr(); // Marshal.Copy((IntPtr)memoryPointer, tempByteArray, 0, sourceSlice.Length * 16 * 4); // Matrix4X4FromByteArray(targetMatrixArray, tempByteArray); //} //public static unsafe void CopyNativeToManagedFloatArray(byte[] tempByteArray, float[] targetFloatArray, // NativeSlice sourceSlice) //{ // void* memoryPointer = sourceSlice.GetUnsafeReadOnlyPtr(); // Marshal.Copy((IntPtr)memoryPointer, tempByteArray, 0, sourceSlice.Length * 4); // FloatFromByteArray(targetFloatArray, tempByteArray); //} //public static unsafe void CopyNativeToManagedVector4Array(byte[] tempByteArray, Vector4[] targetVector4Array, // NativeSlice sourceSlice) //{ // void* memoryPointer = sourceSlice.GetUnsafeReadOnlyPtr(); // Marshal.Copy((IntPtr)memoryPointer, tempByteArray, 0, sourceSlice.Length * 4 * 4); // Vector4FromByteArray(targetVector4Array, tempByteArray); //} //private static void Matrix4X4FromByteArray(Matrix4x4[] destination, byte[] source) //{ // GCHandle handle = GCHandle.Alloc(destination, GCHandleType.Pinned); // try // { // IntPtr pointer = handle.AddrOfPinnedObject(); // Marshal.Copy(source, 0, pointer, source.Length); // } // finally // { // if (handle.IsAllocated) // handle.Free(); // } //} //private static void FloatFromByteArray(float[] destination, byte[] source) //{ // GCHandle handle = GCHandle.Alloc(destination, GCHandleType.Pinned); // try // { // IntPtr pointer = handle.AddrOfPinnedObject(); // Marshal.Copy(source, 0, pointer, source.Length); // } // finally // { // if (handle.IsAllocated) // handle.Free(); // } //} //private static void Vector4FromByteArray(Vector4[] destination, byte[] source) //{ // GCHandle handle = GCHandle.Alloc(destination, GCHandleType.Pinned); // try // { // IntPtr pointer = handle.AddrOfPinnedObject(); // Marshal.Copy(source, 0, pointer, source.Length); // } // finally // { // if (handle.IsAllocated) // handle.Free(); // } //} //public static unsafe NativeArray CreateNativeArrayFromManagedArray(float[,] array) //{ // void* managedBuffer = UnsafeUtility.AddressOf(ref array[0, 0]); // int length = array.GetLength(0) * array.GetLength(1); // return NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray(managedBuffer, length, Allocator.None); //} //} public static class NativeListExtentions { public static unsafe void ClearMemory( this NativeList nativeList) where T : unmanaged { UnsafeUtility.MemClear(nativeList.GetUnsafePtr(), nativeList.Length * UnsafeUtility.SizeOf()); } public static unsafe void CompactMemory( this NativeList nativeList) where T : unmanaged { nativeList.Clear(); nativeList.Capacity = 0; } } public static class NativeArrayExtensions { public static unsafe void CopyToFast( this NativeArray nativeArray, T[] array) where T : struct { if (array == null) { throw new NullReferenceException(nameof(array) + " is null"); } int nativeArrayLength = nativeArray.Length; if (array.Length < nativeArrayLength) { throw new IndexOutOfRangeException( nameof(array) + " is shorter than " + nameof(nativeArray)); } int byteLength = nativeArray.Length * UnsafeUtility.SizeOf(); void* managedBuffer = UnsafeUtility.AddressOf(ref array[0]); void* nativeBuffer = nativeArray.GetUnsafePtr(); UnsafeUtility.MemCpy(managedBuffer, nativeBuffer, byteLength); } public static unsafe void CopyToFast( this NativeSlice nativeSlice, T[] array) where T : struct { if (array == null) { throw new NullReferenceException(nameof(array) + " is null"); } int nativeArrayLength = nativeSlice.Length; if (array.Length < nativeArrayLength) { throw new IndexOutOfRangeException( nameof(array) + " is shorter than " + nameof(nativeSlice)); } int byteLength = nativeSlice.Length * UnsafeUtility.SizeOf(); void* managedBuffer = UnsafeUtility.AddressOf(ref array[0]); void* nativeBuffer = nativeSlice.GetUnsafePtr(); UnsafeUtility.MemCpy(managedBuffer, nativeBuffer, byteLength); } public static unsafe void CopyToFast( this NativeArray nativeArray, T[,,] array) where T : struct { if (array == null) { throw new NullReferenceException(nameof(array) + " is null"); } int nativeArrayLength = nativeArray.Length; int managedArrayLength = array.GetLength(0) * array.GetLength(1) * array.GetLength(2); if (managedArrayLength < nativeArrayLength) { throw new IndexOutOfRangeException( nameof(array) + " is shorter than " + nameof(nativeArray)); } int byteLength = nativeArray.Length * UnsafeUtility.SizeOf(); void* managedBuffer = UnsafeUtility.AddressOf(ref array[0, 0, 0]); void* nativeBuffer = nativeArray.GetUnsafePtr(); UnsafeUtility.MemCpy(managedBuffer, nativeBuffer, byteLength); } public static unsafe void CopyFromFast( this NativeArray nativeArray, T[,] array) where T : struct { if (array == null) { throw new NullReferenceException(nameof(array) + " is null"); } int nativeArrayLength = nativeArray.Length; int managedArrayLength = array.GetLength(0) * array.GetLength(1); if (managedArrayLength > nativeArrayLength) { throw new IndexOutOfRangeException( nameof(nativeArray) + " is shorter than " + nameof(array)); } int byteLength = managedArrayLength * UnsafeUtility.SizeOf(); void* managedBuffer = UnsafeUtility.AddressOf(ref array[0, 0]); void* nativeBuffer = nativeArray.GetUnsafePtr(); UnsafeUtility.MemCpy(nativeBuffer, managedBuffer, byteLength); } public static unsafe void CopyFromFast( this NativeArray nativeArray, T[,,] array) where T : struct { if (array == null) { throw new NullReferenceException(nameof(array) + " is null"); } int nativeArrayLength = nativeArray.Length; int managedArrayLength = array.GetLength(0) * array.GetLength(1) * array.GetLength(2); if (managedArrayLength > nativeArrayLength) { throw new IndexOutOfRangeException( nameof(nativeArray) + " is shorter than " + nameof(array)); } int byteLength = managedArrayLength * UnsafeUtility.SizeOf(); void* managedBuffer = UnsafeUtility.AddressOf(ref array[0, 0, 0]); void* nativeBuffer = nativeArray.GetUnsafePtr(); UnsafeUtility.MemCpy(nativeBuffer, managedBuffer, byteLength); } public static unsafe void CopyFromFast( this NativeArray nativeArray, T[] array) where T : struct { if (array == null) { throw new NullReferenceException(nameof(array) + " is null"); } int nativeArrayLength = nativeArray.Length; int managedArrayLength = array.GetLength(0); if (managedArrayLength > nativeArrayLength) { throw new IndexOutOfRangeException( nameof(nativeArray) + " is shorter than " + nameof(array)); } int byteLength = managedArrayLength * UnsafeUtility.SizeOf(); void* managedBuffer = UnsafeUtility.AddressOf(ref array[0]); void* nativeBuffer = nativeArray.GetUnsafePtr(); UnsafeUtility.MemCpy(nativeBuffer, managedBuffer, byteLength); } public static unsafe void CopyFromFast( this NativeArray nativeArray, List managedList) where T : struct { if (managedList == null) { throw new NullReferenceException(nameof(managedList) + " is null"); } int nativeArrayLength = nativeArray.Length; int managedListLength = managedList.Count; T[] managedInternalArray = managedList.GetInternalArray(); if (managedListLength > nativeArrayLength) { throw new IndexOutOfRangeException( nameof(nativeArray) + " is shorter than " + nameof(managedInternalArray)); } int byteLength = managedListLength * UnsafeUtility.SizeOf(); void* managedBuffer = UnsafeUtility.AddressOf(ref managedInternalArray[0]); void* nativeBuffer = nativeArray.GetUnsafePtr(); UnsafeUtility.MemCpy(nativeBuffer, managedBuffer, byteLength); } } }