Я пытаюсь поместить объект в ByteBuffer безрезультатно.
Я пытаюсь создать класс VertexBuffer для Android, который имитирует буфер вершин DirectX / XNA. Я имею в виду, что я хочу разрешить структуру вершин любого типа (которая реализует определенный интерфейс / расширяет определенный класс). Для этого мне нужно преобразовать этот объект в byte [].
Я изучил Serializable, ByteArrayOutputStream и ObjectOutputStream, байт дает мне слишком много байтов. Ex. класс Vertex, имеющий 3 числа с плавающей запятой для x, y и z, должен иметь размер около 3 * 4 или 12 байт, но полученный массив имеет длину 51! Я почти уверен, что дополнительные байты являются результатом сериализации, и что я, вероятно, мог бы просто взять байты конца массива, но это медленнее, и если есть более простой способ, я бы предпочел это.
Я также изучил использование метода getClass и рекурсивно перебираю поля, пока не доберусь до примитивных данных. С примитивными данными я могу поместить их непосредственно в ByteBuffer, используя соответствующий метод put. На мой взгляд, это самый надежный метод, но он кажется более сложным, чем просто использование сериализации.
РЕДАКТИРОВАТЬ: Предполагается, что класс буфера вершин хранит данные вершин в виде байтов в ByteBuffer (или некотором другом расширении). Класс данных вершин должен наследовать метод getVertexDeclaration, который сообщает буферу вершин, как должны использоваться байты. Например:
public class ColoredTexturedVertex implements Vertex
{
public Vector3 Position;
public Vector2 TexCoord;
public int Color;
public VertexDeclaration getVertexDeclaration()
{
return VertexDeclaration.createFromArray(new VertexElement[] {
new VertexElement(0, 4 * 3, Usage.Position),
new VertexElement(12, 4 * 2, Usage.TexCoord),
new VertexElement(20, 4 * 1, Usage.Color)
});
}
}
при передаче в буфер вершин этот класс сообщит буферу, что это вершина с положением, координатой текстуры и данными цвета. VertexDeclaration отражает поля класса. Первые 12 байтов (Vector3) будут использоваться в качестве данных позиции. Следующие 8 байтов (Vector2) будут использоваться в качестве текстурных координат. Последние 4 байта будут использоваться в качестве цветовых данных.
Возвращаясь к моему вопросу, я просто хочу выделить эти байты для хранения в буфере вершин. Причина, по которой они мне нужны в ByteBuffer, заключается в том, что glDrawElements требует, чтобы буфер передавался с другими его параметрами.
Я не хочу восстанавливать вершину в исходное состояние, поэтому мне не нужны все дополнительные вещи, которые сериализуют при создании байтов.
Я могу ладить только с использованием массивов с плавающей точкой и FloatBuffer, но если я смогу это выяснить, это упростит процесс использования различных типов вершин.