現在、次の方法で Mapped Byte Buffer から FloatBuffer を埋めています。
/**
* The vertex lump (Lump 3) is an array of coordinates of all the vertices (corners) of brushes in the map geometry.
* Each vertex is a Vector of 3 floats (x, y, and z), giving 12 bytes per vertex.
* @author Jurian
*
*/
public class VertexLump extends Lump {
public final FloatBuffer vertexes;
/**
* @param buffer Little-Endian buffer with actual data
* @param bsp Used for referencing the header with position and length of vertex data
*/
public VertexLump(MappedByteBuffer buffer, ValveBSP bsp) {
super(buffer, bsp.headers[LumpType.LUMP_VERTEXES.index]);
//MappedByteBuffer is set to correct position in super()
vertexes = FloatBuffer.allocate(header.filelen / (Buffers.SIZEOF_FLOAT));
for(int i = 0; i < vertexes.capacity(); i++) {
vertexes.put(buffer.getFloat());
}
vertexes.flip();
}
}
しかし、すべての位置をループするのではなく、これを行うためのより良い方法があるのではないかと私は疑っています。バッファーにはかなりの数の頂点が存在する可能性があります (最大 65536)。
これはうまくいくようです:
public VertexLump(MappedByteBuffer buffer, ValveBSP bsp) {
super(buffer, bsp.headers[LumpType.LUMP_VERTEXES.index]);
vertexes = buffer.asFloatBuffer();
vertexes.limit(header.filelen / Buffers.SIZEOF_FLOAT);
}
ただし、OpenGL のこの関数は GPU に大量のデータを送信しますか? それとも現在位置から限界まで?
gl.glBufferData(GL3.GL_ARRAY_BUFFER, vertexes.limit(), vertexes, GL3.GL_STATIC_DRAW);