using System;
using VrmLib;
namespace UniVRM10
{
///
/// for exporter
///
public class ArrayByteBuffer10
{
public ArraySegment Bytes
{
get
{
if (m_bytes == null)
{
return new ArraySegment();
}
return new ArraySegment(m_bytes, 0, m_used);
}
}
Byte[] m_bytes;
int m_used = 0;
public ArrayByteBuffer10(Byte[] bytes = null)
{
m_bytes = bytes ?? (new byte[] { });
}
public ArrayByteBuffer10(Byte[] bytes, int used)
{
m_bytes = bytes ?? (new byte[] { });
m_used = used;
}
public void ExtendCapacity(int byteLength)
{
var backup = m_bytes;
m_bytes = new byte[backup.Length + byteLength];
backup.CopyTo(m_bytes, backup.Length);
}
public void Extend(ArraySegment array, int stride, out int offset, out int length)
{
var tmp = m_bytes;
// alignment
var padding = m_used % stride == 0 ? 0 : stride - m_used % stride;
if (m_bytes == null || m_used + padding + array.Count > m_bytes.Length)
{
// recreate buffer
var newSize = Math.Max(m_used + padding + array.Count, m_bytes.Length * 2);
m_bytes = new Byte[newSize];
if (m_used > 0)
{
Buffer.BlockCopy(tmp, 0, m_bytes, 0, m_used);
}
}
if (m_used + padding + array.Count > m_bytes.Length)
{
throw new ArgumentOutOfRangeException();
}
Buffer.BlockCopy(array.Array, array.Offset, m_bytes, m_used + padding, array.Count);
length = array.Count;
offset = m_used + padding;
// var result = new GltfBufferView
// {
// buffer = 0,
// byteLength = array.Length,
// byteOffset = m_used + padding,
// target = target,
// };
// if (target == GltfBufferTargetType.ARRAY_BUFFER)
// {
// result.byteStride = stride;
// }
m_used = m_used + padding + array.Count;
// return result;
}
}
}