public virtual void SetValues(Matrix4d [] array)
        {
            if (array == null)
            {
                throw new ArgumentNullException(nameof(array));
            }
            int typeSize = Marshal.SizeOf(typeof(Matrix4d));

            unsafe {
                fixed(Matrix4d *arrptr = array)
                MDLMemoryHelper.SetValues(typeSize, (IntPtr)arrptr, array.Length, _SetDouble4x4Array);
            }
        }
        public virtual Matrix4d [] GetNMatrix4dValues()
        {
            var count    = ElementCount;
            var timesArr = new Matrix4d [(int)count];
            int typeSize = Marshal.SizeOf(typeof(Matrix4d));

            unsafe {
                fixed(Matrix4d *arrptr = timesArr)
                MDLMemoryHelper.FetchValues(typeSize, (IntPtr)arrptr, count, _GetDouble4x4Array);
            }

            return(timesArr);
        }
        public virtual Quaterniond [] GetQuaterniondValues()
        {
            var count    = ElementCount * TimeSampleCount;
            var timesArr = new Quaterniond [(int)count];
            int typeSize = Marshal.SizeOf(typeof(Quaterniond));

            unsafe {
                fixed(Quaterniond *arrptr = timesArr)
                MDLMemoryHelper.FetchValues(typeSize, (IntPtr)arrptr, count, _GetDoubleQuaternionArray);
            }

            return(timesArr);
        }
        public virtual Matrix4 [] GetNMatrix4Values()
        {
            var count    = TimeSampleCount;
            var timesArr = new Matrix4 [(int)count];
            int typeSize = Marshal.SizeOf(typeof(Matrix4));

            unsafe {
                fixed(Matrix4 *arrptr = timesArr)
                MDLMemoryHelper.FetchValues(typeSize, (IntPtr)arrptr, count, _GetFloat4x4Array);
            }

            return(timesArr);
        }
        public virtual Vector4d [] GetVector4dValues()
        {
            var count    = TimeSampleCount;
            var timesArr = new Vector4d [(int)count];
            int typeSize = Marshal.SizeOf(typeof(Vector4d));

            unsafe {
                fixed(Vector4d *arrptr = timesArr)
                MDLMemoryHelper.FetchValues(typeSize, (IntPtr)arrptr, count, _GetDouble4Array);
            }

            return(timesArr);
        }
        public virtual Quaternion [] GetQuaternionValues(double time)
        {
            var count    = ElementCount;
            var timesArr = new Quaternion [(int)count];
            int typeSize = Marshal.SizeOf(typeof(Quaternion));

            unsafe {
                fixed(Quaternion *arrptr = timesArr)
                MDLMemoryHelper.FetchValues(typeSize, (IntPtr)arrptr, count, time, _GetFloatQuaternionArray);
            }

            return(timesArr);
        }
        public virtual void SetValues(Quaterniond [] array, double time)
        {
            if (array == null)
            {
                throw new ArgumentNullException(nameof(array));
            }
            int typeSize = Marshal.SizeOf(typeof(Quaterniond));

            unsafe {
                fixed(Quaterniond *arrptr = array)
                MDLMemoryHelper.SetValues(typeSize, (IntPtr)arrptr, array.Length, time, _SetDoubleQuaternionArray);
            }
        }
        public virtual Vector3 [] GetNVector3Values()
        {
            var count    = ElementCount * TimeSampleCount;
            var timesArr = new Vector3 [(int)count];
            int typeSize = Marshal.SizeOf(typeof(Vector3));

            unsafe {
                fixed(Vector3 *arrptr = timesArr)
                MDLMemoryHelper.FetchValues(typeSize, (IntPtr)arrptr, count, _GetFloat3Array);
            }

            return(timesArr);
        }
        public virtual Vector3d [] GetNVector3dValues(double time)
        {
            var count    = ElementCount;
            var timesArr = new Vector3d [(int)count];
            int typeSize = Marshal.SizeOf(typeof(Vector3d));

            unsafe {
                fixed(Vector3d *arrptr = timesArr)
                MDLMemoryHelper.FetchValues(typeSize, (IntPtr)arrptr, count, time, _GetDouble3Array);
            }

            return(timesArr);
        }
        public virtual void Reset(Quaterniond [] values, double [] times)
        {
            if (values == null)
            {
                throw new ArgumentNullException(nameof(values));
            }
            if (times == null)
            {
                throw new ArgumentNullException(nameof(times));
            }
            int typeSize = Marshal.SizeOf(typeof(Quaterniond));

            unsafe {
                fixed(Quaterniond *valuesPtr = values)
                MDLMemoryHelper.Reset(typeSize, (IntPtr)valuesPtr, values.Length, times, _ResetWithDoubleQuaternionArray);
            }
        }
        public virtual void Reset(Matrix4d [] values, double [] times)
        {
            if (values == null)
            {
                throw new ArgumentNullException(nameof(values));
            }
            if (times == null)
            {
                throw new ArgumentNullException(nameof(times));
            }
            if (values.Length != times.Length)
            {
                throw new InvalidOperationException($"The length of the '{nameof (values)}' array and the '{nameof (times)}' array must match.");
            }
            int typeSize = Marshal.SizeOf(typeof(Matrix4d));

            unsafe {
                fixed(Matrix4d *valuesPtr = values)
                MDLMemoryHelper.Reset(typeSize, (IntPtr)valuesPtr, times, _ResetWithDouble4x4Array);
            }
        }