using System; using System.Runtime.InteropServices; using Unity.Collections; using UnityEngine; namespace MagicaCloth { /// /// ダブルバッファ対応のComputeBuffer /// /// public class DoubleComputeBuffer : IDisposable where T : struct { ComputeBuffer buffer0; ComputeBuffer buffer1; NativeArray nativeArrya; //========================================================================================= public void Dispose() { if (buffer0 != null) { buffer0.Release(); buffer0.Dispose(); buffer0 = null; } if (buffer1 != null) { buffer1.Release(); buffer1.Dispose(); buffer1 = null; } } public void Swap() { var temp = buffer1; buffer1 = buffer0; buffer0 = temp; } public void Create(int size, ComputeBufferType type, ComputeBufferMode usage) { buffer0?.Release(); buffer0?.Dispose(); buffer0 = new ComputeBuffer(size, Marshal.SizeOf(typeof(T)), type, usage); } #if UNITY_2021_2_OR_NEWER public void BeginWrite(int length) { nativeArrya = buffer0.BeginWrite(0, length); } public void EndWrite(int length) { buffer0.EndWrite(length); } #endif public NativeArray GetNativeArray() { return nativeArrya; } public ComputeBuffer GetBuffer(int bufferIndex = 0) { return bufferIndex == 0 ? buffer0 : buffer1; } public int Count { get { return buffer0?.count ?? 0; } } } }