[BurstCompile]
    struct NativeArray3D<T> : System.IDisposable where T : unmanaged
    {
        private NativeArray<T> backing;
        public int sizeX;
        public int sizeY;
        public int sizeZ;

        public NativeArray3D(int x, int y)
        {
            backing = new(x * y, Allocator.Temp);
            this.sizeX = x;
            this.sizeY = y;
            this.sizeZ = 1;
        }

        public NativeArray3D(int x, int y, int z)
        {
            backing = new(x * y * z, Allocator.Temp);
            this.sizeX = x;
            this.sizeY = y;
            this.sizeZ = z;
        }

        public T this[int x, int y]
        {
            get
            {
                if (x >= sizeX || y >= sizeY)
                {
                    UnityEngine.Debug.LogError($"Bogus: {x}, {y}");
                }
                return backing[x * sizeY + y];
            }
            set
            {
                backing[x * sizeY + y] = value;
            }
        }

        public T this[int x, int y, int z]
        {
            get
            {
                if (x < 0 || y < 0 || z < 0 || x >= sizeX || y >= sizeY || z >= sizeZ)
                {
                    UnityEngine.Debug.LogError($"Bogus: {x}, {y}, {z}");
                }
                return backing[x * sizeY * sizeZ + y * sizeZ + z];
            }
            set
            {
                if (x < 0 || y < 0 || z < 0 || x >= sizeX || y >= sizeY || z >= sizeZ)
                {
                    UnityEngine.Debug.LogError($"Bogus: {x}, {y}, {z}");
                }
                backing[x * sizeY * sizeZ + y * sizeZ + z] = value;
            }
        }

        public void Dispose()
        {
            backing.Dispose();
        }
    }